From 1750ab8676dadb3d6f2f3dbfe0ee9ea95de66733 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:53:06 +0200 Subject: [PATCH 01/82] [Fleet] fix restart upgrade disabled condition (#184586) ## Summary Closes https://github.com/elastic/kibana/issues/184212 Fix the Restart upgrade modal submit button disabled condition. It was not correct for single agent restart, the restart was disabled. To verify: - enroll an agent with an older version e.g. 8.13.1 - upgrade agent with a fictive version e.g. 8.13.5 - update the agent doc to set the `upgrade_started_at` to more than 2 hours ago - go to `Restart upgrade`, the modal window show enable submit image ### 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 | 41 +++++++++++++++++++ .../components/agent_upgrade_modal/index.tsx | 29 ++++++------- 2 files changed, 56 insertions(+), 14 deletions(-) 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 a71329168d054..3167c2dcd4d00 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 @@ -466,4 +466,45 @@ describe('AgentUpgradeAgentModal', () => { expect(el).toBeDisabled(); }); }); + + it('should enable restart upgrade if single agent stuck updating', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: [ + { status: 'updating', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' }, + ] as any, + agentCount: 1, + isUpdating: true, + }); + + const el = utils.getByTestId('confirmModalTitleText'); + expect(el.textContent).toEqual('Restart upgrade'); + + const btn = utils.getByTestId('confirmModalConfirmButton'); + await waitFor(() => { + expect(btn).toBeEnabled(); + }); + }); + + it('should enable restart upgrade if single agent failed upgrade', async () => { + const { utils } = renderAgentUpgradeAgentModal({ + agents: [ + { + status: 'updating', + upgrade_details: { state: 'UPG_FAILED' }, + id: 'agent1', + active: true, + }, + ] as any, + agentCount: 1, + isUpdating: true, + }); + + const el = utils.getByTestId('confirmModalTitleText'); + expect(el.textContent).toEqual('Restart upgrade'); + + const btn = utils.getByTestId('confirmModalConfirmButton'); + await waitFor(() => { + expect(btn).toBeEnabled(); + }); + }); }); 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 aab08cad1922a..b65b90e8062bd 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 @@ -290,26 +290,27 @@ export const AgentUpgradeAgentModal: React.FunctionComponent agent.id).includes(agents[0].id); - const isSubmitButtonDisabled = useMemo( - () => + const isSubmitButtonDisabled = useMemo(() => { + if (!isSubmitting && isUpdating && isSingleAgent && isStuckInUpdating(agents[0])) return false; + return ( isSubmitting || (isUpdating && updatingAgents === 0) || !selectedVersion[0].value || (isSingleAgent && !isAgentUpgradeableToVersion(agents[0], selectedVersion[0].value)) || (isSingleAgent && !isSingleAgentFleetServer && - !isAgentVersionLessThanFleetServer(selectedVersion[0].value, fleetServerAgents)), - [ - agents, - fleetServerAgents, - isSingleAgent, - isSubmitting, - isUpdating, - selectedVersion, - updatingAgents, - isSingleAgentFleetServer, - ] - ); + !isAgentVersionLessThanFleetServer(selectedVersion[0].value, fleetServerAgents)) + ); + }, [ + agents, + fleetServerAgents, + isSingleAgent, + isSubmitting, + isUpdating, + selectedVersion, + updatingAgents, + isSingleAgentFleetServer, + ]); async function onSubmit() { const version = getVersion(selectedVersion); From 9abe56f1c699367e111e08a5df6bd10e9598e922 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Mon, 3 Jun 2024 08:10:44 -0600 Subject: [PATCH 02/82] [ES|QL] add tests for implicit date casting (#184612) ## Summary Relates to https://github.com/elastic/elasticsearch/issues/109265 These test reflect the reality of how date casting is working in Elasticsearch today. When the above issue is addressed in Elasticsearch, these tests will fail the error sync check and prompt us to update the validator. --------- Co-authored-by: Stratoula Kalafateli --- .../generate_function_validation_tests.ts | 76 +++++++++ .../esql_validation_meta_tests.json | 153 ++++++++++++++++++ .../src/validation/validation.test.ts | 77 +++++++++ 3 files changed, 306 insertions(+) diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts index bc12ea1fbfb2f..3f3f4f42a07ce 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts @@ -53,6 +53,7 @@ function generateTestsForEvalFunction(definition: FunctionDefinition) { generateEvalCommandTestsForEvalFunction(definition, testCases); generateSortCommandTestsForEvalFunction(definition, testCases); generateNullAcceptanceTestsForFunction(definition, testCases); + generateImplicitDateCastingTestsForFunction(definition, testCases); return testCases; } @@ -63,6 +64,7 @@ function generateTestsForAggFunction(definition: FunctionDefinition) { generateWhereCommandTestsForAggFunction(definition, testCases); generateEvalCommandTestsForAggFunction(definition, testCases); generateNullAcceptanceTestsForFunction(definition, testCases); + generateImplicitDateCastingTestsForFunction(definition, testCases); return testCases; } @@ -71,6 +73,7 @@ function generateTestsForGroupingFunction(definition: FunctionDefinition) { generateStatsCommandTestsForGroupingFunction(definition, testCases); generateSortCommandTestsForGroupingFunction(definition, testCases); generateNullAcceptanceTestsForFunction(definition, testCases); + generateImplicitDateCastingTestsForFunction(definition, testCases); return testCases; } @@ -124,6 +127,79 @@ function generateNullAcceptanceTestsForFunction( ); } +/** + * Tests for strings being casted to dates + * + * @param definition + * @param testCases + * @returns + */ +function generateImplicitDateCastingTestsForFunction( + definition: FunctionDefinition, + testCases: Map +) { + const allSignaturesWithDateParams = definition.signatures.filter((signature) => + signature.params.some( + (param, i) => + param.type === 'date' && + !definition.signatures.some((def) => def.params[i].type === 'string') // don't count parameters that already accept a string + ) + ); + + if (!allSignaturesWithDateParams.length) { + // no signatures contain date params + return; + } + + const commandToTestWith = definition.supportedCommands.includes('eval') ? 'eval' : 'stats'; + + for (const signature of allSignaturesWithDateParams) { + const mappedParams = getFieldMapping(signature.params); + + testCases.set( + `from a_index | ${commandToTestWith} ${ + getFunctionSignatures( + { + ...definition, + signatures: [ + { + ...signature, + params: mappedParams.map((param) => + // overwrite dates with a string + param.type === 'date' ? { ...param, name: '"2022"' } : param + ), + }, + ], + }, + { withTypes: false } + )[0].declaration + }`, + [] + ); + + testCases.set( + `from a_index | ${commandToTestWith} ${ + getFunctionSignatures( + { + ...definition, + signatures: [ + { + ...signature, + params: mappedParams.map((param) => + // overwrite dates with a string + param.type === 'date' ? { ...param, name: 'concat("20", "22")' } : param + ), + }, + ], + }, + { withTypes: false } + )[0].declaration + }`, + [] + ); + } +} + function generateRowCommandTestsForEvalFunction( { name, alias, signatures, ...defRest }: FunctionDefinition, testCases: Map diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index 1a3296984d7e1..a18a65138b10d 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -9044,6 +9044,19 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval date_diff(\"year\", \"2022\", \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(\"year\", concat(\"20\", \"22\"), concat(\"20\", \"22\"))", + "error": [ + "Argument of [date_diff] must be [date], found value [concat(\"20\", \"22\")] type [string]", + "Argument of [date_diff] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "row var = abs(5)", "error": [], @@ -10999,6 +11012,18 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", concat(\"20\", \"22\"))", + "error": [ + "Argument of [date_extract] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "row var = date_format(\"a\", now())", "error": [], @@ -11074,6 +11099,18 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval date_format(stringField, \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_format(stringField, concat(\"20\", \"22\"))", + "error": [ + "Argument of [date_format] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "row var = date_parse(\"a\", \"a\")", "error": [], @@ -11279,6 +11316,31 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval date_trunc(1 year, \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_trunc(1 year, concat(\"20\", \"22\"))", + "error": [ + "Argument of [date_trunc] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_trunc(\"2022\", \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_trunc(concat(\"20\", \"22\"), concat(\"20\", \"22\"))", + "error": [ + "Argument of [date_trunc] must be [time_literal], found value [concat(\"20\", \"22\")] type [string]", + "Argument of [date_trunc] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "row var = e()", "error": [], @@ -23968,6 +24030,18 @@ "error": [], "warning": [] }, + { + "query": "from a_index | stats max(\"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats max(concat(\"20\", \"22\"))", + "error": [ + "Argument of [max] must be [number], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "from a_index | stats var = min(numberField)", "error": [], @@ -24229,6 +24303,18 @@ "error": [], "warning": [] }, + { + "query": "from a_index | stats min(\"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats min(concat(\"20\", \"22\"))", + "error": [ + "Argument of [min] must be [number], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "from a_index | stats var = count(stringField)", "error": [], @@ -24775,6 +24861,73 @@ ], "warning": [] }, + { + "query": "from a_index | stats bucket(\"2022\", 1 year)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats bucket(concat(\"20\", \"22\"), 1 year)", + "error": [ + "Argument of [bucket] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats by bucket(concat(\"20\", \"22\"), 1 year)", + "error": [ + "Argument of [bucket] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats bucket(\"2022\", 5, \"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats bucket(concat(\"20\", \"22\"), 5, \"a\", \"a\")", + "error": [ + "Argument of [bucket] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats bucket(\"2022\", 5, \"2022\", \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats bucket(concat(\"20\", \"22\"), 5, concat(\"20\", \"22\"), concat(\"20\", \"22\"))", + "error": [ + "Argument of [bucket] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats bucket(\"2022\", 5, \"a\", \"2022\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats bucket(concat(\"20\", \"22\"), 5, \"a\", concat(\"20\", \"22\"))", + "error": [ + "Argument of [bucket] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | stats bucket(\"2022\", 5, \"2022\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "from a_index | stats bucket(concat(\"20\", \"22\"), 5, concat(\"20\", \"22\"), \"a\")", + "error": [ + "Argument of [bucket] must be [date], found value [concat(\"20\", \"22\")] type [string]" + ], + "warning": [] + }, { "query": "row var = cbrt(5)", "error": [], diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index ebf44b1fee72a..d4807d35d4e09 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -2025,6 +2025,15 @@ describe('validation logic', () => { ); testErrorsAndWarnings('from a_index | eval date_diff(null, null, null)', []); testErrorsAndWarnings('row nullVar = null | eval date_diff(nullVar, nullVar, nullVar)', []); + + testErrorsAndWarnings('from a_index | eval date_diff("year", "2022", "2022")', []); + testErrorsAndWarnings( + 'from a_index | eval date_diff("year", concat("20", "22"), concat("20", "22"))', + [ + 'Argument of [date_diff] must be [date], found value [concat("20", "22")] type [string]', + 'Argument of [date_diff] must be [date], found value [concat("20", "22")] type [string]', + ] + ); }); describe('abs', () => { @@ -2898,6 +2907,18 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | eval date_extract(null, null)', []); testErrorsAndWarnings('row nullVar = null | eval date_extract(nullVar, nullVar)', []); + + testErrorsAndWarnings( + 'from a_index | eval date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", "2022")', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", concat("20", "22"))', + [ + 'Argument of [date_extract] must be [date], found value [concat("20", "22")] type [string]', + ] + ); }); describe('date_format', () => { @@ -2937,6 +2958,10 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | eval date_format(null, null)', []); testErrorsAndWarnings('row nullVar = null | eval date_format(nullVar, nullVar)', []); + testErrorsAndWarnings('from a_index | eval date_format(stringField, "2022")', []); + testErrorsAndWarnings('from a_index | eval date_format(stringField, concat("20", "22"))', [ + 'Argument of [date_format] must be [date], found value [concat("20", "22")] type [string]', + ]); }); describe('date_parse', () => { @@ -3038,6 +3063,19 @@ describe('validation logic', () => { ); testErrorsAndWarnings('from a_index | eval date_trunc(null, null)', []); testErrorsAndWarnings('row nullVar = null | eval date_trunc(nullVar, nullVar)', []); + testErrorsAndWarnings('from a_index | eval date_trunc(1 year, "2022")', []); + testErrorsAndWarnings('from a_index | eval date_trunc(1 year, concat("20", "22"))', [ + 'Argument of [date_trunc] must be [date], found value [concat("20", "22")] type [string]', + ]); + testErrorsAndWarnings('from a_index | eval date_trunc("2022", "2022")', []); + + testErrorsAndWarnings( + 'from a_index | eval date_trunc(concat("20", "22"), concat("20", "22"))', + [ + 'Argument of [date_trunc] must be [time_literal], found value [concat("20", "22")] type [string]', + 'Argument of [date_trunc] must be [date], found value [concat("20", "22")] type [string]', + ] + ); }); describe('e', () => { @@ -9353,6 +9391,10 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | stats max(null)', []); testErrorsAndWarnings('row nullVar = null | stats max(nullVar)', []); + testErrorsAndWarnings('from a_index | stats max("2022")', []); + testErrorsAndWarnings('from a_index | stats max(concat("20", "22"))', [ + 'Argument of [max] must be [number], found value [concat("20", "22")] type [string]', + ]); }); describe('min', () => { @@ -9493,6 +9535,10 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | stats min(null)', []); testErrorsAndWarnings('row nullVar = null | stats min(nullVar)', []); + testErrorsAndWarnings('from a_index | stats min("2022")', []); + testErrorsAndWarnings('from a_index | stats min(concat("20", "22"))', [ + 'Argument of [min] must be [number], found value [concat("20", "22")] type [string]', + ]); }); describe('count', () => { @@ -9807,6 +9853,37 @@ describe('validation logic', () => { 'Argument of [bucket] must be a constant, received [nullVar]', ] ); + testErrorsAndWarnings('from a_index | stats bucket("2022", 1 year)', []); + testErrorsAndWarnings('from a_index | stats bucket(concat("20", "22"), 1 year)', [ + 'Argument of [bucket] must be [date], found value [concat("20", "22")] type [string]', + ]); + testErrorsAndWarnings('from a_index | stats by bucket(concat("20", "22"), 1 year)', [ + 'Argument of [bucket] must be [date], found value [concat("20", "22")] type [string]', + ]); + testErrorsAndWarnings('from a_index | stats bucket("2022", 5, "a", "a")', []); + testErrorsAndWarnings('from a_index | stats bucket(concat("20", "22"), 5, "a", "a")', [ + 'Argument of [bucket] must be [date], found value [concat("20", "22")] type [string]', + ]); + testErrorsAndWarnings('from a_index | stats bucket("2022", 5, "2022", "2022")', []); + + testErrorsAndWarnings( + 'from a_index | stats bucket(concat("20", "22"), 5, concat("20", "22"), concat("20", "22"))', + ['Argument of [bucket] must be [date], found value [concat("20", "22")] type [string]'] + ); + + testErrorsAndWarnings('from a_index | stats bucket("2022", 5, "a", "2022")', []); + + testErrorsAndWarnings( + 'from a_index | stats bucket(concat("20", "22"), 5, "a", concat("20", "22"))', + ['Argument of [bucket] must be [date], found value [concat("20", "22")] type [string]'] + ); + + testErrorsAndWarnings('from a_index | stats bucket("2022", 5, "2022", "a")', []); + + testErrorsAndWarnings( + 'from a_index | stats bucket(concat("20", "22"), 5, concat("20", "22"), "a")', + ['Argument of [bucket] must be [date], found value [concat("20", "22")] type [string]'] + ); }); describe('cbrt', () => { From 03a5ea56299459fcbf7932760236b460f2aa9837 Mon Sep 17 00:00:00 2001 From: Jedr Blaszyk Date: Mon, 3 Jun 2024 16:18:58 +0200 Subject: [PATCH 03/82] [Connectors] Use API to start on-demand connector sync (#184411) --- .../lib/start_sync.test.ts | 236 +++------- .../kbn-search-connectors/lib/start_sync.ts | 76 +--- .../server/lib/connectors/start_sync.test.ts | 402 ++++++------------ .../server/lib/connectors/start_sync.ts | 25 +- 4 files changed, 187 insertions(+), 552 deletions(-) diff --git a/packages/kbn-search-connectors/lib/start_sync.test.ts b/packages/kbn-search-connectors/lib/start_sync.test.ts index c32b82bc7ba7f..5b8aac3d246ea 100644 --- a/packages/kbn-search-connectors/lib/start_sync.test.ts +++ b/packages/kbn-search-connectors/lib/start_sync.test.ts @@ -8,17 +8,17 @@ import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; -import { SyncJobType, SyncStatus, TriggerMethod } from '../types/connectors'; -import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '..'; +import { errors } from '@elastic/elasticsearch'; + +import { SyncJobType } from '../types/connectors'; import { startConnectorSync } from './start_sync'; describe('startSync lib function', () => { const mockClient = { - get: jest.fn(), - index: jest.fn(), - update: jest.fn(), + transport: { + request: jest.fn(), + }, }; beforeEach(() => { @@ -26,217 +26,79 @@ describe('startSync lib function', () => { }); it('should start a full sync', async () => { - mockClient.get.mockImplementation(() => { - return Promise.resolve({ - _id: 'connectorId', - _source: { - api_key_id: null, - configuration: {}, - created_at: null, - custom_scheduling: {}, - error: null, - index_name: 'index_name', - language: null, - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: null, - status: 'not connected', - sync_now: false, - }, - index: CONNECTORS_INDEX, - }); - }); - mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.transport.request.mockImplementation(() => ({ id: '12345' })); await expect( startConnectorSync(mockClient as unknown as ElasticsearchClient, { connectorId: 'connectorId', jobType: SyncJobType.FULL, }) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: {}, - filtering: null, - id: 'connectorId', - index_name: 'index_name', - language: null, - pipeline: null, - service_type: null, - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.FULL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, + ).resolves.toEqual({ id: '12345' }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: '/_connector/_sync_job', + body: { + id: 'connectorId', + job_type: 'full', }, - index: CURRENT_CONNECTORS_JOB_INDEX, }); }); - it('should not create index if there is no connector', async () => { - mockClient.get.mockImplementation(() => { - return Promise.resolve({}); - }); + it('should start an incremental sync', async () => { + mockClient.transport.request.mockImplementation(() => ({ id: '12345' })); + await expect( startConnectorSync(mockClient as unknown as ElasticsearchClient, { connectorId: 'connectorId', - jobType: SyncJobType.FULL, + jobType: SyncJobType.INCREMENTAL, }) - ).rejects.toEqual(new Error('resource_not_found')); - expect(mockClient.index).not.toHaveBeenCalled(); + ).resolves.toEqual({ id: '12345' }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: '/_connector/_sync_job', + body: { + id: 'connectorId', + job_type: 'incremental', + }, + }); }); - it('should start an incremental sync', async () => { - mockClient.get.mockImplementation(() => { - return Promise.resolve({ - _id: 'connectorId', - _source: { - api_key_id: null, - configuration: {}, - created_at: null, - custom_scheduling: {}, - error: null, - filtering: [], - index_name: 'index_name', - language: null, - last_access_control_sync_status: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: null, - status: 'not connected', - sync_now: false, - }, - index: CONNECTORS_INDEX, - }); - }); - mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + it('should start an access_control sync', async () => { + mockClient.transport.request.mockImplementation(() => ({ id: '12345' })); await expect( startConnectorSync(mockClient as unknown as ElasticsearchClient, { connectorId: 'connectorId', - jobType: SyncJobType.INCREMENTAL, + jobType: SyncJobType.ACCESS_CONTROL, }) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: {}, - filtering: null, - id: 'connectorId', - index_name: 'index_name', - language: null, - pipeline: null, - service_type: null, - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.INCREMENTAL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, + ).resolves.toEqual({ id: '12345' }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: '/_connector/_sync_job', + body: { + id: 'connectorId', + job_type: 'access_control', }, - index: CURRENT_CONNECTORS_JOB_INDEX, }); }); - it('should start an access control sync', async () => { - mockClient.get.mockImplementation(() => { - return Promise.resolve({ - _id: 'connectorId', - _source: { - api_key_id: null, - configuration: {}, - created_at: null, - custom_scheduling: {}, - error: null, - index_name: 'search-index_name', - language: null, - last_access_control_sync_status: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: null, - status: 'not connected', - sync_now: false, + it('sync not started if there is no connector', async () => { + const notFoundError = new errors.ResponseError({ + statusCode: 404, + body: { + error: { + type: `document_missing_exception`, }, - index: CONNECTORS_INDEX, - }); - }); - mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + }, + } as any); + + mockClient.transport.request.mockRejectedValueOnce(notFoundError); await expect( startConnectorSync(mockClient as unknown as ElasticsearchClient, { connectorId: 'connectorId', - targetIndexName: '.search-acl-filter-index_name', - jobType: SyncJobType.ACCESS_CONTROL, + jobType: SyncJobType.FULL, }) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: {}, - filtering: null, - id: 'connectorId', - index_name: `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}index_name`, - language: null, - pipeline: null, - service_type: null, - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.ACCESS_CONTROL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, - }); + ).rejects.toEqual(notFoundError); }); }); diff --git a/packages/kbn-search-connectors/lib/start_sync.ts b/packages/kbn-search-connectors/lib/start_sync.ts index 56017e7717f67..3f3ad5d4f5e0f 100644 --- a/packages/kbn-search-connectors/lib/start_sync.ts +++ b/packages/kbn-search-connectors/lib/start_sync.ts @@ -8,84 +8,24 @@ import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; -import { - ConnectorConfiguration, - ConnectorDocument, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../types/connectors'; -import { isConfigEntry } from '../utils/is_category_entry'; +import { SyncJobType } from '../types/connectors'; export const startConnectorSync = async ( client: ElasticsearchClient, { connectorId, jobType, - targetIndexName, }: { connectorId: string; jobType?: SyncJobType; - targetIndexName?: string; } ) => { - const connectorResult = await client.get({ - id: connectorId, - index: CONNECTORS_INDEX, + return await client.transport.request<{ id: string }>({ + method: 'POST', + path: `/_connector/_sync_job`, + body: { + id: connectorId, + job_type: jobType, + }, }); - const connector = connectorResult._source; - if (connector) { - const configuration = Object.entries(connector.configuration).reduce( - (acc, [key, configEntry]) => { - if (isConfigEntry(configEntry)) { - acc[key] = configEntry; - } - return acc; - }, - {} as ConnectorConfiguration - ); - const { - filtering, - index_name: connectorIndexName, - language, - pipeline, - service_type: serviceType, - } = connector; - - const now = new Date().toISOString(); - - return await client.index({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration, - filtering: filtering ? filtering[0]?.active ?? null : null, - id: connectorId, - index_name: targetIndexName || connectorIndexName, - language, - pipeline: pipeline ?? null, - service_type: serviceType, - }, - created_at: now, - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: jobType || SyncJobType.FULL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, - }); - } else { - throw new Error('resource_not_found'); - } }; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts index 6c5d44b00628d..47d666a66a0d9 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts @@ -6,20 +6,23 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; -import { - CONNECTORS_INDEX, - SyncJobType, - SyncStatus, - TriggerMethod, - CURRENT_CONNECTORS_JOB_INDEX, -} from '@kbn/search-connectors'; +import { CONNECTORS_INDEX, SyncJobType } from '@kbn/search-connectors'; -import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '../../../common/constants'; +import { fetchConnectorById, startConnectorSync } from '@kbn/search-connectors'; import { ErrorCode } from '../../../common/types/error_codes'; import { startSync } from './start_sync'; +jest.mock('@kbn/search-connectors', () => { + const originalModule = jest.requireActual('@kbn/search-connectors'); + return { + ...originalModule, + fetchConnectorById: jest.fn(), + startConnectorSync: jest.fn(), + }; +}); + describe('startSync lib function', () => { const mockClient = { asCurrentUser: { @@ -28,6 +31,9 @@ describe('startSync lib function', () => { update: jest.fn(), }, asInternalUser: {}, + transport: { + request: jest.fn(), + }, }; beforeEach(() => { @@ -35,170 +41,71 @@ describe('startSync lib function', () => { }); it('should start a full sync', async () => { - mockClient.asCurrentUser.get.mockImplementation(() => { - return Promise.resolve({ - _id: 'connectorId', - _source: { - api_key_id: null, - configuration: {}, - created_at: null, - custom_scheduling: {}, - error: null, - index_name: 'index_name', - language: null, - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: null, - status: 'not connected', - sync_now: false, - }, - index: CONNECTORS_INDEX, - }); + (fetchConnectorById as jest.Mock).mockResolvedValue({ + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); - await expect( - startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: {}, - filtering: null, - id: 'connectorId', - index_name: 'index_name', - language: null, - pipeline: null, - service_type: null, - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.FULL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, - }); - }); - it('should start a full sync with service type, pipeline', async () => { - mockClient.asCurrentUser.get.mockImplementation(() => { - return Promise.resolve({ - _source: { - api_key_id: null, - configuration: { config: { label: 'label', value: 'haha' } }, - created_at: null, - custom_scheduling: {}, - error: null, - filtering: [{ active: 'filtering' }], - index_name: 'index_name', - language: 'nl', - last_seen: null, - last_sync_error: null, - last_sync_status: null, - last_synced: null, - pipeline: { name: 'pipeline' }, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: 'service_type', - status: 'not connected', - sync_now: false, - }, - index: CONNECTORS_INDEX, - }); - }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (startConnectorSync as jest.Mock).mockResolvedValue({ id: 'fakeId' }); await expect( startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: { - config: { label: 'label', value: 'haha' }, - }, - filtering: 'filtering', - id: 'connectorId', - index_name: 'index_name', - language: 'nl', - pipeline: { name: 'pipeline' }, - service_type: 'service_type', - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.FULL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, + ).resolves.toEqual({ id: 'fakeId' }); + + expect(startConnectorSync).toHaveBeenCalledWith(mockClient.asCurrentUser, { + connectorId: 'connectorId', + jobType: 'full', }); }); - it('should not create index if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementation(() => { - return Promise.resolve({}); - }); + it('should not create job if there is no connector', async () => { + (fetchConnectorById as jest.Mock).mockResolvedValue(undefined); await expect( startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).rejects.toEqual(new Error(ErrorCode.RESOURCE_NOT_FOUND)); - expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); + expect(startConnectorSync).not.toHaveBeenCalled(); }); it('should set sync_now for crawler and not index a sync job', async () => { - mockClient.asCurrentUser.get.mockImplementation(() => { - return Promise.resolve({ - _primary_term: 1, - _seq_no: 10, - _source: { - api_key_id: null, - configuration: { config: { label: 'label', value: 'haha' } }, - created_at: null, - custom_scheduling: {}, - error: null, - filtering: [{ active: 'filtering' }], - index_name: 'index_name', - language: 'nl', - last_seen: null, - last_sync_error: null, - last_sync_status: null, - last_synced: null, - pipeline: { name: 'pipeline' }, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: 'elastic-crawler', - status: 'not connected', - sync_now: false, - }, - index: CONNECTORS_INDEX, - }); + (fetchConnectorById as jest.Mock).mockResolvedValue({ + api_key_id: null, + configuration: { config: { label: 'label', value: 'haha' } }, + created_at: null, + custom_scheduling: {}, + error: null, + filtering: [{ active: 'filtering' }], + id: 'connectorId', + index_name: 'index_name', + language: 'nl', + last_seen: null, + last_sync_error: null, + last_sync_status: null, + last_synced: null, + pipeline: { name: 'pipeline' }, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: 'elastic-crawler', + status: 'not connected', + sync_now: false, }); + mockClient.asCurrentUser.update.mockImplementation(() => ({ _id: 'fakeId' })); await expect( @@ -209,7 +116,7 @@ describe('startSync lib function', () => { 'syncConfig' ) ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); + expect(startConnectorSync).not.toHaveBeenCalled(); expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ doc: { configuration: { @@ -219,40 +126,35 @@ describe('startSync lib function', () => { sync_now: true, }, id: 'connectorId', - if_primary_term: 1, - if_seq_no: 10, index: CONNECTORS_INDEX, }); }); it('should start an incremental sync', async () => { - mockClient.asCurrentUser.get.mockImplementation(() => { - return Promise.resolve({ - _id: 'connectorId', - _source: { - api_key_id: null, - configuration: {}, - created_at: null, - custom_scheduling: {}, - error: null, - filtering: [], - index_name: 'index_name', - language: null, - last_access_control_sync_status: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: null, - status: 'not connected', - sync_now: false, - }, - index: CONNECTORS_INDEX, - }); + (fetchConnectorById as jest.Mock).mockResolvedValue({ + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + + (startConnectorSync as jest.Mock).mockResolvedValue({ id: 'fakeId' }); await expect( startSync( @@ -260,70 +162,43 @@ describe('startSync lib function', () => { 'connectorId', SyncJobType.INCREMENTAL ) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: {}, - filtering: null, - id: 'connectorId', - index_name: 'index_name', - language: null, - pipeline: null, - service_type: null, - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.INCREMENTAL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, + ).resolves.toEqual({ id: 'fakeId' }); + + expect(startConnectorSync).toHaveBeenCalledWith(mockClient.asCurrentUser, { + connectorId: 'connectorId', + jobType: 'incremental', }); }); it('should start an access control sync', async () => { - mockClient.asCurrentUser.get.mockImplementation(() => { - return Promise.resolve({ - _id: 'connectorId', - _source: { - api_key_id: null, - configuration: { - use_document_level_security: { - value: true, - }, - }, - created_at: null, - custom_scheduling: {}, - error: null, - index_name: 'search-index_name', - language: null, - last_access_control_sync_status: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, - service_type: null, - status: 'not connected', - sync_now: false, + (fetchConnectorById as jest.Mock).mockResolvedValue({ + api_key_id: null, + configuration: { + use_document_level_security: { + value: true, }, - index: CONNECTORS_INDEX, - }); + }, + created_at: null, + custom_scheduling: {}, + error: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + + (startConnectorSync as jest.Mock).mockResolvedValue({ id: 'fakeId' }); await expect( startSync( @@ -331,40 +206,11 @@ describe('startSync lib function', () => { 'connectorId', SyncJobType.ACCESS_CONTROL ) - ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration: { - use_document_level_security: { - value: true, - }, - }, - filtering: null, - id: 'connectorId', - index_name: `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}search-index_name`, - language: null, - pipeline: null, - service_type: null, - }, - created_at: expect.any(String), - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: SyncJobType.ACCESS_CONTROL, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, + ).resolves.toEqual({ id: 'fakeId' }); + + expect(startConnectorSync).toHaveBeenCalledWith(mockClient.asCurrentUser, { + connectorId: 'connectorId', + jobType: 'access_control', }); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts index 634d7e97de5ec..363f9f2143f16 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts @@ -9,18 +9,15 @@ import { IScopedClusterClient } from '@kbn/core/server'; import { ConnectorConfiguration, - ConnectorDocument, SyncJobType, CONNECTORS_INDEX, startConnectorSync, + fetchConnectorById, } from '@kbn/search-connectors'; import { isConfigEntry } from '../../../common/connectors/is_category_entry'; -import { - CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX, - ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, -} from '../../../common/constants'; +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; import { ErrorCode } from '../../../common/types/error_codes'; @@ -30,11 +27,8 @@ export const startSync = async ( jobType: SyncJobType, nextSyncConfig?: string // only processed for elastic-crawler service types ) => { - const connectorResult = await client.asCurrentUser.get({ - id: connectorId, - index: CONNECTORS_INDEX, - }); - const connector = connectorResult._source; + const connector = await fetchConnectorById(client.asCurrentUser, connectorId); + if (connector) { const config = Object.entries(connector.configuration).reduce((acc, [key, configEntry]) => { if (isConfigEntry(configEntry)) { @@ -48,7 +42,7 @@ export const startSync = async ( nextSyncConfig: { label: 'nextSyncConfig', value: nextSyncConfig }, } : config; - const { index_name } = connector; + if ( jobType === SyncJobType.ACCESS_CONTROL && !configuration.use_document_level_security?.value @@ -57,27 +51,20 @@ export const startSync = async ( } if (connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE) { + // Crawler-specific actions are not migrated to Connector API return await client.asCurrentUser.update({ doc: { configuration, sync_now: true, }, id: connectorId, - if_primary_term: connectorResult._primary_term, - if_seq_no: connectorResult._seq_no, index: CONNECTORS_INDEX, }); } - const targetIndexName = - jobType === SyncJobType.ACCESS_CONTROL - ? `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}${index_name}` - : index_name ?? undefined; - return await startConnectorSync(client.asCurrentUser, { connectorId, jobType, - targetIndexName, }); } else { throw new Error(ErrorCode.RESOURCE_NOT_FOUND); From 5a3251af2fb1cafc36c002009d0296f8b58f057a Mon Sep 17 00:00:00 2001 From: shainaraskas <58563081+shainaraskas@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:46:40 -0400 Subject: [PATCH 04/82] describe the values in the CCR metrics table (#184545) --- .../monitoring/elasticsearch-details.asciidoc | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/docs/user/monitoring/elasticsearch-details.asciidoc b/docs/user/monitoring/elasticsearch-details.asciidoc index 74c8122d4cad1..f8a8894c29207 100644 --- a/docs/user/monitoring/elasticsearch-details.asciidoc +++ b/docs/user/monitoring/elasticsearch-details.asciidoc @@ -108,16 +108,39 @@ model, the number of forecasts, and the node that runs the job. == CCR To view {ccr} metrics, click **CCR**. For each follower index on the cluster, it -shows information such as the leader index, an indication of how much the -follower index is lagging behind the leader index, the last fetch time, the -number of operations synced, and error messages. If you select a follower index, -you can view the same information for each shard. +shows the following information: + +- **Index**: The name of the follower index. +- **Follows**: The name of the leader index. +- **Alerts**: Any read exceptions that have been triggered for the index or its +shards. +- **Sync Lag (ops)**: How many operations the follower index is lagging behind the +leader index. ++ +This is calculated by finding the difference between the minimum and maximum operation +sequence number on the leader (`leader_max_seq_no`) and the difference between the minimum +and maximum global sequence number checkpoint on the follower (`follower_global_checkpoint`) +for each shard over the selected time period. The difference in `follower_global_checkpoint` +is subtracted from the difference in `leader_max_seq_no` for each shard, and the highest result +across all shards is displayed. +- **Last fetch time**: The time elapsed since the last successful fetch from the leader index. +Represents the longest time elapsed across all of the shards in the follower index. +- **Ops synced**: The number of operations indexed (replicated) into the follower index from +the leader index in the selected time period. ++ +This metric is a sum of the number of operations indexed across all shards over the selected +time period. +- **Error**: Any exceptions returned for the most recent document in the selected time period. + +If you select a follower index, you can view the same information for each shard. +For more information on the properties used to calculate these metrics, refer to the +{ref}/ccr-get-follow-stats.html[get follower stats API] documentation. If you select a shard, you can see graphs for the fetch and operation delays. -You can also see advanced information, which contains the results from the +You can also see advanced information, which contains additional stats from the {ref}/ccr-get-follow-stats.html[get follower stats API]. -For more information, refer to {ref}/xpack-ccr.html[{ccr-cap}]. +Learn more about {ref}/xpack-ccr.html[{ccr-cap}]. [float] [[logs-monitor-page]] From 838be8c8c6778b1758792ae85f2a6acac249af75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Mon, 3 Jun 2024 16:49:36 +0200 Subject: [PATCH 05/82] [Search] Move sync logic to an independent logic (#184589) ## Summary https://github.com/elastic/kibana/assets/1410658/738d539d-cd62-44c5-9c0d-c95d41754d71 - Move sync context menu to shared folder. - Add simple index polling for fetching index if it doesn't exist. This way when if index is created in between connector polls, page will return to fully functioning state. - Fixed Pipeline and SyncRules disabled states as they are heavily dependent on index. Schedule is usable, so it requires only an index name attached to the index. - Moved some sync logic to CancelSync logic and renamed it to SyncsLogic. We can reuse and don't depend on an index to exist. Methods there take their data as a parameter now instead. Some UI states are still checked from IndexViewLogic. Will separate them in followup PRs. - SyncJobs table now takes connector and determines what to show from there. This was done to make it work independently without complicating the state. Both usages had a connector (from different sources but same). So depending on where it is rendered it will show correct data now consistently. - Updated tests, added a small util to check if connector has incremental sync and access control syncs ### 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 - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] 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)) - [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) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../connector_configuration.tsx | 2 +- .../connector_detail/connector_detail.tsx | 6 +- .../connector_detail/connector_view_logic.ts | 18 +- .../native_connector_configuration.tsx | 2 +- .../components/connector_detail/overview.tsx | 5 +- .../connector/cancel_syncs_logic.test.ts | 51 ---- .../connector/cancel_syncs_logic.ts | 56 ---- ...ative_connector_advanced_configuration.tsx | 2 +- .../search_index/index_view_logic.ts | 10 +- .../components/search_index/overview.tsx | 5 +- .../components/search_index/search_index.tsx | 3 +- .../search_index/sync_jobs/sync_jobs.tsx | 30 ++- .../sync_jobs/sync_jobs_view_logic.ts | 36 ++- .../header_actions/header_actions.test.tsx | 7 +- .../header_actions/header_actions.tsx | 10 +- .../syncs_context_menu.test.tsx | 6 +- .../header_actions/syncs_context_menu.tsx | 58 ++--- .../shared/header_actions/syncs_logic.test.ts | 239 ++++++++++++++++++ .../shared/header_actions/syncs_logic.ts | 104 ++++++++ .../utils/connector_helpers.test.ts | 125 +++++++++ .../utils/connector_helpers.ts | 16 ++ 21 files changed, 594 insertions(+), 197 deletions(-) delete mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.test.ts delete mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.ts rename x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/{search_index/components => shared}/header_actions/header_actions.test.tsx (82%) rename x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/{search_index/components => shared}/header_actions/header_actions.tsx (80%) rename x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/{search_index/components => shared}/header_actions/syncs_context_menu.test.tsx (95%) rename x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/{search_index/components => shared}/header_actions/syncs_context_menu.tsx (74%) create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.ts 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 6032230205523..acbfee25ae73b 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 @@ -42,12 +42,12 @@ import { EuiButtonTo, EuiLinkTo } from '../../../shared/react_router_helpers'; import { GenerateConnectorApiKeyApiLogic } from '../../api/connector/generate_connector_api_key_api_logic'; import { CONNECTOR_DETAIL_TAB_PATH } from '../../routes'; import { isAdvancedSyncRuleSnippetEmpty } from '../../utils/sync_rules_helpers'; -import { SyncsContextMenu } from '../search_index/components/header_actions/syncs_context_menu'; import { ApiKeyConfig } from '../search_index/connector/api_key_configuration'; import { getConnectorTemplate } from '../search_index/connector/constants'; import { ConnectorFilteringLogic } from '../search_index/connector/sync_rules/connector_filtering_logic'; +import { SyncsContextMenu } from '../shared/header_actions/syncs_context_menu'; import { AttachIndexBox } from './attach_index_box'; import { ConnectorDetailTabId } from './connector_detail'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx index be3f7964fb370..955a8b79f60dc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx @@ -18,12 +18,12 @@ import { CONNECTOR_DETAIL_TAB_PATH } from '../../routes'; import { connectorsBreadcrumbs } from '../connectors/connectors'; import { EnterpriseSearchContentPageTemplate } from '../layout/page_template'; -import { getHeaderActions } from '../search_index/components/header_actions/header_actions'; import { ConnectorScheduling } from '../search_index/connector/connector_scheduling'; import { ConnectorSyncRules } from '../search_index/connector/sync_rules/connector_rules'; import { SearchIndexDocuments } from '../search_index/documents'; import { SearchIndexIndexMappings } from '../search_index/index_mappings'; import { SearchIndexPipelines } from '../search_index/pipelines/pipelines'; +import { getHeaderActions } from '../shared/header_actions/header_actions'; import { ConnectorConfiguration } from './connector_configuration'; import { ConnectorNameAndDescription } from './connector_name_and_description'; @@ -137,7 +137,7 @@ export const ConnectorDetail: React.FC = () => { ? [ { content: , - disabled: !connector?.index_name, + disabled: !index, id: ConnectorDetailTabId.SYNC_RULES, isSelected: tabId === ConnectorDetailTabId.SYNC_RULES, label: i18n.translate( @@ -200,7 +200,7 @@ export const ConnectorDetail: React.FC = () => { const PIPELINES_TAB = { content: , - disabled: !connector?.index_name, + disabled: !index, id: ConnectorDetailTabId.PIPELINES, isSelected: tabId === ConnectorDetailTabId.PIPELINES, label: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts index 42d881300ac5d..69049a2709f58 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts @@ -12,7 +12,6 @@ import { FeatureName, IngestPipelineParams, IngestionMethod, - IngestionStatus, } from '@kbn/search-connectors'; import { Status } from '../../../../../common/types/api'; @@ -30,6 +29,11 @@ import { import { FetchIndexActions, FetchIndexApiLogic } from '../../api/index/fetch_index_api_logic'; import { ElasticsearchViewIndex } from '../../types'; +import { + hasDocumentLevelSecurityFeature, + hasIncrementalSyncFeature, +} from '../../utils/connector_helpers'; + import { ConnectorNameAndDescriptionLogic, ConnectorNameAndDescriptionActions, @@ -71,7 +75,6 @@ export interface ConnectorViewValues { index: ElasticsearchViewIndex | undefined; indexName: string; ingestionMethod: IngestionMethod; - ingestionStatus: IngestionStatus; isCanceling: boolean; isHiddenIndex: boolean; isLoading: boolean; @@ -142,6 +145,11 @@ export const ConnectorViewLogic = kea { + if (!values.index && connector?.index_name) { + actions.fetchIndex({ indexName: connector.index_name }); + } + }, }), path: ['enterprise_search', 'content', 'connector_view_logic'], selectors: ({ selectors }) => ({ @@ -188,8 +196,7 @@ export const ConnectorViewLogic = kea [selectors.connector], - (connector?: Connector) => - connector?.features?.[FeatureName.DOCUMENT_LEVEL_SECURITY]?.enabled || false, + (connector?: Connector) => hasDocumentLevelSecurityFeature(connector), ], hasFilteringFeature: [ () => [selectors.hasAdvancedFilteringFeature, selectors.hasBasicFilteringFeature], @@ -197,8 +204,7 @@ export const ConnectorViewLogic = kea [selectors.connector], - (connector?: Connector) => - connector?.features?.[FeatureName.INCREMENTAL_SYNC]?.enabled || false, + (connector?: Connector) => hasIncrementalSyncFeature(connector), ], htmlExtraction: [ () => [selectors.connector], 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 4660ad75fe905..ada3b65114ef1 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 @@ -38,11 +38,11 @@ import { GenerateConnectorApiKeyApiLogic } from '../../api/connector/generate_co import { CONNECTOR_DETAIL_TAB_PATH } from '../../routes'; import { hasConfiguredConfiguration } from '../../utils/has_configured_configuration'; -import { SyncsContextMenu } from '../search_index/components/header_actions/syncs_context_menu'; import { ApiKeyConfig } from '../search_index/connector/api_key_configuration'; import { ConvertConnector } from '../search_index/connector/native_connector_configuration/convert_connector'; import { NativeConnectorConfigurationConfig } from '../search_index/connector/native_connector_configuration/native_connector_configuration_config'; import { ResearchConfiguration } from '../search_index/connector/native_connector_configuration/research_configuration'; +import { SyncsContextMenu } from '../shared/header_actions/syncs_context_menu'; import { AttachIndexBox } from './attach_index_box'; import { ConnectorDetailTabId } from './connector_detail'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx index 53dc7a601ad28..7e5b5cf61b475 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx @@ -217,10 +217,7 @@ export const ConnectorDetailOverview: React.FC = () => { {connector && connector.service_type !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE && ( <> - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.test.ts deleted file mode 100644 index 36ee9b44ac9d9..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.test.ts +++ /dev/null @@ -1,51 +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 { LogicMounter } from '../../../../__mocks__/kea_logic'; - -import { indices } from '../../../__mocks__/search_indices.mock'; - -import { FetchIndexApiLogic } from '../../../api/index/fetch_index_api_logic'; -import { IndexViewLogic } from '../index_view_logic'; - -import { CancelSyncsLogic } from './cancel_syncs_logic'; - -describe('CancelSyncsLogic', () => { - const { mount } = new LogicMounter(CancelSyncsLogic); - const { mount: IndexViewLogicMount } = new LogicMounter(IndexViewLogic); - const { mount: FetchIndexApiLogicMount } = new LogicMounter(FetchIndexApiLogic); - const DEFAULT_VALUES = { - connectorId: null, - isConnectorIndex: false, - }; - - beforeEach(() => { - jest.clearAllMocks(); - IndexViewLogicMount(); - FetchIndexApiLogicMount(); - mount(); - }); - it('has expected default values', () => { - expect(CancelSyncsLogic.values).toEqual(DEFAULT_VALUES); - }); - - describe('actions', () => { - describe('cancelSyncs', () => { - it('should not call makeCancelSyncRequest if index is not a connector', () => { - CancelSyncsLogic.actions.makeCancelSyncsRequest = jest.fn(); - CancelSyncsLogic.actions.cancelSyncs(); - expect(CancelSyncsLogic.actions.makeCancelSyncsRequest).not.toHaveBeenCalled(); - }); - it('should call clearFlashMessages and request if index is a connector', () => { - CancelSyncsLogic.actions.makeCancelSyncsRequest = jest.fn(); - FetchIndexApiLogic.actions.apiSuccess(indices[1]); - CancelSyncsLogic.actions.cancelSyncs(); - expect(CancelSyncsLogic.actions.makeCancelSyncsRequest).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.ts deleted file mode 100644 index 055ace3cbc013..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/cancel_syncs_logic.ts +++ /dev/null @@ -1,56 +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 { kea, MakeLogicType } from 'kea'; - -import { Actions } from '../../../../shared/api_logic/create_api_logic'; - -import { - CancelSyncsApiArgs, - CancelSyncsApiLogic, -} from '../../../api/connector/cancel_syncs_api_logic'; -import { IndexViewLogic } from '../index_view_logic'; - -type CancelSyncsApiActions = Actions; - -interface CancelSyncsLogicValues { - connectorId?: string; - isConnectorIndex: boolean; -} - -export interface CancelSyncsLogicActions { - cancelSyncs: () => void; - cancelSyncsApiError: CancelSyncsApiActions['apiError']; - cancelSyncsApiSuccess: CancelSyncsApiActions['apiSuccess']; - makeCancelSyncsRequest: CancelSyncsApiActions['makeRequest']; -} - -export const CancelSyncsLogic = kea>( - { - actions: { - cancelSyncs: true, - }, - connect: { - actions: [ - CancelSyncsApiLogic, - [ - 'apiError as cancelSyncsApiError', - 'apiSuccess as cancelSyncsApiSuccess', - 'makeRequest as makeCancelSyncsRequest', - ], - ], - values: [IndexViewLogic, ['connectorId', 'isConnectorIndex']], - }, - listeners: ({ actions, values }) => ({ - cancelSyncs: () => { - if (values.isConnectorIndex && values.connectorId) { - actions.makeCancelSyncsRequest({ connectorId: values.connectorId }); - } - }, - }), - } -); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx index 1fca8bed5272e..e6e844c1fc7ee 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx @@ -19,7 +19,7 @@ import { generateEncodedPath } from '../../../../../shared/encode_path_params'; import { EuiButtonTo } from '../../../../../shared/react_router_helpers'; import { SEARCH_INDEX_TAB_PATH } from '../../../../routes'; -import { SyncsContextMenu } from '../../components/header_actions/syncs_context_menu'; +import { SyncsContextMenu } from '../../../shared/header_actions/syncs_context_menu'; import { IndexNameLogic } from '../../index_name_logic'; import { SearchIndexTabId } from '../../search_index'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts index 597757e83534a..7d83041ff9e05 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts @@ -43,6 +43,10 @@ import { import { FetchIndexApiResponse } from '../../api/index/fetch_index_api_logic'; import { ElasticsearchViewIndex } from '../../types'; +import { + hasDocumentLevelSecurityFeature, + hasIncrementalSyncFeature, +} from '../../utils/connector_helpers'; import { getIngestionMethod, getIngestionStatus, @@ -288,8 +292,7 @@ export const IndexViewLogic = kea [selectors.connector], - (connector?: Connector) => - connector?.features?.[FeatureName.DOCUMENT_LEVEL_SECURITY]?.enabled || false, + (connector?: Connector) => hasDocumentLevelSecurityFeature(connector), ], hasFilteringFeature: [ () => [selectors.hasAdvancedFilteringFeature, selectors.hasBasicFilteringFeature], @@ -297,8 +300,7 @@ export const IndexViewLogic = kea [selectors.connector], - (connector?: Connector) => - connector?.features?.[FeatureName.INCREMENTAL_SYNC]?.enabled || false, + (connector?: Connector) => hasIncrementalSyncFeature(connector), ], htmlExtraction: [ () => [selectors.connector], diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx index f8ccf71026e83..2baf9bb2b530c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx @@ -135,10 +135,7 @@ export const SearchIndexOverview: React.FC = () => { {isConnectorIndex(indexData) && ( <> - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx index ea23a0b33479e..09e6b494f94e4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx @@ -27,7 +27,8 @@ import { EnterpriseSearchContentPageTemplate } from '../layout/page_template'; import { baseBreadcrumbs } from '../search_indices'; -import { getHeaderActions } from './components/header_actions/header_actions'; +import { getHeaderActions } from '../shared/header_actions/header_actions'; + import { ConnectorScheduling } from './connector/connector_scheduling'; import { ConnectorSyncRules } from './connector/sync_rules/connector_rules'; import { AutomaticCrawlScheduler } from './crawler/automatic_crawl_scheduler/automatic_crawl_scheduler'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx index 49f4959100736..9495716e1a5e0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx @@ -13,27 +13,24 @@ import { EuiButtonGroup } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { SyncJobsTable } from '@kbn/search-connectors'; +import { Connector, SyncJobsTable } from '@kbn/search-connectors'; import { KibanaLogic } from '../../../../shared/kibana'; -import { IndexViewLogic } from '../index_view_logic'; +import { hasDocumentLevelSecurityFeature } from '../../../utils/connector_helpers'; import { SyncJobsViewLogic } from './sync_jobs_view_logic'; export interface SyncJobsProps { - errorOnAccessSync?: boolean; - errorOnContentSync?: boolean; + connector: Connector; } -export const SyncJobs: React.FC = ({ - errorOnAccessSync = false, - errorOnContentSync = false, -}) => { - const { hasDocumentLevelSecurityFeature } = useValues(IndexViewLogic); +export const SyncJobs: React.FC = ({ connector }) => { const { productFeatures } = useValues(KibanaLogic); const shouldShowAccessSyncs = - productFeatures.hasDocumentLevelSecurityEnabled && hasDocumentLevelSecurityFeature; + productFeatures.hasDocumentLevelSecurityEnabled && hasDocumentLevelSecurityFeature(connector); + const errorOnAccessSync = Boolean(connector.last_access_control_sync_error); + const errorOnContentSync = Boolean(connector.last_sync_error); const { connectorId, syncJobsPagination: pagination, @@ -43,8 +40,17 @@ export const SyncJobs: React.FC = ({ selectedSyncJobCategory, syncTriggeredLocally, } = useValues(SyncJobsViewLogic); - const { fetchSyncJobs, cancelSyncJob, setCancelSyncJob, setSelectedSyncJobCategory } = - useActions(SyncJobsViewLogic); + const { + setConnectorId, + fetchSyncJobs, + cancelSyncJob, + setCancelSyncJob, + setSelectedSyncJobCategory, + } = useActions(SyncJobsViewLogic); + + useEffect(() => { + setConnectorId(connector.id); + }, [connector]); useEffect(() => { if (connectorId) { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts index e0a6176e38bff..647a19c62d360 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts @@ -27,8 +27,7 @@ import { FetchSyncJobsResponse, } from '../../../api/connector/fetch_sync_jobs_api_logic'; -import { CancelSyncsLogic, CancelSyncsLogicActions } from '../connector/cancel_syncs_logic'; -import { IndexViewActions, IndexViewLogic } from '../index_view_logic'; +import { SyncsLogic, SyncsLogicActions } from '../../shared/header_actions/syncs_logic'; const UI_REFRESH_INTERVAL = 2000; @@ -41,8 +40,8 @@ export interface SyncJobsViewActions { cancelSyncError: CancelSyncApiActions['apiError']; cancelSyncJob: CancelSyncApiActions['makeRequest']; cancelSyncSuccess: CancelSyncApiActions['apiSuccess']; - cancelSyncsApiError: CancelSyncsLogicActions['cancelSyncsApiError']; - cancelSyncsApiSuccess: CancelSyncsLogicActions['cancelSyncsApiSuccess']; + cancelSyncsApiError: SyncsLogicActions['cancelSyncsApiError']; + cancelSyncsApiSuccess: SyncsLogicActions['cancelSyncsApiSuccess']; fetchSyncJobs: Actions['makeRequest']; fetchSyncJobsApiSuccess: Actions['apiSuccess']; fetchSyncJobsError: Actions['apiError']; @@ -51,12 +50,13 @@ export interface SyncJobsViewActions { setCancelSyncJob: (syncJobId: ConnectorSyncJob['id'] | undefined) => { syncJobId: ConnectorSyncJob['id'] | null; }; + setConnectorId: (connectorId: string | null) => { connectorId: string | null }; setSelectedSyncJobCategory: (category: 'content' | 'access_control') => { category: 'content' | 'access_control'; }; - startAccessControlSync: IndexViewActions['startAccessControlSync']; - startIncrementalSync: IndexViewActions['startIncrementalSync']; - startSync: IndexViewActions['startSync']; + startAccessControlSync: SyncsLogicActions['startAccessControlSync']; + startIncrementalSync: SyncsLogicActions['startIncrementalSync']; + startSync: SyncsLogicActions['startSync']; } export interface SyncJobsViewValues { @@ -77,6 +77,7 @@ export const SyncJobsViewLogic = kea ({ syncJobId: syncJobId ?? null }), + setConnectorId: (connectorId) => ({ connectorId }), setSelectedSyncJobCategory: (category) => ({ category }), }, connect: { @@ -95,14 +96,17 @@ export const SyncJobsViewLogic = kea connectorId, + }, + ], selectedSyncJobCategory: [ 'content', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/header_actions.test.tsx similarity index 82% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/header_actions.test.tsx index 9fe8bdd85cee0..9396bca58a025 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/header_actions.test.tsx @@ -5,14 +5,15 @@ * 2.0. */ -import { apiIndex, connectorIndex, crawlerIndex } from '../../../../__mocks__/view_index.mock'; +import { apiIndex, connectorIndex, crawlerIndex } from '../../../__mocks__/view_index.mock'; import React from 'react'; -import { CrawlerStatusIndicator } from '../../../shared/crawler_status_indicator/crawler_status_indicator'; +import { SearchPlaygroundPopover } from '../../search_index/components/header_actions/search_playground_popover'; + +import { CrawlerStatusIndicator } from '../crawler_status_indicator/crawler_status_indicator'; import { getHeaderActions } from './header_actions'; -import { SearchPlaygroundPopover } from './search_playground_popover'; import { SyncsContextMenu } from './syncs_context_menu'; describe('Header Actions', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/header_actions.tsx similarity index 80% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/header_actions.tsx index 14900cbd4fa3a..900e454053cf6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/header_actions.tsx @@ -9,11 +9,13 @@ import React from 'react'; import { Connector } from '@kbn/search-connectors'; -import { ElasticsearchIndexWithIngestion } from '../../../../../../../common/types/indices'; -import { isCrawlerIndex, isConnectorIndex, getIngestionMethod } from '../../../../utils/indices'; -import { CrawlerStatusIndicator } from '../../../shared/crawler_status_indicator/crawler_status_indicator'; +import { ElasticsearchIndexWithIngestion } from '../../../../../../common/types/indices'; +import { isCrawlerIndex, isConnectorIndex, getIngestionMethod } from '../../../utils/indices'; + +import { SearchPlaygroundPopover } from '../../search_index/components/header_actions/search_playground_popover'; + +import { CrawlerStatusIndicator } from '../crawler_status_indicator/crawler_status_indicator'; -import { SearchPlaygroundPopover } from './search_playground_popover'; import { SyncsContextMenu } from './syncs_context_menu'; // Used to populate rightSideItems of an EuiPageTemplate, which is rendered right-to-left diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/syncs_context_menu.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_context_menu.test.tsx similarity index 95% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/syncs_context_menu.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_context_menu.test.tsx index 2cccee94f9609..13088a0d4e8ec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/syncs_context_menu.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_context_menu.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import '../../../../../__mocks__/shallow_useeffect.mock'; -import { setMockValues, setMockActions } from '../../../../../__mocks__/kea_logic'; +import '../../../../__mocks__/shallow_useeffect.mock'; +import { setMockValues, setMockActions } from '../../../../__mocks__/kea_logic'; import React from 'react'; @@ -20,7 +20,7 @@ import { import { IngestionStatus, IngestionMethod } from '@kbn/search-connectors'; import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { Status } from '../../../../../../../common/types/api'; +import { Status } from '../../../../../../common/types/api'; import { SyncsContextMenu } from './syncs_context_menu'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/syncs_context_menu.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_context_menu.tsx similarity index 74% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/syncs_context_menu.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_context_menu.tsx index 1f0eaaf6f16ae..c525c2f672075 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/syncs_context_menu.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_context_menu.tsx @@ -22,25 +22,26 @@ import { import { i18n } from '@kbn/i18n'; -import { IngestionStatus } from '@kbn/search-connectors'; +import { ConnectorStatus, IngestionStatus } from '@kbn/search-connectors'; -import { Status } from '../../../../../../../common/types/api'; -import { HttpLogic } from '../../../../../shared/http'; -import { KibanaLogic } from '../../../../../shared/kibana'; -import { CancelSyncsApiLogic } from '../../../../api/connector/cancel_syncs_api_logic'; -import { ConnectorViewLogic } from '../../../connector_detail/connector_view_logic'; -import { CancelSyncsLogic } from '../../connector/cancel_syncs_logic'; -import { IndexViewLogic } from '../../index_view_logic'; +import { Status } from '../../../../../../common/types/api'; +import { HttpLogic } from '../../../../shared/http'; +import { KibanaLogic } from '../../../../shared/kibana'; +import { CancelSyncsApiLogic } from '../../../api/connector/cancel_syncs_api_logic'; +import { ConnectorViewLogic } from '../../connector_detail/connector_view_logic'; + +import { IndexViewLogic } from '../../search_index/index_view_logic'; + +import { SyncsLogic } from './syncs_logic'; export const SyncsContextMenu: React.FC = () => { const { config, productFeatures } = useValues(KibanaLogic); - const { ingestionMethod, ingestionStatus, isCanceling, isSyncing, isWaitingForSync } = - useValues(IndexViewLogic); + const { ingestionStatus, isCanceling, isSyncing, isWaitingForSync } = useValues(IndexViewLogic); const { connector, hasDocumentLevelSecurityFeature, hasIncrementalSyncFeature } = useValues(ConnectorViewLogic); - const { cancelSyncs } = useActions(CancelSyncsLogic); const { status } = useValues(CancelSyncsApiLogic); - const { startSync, startIncrementalSync, startAccessControlSync } = useActions(IndexViewLogic); + const { startSync, startIncrementalSync, startAccessControlSync, cancelSyncs } = + useActions(SyncsLogic); const { errorConnectingMessage } = useValues(HttpLogic); const [isPopoverOpen, setPopover] = useState(false); @@ -56,7 +57,7 @@ export const SyncsContextMenu: React.FC = () => { } ); } - if (isSyncing && ingestionStatus !== IngestionStatus.ERROR) { + if (isSyncing && connector?.status !== ConnectorStatus.ERROR) { return i18n.translate('xpack.enterpriseSearch.content.index.syncButton.syncing.label', { defaultMessage: 'Syncing', }); @@ -90,8 +91,8 @@ export const SyncsContextMenu: React.FC = () => { : [ { // @ts-ignore - data-* attributes are applied but doesn't exist on types - 'data-telemetry-id': `entSearchContent-${ingestionMethod}-header-sync-startSync`, - 'data-test-subj': `entSearchContent-${ingestionMethod}-header-sync-startSync`, + 'data-telemetry-id': `entSearchContent-connector-header-sync-startSync`, + 'data-test-subj': `entSearchContent-connector-header-sync-startSync`, disabled: isSyncsDisabled, icon: 'play', name: i18n.translate('xpack.enterpriseSearch.index.header.more.fullSync', { @@ -99,7 +100,7 @@ export const SyncsContextMenu: React.FC = () => { }), onClick: () => { closePopover(); - startSync(); + startSync(connector); }, }, ]), @@ -107,10 +108,8 @@ export const SyncsContextMenu: React.FC = () => { ? [ { // @ts-ignore - data-* attributes are applied but doesn't exist on types - 'data-telemetry-id': - 'entSearchContent-${ingestionMethod}-header-sync-more-incrementalSync', - 'data-test-subj': - 'entSearchContent-${ingestionMethod}-header-sync-more-incrementalSync', + 'data-telemetry-id': `entSearchContent-connector-header-sync-more-incrementalSync`, + 'data-test-subj': `entSearchContent-connector-header-sync-more-incrementalSync`, disabled: isSyncsDisabled, icon: 'play', name: i18n.translate('xpack.enterpriseSearch.index.header.more.incrementalSync', { @@ -118,7 +117,7 @@ export const SyncsContextMenu: React.FC = () => { }), onClick: () => { closePopover(); - startIncrementalSync(); + startIncrementalSync(connector); }, }, ] @@ -127,10 +126,8 @@ export const SyncsContextMenu: React.FC = () => { ? [ { // @ts-ignore - data-* attributes are applied but doesn't exist on types - 'data-telemetry-id': - 'entSearchContent-${ingestionMethod}-header-sync-more-accessControlSync', - 'data-test-subj': - 'entSearchContent-${ingestionMethod}-header-sync-more-accessControlSync', + 'data-telemetry-id': `entSearchContent-connector-header-sync-more-accessControlSync`, + 'data-test-subj': `entSearchContent-connector-header-sync-more-accessControlSync`, disabled: Boolean( isSyncsDisabled || !connector?.configuration.use_document_level_security?.value ), @@ -140,14 +137,14 @@ export const SyncsContextMenu: React.FC = () => { }), onClick: () => { closePopover(); - startAccessControlSync(); + startAccessControlSync(connector); }, }, ] : []), { // @ts-ignore - data-* attributes are applied but doesn't exist on types - 'data-telemetry-id': `entSearchContent-${ingestionMethod}-header-sync-cancelSync`, + 'data-telemetry-id': `entSearchContent-connector-header-sync-cancelSync`, disabled: (isCanceling && ingestionStatus !== IngestionStatus.ERROR) || status === Status.LOADING, icon: , @@ -162,7 +159,7 @@ export const SyncsContextMenu: React.FC = () => { ), onClick: () => { closePopover(); - cancelSyncs(); + cancelSyncs(connector); }, }, ], @@ -174,7 +171,8 @@ export const SyncsContextMenu: React.FC = () => { { )} - + {getSyncButtonText()} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.test.ts new file mode 100644 index 0000000000000..5406622ff9f3c --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.test.ts @@ -0,0 +1,239 @@ +/* + * 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 { LogicMounter } from '../../../../__mocks__/kea_logic'; + +import { + Connector, + ConnectorStatus, + DisplayType, + FieldType, + FilteringValidationState, + SyncStatus, +} from '@kbn/search-connectors'; + +import { SyncsLogic } from './syncs_logic'; + +const mockConnector: Connector = { + id: '123', + api_key_id: '123123', + api_key_secret_id: '321321', + configuration: { + config_value: { + default_value: null, + depends_on: [], + display: DisplayType.TEXTBOX, + label: 'textbox value', + options: [], + order: 0, + required: true, + sensitive: false, + tooltip: 'tooltip', + type: FieldType.STRING, + ui_restrictions: [], + validations: [], + value: '123', + }, + }, + custom_scheduling: {}, + description: 'test', + error: null, + features: { + document_level_security: { + enabled: false, + }, + incremental_sync: { + enabled: false, + }, + sync_rules: { + advanced: { + enabled: false, + }, + basic: { + enabled: false, + }, + }, + }, + filtering: [ + { + active: { + advanced_snippet: { + created_at: '2024-05-28T11:27:53.460Z', + updated_at: '2024-05-28T11:27:53.460Z', + value: {}, + }, + rules: [ + { + created_at: '2024-05-28T11:27:53.460Z', + field: '_', + id: 'DEFAULT', + order: 0, + policy: 'include', + rule: 'regex', + updated_at: '2024-05-28T11:27:53.460Z', + value: '.*', + }, + ], + validation: { + errors: [], + state: FilteringValidationState.VALID, + }, + }, + domain: 'DEFAULT', + draft: { + advanced_snippet: { + created_at: '2024-05-28T11:27:53.460Z', + updated_at: '2024-05-28T11:27:53.460Z', + value: {}, + }, + rules: [ + { + created_at: '2024-05-28T11:27:53.460Z', + field: '_', + id: 'DEFAULT', + order: 0, + policy: 'include', + rule: 'regex', + updated_at: '2024-05-28T11:27:53.460Z', + value: '.*', + }, + ], + validation: { + errors: [], + state: FilteringValidationState.VALID, + }, + }, + }, + ], + index_name: 'test', + is_native: false, + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: SyncStatus.CANCELED, + last_deleted_document_count: 0, + last_incremental_sync_scheduled_at: null, + last_indexed_document_count: 44, + last_seen: '2024-05-31T12:55:30.301795+00:00', + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: SyncStatus.COMPLETED, + last_synced: '2024-05-31T12:42:17.191699+00:00', + name: 'test', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: true, + }, + scheduling: { + access_control: { + enabled: false, + interval: '0 0 0 * * ?', + }, + full: { + enabled: false, + interval: '0 0 0 * * ?', + }, + incremental: { + enabled: false, + interval: '0 0 0 * * ?', + }, + }, + service_type: 'gmail', + status: ConnectorStatus.CONNECTED, + sync_now: false, +}; + +describe('SyncsLogic', () => { + const { mount } = new LogicMounter(SyncsLogic); + const DEFAULT_VALUES = {}; + + beforeEach(() => { + jest.clearAllMocks(); + mount(); + }); + it('has expected default values', () => { + expect(SyncsLogic.values).toEqual(DEFAULT_VALUES); + }); + + describe('actions', () => { + describe('cancelSyncs', () => { + it("should not call makeCancelSyncRequest if connector doesn't exist", () => { + SyncsLogic.actions.makeCancelSyncsRequest = jest.fn(); + SyncsLogic.actions.cancelSyncs(undefined); + expect(SyncsLogic.actions.makeCancelSyncsRequest).not.toHaveBeenCalled(); + }); + it('should call clearFlashMessages and request if a connector is passed', () => { + SyncsLogic.actions.makeCancelSyncsRequest = jest.fn(); + SyncsLogic.actions.cancelSyncs(mockConnector); + expect(SyncsLogic.actions.makeCancelSyncsRequest).toHaveBeenCalled(); + }); + }); + + describe('startAccessControlSync', () => { + it("should not call makeStartAccessControlSyncRequest if connector doesn't exist", () => { + SyncsLogic.actions.makeStartAccessControlSyncRequest = jest.fn(); + SyncsLogic.actions.startAccessControlSync(undefined); + expect(SyncsLogic.actions.makeStartAccessControlSyncRequest).not.toHaveBeenCalled(); + }); + it('should call makeStartAccessControlSyncRequest if a connector is passed', () => { + SyncsLogic.actions.makeStartAccessControlSyncRequest = jest.fn(); + SyncsLogic.actions.startAccessControlSync({ + ...mockConnector, + features: { + ...mockConnector.features, + document_level_security: { enabled: true }, + }, + }); + expect(SyncsLogic.actions.makeStartAccessControlSyncRequest).toHaveBeenCalled(); + }); + it('should not call makeStartAccessControlSyncRequest if incremental sync is not enabled', () => { + SyncsLogic.actions.makeStartAccessControlSyncRequest = jest.fn(); + SyncsLogic.actions.startAccessControlSync({ ...mockConnector, features: {} }); + expect(SyncsLogic.actions.makeStartAccessControlSyncRequest).not.toHaveBeenCalled(); + }); + }); + + describe('startIncrementalSync', () => { + it("should not call makeStartIncrementalSyncRequest if connector doesn't exist", () => { + SyncsLogic.actions.makeStartIncrementalSyncRequest = jest.fn(); + SyncsLogic.actions.startIncrementalSync(undefined); + expect(SyncsLogic.actions.makeStartIncrementalSyncRequest).not.toHaveBeenCalled(); + }); + it('should call makeStartIncrementalSyncRequest if a connector is passed', () => { + SyncsLogic.actions.makeStartIncrementalSyncRequest = jest.fn(); + SyncsLogic.actions.startIncrementalSync({ + ...mockConnector, + features: { + ...mockConnector.features, + incremental_sync: { enabled: true }, + }, + }); + expect(SyncsLogic.actions.makeStartIncrementalSyncRequest).toHaveBeenCalled(); + }); + it('should not call makeStartIncrementalSyncRequest if incremental sync is not enabled', () => { + SyncsLogic.actions.makeStartIncrementalSyncRequest = jest.fn(); + SyncsLogic.actions.startIncrementalSync({ ...mockConnector, features: {} }); + expect(SyncsLogic.actions.makeStartIncrementalSyncRequest).not.toHaveBeenCalled(); + }); + }); + + describe('startSync', () => { + it("should not call makeStartSyncRequest if connector doesn't exist", () => { + SyncsLogic.actions.makeStartSyncRequest = jest.fn(); + SyncsLogic.actions.startSync(undefined); + expect(SyncsLogic.actions.makeStartSyncRequest).not.toHaveBeenCalled(); + }); + it('should call makeStartSyncRequest if a connector is passed', () => { + SyncsLogic.actions.makeStartSyncRequest = jest.fn(); + SyncsLogic.actions.startSync(mockConnector); + expect(SyncsLogic.actions.makeStartSyncRequest).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.ts new file mode 100644 index 0000000000000..14efffa2fc5f1 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/header_actions/syncs_logic.ts @@ -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 { kea, MakeLogicType } from 'kea'; + +import { Connector } from '@kbn/search-connectors'; + +import { Actions } from '../../../../shared/api_logic/create_api_logic'; +import { KibanaLogic } from '../../../../shared/kibana'; + +import { + CancelSyncsApiArgs, + CancelSyncsApiLogic, +} from '../../../api/connector/cancel_syncs_api_logic'; +import { + StartAccessControlSyncApiLogic, + StartAccessControlSyncArgs, +} from '../../../api/connector/start_access_control_sync_api_logic'; +import { + StartIncrementalSyncApiLogic, + StartIncrementalSyncArgs, +} from '../../../api/connector/start_incremental_sync_api_logic'; +import { StartSyncApiLogic, StartSyncArgs } from '../../../api/connector/start_sync_api_logic'; +import { + hasDocumentLevelSecurityFeature, + hasIncrementalSyncFeature, +} from '../../../utils/connector_helpers'; + +type CancelSyncsApiActions = Actions; +type StartSyncApiActions = Actions; +type StartIncrementalSyncApiActions = Actions; +type StartAccessControlSyncApiActions = Actions; + +export interface SyncsLogicActions { + cancelSyncs(connector?: Connector): { connector: Connector }; + cancelSyncsApiError: CancelSyncsApiActions['apiError']; + cancelSyncsApiSuccess: CancelSyncsApiActions['apiSuccess']; + makeCancelSyncsRequest: CancelSyncsApiActions['makeRequest']; + makeStartAccessControlSyncRequest: StartAccessControlSyncApiActions['makeRequest']; + makeStartIncrementalSyncRequest: StartIncrementalSyncApiActions['makeRequest']; + makeStartSyncRequest: StartSyncApiActions['makeRequest']; + startAccessControlSync(connector?: Connector): { connector: Connector }; + startIncrementalSync(connector?: Connector): { connector: Connector }; + startSync(connector?: Connector): { connector: Connector }; +} + +export const SyncsLogic = kea>({ + actions: { + cancelSyncs: (connector?: Connector) => ({ connector }), + startAccessControlSync: (connector?: Connector) => ({ connector }), + startIncrementalSync: (connector?: Connector) => ({ connector }), + startSync: (connector?: Connector) => ({ connector }), + }, + connect: { + actions: [ + CancelSyncsApiLogic, + [ + 'apiError as cancelSyncsApiError', + 'apiSuccess as cancelSyncsApiSuccess', + 'makeRequest as makeCancelSyncsRequest', + ], + StartAccessControlSyncApiLogic, + ['makeRequest as makeStartAccessControlSyncRequest'], + StartIncrementalSyncApiLogic, + ['makeRequest as makeStartIncrementalSyncRequest'], + StartSyncApiLogic, + ['makeRequest as makeStartSyncRequest'], + ], + }, + listeners: ({ actions }) => ({ + cancelSyncs: ({ connector }) => { + if (connector?.id) { + actions.makeCancelSyncsRequest({ connectorId: connector.id }); + } + }, + startAccessControlSync: ({ connector }) => { + if ( + connector?.id && + hasDocumentLevelSecurityFeature(connector) && + KibanaLogic.values.productFeatures.hasDocumentLevelSecurityEnabled + ) { + actions.makeStartAccessControlSyncRequest({ connectorId: connector.id }); + } + }, + startIncrementalSync: ({ connector }) => { + if ( + connector?.id && + hasIncrementalSyncFeature(connector) && + KibanaLogic.values.productFeatures.hasIncrementalSyncEnabled + ) { + actions.makeStartIncrementalSyncRequest({ connectorId: connector.id }); + } + }, + startSync: ({ connector }) => { + if (connector?.id) { + actions.makeStartSyncRequest({ connectorId: connector.id }); + } + }, + }), +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.test.ts new file mode 100644 index 0000000000000..f3187fbea88ee --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.test.ts @@ -0,0 +1,125 @@ +/* + * 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 { Connector, ConnectorStatus } from '@kbn/search-connectors'; + +import { hasDocumentLevelSecurityFeature, hasIncrementalSyncFeature } from './connector_helpers'; + +const mockConnector: Connector = { + api_key_id: '', + api_key_secret_id: '', + configuration: {}, + custom_scheduling: {}, + features: { + incremental_sync: { + enabled: true, + }, + document_level_security: { + enabled: true, + }, + }, + description: null, + error: null, + filtering: [], + id: '', + index_name: null, + is_native: false, + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_deleted_document_count: null, + last_incremental_sync_scheduled_at: null, + last_indexed_document_count: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + name: '', + scheduling: { + access_control: { + enabled: false, + interval: '', + }, + full: { + enabled: false, + interval: '', + }, + incremental: { + enabled: false, + interval: '', + }, + }, + service_type: null, + status: ConnectorStatus.CREATED, + sync_now: false, +}; + +describe('connector_helpers', () => { + describe('hasIncrementalSyncFeature', () => { + it('returns true if connector has incremental sync feature enabled', () => { + const connector: Connector = { + ...mockConnector, + features: { + incremental_sync: { + enabled: true, + }, + }, + }; + expect(hasIncrementalSyncFeature(connector)).toEqual(true); + }); + + it('returns false if connector does not have incremental sync feature enabled', () => { + const connector = { + ...mockConnector, + features: { + incremental_sync: { + enabled: false, + }, + }, + }; + expect(hasIncrementalSyncFeature(connector)).toEqual(false); + }); + + it('returns false if connector is undefined', () => { + const connector = undefined; + expect(hasIncrementalSyncFeature(connector)).toEqual(false); + }); + }); + + describe('hasDocumentLevelSecurityFeature', () => { + it('returns true if connector has document level security feature enabled', () => { + const connector = { + ...mockConnector, + features: { + document_level_security: { + enabled: true, + }, + }, + }; + expect(hasDocumentLevelSecurityFeature(connector)).toEqual(true); + }); + + it('returns false if connector does not have document level security feature enabled', () => { + const connector = { + ...mockConnector, + features: { + document_level_security: { + enabled: false, + }, + }, + }; + expect(hasDocumentLevelSecurityFeature(connector)).toEqual(false); + }); + + it('returns false if connector is undefined', () => { + const connector = undefined; + expect(hasDocumentLevelSecurityFeature(connector)).toEqual(false); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.ts new file mode 100644 index 0000000000000..2d91be4c269b3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_helpers.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Connector, FeatureName } from '@kbn/search-connectors'; + +export const hasIncrementalSyncFeature = (connector: Connector | undefined): boolean => { + return connector?.features?.[FeatureName.INCREMENTAL_SYNC]?.enabled || false; +}; + +export const hasDocumentLevelSecurityFeature = (connector: Connector | undefined): boolean => { + return connector?.features?.[FeatureName.DOCUMENT_LEVEL_SECURITY]?.enabled || false; +}; From 23c84d1eaa7525c45e8ff3dc061dc702781727c7 Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Mon, 3 Jun 2024 17:07:14 +0200 Subject: [PATCH 06/82] [SLO Doc] Fix SLO OpenAPI component links (#184630) ## Summary This PR fixed SLO OpenAPI component links --- .../observability_solution/slo/docs/openapi/slo/README.md | 2 +- .../slo/docs/openapi/slo/components/README.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/README.md b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/README.md index 25491ce3951b4..af8985c964abd 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/README.md +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/README.md @@ -14,7 +14,7 @@ A guide about the OpenApi specification can be found at [https://swagger.io/docs ## Tools It is possible to manually validate the docs before bundling them with the following -command in the `x-pack/plugins/observability_solution/observability/docs/openapi/slo` folder: +command in the `x-pack/plugins/observability_solution/slo/docs/openapi/slo` folder: ```bash make validate diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/README.md b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/README.md index 0841562a33150..6beadcd86e1e9 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/README.md +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/README.md @@ -1,7 +1,7 @@ Reusable components =========== - - `examples` - reusable [Example objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#exampleObject) - - `headers` - reusable [Header objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject) - - `parameters` - reusable [Parameter objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject) - - `schemas` - reusable [Schema objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#schemaObject) + - `examples` - reusable [Example objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#example-object) + - `headers` - reusable [Header objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#header-object) + - `parameters` - reusable [Parameter objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameter-object) + - `schemas` - reusable [Schema objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#schema-object) From b560e09ffae39d9561e184f9bba146b1216d1b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Zaffarano?= Date: Mon, 3 Jun 2024 12:22:31 -0300 Subject: [PATCH 07/82] [Telemetry][Security Solution] Update log events and messages (#184536) ## Summary The second part of the [logging improvement task](https://github.com/elastic/kibana/pull/184175/commits). --- .../lib/telemetry/tasks/configuration.ts | 21 ++++++++++--------- .../lib/telemetry/tasks/detection_rule.ts | 17 +++++++-------- .../server/lib/telemetry/tasks/diagnostic.ts | 13 ++++++------ .../server/lib/telemetry/tasks/filterlists.ts | 13 ++++++------ .../telemetry/tasks/prebuilt_rule_alerts.ts | 13 ++++++------ .../lib/telemetry/tasks/security_lists.ts | 13 ++++++------ .../server/lib/telemetry/tasks/timelines.ts | 14 ++++++------- .../telemetry/tasks/timelines_diagnostic.ts | 14 ++++++------- 8 files changed, 58 insertions(+), 60 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts index 0c95ccf651013..0558971ebf1e3 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts @@ -32,26 +32,27 @@ export function createTelemetryConfigurationTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('configuration')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('configuration'), mdc); const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { const artifactName = 'telemetry-buffer-and-batch-sizes-v1'; const manifest = await artifactService.getArtifact(artifactName); if (manifest.notModified) { - log.l('No new configuration artifact found, skipping...'); + log.debug('No new configuration artifact found, skipping...'); await taskMetricsService.end(trace); return 0; } const configArtifact = manifest.data as unknown as TelemetryConfiguration; - log.l(`Got telemetry configuration artifact: ${JSON.stringify(configArtifact)}`); + log.l('Got telemetry configuration artifact', { + artifact: configArtifact, + }); telemetryConfiguration.max_detection_alerts_batch = configArtifact.max_detection_alerts_batch; @@ -86,9 +87,9 @@ export function createTelemetryConfigurationTaskConfig() { } else { const channel = channelsDict.get(channelName); if (!channel) { - log.l(`Ignoring unknown channel "${channelName}"`); + log.l('Ignoring unknown channel', { channel: channelName }); } else { - log.l(`Updating configuration for channel "${channelName}`); + log.l('Updating configuration for channel', { channel: channelName }); sender.updateQueueConfig(channel, { bufferTimeSpanMillis: config.buffer_time_span_millis, inflightEventsThreshold: config.inflight_events_threshold, @@ -108,10 +109,10 @@ export function createTelemetryConfigurationTaskConfig() { await taskMetricsService.end(trace); - log.l(`Updated TelemetryConfiguration: ${JSON.stringify(telemetryConfiguration)}`); + log.l('Updated TelemetryConfiguration', { configuration: telemetryConfiguration }); return 0; } catch (err) { - log.l(`Failed to set telemetry configuration due to ${err.message}`); + log.l('Failed to set telemetry configuration', { error: err.message }); telemetryConfiguration.resetAllToDefault(); await taskMetricsService.end(trace, err); return 0; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts index 91a2bf2a5b85a..3dbd774e29372 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts @@ -38,14 +38,13 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('detection_rule')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('detection_rule'), mdc); const usageCollector = sender.getTelemetryUsageCluster(); const usageLabelPrefix: string[] = ['security_telemetry', 'detection-rules']; const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ @@ -61,7 +60,7 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n const { body: prebuiltRules } = await receiver.fetchDetectionRules(); if (!prebuiltRules) { - log.l('no prebuilt rules found'); + log.debug('no prebuilt rules found'); await taskMetricsService.end(trace); return 0; } @@ -103,7 +102,9 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n licenseInfo, LIST_DETECTION_RULE_EXCEPTION ); - log.l(`Detection rule exception json length ${detectionRuleExceptionsJson.length}`); + log.l('Detection rule exception json length', { + length: detectionRuleExceptionsJson.length, + }); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), @@ -120,9 +121,7 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n } await taskMetricsService.end(trace); - log.l( - `Task: ${taskId} executed. Processed ${detectionRuleExceptionsJson.length} exceptions` - ); + log.l('Task executed', { length: detectionRuleExceptionsJson.length }); return detectionRuleExceptionsJson.length; } catch (err) { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts index 1c691aea4155f..8148a81e8f915 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts @@ -33,12 +33,11 @@ export function createTelemetryDiagnosticsTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('diagnostic')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('diagnostic'), mdc); const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { if (!taskExecutionPeriod.last) { @@ -57,13 +56,15 @@ export function createTelemetryDiagnosticsTaskConfig() { ); if (alerts.length === 0) { - log.l('no diagnostic alerts retrieved'); + log.debug('no diagnostic alerts retrieved'); await taskMetricsService.end(trace); return alertCount; } alertCount += alerts.length; - log.l(`Sending ${alerts.length} diagnostic alerts`); + log.l('Sending diagnostic alerts', { + alerts_count: alerts.length, + }); await sender.sendOnDemand(TELEMETRY_CHANNEL_ENDPOINT_ALERTS, processedAlerts); } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts index 69a3ee646f0cf..f31275456ade4 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/filterlists.ts @@ -32,31 +32,30 @@ export function createTelemetryFilterListArtifactTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('filterlists')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('filterlists'), mdc); const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { const artifactName = 'telemetry-filterlists-v1'; const manifest = await artifactService.getArtifact(artifactName); if (manifest.notModified) { - log.l('No new filterlist artifact found, skipping...'); + log.debug('No new filterlist artifact found, skipping...'); await taskMetricsService.end(trace); return 0; } const artifact = manifest.data as unknown as TelemetryFilterListArtifact; - log.l(`New filterlist artifact: ${JSON.stringify(artifact)}`); + log.l('New filterlist artifact', { artifact }); filterList.endpointAlerts = artifact.endpoint_alerts; filterList.exceptionLists = artifact.exception_lists; filterList.prebuiltRulesAlerts = artifact.prebuilt_rules_alerts; await taskMetricsService.end(trace); return 0; } catch (err) { - log.l(`Failed to set telemetry filterlist artifact due to ${err.message}`); + log.l('Failed to set telemetry filterlist artifact', { error: err.message }); filterList.resetAllToDefault(); await taskMetricsService.end(trace, err); return 0; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts index 3fda2878d4566..15f84e1ff4ef1 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts @@ -40,12 +40,11 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('prebuilt_rule_alerts')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('prebuilt_rule_alerts'), mdc); const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { const [clusterInfoPromise, licenseInfoPromise, packageVersion] = await Promise.allSettled([ @@ -61,7 +60,7 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n const index = receiver.getAlertsIndex(); if (index === undefined) { - log.l(`alerts index is not ready yet, skipping telemetry task`); + log.warn(`alerts index is not ready yet, skipping telemetry task`); await taskMetricsService.end(trace); return 0; } @@ -96,7 +95,7 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n }) ); - log.l(`sending ${enrichedAlerts.length} elastic prebuilt alerts`); + log.l('sending elastic prebuilt alerts', { length: enrichedAlerts.length }); const batches = batchTelemetryRecords(enrichedAlerts, maxTelemetryBatch); const promises = batches.map(async (batch) => { @@ -109,7 +108,7 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n await taskMetricsService.end(trace); return 0; } catch (err) { - logger.error('could not complete prebuilt alerts telemetry task'); + logger.error('could not complete task', { error: err }); await taskMetricsService.end(trace, err); return 0; } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts index 09e1d14558c54..e56a1a1cf0fed 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts @@ -43,12 +43,11 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('security_lists')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('security_lists'), mdc); const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); const usageCollector = sender.getTelemetryUsageCluster(); const usageLabelPrefix: string[] = ['security_telemetry', 'lists']; @@ -82,7 +81,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) LIST_TRUSTED_APPLICATION ); trustedApplicationsCount = trustedAppsJson.length; - log.l(`Trusted Apps: ${trustedApplicationsCount}`); + log.l('Trusted Apps', { trusted_apps_count: trustedApplicationsCount }); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), @@ -107,7 +106,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) LIST_ENDPOINT_EXCEPTION ); endpointExceptionsCount = epExceptionsJson.length; - log.l(`EP Exceptions: ${endpointExceptionsCount}`); + log.l('EP Exceptions', { ep_exceptions_count: endpointExceptionsCount }); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), @@ -132,7 +131,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) LIST_ENDPOINT_EVENT_FILTER ); endpointEventFiltersCount = epFiltersJson.length; - log.l(`EP Event Filters: ${endpointEventFiltersCount}`); + log.l('EP Event Filters', { ep_filters_count: endpointEventFiltersCount }); usageCollector?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts index c016f029fa2a5..ef9ce40e77c96 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts @@ -30,13 +30,12 @@ export function createTelemetryTimelineTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('timelines')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('timelines'), mdc); const fetcher = new TelemetryTimelineFetcher(receiver); const trace = taskMetricsService.start(taskType); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { let counter = 0; @@ -49,7 +48,7 @@ export function createTelemetryTimelineTaskConfig() { } const alerts = await receiver.fetchTimelineAlerts(alertsIndex, rangeFrom, rangeTo); - log.l(`found ${alerts.length} alerts to process`); + log.l('found alerts to process', { length: alerts.length }); for (const alert of alerts) { const result = await fetcher.fetchTimeline(alert); @@ -70,16 +69,17 @@ export function createTelemetryTimelineTaskConfig() { await sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [result.timeline]); counter += 1; } else { - log.l('no events in timeline'); + log.debug('no events in timeline'); } } - log.l(`sent ${counter} timelines. Concluding timeline task.`); + log.l('Concluding timeline task.', { counter }); await taskMetricsService.end(trace); return counter; } catch (err) { + logger.error('could not complete task', { error: err }); await taskMetricsService.end(trace, err); return 0; } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts index 31718ec47b1e6..35f5abeac10af 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts @@ -30,13 +30,12 @@ export function createTelemetryDiagnosticTimelineTaskConfig() { taskMetricsService: ITaskMetricsService, taskExecutionPeriod: TaskExecutionPeriod ) => { - const log = newTelemetryLogger(logger.get('timelines_diagnostic')); + const mdc = { task_id: taskId, task_execution_period: taskExecutionPeriod }; + const log = newTelemetryLogger(logger.get('timelines_diagnostic'), mdc); const trace = taskMetricsService.start(taskType); const fetcher = new TelemetryTimelineFetcher(receiver); - log.l( - `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` - ); + log.l('Running telemetry task'); try { let counter = 0; @@ -49,7 +48,7 @@ export function createTelemetryDiagnosticTimelineTaskConfig() { rangeTo ); - log.l(`found ${alerts.length} alerts to process`); + log.l('found alerts to process', { length: alerts.length }); for (const alert of alerts) { const result = await fetcher.fetchTimeline(alert); @@ -70,16 +69,17 @@ export function createTelemetryDiagnosticTimelineTaskConfig() { await sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [result.timeline]); counter += 1; } else { - log.l('no events in timeline'); + log.debug('no events in timeline'); } } - log.l(`sent ${counter} timelines. Concluding timeline task.`); + log.l('Concluding timeline task.', { counter }); await taskMetricsService.end(trace); return counter; } catch (err) { + logger.error('could not complete task', { error: err }); await taskMetricsService.end(trace, err); return 0; } From 1bf33f9d2700c2972cd9448b3c5d7b3a5b05aec8 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Mon, 3 Jun 2024 17:29:48 +0200 Subject: [PATCH 08/82] [EDR Workflows] Crowdstrike - add support to responder (#184217) --- .../get_external_edr_agent_info.test.ts | 120 ++++++++++++++ .../get_external_edr_agent_info.ts | 70 ++++++++ .../endpoint_responder/translations.ts | 10 ++ .../use_responder_action_data.test.ts | 53 +++++++ .../use_responder_action_data.ts | 50 +++--- .../components/host_isolation/index.tsx | 17 +- .../isolate_host/header.test.tsx | 63 +++++++- .../document_details/isolate_host/header.tsx | 10 +- .../lib/console_commands_definition.ts | 43 +++++ .../console_commands_definition.test.tsx | 150 ++++++++++++++---- .../hooks/use_with_show_responder.tsx | 12 +- .../common/crowdstrike/schema.ts | 1 + 12 files changed, 521 insertions(+), 78 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.test.ts create mode 100644 x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.ts diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.test.ts b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.test.ts new file mode 100644 index 0000000000000..9e20b45f55fe6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.test.ts @@ -0,0 +1,120 @@ +/* + * 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 { getSentinelOneAgentId } from '../../../common/utils/sentinelone_alert_check'; +import { getCrowdstrikeAgentId } from '../../../common/utils/crowdstrike_alert_check'; +import { getExternalEdrAgentInfo } from './get_external_edr_agent_info'; + +jest.mock('../../../common/utils/sentinelone_alert_check'); +jest.mock('../../../common/utils/crowdstrike_alert_check'); + +describe('getExternalEdrAgentInfo', () => { + const mockEventData = [ + { + category: 'event', + field: 'event.module', + values: ['sentinel_one'], + isObjectArray: false, + }, + { + category: 'host', + field: 'host.name', + values: ['test-host'], + isObjectArray: false, + }, + { + category: 'host', + field: 'host.os.name', + values: ['Windows'], + isObjectArray: false, + }, + { + category: 'host', + field: 'host.os.family', + values: ['windows'], + isObjectArray: false, + }, + { + category: 'host', + field: 'host.os.version', + values: ['10'], + isObjectArray: false, + }, + { + category: 'kibana', + field: 'kibana.alert.last_detected', + values: ['2023-05-01T12:34:56Z'], + isObjectArray: false, + }, + { + category: 'crowdstrike', + field: 'crowdstrike.event.HostName', + values: ['test-crowdstrike-host'], + isObjectArray: false, + }, + { + category: 'crowdstrike', + field: 'crowdstrike.event.Platform', + values: ['linux'], + isObjectArray: false, + }, + ]; + + beforeEach(() => { + (getSentinelOneAgentId as jest.Mock).mockReturnValue('sentinel-one-agent-id'); + (getCrowdstrikeAgentId as jest.Mock).mockReturnValue('crowdstrike-agent-id'); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return correct info for sentinel_one agent type', () => { + const result = getExternalEdrAgentInfo(mockEventData, 'sentinel_one'); + expect(result).toEqual({ + agent: { + id: 'sentinel-one-agent-id', + type: 'sentinel_one', + }, + host: { + name: 'test-host', + os: { + name: 'Windows', + family: 'windows', + version: '10', + }, + }, + lastCheckin: '2023-05-01T12:34:56Z', + }); + }); + + it('should return correct info for crowdstrike agent type', () => { + const result = getExternalEdrAgentInfo(mockEventData, 'crowdstrike'); + expect(result).toEqual({ + agent: { + id: 'crowdstrike-agent-id', + type: 'crowdstrike', + }, + host: { + name: 'test-crowdstrike-host', + os: { + name: '', + family: 'linux', + version: '', + }, + }, + lastCheckin: '2023-05-01T12:34:56Z', + }); + }); + + it('should throw an error for unsupported agent type', () => { + expect(() => { + // @ts-expect-error testing purpose + getExternalEdrAgentInfo(mockEventData, 'unsupported_agent_type'); + }).toThrow('Unsupported agent type: unsupported_agent_type'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.ts b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.ts new file mode 100644 index 0000000000000..0c9c9ed9f0138 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/get_external_edr_agent_info.ts @@ -0,0 +1,70 @@ +/* + * 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 { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; +import type { ThirdPartyAgentInfo } from '../../../../common/types'; +import { getSentinelOneAgentId } from '../../../common/utils/sentinelone_alert_check'; +import { getFieldValue } from '../host_isolation/helpers'; +import { getCrowdstrikeAgentId } from '../../../common/utils/crowdstrike_alert_check'; + +export const getExternalEdrAgentInfo = ( + eventData: TimelineEventsDetailsItem[], + agentType: ResponseActionAgentType +): ThirdPartyAgentInfo => { + switch (agentType) { + case 'sentinel_one': + return { + agent: { + id: getSentinelOneAgentId(eventData) || '', + type: getFieldValue( + { category: 'event', field: 'event.module' }, + eventData + ) as ResponseActionAgentType, + }, + host: { + name: getFieldValue({ category: 'host', field: 'host.name' }, eventData), + os: { + name: getFieldValue({ category: 'host', field: 'host.os.name' }, eventData), + family: getFieldValue({ category: 'host', field: 'host.os.family' }, eventData), + version: getFieldValue({ category: 'host', field: 'host.os.version' }, eventData), + }, + }, + lastCheckin: getFieldValue( + { category: 'kibana', field: 'kibana.alert.last_detected' }, + eventData + ), + }; + case 'crowdstrike': + return { + agent: { + id: getCrowdstrikeAgentId(eventData) || '', + type: agentType, + }, + host: { + name: getFieldValue( + { category: 'crowdstrike', field: 'crowdstrike.event.HostName' }, + eventData + ), + os: { + name: '', + family: getFieldValue( + { category: 'crowdstrike', field: 'crowdstrike.event.Platform' }, + eventData + ), + version: '', + }, + }, + lastCheckin: getFieldValue( + { category: 'kibana', field: 'kibana.alert.last_detected' }, + eventData + ), + }; + default: + throw new Error(`Unsupported agent type: ${agentType}`); + } +}; diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/translations.ts b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/translations.ts index 2badb70572c1d..52dd93cc5c7cc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/translations.ts @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { CROWDSTRIKE_AGENT_ID_FIELD } from '../../../common/utils/crowdstrike_alert_check'; import { SENTINEL_ONE_AGENT_ID_FIELD } from '../../../common/utils/sentinelone_alert_check'; export const NOT_FROM_ENDPOINT_HOST_TOOLTIP = i18n.translate( @@ -36,3 +37,12 @@ export const SENTINEL_ONE_AGENT_ID_PROPERTY_MISSING = i18n.translate( }, } ); +export const CROWDSTRIKE_AGENT_ID_PROPERTY_MISSING = i18n.translate( + 'xpack.securitySolution.endpoint.detections.takeAction.responseActionConsole.missingCrowdstrikeAgentId', + { + defaultMessage: 'Event data missing Crowdstrike agent identifier ({field})', + values: { + field: CROWDSTRIKE_AGENT_ID_FIELD, + }, + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.test.ts b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.test.ts index 9a00f462cd870..76be881fa553d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.test.ts +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.test.ts @@ -177,4 +177,57 @@ describe('#useResponderActionData', () => { expect(result.current.isDisabled).toEqual(false); }); }); + describe('when agentType is `crowdstrike`', () => { + const createEventDataMock = (): TimelineEventsDetailsItem[] => { + return [ + { + category: 'crowdstrike', + field: 'crowdstrike.event.DeviceId', + values: ['mockedAgentId'], + originalValue: ['mockedAgentId'], + isObjectArray: false, + }, + ]; + }; + + it('should return `responder` menu item as `disabled` if agentType is `crowdstrike` and feature flag is disabled', () => { + useIsExperimentalFeatureEnabledMock.mockReturnValue(false); + + const { result } = renderHook(() => + useResponderActionData({ + endpointId: 'crowdstrike-id', + agentType: 'crowdstrike', + eventData: createEventDataMock(), + }) + ); + expect(result.current.isDisabled).toEqual(true); + }); + + it('should return responder menu item as disabled with tooltip if agent id property is missing from event data', () => { + useIsExperimentalFeatureEnabledMock.mockReturnValue(true); + const { result } = renderHook(() => + useResponderActionData({ + endpointId: 'crowdstrike-id', + agentType: 'crowdstrike', + eventData: [], + }) + ); + expect(result.current.isDisabled).toEqual(true); + expect(result.current.tooltip).toEqual( + 'Event data missing Crowdstrike agent identifier (crowdstrike.event.DeviceId)' + ); + }); + + it('should return `responder` menu item as `enabled `if agentType is `crowdstrike` and feature flag is enabled', () => { + useIsExperimentalFeatureEnabledMock.mockReturnValue(true); + const { result } = renderHook(() => + useResponderActionData({ + endpointId: 'crowdstrike-id', + agentType: 'crowdstrike', + eventData: createEventDataMock(), + }) + ); + expect(result.current.isDisabled).toEqual(false); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts index b5e068ed4dbde..b2bf6d22643f4 100644 --- a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts @@ -7,10 +7,11 @@ import type { ReactNode } from 'react'; import { useCallback, useMemo } from 'react'; import type { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; +import { getExternalEdrAgentInfo } from './get_external_edr_agent_info'; +import { getCrowdstrikeAgentId } from '../../../common/utils/crowdstrike_alert_check'; import type { Platform } from '../../../management/components/endpoint_responder/components/header_info/platforms'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; import { getSentinelOneAgentId } from '../../../common/utils/sentinelone_alert_check'; -import type { ThirdPartyAgentInfo } from '../../../../common/types'; import type { ResponseActionAgentType, EndpointCapabilities, @@ -18,13 +19,13 @@ import type { import { useGetEndpointDetails, useWithShowResponder } from '../../../management/hooks'; import { HostStatus } from '../../../../common/endpoint/types'; import { + CROWDSTRIKE_AGENT_ID_PROPERTY_MISSING, HOST_ENDPOINT_UNENROLLED_TOOLTIP, LOADING_ENDPOINT_DATA_TOOLTIP, METADATA_API_ERROR_TOOLTIP, NOT_FROM_ENDPOINT_HOST_TOOLTIP, SENTINEL_ONE_AGENT_ID_PROPERTY_MISSING, } from './translations'; -import { getFieldValue } from '../host_isolation/helpers'; export interface ResponderContextMenuItemProps { endpointId: string; @@ -33,32 +34,6 @@ export interface ResponderContextMenuItemProps { eventData?: TimelineEventsDetailsItem[] | null; } -const getThirdPartyAgentInfo = ( - eventData: TimelineEventsDetailsItem[] | null -): ThirdPartyAgentInfo => { - return { - agent: { - id: getSentinelOneAgentId(eventData) || '', - type: getFieldValue( - { category: 'event', field: 'event.module' }, - eventData - ) as ResponseActionAgentType, - }, - host: { - name: getFieldValue({ category: 'host', field: 'host.name' }, eventData), - os: { - name: getFieldValue({ category: 'host', field: 'host.os.name' }, eventData), - family: getFieldValue({ category: 'host', field: 'host.os.family' }, eventData), - version: getFieldValue({ category: 'host', field: 'host.os.version' }, eventData), - }, - }, - lastCheckin: getFieldValue( - { category: 'kibana', field: 'kibana.alert.last_detected' }, - eventData - ), - }; -}; - /** * This hook is used to get the data needed to show the context menu items for the responder * actions. @@ -85,6 +60,9 @@ export const useResponderActionData = ({ const isSentinelOneV1Enabled = useIsExperimentalFeatureEnabled( 'responseActionsSentinelOneV1Enabled' ); + const responseActionsCrowdstrikeManualHostIsolationEnabled = useIsExperimentalFeatureEnabled( + 'responseActionsCrowdstrikeManualHostIsolationEnabled' + ); const { data: hostInfo, isFetching, @@ -105,6 +83,17 @@ export const useResponderActionData = ({ return [true, SENTINEL_ONE_AGENT_ID_PROPERTY_MISSING]; } + return [false, undefined]; + case 'crowdstrike': + // Disable it if feature flag is disabled + if (!responseActionsCrowdstrikeManualHostIsolationEnabled) { + return [true, undefined]; + } + // Event must have the property that identifies the agent id + if (!getCrowdstrikeAgentId(eventData ?? null)) { + return [true, CROWDSTRIKE_AGENT_ID_PROPERTY_MISSING]; + } + return [false, undefined]; default: @@ -152,11 +141,12 @@ export const useResponderActionData = ({ agentType, isSentinelOneV1Enabled, eventData, + responseActionsCrowdstrikeManualHostIsolationEnabled, ]); const handleResponseActionsClick = useCallback(() => { - if (!isEndpointHost) { - const agentInfoFromAlert = getThirdPartyAgentInfo(eventData || null); + if (!isEndpointHost && eventData != null) { + const agentInfoFromAlert = getExternalEdrAgentInfo(eventData, agentType); showResponseActionsConsole({ agentId: agentInfoFromAlert.agent.id, agentType, diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx index 6804ec9fcfc93..918de21b704f8 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx @@ -35,11 +35,6 @@ export const HostIsolationPanel = React.memo( const sentinelOneAgentId = useMemo(() => getSentinelOneAgentId(details), [details]); const crowdstrikeAgentId = useMemo(() => getCrowdstrikeAgentId(details), [details]); - const hostName = useMemo( - () => getFieldValue({ category: 'host', field: 'host.name' }, details), - [details] - ); - const alertId = useMemo( () => getFieldValue({ category: '_id', field: '_id' }, details), [details] @@ -62,6 +57,18 @@ export const HostIsolationPanel = React.memo( [elasticAgentId, sentinelOneAgentId, crowdstrikeAgentId] ); + const hostName = useMemo(() => { + switch (agentType) { + case 'crowdstrike': + return getFieldValue( + { category: 'crowdstrike', field: 'crowdstrike.event.HostName' }, + details + ); + default: + return getFieldValue({ category: 'host', field: 'host.name' }, details); + } + }, [agentType, details]); + return isolateAction === 'isolateHost' ? ( render( @@ -32,6 +35,8 @@ const renderPanelHeader = () => describe('', () => { beforeEach(() => { mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + mockIsAlertFromSentinelOneEvent.mockReturnValue(false); + mockIsAlertFromCrowdstrike.mockReturnValue(false); }); it.each([ @@ -52,14 +57,35 @@ describe('', () => { expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toHaveTextContent(title); }); - it.each(['isolateHost', 'unisolateHost'])( - 'should display beta badge on %s host message for SentinelOne alerts', - (action) => { + it.each([ + { + action: 'isolateHost', + alertCheck: mockIsAlertFromSentinelOneEvent, + description: 'SentinelOne', + }, + { + action: 'unisolateHost', + alertCheck: mockIsAlertFromSentinelOneEvent, + description: 'SentinelOne', + }, + { + action: 'isolateHost', + alertCheck: mockIsAlertFromCrowdstrike, + description: 'Crowdstrike', + }, + { + action: 'unisolateHost', + alertCheck: mockIsAlertFromCrowdstrike, + description: 'Crowdstrike', + }, + ])( + 'should display beta badge on $description alerts for %s host message', + ({ action, alertCheck }) => { (useIsolateHostPanelContext as jest.Mock).mockReturnValue({ isolateAction: action, }); mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); - mockIsAlertFromSentinelOneEvent.mockReturnValue(true); + alertCheck.mockReturnValue(true); const { getByTestId } = renderPanelHeader(); @@ -68,14 +94,35 @@ describe('', () => { } ); - it.each(['isolateHost', 'unisolateHost'])( - 'should not display beta badge on %s host message for non-SentinelOne alerts', - (action) => { + it.each([ + { + action: 'isolateHost', + alertCheck: mockIsAlertFromSentinelOneEvent, + description: 'SentinelOne', + }, + { + action: 'unisolateHost', + alertCheck: mockIsAlertFromSentinelOneEvent, + description: 'SentinelOne', + }, + { + action: 'isolateHost', + alertCheck: mockIsAlertFromCrowdstrike, + description: 'Crowdstrike', + }, + { + action: 'unisolateHost', + alertCheck: mockIsAlertFromCrowdstrike, + description: 'Crowdstrike', + }, + ])( + 'should not display beta badge on $description alerts for %s host message', + ({ action, alertCheck }) => { (useIsolateHostPanelContext as jest.Mock).mockReturnValue({ isolateAction: action, }); mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); - mockIsAlertFromSentinelOneEvent.mockReturnValue(false); + alertCheck.mockReturnValue(false); const { getByTestId } = renderPanelHeader(); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/header.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/header.tsx index efe8e867966db..ead599d38e498 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/header.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/header.tsx @@ -9,6 +9,7 @@ import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui' import type { FC } from 'react'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { isAlertFromCrowdstrikeEvent } from '../../../common/utils/crowdstrike_alert_check'; import { TECHNICAL_PREVIEW, TECHNICAL_PREVIEW_TOOLTIP } from '../../../common/translations'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; import { isAlertFromSentinelOneEvent } from '../../../common/utils/sentinelone_alert_check'; @@ -26,6 +27,13 @@ export const PanelHeader: FC = () => { 'responseActionsSentinelOneV1Enabled' ); + const isAlertFromCrowdstrikeAlert = isAlertFromCrowdstrikeEvent({ data }); + const responseActionsCrowdstrikeManualHostIsolationEnabled = useIsExperimentalFeatureEnabled( + 'responseActionsCrowdstrikeManualHostIsolationEnabled' + ); + const showAsTechPreview = + (isSentinelOneV1Enabled && isSentinelOneAlert) || + (responseActionsCrowdstrikeManualHostIsolationEnabled && isAlertFromCrowdstrikeAlert); const title = ( @@ -41,7 +49,7 @@ export const PanelHeader: FC = () => { /> )} - {isSentinelOneV1Enabled && isSentinelOneAlert && ( + {showAsTechPreview && ( diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/console_commands_definition.ts b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/console_commands_definition.ts index 61fb75cb52450..912f5104c27c1 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/console_commands_definition.ts +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/console_commands_definition.ts @@ -504,6 +504,8 @@ export const getEndpointConsoleCommands = ({ switch (agentType) { case 'sentinel_one': return adjustCommandsForSentinelOne({ commandList: consoleCommands }); + case 'crowdstrike': + return adjustCommandsForCrowdstrike({ commandList: consoleCommands }); default: // agentType === endpoint: just returns the defined command list return consoleCommands; @@ -552,3 +554,44 @@ const adjustCommandsForSentinelOne = ({ return command; }); }; + +/** @private */ +const adjustCommandsForCrowdstrike = ({ + commandList, +}: { + commandList: CommandDefinition[]; +}): CommandDefinition[] => { + const featureFlags = ExperimentalFeaturesService.get(); + const isHostIsolationEnabled = featureFlags.responseActionsCrowdstrikeManualHostIsolationEnabled; + + const disableCommand = (command: CommandDefinition) => { + command.helpDisabled = true; + command.helpHidden = true; + command.validate = () => + UPGRADE_AGENT_FOR_RESPONDER('crowdstrike', command.name as ConsoleResponseActionCommands); + }; + + return commandList.map((command) => { + const agentSupportsResponseAction = + command.name === 'status' + ? false + : isActionSupportedByAgentType( + 'crowdstrike', + RESPONSE_CONSOLE_COMMAND_TO_API_COMMAND_MAP[ + command.name as ConsoleResponseActionCommands + ], + 'manual' + ); + + // If command is not supported by Crowdstrike - disable it + if ( + !agentSupportsResponseAction || + (command.name === 'isolate' && !isHostIsolationEnabled) || + (command.name === 'release' && !isHostIsolationEnabled) + ) { + disableCommand(command); + } + + return command; + }); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/integration_tests/console_commands_definition.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/integration_tests/console_commands_definition.test.tsx index 3cc73b1ef7854..cff88c4e9854d 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/integration_tests/console_commands_definition.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/integration_tests/console_commands_definition.test.tsx @@ -15,24 +15,23 @@ import { EndpointMetadataGenerator } from '../../../../../../common/endpoint/dat import { getEndpointPrivilegesInitialStateMock } from '../../../../../common/components/user_privileges/endpoint/mocks'; import { sortBy } from 'lodash'; import { HELP_GROUPS } from '../console_commands_definition'; +import { ExperimentalFeaturesService } from '../../../../../common/experimental_features_service'; +import type { CommandDefinition } from '../../../console'; +import type { HostMetadataInterface } from '../../../../../../common/endpoint/types'; + +jest.mock('../../../../../common/experimental_features_service'); describe('When displaying Endpoint Response Actions', () => { let render: ConsoleTestSetup['renderConsole']; let renderResult: ReturnType; let consoleSelectors: ConsoleTestSetup['selectors']; let helpPanelSelectors: HelpSidePanelSelectorsAndActions; + let commands: CommandDefinition[]; + let endpointMetadata: HostMetadataInterface; beforeEach(() => { const testSetup = getConsoleTestSetup(); - - const endpointMetadata = new EndpointMetadataGenerator().generate(); - const commands = getEndpointConsoleCommands({ - agentType: 'endpoint', - endpointAgentId: '123', - endpointCapabilities: endpointMetadata.Endpoint.capabilities ?? [], - endpointPrivileges: getEndpointPrivilegesInitialStateMock(), - }); - + endpointMetadata = new EndpointMetadataGenerator().generate(); consoleSelectors = testSetup.selectors; render = (props = { commands }) => { renderResult = testSetup.renderConsole(props); @@ -42,31 +41,118 @@ describe('When displaying Endpoint Response Actions', () => { }; }); - it('should display expected help groups', () => { - render(); - consoleSelectors.openHelpPanel(); + describe('for agent type endpoint', () => { + beforeEach(() => { + (ExperimentalFeaturesService.get as jest.Mock).mockReturnValueOnce({ + responseActionUploadEnabled: true, + }); + commands = getEndpointConsoleCommands({ + agentType: 'endpoint', + endpointAgentId: '123', + endpointCapabilities: endpointMetadata.Endpoint.capabilities ?? [], + endpointPrivileges: getEndpointPrivilegesInitialStateMock(), + }); + }); + + it('should display expected help groups', () => { + render({ commands }); + consoleSelectors.openHelpPanel(); + + expect(helpPanelSelectors.getHelpGroupLabels()).toEqual([ + ...sortBy(Object.values(HELP_GROUPS), 'position').map((group) => group.label), + 'Supporting commands & parameters', + ]); + }); + + it('should display response action commands in the help panel in expected order', () => { + render({ commands }); + consoleSelectors.openHelpPanel(); + const commandsInPanel = helpPanelSelectors.getHelpCommandNames( + HELP_GROUPS.responseActions.label + ); - expect(helpPanelSelectors.getHelpGroupLabels()).toEqual([ - ...sortBy(Object.values(HELP_GROUPS), 'position').map((group) => group.label), - 'Supporting commands & parameters', - ]); + expect(commandsInPanel).toEqual([ + 'isolate', + 'release', + 'status', + 'processes', + 'kill-process --pid', + 'suspend-process --pid', + 'get-file --path', + 'execute --command', + 'upload --file', + ]); + }); }); - it('should display response action commands in the help panel in expected order', () => { - render(); - consoleSelectors.openHelpPanel(); - const commands = helpPanelSelectors.getHelpCommandNames(HELP_GROUPS.responseActions.label); - - expect(commands).toEqual([ - 'isolate', - 'release', - 'status', - 'processes', - 'kill-process --pid', - 'suspend-process --pid', - 'get-file --path', - 'execute --command', - 'upload --file', - ]); + describe('for agent type sentinel_one', () => { + beforeEach(() => { + (ExperimentalFeaturesService.get as jest.Mock).mockReturnValue({ + responseActionsCrowdstrikeManualHostIsolationEnabled: true, + responseActionsSentinelOneV1Enabled: true, + responseActionsSentinelOneGetFileEnabled: true, + }); + + commands = getEndpointConsoleCommands({ + agentType: 'sentinel_one', + endpointAgentId: '123', + endpointCapabilities: endpointMetadata.Endpoint.capabilities ?? [], + endpointPrivileges: getEndpointPrivilegesInitialStateMock(), + }); + }); + + it('should display expected help groups', () => { + render({ commands }); + consoleSelectors.openHelpPanel(); + + expect(helpPanelSelectors.getHelpGroupLabels()).toEqual([ + ...sortBy(Object.values(HELP_GROUPS), 'position').map((group) => group.label), + 'Supporting commands & parameters', + ]); + }); + + it('should display response action commands in the help panel in expected order', () => { + render({ commands }); + consoleSelectors.openHelpPanel(); + const commandsInPanel = helpPanelSelectors.getHelpCommandNames( + HELP_GROUPS.responseActions.label + ); + + expect(commandsInPanel).toEqual(['isolate', 'release', 'get-file --path']); + }); + }); + + describe('for agent type crowdstrike', () => { + beforeEach(() => { + (ExperimentalFeaturesService.get as jest.Mock).mockReturnValue({ + responseActionsCrowdstrikeManualHostIsolationEnabled: true, + }); + commands = getEndpointConsoleCommands({ + agentType: 'crowdstrike', + endpointAgentId: '123', + endpointCapabilities: endpointMetadata.Endpoint.capabilities ?? [], + endpointPrivileges: getEndpointPrivilegesInitialStateMock(), + }); + }); + + it('should display expected help groups', () => { + render({ commands }); + consoleSelectors.openHelpPanel(); + + expect(helpPanelSelectors.getHelpGroupLabels()).toEqual([ + ...sortBy(Object.values(HELP_GROUPS), 'position').map((group) => group.label), + 'Supporting commands & parameters', + ]); + }); + + it('should display response action commands in the help panel in expected order', () => { + render({ commands }); + consoleSelectors.openHelpPanel(); + const commandsInPanel = helpPanelSelectors.getHelpCommandNames( + HELP_GROUPS.responseActions.label + ); + + expect(commandsInPanel).toEqual(['isolate', 'release']); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/use_with_show_responder.tsx b/x-pack/plugins/security_solution/public/management/hooks/use_with_show_responder.tsx index 8e0e1d213a73b..b820e75dad97c 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/use_with_show_responder.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/use_with_show_responder.tsx @@ -51,11 +51,18 @@ export const useWithShowResponder = (): ShowResponseActionsConsole => { const isSentinelOneV1Enabled = useIsExperimentalFeatureEnabled( 'responseActionsSentinelOneV1Enabled' ); + const responseActionsCrowdstrikeManualHostIsolationEnabled = useIsExperimentalFeatureEnabled( + 'responseActionsCrowdstrikeManualHostIsolationEnabled' + ); const agentStatusClientEnabled = useIsExperimentalFeatureEnabled('agentStatusClientEnabled'); return useCallback( (props: ResponderInfoProps) => { const { agentId, agentType, capabilities, hostName, platform } = props; + const isExternalEdr = + (isSentinelOneV1Enabled && agentType === 'sentinel_one') || + (responseActionsCrowdstrikeManualHostIsolationEnabled && agentType === 'crowdstrike'); + // If no authz, just exit and log something to the console if (agentType === 'endpoint' && !endpointPrivileges.canAccessResponseConsole) { window.console.error(new Error(`Access denied to ${agentType} response actions console`)); @@ -112,7 +119,7 @@ export const useWithShowResponder = (): ShowResponseActionsConsole => { }, consoleProps, PageTitleComponent: () => { - if (isSentinelOneV1Enabled && agentType === 'sentinel_one') { + if (isExternalEdr) { return ( {RESPONDER_PAGE_TITLE} @@ -145,11 +152,12 @@ export const useWithShowResponder = (): ShowResponseActionsConsole => { } }, [ + isSentinelOneV1Enabled, + responseActionsCrowdstrikeManualHostIsolationEnabled, endpointPrivileges, isEnterpriseLicense, consoleManager, agentStatusClientEnabled, - isSentinelOneV1Enabled, ] ); }; diff --git a/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts b/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts index d19deabd6aeda..1bd1ac46f31fc 100644 --- a/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts +++ b/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts @@ -235,6 +235,7 @@ export const CrowdstrikeHostActionsParamsSchema = schema.object({ actionParameters: schema.maybe(schema.object({}, { unknowns: 'allow' })), ids: schema.arrayOf(schema.string()), alertIds: schema.maybe(schema.arrayOf(schema.string())), + comment: schema.maybe(schema.string()), }); export const CrowdstrikeGetAgentsParamsSchema = schema.object({ From 4c1dacaff540bfbd053d5e3bf98b97c93058cc9c Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 3 Jun 2024 19:00:22 +0300 Subject: [PATCH 09/82] fix: [Obs Infrastructure > Hosts][KEYBOARD]: Logs tab at the bottom of the page cannot be scrolled by keyboard (#184003) Closes: https://github.com/elastic/observability-dev/issues/3421 Closes: https://github.com/elastic/observability-dev/issues/3407 Closes: https://github.com/elastic/observability-dev/issues/3412 Closes: https://github.com/elastic/observability-dev/issues/3418 Closes: https://github.com/elastic/observability-dev/issues/3421 Closes: https://github.com/elastic/observability-dev/issues/3424 ## Summary The Obs Applications > Host Detail page has aLogs table that includes a hover-only detail view. This needs to also be keyboard focusable to be available to all users. Screenshot attached below. ## Steps to recreate 1. Open the [Obs Hosts](https://issue-serverless-bdwqw-pr183659-f2d99b.kb.eu-west-aws.qa.elastic.cloud/app/metrics/hosts) view 2. Click on one of the host name links 3. When the Host Detail opens, click on the Logs tab 4. Use the Tab key to move through the table 5. Verify the table row [ ... ] never appears when navigating by keyboard ## What was changed?: All the above-mentioned errors use a single component` x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream` and can be fixed within it. 1. tab-index has been added to vertical_scroll_panel.tsx. 2. The logic displaying the button with menu has been updated using CSS. --- .../logging/log_text_stream/scrollable_log_text_stream_view.tsx | 2 +- .../logging/log_text_stream/vertical_scroll_panel.tsx | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx index 959a2d99924db..fdb0d6a88f8a5 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx @@ -204,7 +204,7 @@ export class ScrollableLogTextStreamView extends React.PureComponent< onVisibleChildrenChange={this.handleVisibleChildrenChange} target={targetId} hideScrollbar={hideScrollbar} - data-test-subj={'logStream'} + data-test-subj="logStream" isLocked={isScrollLocked} entriesCount={items.length} > diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/vertical_scroll_panel.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/vertical_scroll_panel.tsx index 6f0313ce459f0..ec8d666ef9b87 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/vertical_scroll_panel.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/vertical_scroll_panel.tsx @@ -248,6 +248,8 @@ export class VerticalScrollPanel extends React.PureComponent< scrollbarOffset={scrollbarOffset} onScroll={this.handleScroll} ref={this.scrollRef} + tabIndex={0} + className="eui-scrollBar" > {typeof children === 'function' ? children(this.registerChild) : null} From f10ffdce843db5a1d2af1747984dfb4f37f61bad Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 3 Jun 2024 18:10:51 +0200 Subject: [PATCH 10/82] [Visualize] Unskip function test heatmap (#184605) ## Summary unskip functional test --- test/functional/apps/visualize/group2/_heatmap_chart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/apps/visualize/group2/_heatmap_chart.ts b/test/functional/apps/visualize/group2/_heatmap_chart.ts index 09439635ebc5e..2f9ecc5a89d06 100644 --- a/test/functional/apps/visualize/group2/_heatmap_chart.ts +++ b/test/functional/apps/visualize/group2/_heatmap_chart.ts @@ -16,7 +16,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['visualize', 'visEditor', 'visChart', 'timePicker']); // FLAKY: https://github.com/elastic/kibana/issues/181884 - describe.skip('heatmap chart', function indexPatternCreation() { + describe('heatmap chart', function indexPatternCreation() { const vizName1 = 'Visualization HeatmapChart'; let isNewChartsLibraryEnabled = false; From c32f283c744c9eeefd18d6b56e0ceea294901813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:43:01 +0200 Subject: [PATCH 11/82] [Console Monaco migration] Autocomplete fixes (#184032) ## Summary Fixes https://github.com/elastic/kibana/issues/183421 This PR fixes following issues in the autocomplete suggestions for request body: - Conditional template - Display suggestions for boolean values - Display async loaded suggestions - Move the cursor inside an empty array/object after inserting it as a template ### How to test - Set the config for Monaco migration `console.dev.enableMonaco: true` in `/config/kibana.dev.yml` - Start ES and Kibana with `yarn es snapshot` and `yarn start` - Conditional template - Try creating different types of repos and check that the "settings" property changes its template for each type Screenshot 2024-05-24 at 17 28 17 Screenshot 2024-05-24 at 17 28 33 - Check autocomplete suggestions of any boolean property, for example for the request `GET _search` the property `explain` - Check asynchronously loaded suggestions, for example `fields` property for the request `GET _search` - Check templates with empty objects/arrays, for example `query` in the `GET _search` request ### 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) --- .../monaco/monaco_editor_actions_provider.ts | 35 +++- .../editor/monaco/utils/autocomplete_utils.ts | 182 ++++++++++++------ .../editor/monaco/utils/tokens_utils.test.ts | 4 + .../editor/monaco/utils/tokens_utils.ts | 2 +- .../public/lib/autocomplete/autocomplete.ts | 9 +- .../console/public/lib/autocomplete/types.ts | 5 +- 6 files changed, 170 insertions(+), 67 deletions(-) diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts index 8001966907272..f0bc4b34d899b 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts @@ -7,7 +7,7 @@ */ import { CSSProperties, Dispatch } from 'react'; -import { debounce } from 'lodash'; +import { debounce, range } from 'lodash'; import { ConsoleParsedRequestsProvider, getParsedRequestsProvider, monaco } from '@kbn/monaco'; import { i18n } from '@kbn/i18n'; import { toMountPoint } from '@kbn/react-kibana-mount'; @@ -347,7 +347,7 @@ export class MonacoEditorActionsProvider { model: monaco.editor.ITextModel, position: monaco.Position, context: monaco.languages.CompletionContext - ) { + ): Promise { // determine autocomplete type const autocompleteType = await this.getAutocompleteType(model, position); if (!autocompleteType) { @@ -384,7 +384,12 @@ export class MonacoEditorActionsProvider { position.lineNumber ); const requestStartLineNumber = requests[0].startLineNumber; - const suggestions = getBodyCompletionItems(model, position, requestStartLineNumber); + const suggestions = await getBodyCompletionItems( + model, + position, + requestStartLineNumber, + this + ); return { suggestions, }; @@ -394,12 +399,12 @@ export class MonacoEditorActionsProvider { suggestions: [], }; } - public provideCompletionItems( + public async provideCompletionItems( model: monaco.editor.ITextModel, position: monaco.Position, context: monaco.languages.CompletionContext, token: monaco.CancellationToken - ): monaco.languages.ProviderResult { + ): Promise { return this.getSuggestions(model, position, context); } @@ -565,4 +570,24 @@ export class MonacoEditorActionsProvider { this.editor.setPosition({ lineNumber: firstRequestAfter.endLineNumber, column: 1 }); } } + + /* + * This function is to get an array of line contents + * from startLine to endLine including both line numbers + */ + public getLines(startLine: number, endLine: number): string[] { + const model = this.editor.getModel(); + if (!model) { + return []; + } + // range returns an array not including the end of the range, so we need to add 1 + return range(startLine, endLine + 1).map((lineNumber) => model.getLineContent(lineNumber)); + } + + /* + * This function returns the current position of the cursor + */ + public getCurrentPosition(): monaco.IPosition { + return this.editor.getPosition() ?? { lineNumber: 1, column: 1 }; + } } diff --git a/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts b/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts index 5302bf90d82c0..9f8a6e5efd99c 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts @@ -7,13 +7,18 @@ */ import { monaco } from '@kbn/monaco'; +import { MonacoEditorActionsProvider } from '../monaco_editor_actions_provider'; import { getEndpointBodyCompleteComponents, getGlobalAutocompleteComponents, getTopLevelUrlCompleteComponents, getUnmatchedEndpointComponents, } from '../../../../../lib/kb'; -import { AutoCompleteContext, ResultTerm } from '../../../../../lib/autocomplete/types'; +import { + AutoCompleteContext, + type DataAutoCompleteRulesOneOf, + ResultTerm, +} from '../../../../../lib/autocomplete/types'; import { populateContext } from '../../../../../lib/autocomplete/engine'; import type { EditorRequest } from '../types'; import { parseBody, parseLine, parseUrl } from './tokens_utils'; @@ -133,8 +138,8 @@ export const getUrlPathCompletionItems = ( // map autocomplete items to completion items .map((item) => { return { - label: item.name!, - insertText: item.name!, + label: item.name + '', + insertText: item.name + '', detail: item.meta ?? i18nTexts.endpoint, // the kind is only used to configure the icon kind: monaco.languages.CompletionItemKind.Constant, @@ -195,8 +200,8 @@ export const getUrlParamsCompletionItems = ( // map autocomplete items to completion items .map((item) => { return { - label: item.name!, - insertText: item.name!, + label: item.name + '', + insertText: item.name + '', detail: item.meta ?? i18nTexts.param, // the kind is only used to configure the icon kind: monaco.languages.CompletionItemKind.Constant, @@ -211,11 +216,12 @@ export const getUrlParamsCompletionItems = ( /* * This function returns an array of completion items for the request body params */ -export const getBodyCompletionItems = ( +export const getBodyCompletionItems = async ( model: monaco.editor.ITextModel, position: monaco.Position, - requestStartLineNumber: number -): monaco.languages.CompletionItem[] => { + requestStartLineNumber: number, + editor: MonacoEditorActionsProvider +): Promise => { const { lineNumber, column } = position; // get the content on the method+url line @@ -244,62 +250,91 @@ export const getBodyCompletionItems = ( } else { components = getUnmatchedEndpointComponents(); } - populateContext(bodyTokens, context, undefined, true, components); - - if (context.autoCompleteSet && context.autoCompleteSet.length > 0) { - const wordUntilPosition = model.getWordUntilPosition(position); - // if there is " after the cursor, replace it - let endColumn = position.column; - const charAfterPosition = model.getValueInRange({ - startLineNumber: position.lineNumber, - startColumn: position.column, - endLineNumber: position.lineNumber, - endColumn: position.column + 1, - }); - if (charAfterPosition === '"') { - endColumn = endColumn + 1; - } - const range = { - startLineNumber: position.lineNumber, - // replace the whole word with the suggestion - startColumn: wordUntilPosition.startColumn, - endLineNumber: position.lineNumber, - endColumn, - }; - return ( - context.autoCompleteSet - // filter autocomplete items without a name - .filter(({ name }) => Boolean(name)) - // map autocomplete items to completion items - .map((item) => { - const suggestion = { - // convert name to a string - label: item.name + '', - insertText: getInsertText(item, bodyContent), - detail: i18nTexts.api, - // the kind is only used to configure the icon - kind: monaco.languages.CompletionItemKind.Constant, - range, - insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, - }; - return suggestion; - }) - ); + context.editor = editor; + context.requestStartRow = requestStartLineNumber; + populateContext(bodyTokens, context, editor, true, components); + if (!context) { + return []; } - return []; + if (context.asyncResultsState?.isLoading && context.asyncResultsState) { + const results = await context.asyncResultsState.results; + return getSuggestions(model, position, results, context, bodyContent); + } + + return getSuggestions(model, position, context.autoCompleteSet ?? [], context, bodyContent); }; +const getSuggestions = ( + model: monaco.editor.ITextModel, + position: monaco.Position, + autocompleteSet: ResultTerm[], + context: AutoCompleteContext, + bodyContent: string +) => { + const wordUntilPosition = model.getWordUntilPosition(position); + // if there is " after the cursor, replace it + let endColumn = position.column; + const charAfterPosition = model.getValueInRange({ + startLineNumber: position.lineNumber, + startColumn: position.column, + endLineNumber: position.lineNumber, + endColumn: position.column + 1, + }); + if (charAfterPosition === '"') { + endColumn = endColumn + 1; + } + const range = { + startLineNumber: position.lineNumber, + // replace the whole word with the suggestion + startColumn: wordUntilPosition.startColumn, + endLineNumber: position.lineNumber, + endColumn, + }; + return ( + autocompleteSet + // filter out items that don't have name + .filter(({ name }) => name !== undefined) + // map autocomplete items to completion items + .map((item) => { + const suggestion = { + // convert name to a string + label: item.name + '', + insertText: getInsertText(item, bodyContent, context), + detail: i18nTexts.api, + // the kind is only used to configure the icon + kind: monaco.languages.CompletionItemKind.Constant, + range, + insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, + }; + return suggestion; + }) + ); +}; const getInsertText = ( { name, insertValue, template, value }: ResultTerm, - bodyContent: string + bodyContent: string, + context: AutoCompleteContext ): string => { - let insertText = bodyContent.endsWith('"') ? '' : '"'; - if (insertValue && insertValue !== '{' && insertValue !== '[') { - insertText += `${insertValue}"`; + if (name === undefined) { + return ''; + } + let insertText = ''; + if (typeof name === 'string') { + insertText = bodyContent.endsWith('"') ? '' : '"'; + if (insertValue && insertValue !== '{' && insertValue !== '[') { + insertText += `${insertValue}"`; + } else { + insertText += `${name}"`; + } } else { - insertText += `${name}"`; + insertText = name + ''; } + // check if there is template to add + const conditionalTemplate = getConditionalTemplate(name, bodyContent, context.endpoint); + if (conditionalTemplate) { + template = conditionalTemplate; + } if (template !== undefined) { let templateLines; const { __raw, value: templateValue } = template; @@ -314,5 +349,42 @@ const getInsertText = ( } else if (value === '[') { insertText += '[]'; } + // the string $0 is used to move the cursor between empty curly/square brackets + if (insertText.endsWith('{}')) { + insertText = insertText.substring(0, insertText.length - 2) + '{$0}'; + } + if (insertText.endsWith('[]')) { + insertText = insertText.substring(0, insertText.length - 2) + '[$0]'; + } return insertText; }; + +const getConditionalTemplate = ( + name: string | boolean, + bodyContent: string, + endpoint: AutoCompleteContext['endpoint'] +) => { + if (typeof name !== 'string' || !endpoint || !endpoint.data_autocomplete_rules) { + return; + } + // get the autocomplete rules for the request body + const { data_autocomplete_rules: autocompleteRules } = endpoint; + // get the rules for this property name + const rules = autocompleteRules[name]; + // check if the rules have "__one_of" property + if (!rules || typeof rules !== 'object' || !('__one_of' in rules)) { + return; + } + const oneOfRules = rules.__one_of as DataAutoCompleteRulesOneOf[]; + // try to match one of the rules to the body content + const matchedRule = oneOfRules.find((rule) => { + if (rule.__condition && rule.__condition.lines_regex) { + return new RegExp(rule.__condition.lines_regex, 'm').test(bodyContent); + } + return false; + }); + // use the template from the matched rule + if (matchedRule && matchedRule.__template) { + return matchedRule.__template; + } +}; diff --git a/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.test.ts b/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.test.ts index 56d9dea22b743..600b5f4a98e4a 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.test.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.test.ts @@ -118,6 +118,10 @@ describe('tokens_utils', () => { value: '{"property1":{"nested1":"value","nested2":{}},"', tokens: ['{'], }, + { + value: '{\n "explain": false,\n "', + tokens: ['{'], + }, ]; for (const testCase of testCases) { const { value, tokens } = testCase; diff --git a/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.ts b/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.ts index 76e6e9672252f..f52a0bb6a9079 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/utils/tokens_utils.ts @@ -228,7 +228,7 @@ export const parseBody = (value: string): string[] => { break; } case 'f': { - if (peek(1) === 'a' && peek(2) === 'l' && peek(3) === 's' && peek(3) === 'e') { + if (peek(1) === 'a' && peek(2) === 'l' && peek(3) === 's' && peek(4) === 'e') { next(); next(); next(); diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index bdb2a16c879ab..d6d2a8e711f13 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -799,7 +799,8 @@ export default function ({ // if not on the first line if (context.rangeToReplace && context.rangeToReplace.start?.lineNumber > 1) { const prevTokenLineNumber = position.lineNumber; - const line = context.editor?.getLineValue(prevTokenLineNumber) ?? ''; + const editorFromContext = context.editor as CoreEditor | undefined; + const line = editorFromContext?.getLineValue(prevTokenLineNumber) ?? ''; const prevLineLength = line.length; const linesToEnter = context.rangeToReplace.end.lineNumber - prevTokenLineNumber; @@ -1188,7 +1189,7 @@ export default function ({ context: AutoCompleteContext; completer?: { insertMatch: (v: unknown) => void }; } = { - value: term.name, + value: term.name + '', meta: 'API', score: 0, context, @@ -1206,8 +1207,8 @@ export default function ({ ); terms.sort(function ( - t1: { score: number; name?: string }, - t2: { score: number; name?: string } + t1: { score: number; name?: string | boolean }, + t2: { score: number; name?: string | boolean } ) { /* score sorts from high to low */ if (t1.score > t2.score) { diff --git a/src/plugins/console/public/lib/autocomplete/types.ts b/src/plugins/console/public/lib/autocomplete/types.ts index 7d1fb383f52a5..58af891488695 100644 --- a/src/plugins/console/public/lib/autocomplete/types.ts +++ b/src/plugins/console/public/lib/autocomplete/types.ts @@ -6,13 +6,14 @@ * Side Public License, v 1. */ +import { MonacoEditorActionsProvider } from '../../application/containers/editor/monaco/monaco_editor_actions_provider'; import { CoreEditor, Range, Token } from '../../types'; export interface ResultTerm { meta?: string; context?: AutoCompleteContext; insertValue?: string; - name?: string; + name?: string | boolean; value?: string; score?: number; template?: { __raw?: boolean; value?: string; [key: string]: unknown }; @@ -53,7 +54,7 @@ export interface AutoCompleteContext { replacingToken?: boolean; rangeToReplace?: Range; autoCompleteType?: null | string; - editor?: CoreEditor; + editor?: CoreEditor | MonacoEditorActionsProvider; /** * The tokenized user input that prompted the current autocomplete at the cursor. This can be out of sync with From f9e30fa32823c26765b0b80ac54978aec3d9f34c Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:30:41 +0200 Subject: [PATCH 12/82] transition sourcerer code ownership to threat hunting investigations (#184666) ## Summary All this PR does is it changes the Sourcerer code ownership to threat hunting investigations team. --- .github/CODEOWNERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b7c88c311d0b8..e9664ea90461b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1548,7 +1548,7 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/common/cti @elastic/security-detection-engine /x-pack/plugins/security_solution/common/field_maps @elastic/security-detection-engine -/x-pack/plugins/security_solution/public/common/components/sourcerer @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/sourcerer @elastic/security-threat-hunting-investigations /x-pack/plugins/security_solution/public/detection_engine/rule_creation @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detection_engine/rule_exceptions @elastic/security-detection-engine @@ -1564,7 +1564,6 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/server/lib/detection_engine/rule_types @elastic/security-detection-engine /x-pack/plugins/security_solution/server/lib/detection_engine/routes/index @elastic/security-detection-engine /x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals @elastic/security-detection-engine -/x-pack/plugins/security_solution/server/lib/sourcerer @elastic/security-detection-engine /x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine @elastic/security-detection-engine From 3a217fd7c79391bcc02cf46f5ebcaa8369042505 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 3 Jun 2024 10:51:07 -0700 Subject: [PATCH 13/82] [HTTP/OAS] Add descriptions for data view APIs (#184182) --- src/plugins/data_views/server/constants.ts | 19 +++++++++++++++++++ .../public/create_data_view.ts | 8 +++++--- .../public/default_data_view.ts | 12 ++++++++---- .../public/delete_data_view.ts | 10 +++++++--- .../public/fields/update_fields.ts | 8 +++++--- .../rest_api_routes/public/get_data_view.ts | 8 +++++--- .../rest_api_routes/public/get_data_views.ts | 17 +++++++++++++---- .../runtime_fields/create_runtime_field.ts | 8 +++++--- .../runtime_fields/delete_runtime_field.ts | 8 +++++--- .../runtime_fields/get_runtime_field.ts | 8 +++++--- .../runtime_fields/put_runtime_field.ts | 8 +++++--- .../runtime_fields/update_runtime_field.ts | 8 +++++--- .../rest_api_routes/public/swap_references.ts | 12 ++++++++++-- .../public/update_data_view.ts | 8 +++++--- 14 files changed, 102 insertions(+), 40 deletions(-) diff --git a/src/plugins/data_views/server/constants.ts b/src/plugins/data_views/server/constants.ts index 67235ae3af16d..2aa9dc5904e2b 100644 --- a/src/plugins/data_views/server/constants.ts +++ b/src/plugins/data_views/server/constants.ts @@ -98,3 +98,22 @@ export const INITIAL_REST_VERSION_INTERNAL = '1'; * Default field caps cache max-age in seconds */ export const DEFAULT_FIELD_CACHE_FRESHNESS = 5; + +/** + * Operation summaries + */ +export const CREATE_DATA_VIEW_DESCRIPTION = 'Create a data view'; +export const CREATE_RUNTIME_FIELD_DESCRIPTION = 'Create a runtime field'; +export const CREATE_UPDATE_RUNTIME_FIELD_DESCRIPTION = 'Create or update a runtime field'; +export const DELETE_DATA_VIEW_DESCRIPTION = 'Delete a data view'; +export const DELETE_RUNTIME_FIELD_DESCRIPTION = 'Delete a runtime field from a data view'; +export const GET_DATA_VIEW_DESCRIPTION = 'Get a data view'; +export const GET_DATA_VIEWS_DESCRIPTION = 'Get all data views'; +export const GET_DEFAULT_DATA_VIEW_DESCRIPTION = 'Get the default data view'; +export const GET_RUNTIME_FIELD_DESCRIPTION = 'Get a runtime field'; +export const PREVIEW_SWAP_REFERENCES_DESCRIPTION = 'Preview swapping saved object references'; +export const SET_DEFAULT_DATA_VIEW_DESCRIPTION = 'Set the default data view'; +export const SWAP_REFERENCES_DESCRIPTION = 'Swap saved object references for a data view'; +export const UPDATE_DATA_VIEW_DESCRIPTION = 'Update a data view'; +export const UPDATE_DATA_VIEW_FIELDS_DESCRIPTION = 'Update data view fields metadata'; +export const UPDATE_RUNTIME_FIELD_DESCRIPTION = 'Update a runtime field'; diff --git a/src/plugins/data_views/server/rest_api_routes/public/create_data_view.ts b/src/plugins/data_views/server/rest_api_routes/public/create_data_view.ts index a37eb4b682b56..1c4d3265e673f 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/create_data_view.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/create_data_view.ts @@ -23,6 +23,7 @@ import { SERVICE_KEY, SERVICE_KEY_LEGACY, INITIAL_REST_VERSION, + CREATE_DATA_VIEW_DESCRIPTION, } from '../../constants'; import { DataViewSpecRestResponse } from '../route_types'; @@ -47,7 +48,7 @@ export const createDataView = async ({ }; const registerCreateDataViewRouteFactory = - (path: string, serviceKey: string) => + (path: string, serviceKey: string, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -56,7 +57,7 @@ const registerCreateDataViewRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.post({ path, access: 'public' }).addVersion( + router.versioned.post({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -127,7 +128,8 @@ const registerCreateDataViewRouteFactory = export const registerCreateDataViewRoute = registerCreateDataViewRouteFactory( DATA_VIEW_PATH, - SERVICE_KEY + SERVICE_KEY, + CREATE_DATA_VIEW_DESCRIPTION ); export const registerCreateDataViewRouteLegacy = registerCreateDataViewRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/default_data_view.ts b/src/plugins/data_views/server/rest_api_routes/public/default_data_view.ts index 00f992dfab334..5fb01acf14dc8 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/default_data_view.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/default_data_view.ts @@ -21,6 +21,8 @@ import { SERVICE_KEY, SERVICE_KEY_LEGACY, INITIAL_REST_VERSION, + GET_DEFAULT_DATA_VIEW_DESCRIPTION, + SET_DEFAULT_DATA_VIEW_DESCRIPTION, } from '../../constants'; interface GetDefaultArgs { @@ -58,7 +60,7 @@ export const setDefault = async ({ }; const manageDefaultIndexPatternRoutesFactory = - (path: string, serviceKey: string) => + (path: string, serviceKey: string, getDescription?: string, postDescription?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -67,7 +69,7 @@ const manageDefaultIndexPatternRoutesFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.get({ path, access: 'public' }).addVersion( + router.versioned.get({ path, access: 'public', description: getDescription }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -104,7 +106,7 @@ const manageDefaultIndexPatternRoutesFactory = }) ); - router.versioned.post({ path, access: 'public' }).addVersion( + router.versioned.post({ path, access: 'public', description: postDescription }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -159,7 +161,9 @@ const manageDefaultIndexPatternRoutesFactory = export const registerManageDefaultDataViewRoute = manageDefaultIndexPatternRoutesFactory( `${SERVICE_PATH}/default`, - SERVICE_KEY + SERVICE_KEY, + GET_DEFAULT_DATA_VIEW_DESCRIPTION, + SET_DEFAULT_DATA_VIEW_DESCRIPTION ); export const registerManageDefaultDataViewRouteLegacy = manageDefaultIndexPatternRoutesFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/delete_data_view.ts b/src/plugins/data_views/server/rest_api_routes/public/delete_data_view.ts index f3f8f26305437..ae00d649eb9dc 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/delete_data_view.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/delete_data_view.ts @@ -19,6 +19,7 @@ import { SPECIFIC_DATA_VIEW_PATH, SPECIFIC_DATA_VIEW_PATH_LEGACY, INITIAL_REST_VERSION, + DELETE_DATA_VIEW_DESCRIPTION, } from '../../constants'; interface DeleteDataViewArgs { @@ -39,7 +40,7 @@ export const deleteDataView = async ({ }; const deleteIndexPatternRouteFactory = - (path: string) => + (path: string, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -48,7 +49,7 @@ const deleteIndexPatternRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.delete({ path, access: 'public' }).addVersion( + router.versioned.delete({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -91,7 +92,10 @@ const deleteIndexPatternRouteFactory = ); }; -export const registerDeleteDataViewRoute = deleteIndexPatternRouteFactory(SPECIFIC_DATA_VIEW_PATH); +export const registerDeleteDataViewRoute = deleteIndexPatternRouteFactory( + SPECIFIC_DATA_VIEW_PATH, + DELETE_DATA_VIEW_DESCRIPTION +); export const registerDeleteDataViewRouteLegacy = deleteIndexPatternRouteFactory( SPECIFIC_DATA_VIEW_PATH_LEGACY diff --git a/src/plugins/data_views/server/rest_api_routes/public/fields/update_fields.ts b/src/plugins/data_views/server/rest_api_routes/public/fields/update_fields.ts index c9c97e4ed8d57..a8d2e7d0a5247 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/fields/update_fields.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/fields/update_fields.ts @@ -26,6 +26,7 @@ import { SERVICE_KEY, SERVICE_KEY_LEGACY, INITIAL_REST_VERSION, + UPDATE_DATA_VIEW_FIELDS_DESCRIPTION, } from '../../../constants'; interface UpdateFieldsArgs { @@ -117,7 +118,7 @@ const fieldUpdateSchema = schema.object({ format: schema.maybe(schema.nullable(serializedFieldFormatSchema)), }); -const updateFieldsActionRouteFactory = (path: string, serviceKey: string) => { +const updateFieldsActionRouteFactory = (path: string, serviceKey: string, description?: string) => { return ( router: IRouter, getStartServices: StartServicesAccessor< @@ -126,7 +127,7 @@ const updateFieldsActionRouteFactory = (path: string, serviceKey: string) => { >, usageCollection?: UsageCounter ) => { - router.versioned.post({ path, access: 'public' }).addVersion( + router.versioned.post({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -200,7 +201,8 @@ const updateFieldsActionRouteFactory = (path: string, serviceKey: string) => { export const registerUpdateFieldsRouteLegacy = updateFieldsActionRouteFactory( `${SPECIFIC_DATA_VIEW_PATH}/fields`, - SERVICE_KEY + SERVICE_KEY, + UPDATE_DATA_VIEW_FIELDS_DESCRIPTION ); export const registerUpdateFieldsRoute = updateFieldsActionRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/get_data_view.ts b/src/plugins/data_views/server/rest_api_routes/public/get_data_view.ts index d484623059c44..72c3b5328256f 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/get_data_view.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/get_data_view.ts @@ -23,6 +23,7 @@ import { SERVICE_KEY, SERVICE_KEY_LEGACY, INITIAL_REST_VERSION, + GET_DATA_VIEW_DESCRIPTION, } from '../../constants'; interface GetDataViewArgs { @@ -43,7 +44,7 @@ export const getDataView = async ({ }; const getDataViewRouteFactory = - (path: string, serviceKey: string) => + (path: string, serviceKey: string, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -52,7 +53,7 @@ const getDataViewRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.get({ path, access: 'public' }).addVersion( + router.versioned.get({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -117,7 +118,8 @@ const getDataViewRouteFactory = export const registerGetDataViewRoute = getDataViewRouteFactory( SPECIFIC_DATA_VIEW_PATH, - SERVICE_KEY + SERVICE_KEY, + GET_DATA_VIEW_DESCRIPTION ); export const registerGetDataViewRouteLegacy = getDataViewRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/get_data_views.ts b/src/plugins/data_views/server/rest_api_routes/public/get_data_views.ts index 1314fdd265f74..ab71b45921f77 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/get_data_views.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/get_data_views.ts @@ -15,7 +15,12 @@ import type { DataViewsServerPluginStartDependencies, DataViewsServerPluginStart, } from '../../types'; -import { SERVICE_KEY, SERVICE_PATH, INITIAL_REST_VERSION } from '../../constants'; +import { + SERVICE_KEY, + SERVICE_PATH, + INITIAL_REST_VERSION, + GET_DATA_VIEWS_DESCRIPTION, +} from '../../constants'; import { DataViewListItemRestResponse } from '../route_types'; interface GetDataViewsArgs { @@ -34,7 +39,7 @@ export const getDataViews = async ({ }; const getDataViewsRouteFactory = - (path: string, serviceKey: string) => + (path: string, serviceKey: string, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -57,7 +62,7 @@ const getDataViewsRouteFactory = return schema.object({ [serviceKey]: dataViewListSchema }); }; - router.versioned.get({ path, access: 'public' }).addVersion( + router.versioned.get({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -98,4 +103,8 @@ const getDataViewsRouteFactory = ); }; -export const registerGetDataViewsRoute = getDataViewsRouteFactory(SERVICE_PATH, SERVICE_KEY); +export const registerGetDataViewsRoute = getDataViewsRouteFactory( + SERVICE_PATH, + SERVICE_KEY, + GET_DATA_VIEWS_DESCRIPTION +); diff --git a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/create_runtime_field.ts b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/create_runtime_field.ts index 8f2ed701ecf0a..ff446f76c885a 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/create_runtime_field.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/create_runtime_field.ts @@ -24,6 +24,7 @@ import { SERVICE_KEY_LEGACY, SERVICE_KEY_TYPE, INITIAL_REST_VERSION, + CREATE_RUNTIME_FIELD_DESCRIPTION, } from '../../../constants'; import { responseFormatter } from './response_formatter'; import { runtimeResponseSchema } from '../../schema'; @@ -68,7 +69,7 @@ export const createRuntimeField = async ({ }; const runtimeCreateFieldRouteFactory = - (path: string, serviceKey: SERVICE_KEY_TYPE) => + (path: string, serviceKey: SERVICE_KEY_TYPE, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -77,7 +78,7 @@ const runtimeCreateFieldRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.post({ path, access: 'public' }).addVersion( + router.versioned.post({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -138,7 +139,8 @@ const runtimeCreateFieldRouteFactory = export const registerCreateRuntimeFieldRoute = runtimeCreateFieldRouteFactory( RUNTIME_FIELD_PATH, - SERVICE_KEY + SERVICE_KEY, + CREATE_RUNTIME_FIELD_DESCRIPTION ); export const registerCreateRuntimeFieldRouteLegacy = runtimeCreateFieldRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/delete_runtime_field.ts b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/delete_runtime_field.ts index bbbdb4a914a61..8d504abdf9d98 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/delete_runtime_field.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/delete_runtime_field.ts @@ -20,6 +20,7 @@ import { SPECIFIC_RUNTIME_FIELD_PATH, SPECIFIC_RUNTIME_FIELD_PATH_LEGACY, INITIAL_REST_VERSION, + DELETE_RUNTIME_FIELD_DESCRIPTION, } from '../../../constants'; interface DeleteRuntimeFieldArgs { @@ -51,7 +52,7 @@ export const deleteRuntimeField = async ({ }; const deleteRuntimeFieldRouteFactory = - (path: string) => + (path: string, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -60,7 +61,7 @@ const deleteRuntimeFieldRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.delete({ path, access: 'public' }).addVersion( + router.versioned.delete({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -110,7 +111,8 @@ const deleteRuntimeFieldRouteFactory = }; export const registerDeleteRuntimeFieldRoute = deleteRuntimeFieldRouteFactory( - SPECIFIC_RUNTIME_FIELD_PATH + SPECIFIC_RUNTIME_FIELD_PATH, + DELETE_RUNTIME_FIELD_DESCRIPTION ); export const registerDeleteRuntimeFieldRouteLegacy = deleteRuntimeFieldRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/get_runtime_field.ts b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/get_runtime_field.ts index 928a6a6df6884..8e7639b9f8bee 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/get_runtime_field.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/get_runtime_field.ts @@ -23,6 +23,7 @@ import { SERVICE_KEY_LEGACY, SERVICE_KEY_TYPE, INITIAL_REST_VERSION, + GET_RUNTIME_FIELD_DESCRIPTION, } from '../../../constants'; import { responseFormatter } from './response_formatter'; import { runtimeResponseSchema } from '../../schema'; @@ -59,7 +60,7 @@ export const getRuntimeField = async ({ }; const getRuntimeFieldRouteFactory = - (path: string, serviceKey: SERVICE_KEY_TYPE) => + (path: string, serviceKey: SERVICE_KEY_TYPE, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -68,7 +69,7 @@ const getRuntimeFieldRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.get({ path, access: 'public' }).addVersion( + router.versioned.get({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -125,7 +126,8 @@ const getRuntimeFieldRouteFactory = export const registerGetRuntimeFieldRoute = getRuntimeFieldRouteFactory( SPECIFIC_RUNTIME_FIELD_PATH, - SERVICE_KEY + SERVICE_KEY, + GET_RUNTIME_FIELD_DESCRIPTION ); export const registerGetRuntimeFieldRouteLegacy = getRuntimeFieldRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/put_runtime_field.ts b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/put_runtime_field.ts index de06d2cded9f7..7105d8ea8413b 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/put_runtime_field.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/put_runtime_field.ts @@ -24,6 +24,7 @@ import { SERVICE_KEY_LEGACY, SERVICE_KEY_TYPE, INITIAL_REST_VERSION, + CREATE_UPDATE_RUNTIME_FIELD_DESCRIPTION, } from '../../../constants'; import { responseFormatter } from './response_formatter'; import { RuntimeResponseType } from '../../route_types'; @@ -67,7 +68,7 @@ export const putRuntimeField = async ({ }; const putRuntimeFieldRouteFactory = - (path: string, serviceKey: SERVICE_KEY_TYPE) => + (path: string, serviceKey: SERVICE_KEY_TYPE, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -76,7 +77,7 @@ const putRuntimeFieldRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.put({ path, access: 'public' }).addVersion( + router.versioned.put({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -140,7 +141,8 @@ const putRuntimeFieldRouteFactory = export const registerPutRuntimeFieldRoute = putRuntimeFieldRouteFactory( RUNTIME_FIELD_PATH, - SERVICE_KEY + SERVICE_KEY, + CREATE_UPDATE_RUNTIME_FIELD_DESCRIPTION ); export const registerPutRuntimeFieldRouteLegacy = putRuntimeFieldRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/update_runtime_field.ts b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/update_runtime_field.ts index efbe7fd31e8d2..485551c866eef 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/update_runtime_field.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/runtime_fields/update_runtime_field.ts @@ -25,6 +25,7 @@ import { SERVICE_KEY_LEGACY, SERVICE_KEY_TYPE, INITIAL_REST_VERSION, + UPDATE_RUNTIME_FIELD_DESCRIPTION, } from '../../../constants'; import { responseFormatter } from './response_formatter'; import { runtimeResponseSchema } from '../../schema'; @@ -67,7 +68,7 @@ export const updateRuntimeField = async ({ }; const updateRuntimeFieldRouteFactory = - (path: string, serviceKey: SERVICE_KEY_TYPE) => + (path: string, serviceKey: SERVICE_KEY_TYPE, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -76,7 +77,7 @@ const updateRuntimeFieldRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.post({ path, access: 'public' }).addVersion( + router.versioned.post({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -139,7 +140,8 @@ const updateRuntimeFieldRouteFactory = export const registerUpdateRuntimeFieldRoute = updateRuntimeFieldRouteFactory( SPECIFIC_RUNTIME_FIELD_PATH, - SERVICE_KEY + SERVICE_KEY, + UPDATE_RUNTIME_FIELD_DESCRIPTION ); export const registerUpdateRuntimeFieldRouteLegacy = updateRuntimeFieldRouteFactory( diff --git a/src/plugins/data_views/server/rest_api_routes/public/swap_references.ts b/src/plugins/data_views/server/rest_api_routes/public/swap_references.ts index ebdea001444be..29ebebe2c5ee7 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/swap_references.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/swap_references.ts @@ -15,7 +15,12 @@ import type { DataViewsServerPluginStartDependencies, DataViewsServerPluginStart, } from '../../types'; -import { DATA_VIEW_SWAP_REFERENCES_PATH, INITIAL_REST_VERSION } from '../../constants'; +import { + DATA_VIEW_SWAP_REFERENCES_PATH, + INITIAL_REST_VERSION, + PREVIEW_SWAP_REFERENCES_DESCRIPTION, + SWAP_REFERENCES_DESCRIPTION, +} from '../../constants'; import { DATA_VIEW_SAVED_OBJECT_TYPE } from '../../../common/constants'; interface GetDataViewArgs { @@ -58,7 +63,10 @@ export const swapReferencesRoute = const path = previewRoute ? `${DATA_VIEW_SWAP_REFERENCES_PATH}/_preview` : DATA_VIEW_SWAP_REFERENCES_PATH; - router.versioned.post({ path, access: 'public' }).addVersion( + const description = previewRoute + ? PREVIEW_SWAP_REFERENCES_DESCRIPTION + : SWAP_REFERENCES_DESCRIPTION; + router.versioned.post({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { diff --git a/src/plugins/data_views/server/rest_api_routes/public/update_data_view.ts b/src/plugins/data_views/server/rest_api_routes/public/update_data_view.ts index a551a1b63bc2d..0c7c66a0a1fec 100644 --- a/src/plugins/data_views/server/rest_api_routes/public/update_data_view.ts +++ b/src/plugins/data_views/server/rest_api_routes/public/update_data_view.ts @@ -29,6 +29,7 @@ import { SERVICE_KEY, SERVICE_KEY_LEGACY, INITIAL_REST_VERSION, + UPDATE_DATA_VIEW_DESCRIPTION, } from '../../constants'; const indexPatternUpdateSchema = schema.object({ @@ -137,7 +138,7 @@ export const updateDataView = async ({ }; const updateDataViewRouteFactory = - (path: string, serviceKey: string) => + (path: string, serviceKey: string, description?: string) => ( router: IRouter, getStartServices: StartServicesAccessor< @@ -146,7 +147,7 @@ const updateDataViewRouteFactory = >, usageCollection?: UsageCounter ) => { - router.versioned.post({ path, access: 'public' }).addVersion( + router.versioned.post({ path, access: 'public', description }).addVersion( { version: INITIAL_REST_VERSION, validate: { @@ -222,7 +223,8 @@ const updateDataViewRouteFactory = export const registerUpdateDataViewRoute = updateDataViewRouteFactory( SPECIFIC_DATA_VIEW_PATH, - SERVICE_KEY + SERVICE_KEY, + UPDATE_DATA_VIEW_DESCRIPTION ); export const registerUpdateDataViewRouteLegacy = updateDataViewRouteFactory( From 1c56c518b76bf25c69de25033a441cc70bb8a8b8 Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:28:11 -0700 Subject: [PATCH 14/82] [ResponseOps] Flapping recovered alerts do not show up as active in the alerts table (#184255) Resolves https://github.com/elastic/kibana/issues/183735 ## Summary This bug is caused by event log docs not being written for "pending recovered" alerts on rules with "notify on every run" and "throttle" or notify when set to null. In this PR I remove the logic causing this in `xpack/plugins/alerting/server/lib/get_alerts_for_notification.ts` so now these alerts will be logged in the event log and show up in the ui. ### 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 ### To verify - Create an ES Query rule without actions, or with `notifyWhen` set to "notify on every run" or "throttle". Get it to start flapping. - Let the flapping alert start to recover and verify it's still reported as active in the UI until it's been recovered for X executions (the default is 4 if you don't mess with your flapping settings). Ex. of what to expect Screen Shot 2024-05-29 at 10 53 57 AM --- .../alerts_client/alerts_client.test.ts | 1 - .../legacy_alerts_client.test.ts | 2 - .../alerts_client/legacy_alerts_client.ts | 4 - .../alerting/server/alerts_client/types.ts | 2 - .../lib/get_alerts_for_notification.test.ts | 122 ------------------ .../server/lib/get_alerts_for_notification.ts | 8 +- .../task_runner/rule_type_runner.test.ts | 8 -- .../server/task_runner/rule_type_runner.ts | 5 - .../task_runner_alerts_client.test.ts | 1 - .../tests/alerting/group1/event_log.ts | 12 +- 10 files changed, 9 insertions(+), 156 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts index b3316083d790f..ef6f93d5894a2 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts @@ -313,7 +313,6 @@ describe('Alerts Client', () => { ruleRunMetricsStore, shouldLogAlerts: false, flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: true, maintenanceWindowIds: [], alertDelay: 0, }; diff --git a/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.test.ts b/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.test.ts index 0aa0d59d6db89..0acda99585a4f 100644 --- a/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.test.ts @@ -243,7 +243,6 @@ describe('Legacy Alerts Client', () => { ruleRunMetricsStore, shouldLogAlerts: true, flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: true, maintenanceWindowIds: ['window-id1', 'window-id2'], alertDelay: 5, }); @@ -274,7 +273,6 @@ describe('Legacy Alerts Client', () => { lookBackWindow: 20, statusChangeThreshold: 4, }, - true, 'default', 5, {}, diff --git a/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.ts b/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.ts index 5e7bc30cb26b7..c3ff97c645520 100644 --- a/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.ts +++ b/x-pack/plugins/alerting/server/alerts_client/legacy_alerts_client.ts @@ -142,7 +142,6 @@ export class LegacyAlertsClient< } public processAlerts({ - notifyOnActionGroupChange, flappingSettings, maintenanceWindowIds, alertDelay, @@ -173,7 +172,6 @@ export class LegacyAlertsClient< const alerts = getAlertsForNotification( flappingSettings, - notifyOnActionGroupChange, this.options.ruleType.defaultActionGroupId, alertDelay, processedAlertsNew, @@ -211,12 +209,10 @@ export class LegacyAlertsClient< ruleRunMetricsStore, shouldLogAlerts, flappingSettings, - notifyOnActionGroupChange, maintenanceWindowIds, alertDelay, }: ProcessAndLogAlertsOpts) { this.processAlerts({ - notifyOnActionGroupChange, flappingSettings, maintenanceWindowIds, alertDelay, diff --git a/x-pack/plugins/alerting/server/alerts_client/types.ts b/x-pack/plugins/alerting/server/alerts_client/types.ts index 18fb52a806b62..e1b31e54afd10 100644 --- a/x-pack/plugins/alerting/server/alerts_client/types.ts +++ b/x-pack/plugins/alerting/server/alerts_client/types.ts @@ -108,14 +108,12 @@ export interface ProcessAndLogAlertsOpts { shouldLogAlerts: boolean; ruleRunMetricsStore: RuleRunMetricsStore; flappingSettings: RulesSettingsFlappingProperties; - notifyOnActionGroupChange: boolean; maintenanceWindowIds: string[]; alertDelay: number; } export interface ProcessAlertsOpts { flappingSettings: RulesSettingsFlappingProperties; - notifyOnActionGroupChange: boolean; maintenanceWindowIds: string[]; alertDelay: number; ruleRunMetricsStore: RuleRunMetricsStore; diff --git a/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.test.ts b/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.test.ts index b50025b415178..1d216dfbf8b07 100644 --- a/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.test.ts +++ b/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.test.ts @@ -19,7 +19,6 @@ describe('getAlertsForNotification', () => { const { newAlerts, activeAlerts } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 0, { @@ -90,7 +89,6 @@ describe('getAlertsForNotification', () => { currentRecoveredAlerts, } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 0, {}, @@ -226,7 +224,6 @@ describe('getAlertsForNotification', () => { const { newAlerts, activeAlerts, recoveredAlerts, currentRecoveredAlerts } = getAlertsForNotification( DISABLE_FLAPPING_SETTINGS, - true, 'default', 0, {}, @@ -347,120 +344,6 @@ describe('getAlertsForNotification', () => { `); }); - test('should return flapping pending recovered alerts as active alerts only when notifyWhen is onActionGroupChange', () => { - const alert1 = new Alert('1', { meta: { flapping: true, pendingRecoveredCount: 3 } }); - const alert2 = new Alert('2', { meta: { flapping: false } }); - const alert3 = new Alert('3', { meta: { flapping: true } }); - - const { - newAlerts, - activeAlerts, - currentActiveAlerts, - recoveredAlerts, - currentRecoveredAlerts, - } = getAlertsForNotification( - DEFAULT_FLAPPING_SETTINGS, - false, - 'default', - 0, - {}, - {}, - { - // recovered alerts - '1': alert1, - '2': alert2, - '3': alert3, - }, - { - // current recovered alerts - '1': alert1, - '2': alert2, - '3': alert3, - } - ); - - expect(newAlerts).toMatchInlineSnapshot(`Object {}`); - expect(alertsWithAnyUUID(activeAlerts)).toMatchInlineSnapshot(` - Object { - "3": Object { - "meta": Object { - "activeCount": 0, - "flapping": true, - "flappingHistory": Array [], - "maintenanceWindowIds": Array [], - "pendingRecoveredCount": 1, - "uuid": Any, - }, - "state": Object {}, - }, - } - `); - expect(Object.values(activeAlerts).map((a) => a.getScheduledActionOptions())) - .toMatchInlineSnapshot(` - Array [ - Object { - "actionGroup": "default", - "context": Object {}, - "state": Object {}, - }, - ] - `); - expect(currentActiveAlerts).toMatchInlineSnapshot(`Object {}`); - expect( - Object.values(currentActiveAlerts).map((a) => a.getScheduledActionOptions()) - ).toMatchInlineSnapshot(`Array []`); - expect(alertsWithAnyUUID(recoveredAlerts)).toMatchInlineSnapshot(` - Object { - "1": Object { - "meta": Object { - "activeCount": 0, - "flapping": true, - "flappingHistory": Array [], - "maintenanceWindowIds": Array [], - "pendingRecoveredCount": 0, - "uuid": Any, - }, - "state": Object {}, - }, - "2": Object { - "meta": Object { - "activeCount": 0, - "flapping": false, - "flappingHistory": Array [], - "maintenanceWindowIds": Array [], - "uuid": Any, - }, - "state": Object {}, - }, - } - `); - expect(alertsWithAnyUUID(currentRecoveredAlerts)).toMatchInlineSnapshot(` - Object { - "1": Object { - "meta": Object { - "activeCount": 0, - "flapping": true, - "flappingHistory": Array [], - "maintenanceWindowIds": Array [], - "pendingRecoveredCount": 0, - "uuid": Any, - }, - "state": Object {}, - }, - "2": Object { - "meta": Object { - "activeCount": 0, - "flapping": false, - "flappingHistory": Array [], - "maintenanceWindowIds": Array [], - "uuid": Any, - }, - "state": Object {}, - }, - } - `); - }); - test('should increment activeCount for all active alerts', () => { const alert1 = new Alert('1', { meta: { activeCount: 1, uuid: 'uuid-1' }, @@ -470,7 +353,6 @@ describe('getAlertsForNotification', () => { const { newAlerts, activeAlerts, currentActiveAlerts, delayedAlertsCount } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 0, { @@ -557,7 +439,6 @@ describe('getAlertsForNotification', () => { const { recoveredAlerts, currentRecoveredAlerts, delayedAlertsCount } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 0, {}, @@ -630,7 +511,6 @@ describe('getAlertsForNotification', () => { const { newAlerts, activeAlerts, currentActiveAlerts, delayedAlertsCount } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 5, { @@ -683,7 +563,6 @@ describe('getAlertsForNotification', () => { const { recoveredAlerts, currentRecoveredAlerts, delayedAlertsCount } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 5, {}, @@ -710,7 +589,6 @@ describe('getAlertsForNotification', () => { const { newAlerts, activeAlerts, currentActiveAlerts, delayedAlertsCount } = getAlertsForNotification( DEFAULT_FLAPPING_SETTINGS, - true, 'default', 1, {}, diff --git a/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.ts b/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.ts index c1974810b46d0..5761ab68c8205 100644 --- a/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.ts +++ b/x-pack/plugins/alerting/server/lib/get_alerts_for_notification.ts @@ -17,7 +17,6 @@ export function getAlertsForNotification< RecoveryActionGroupId extends string >( flappingSettings: RulesSettingsFlappingProperties, - notifyOnActionGroupChange: boolean, actionGroupId: string, alertDelay: number, newAlerts: Record> = {}, @@ -83,12 +82,7 @@ export function getAlertsForNotification< context ); activeAlerts[id] = newAlert; - - // rule with "on status change" or rule with at least one - // action with "on status change" should return notifications - if (notifyOnActionGroupChange) { - currentActiveAlerts[id] = newAlert; - } + currentActiveAlerts[id] = newAlert; // remove from recovered alerts delete recoveredAlerts[id]; diff --git a/x-pack/plugins/alerting/server/task_runner/rule_type_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/rule_type_runner.test.ts index 888ed3b864831..42af7ba476085 100644 --- a/x-pack/plugins/alerting/server/task_runner/rule_type_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/rule_type_runner.test.ts @@ -247,7 +247,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -353,7 +352,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -415,7 +413,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -761,7 +758,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -874,7 +870,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -981,7 +976,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -1084,7 +1078,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, @@ -1187,7 +1180,6 @@ describe('RuleTypeRunner', () => { expect(ruleRunMetricsStore.setSearchMetrics).toHaveBeenCalled(); expect(alertsClient.processAlerts).toHaveBeenCalledWith({ flappingSettings: DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: false, maintenanceWindowIds: [], alertDelay: 0, ruleRunMetricsStore, diff --git a/x-pack/plugins/alerting/server/task_runner/rule_type_runner.ts b/x-pack/plugins/alerting/server/task_runner/rule_type_runner.ts index cfac117c8f0fd..3b9990cb938a1 100644 --- a/x-pack/plugins/alerting/server/task_runner/rule_type_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/rule_type_runner.ts @@ -13,7 +13,6 @@ import { createTaskRunError, TaskErrorSource, } from '@kbn/task-manager-plugin/server'; -import { some } from 'lodash'; import { getErrorSource } from '@kbn/task-manager-plugin/server/task_running'; import { IAlertsClient } from '../alerts_client/types'; import { MaintenanceWindow } from '../application/maintenance_window/types'; @@ -24,7 +23,6 @@ import { DEFAULT_FLAPPING_SETTINGS, RuleAlertData, RuleExecutionStatusErrorReasons, - RuleNotifyWhen, RuleTypeParams, RuleTypeState, SanitizedRule, @@ -323,9 +321,6 @@ export class RuleTypeRunner< await this.options.timer.runWithTimer(TaskRunnerTimerSpan.ProcessAlerts, async () => { alertsClient.processAlerts({ flappingSettings: context.flappingSettings ?? DEFAULT_FLAPPING_SETTINGS, - notifyOnActionGroupChange: - notifyWhen === RuleNotifyWhen.CHANGE || - some(actions, (action) => action.frequency?.notifyWhen === RuleNotifyWhen.CHANGE), maintenanceWindowIds: maintenanceWindowsWithoutScopedQueryIds, alertDelay: alertDelay?.active ?? 0, ruleRunMetricsStore: context.ruleRunMetricsStore, diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts index fe8bfe86a2f46..2a13bd4cd7c54 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts @@ -815,7 +815,6 @@ describe('Task Runner', () => { expect(alertsClientNotToUse.checkLimitUsage).not.toHaveBeenCalled(); expect(alertsClientToUse.processAlerts).toHaveBeenCalledWith({ - notifyOnActionGroupChange: false, alertDelay: 0, flappingSettings: { enabled: true, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts index 79e5b659e341d..e780e1186af9e 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts @@ -1240,7 +1240,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { ) .map((event) => event?.kibana?.alert?.flapping); const result = [false, false, false, false, false].concat( - new Array(7).fill(true), + new Array(9).fill(true), false, false, false @@ -1348,7 +1348,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { ) .map((event) => event?.kibana?.alert?.flapping); const result = [false, false, false, false, false].concat( - new Array(7).fill(true), + new Array(9).fill(true), false, false, false @@ -1443,7 +1443,9 @@ export default function eventLogTests({ getService }: FtrProviderContext) { event?.event?.action === 'recovered-instance' ) .map((event) => event?.kibana?.alert?.flapping); - expect(flapping).to.eql([false, false, false, false, false, true, true, true]); + expect(flapping).to.eql( + [false, false, false, false, false].concat(new Array(8).fill(true)) + ); }); it('should generate expected events for flapping alerts that settle on recovered where the action notifyWhen is NOT set to "on status change"', async () => { @@ -1544,7 +1546,9 @@ export default function eventLogTests({ getService }: FtrProviderContext) { event?.event?.action === 'recovered-instance' ) .map((event) => event?.kibana?.alert?.flapping); - expect(flapping).to.eql([false, false, false, false, false, true, true, true]); + expect(flapping).to.eql( + [false, false, false, false, false].concat(new Array(8).fill(true)) + ); }); it('should generate expected uuids for events for flapping alerts that go active while flapping and eventually recover', async () => { From 3efa595a9ad52e63324fc3009ab7c9fb52174eed Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:55:39 -0700 Subject: [PATCH 15/82] Upgrade EUI to v94.6.0 (#184672) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `v94.5.2` ⏩ `v94.6.0` [Questions? Please see our Kibana upgrade FAQ.](https://github.com/elastic/eui/blob/main/wiki/eui-team-processes/upgrading-kibana.md#faq-for-kibana-teams) --- ## [`v94.6.0`](https://github.com/elastic/eui/releases/v94.6.0) - Updated `EuiComboBox` to support rendering `option.append` and `option.prepend` in group labels ([#7800](https://github.com/elastic/eui/pull/7800)) **Accessibility** - Improved the accessibility experience of `EuiBetaBadge` ([#7805](https://github.com/elastic/eui/pull/7805)) --- package.json | 2 +- src/dev/license_checker/config.ts | 2 +- yarn.lock | 39 ++++++------------------------- 3 files changed, 9 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index befee4c5bfb3c..7285c7721ae4b 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.13.0", "@elastic/ems-client": "8.5.1", - "@elastic/eui": "94.5.2", + "@elastic/eui": "94.6.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index d4734866b548f..b7642cf7e9af7 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -86,7 +86,7 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.5.1': ['Elastic License 2.0'], - '@elastic/eui@94.5.2': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@94.6.0': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/yarn.lock b/yarn.lock index 510b9154486a3..172b8fc5940fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1735,10 +1735,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@94.5.2": - version "94.5.2" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.5.2.tgz#f26a94343b92388f9e18be9e4bb5659957e92d44" - integrity sha512-rSheSetb35YbyfLGmLE4vLYgvNbQERHb5k3abKce+mo19cuvQZxuRj1b87N6B4ZSe1zvipGyvfuvFMp2p2spdQ== +"@elastic/eui@94.6.0": + version "94.6.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.6.0.tgz#fd56be1dbdcdea259cdb3504085c8479fa35bcef" + integrity sha512-lYXVcylXn4Iz2WumBuOEkc1PRFoUby7CTnNhTS/gVrbTP7Mn0ombcoPFUSiZcA7VuN2mHfPmTUdBQptC/apTzA== dependencies: "@hello-pangea/dnd" "^16.6.0" "@types/lodash" "^4.14.202" @@ -29011,7 +29011,7 @@ string-replace-loader@^2.2.0: loader-utils "^1.2.3" schema-utils "^1.0.0" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -29029,15 +29029,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -29147,7 +29138,7 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -29161,13 +29152,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -32040,7 +32024,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -32066,15 +32050,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From d720a9bff30138b840f522d88a5b28acae2e23a4 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:34:01 -0500 Subject: [PATCH 16/82] [ML] Adds ES|QL support for field statistics table in Discover (#180849) ## Summary Follow up of https://github.com/elastic/kibana/pull/179098. Adds ES|QL for support field statistics table in Discover Screenshot 2024-05-09 at 13 59 29 https://github.com/elastic/kibana/assets/43350163/09a1feeb-cff6-4b8b-bf82-bb930413f215 https://github.com/elastic/kibana/assets/43350163/2acd78ec-1856-406e-a8f9-f6b2a26f8d81 ### 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: Stratoula Kalafateli Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Davis McPhee --- .../field_stats_table/field_stats_tab.tsx | 14 ++- .../field_stats_table/field_stats_table.tsx | 46 ++++++--- .../components/field_stats_table/types.ts | 4 + .../components/layout/discover_layout.tsx | 10 +- .../layout/discover_main_content.tsx | 3 +- .../main/hooks/use_esql_mode.test.tsx | 7 +- .../discover_saved_search_container.ts | 8 +- .../utils/get_state_defaults.test.ts | 4 +- .../main/utils/get_valid_view_mode.test.ts | 2 +- .../main/utils/get_valid_view_mode.ts | 7 +- .../view_mode_toggle.test.tsx | 8 +- .../view_mode_toggle/view_mode_toggle.tsx | 6 +- .../embeddable/saved_search_embeddable.tsx | 1 + .../apps/discover/group4/_esql_view.ts | 2 +- .../apps/discover/group6/_view_mode_toggle.ts | 4 +- .../common/types/field_request_config.ts | 1 + .../common/types/field_stats.ts | 5 + .../data_visualizer_stats_table.tsx | 6 +- .../components/stats_table/types/index.ts | 6 +- .../components/top_values/top_values.tsx | 28 +++++- .../index_data_visualizer_esql.tsx | 29 ++++-- .../embeddable_esql_field_stats_table.tsx | 82 ++++++++-------- .../embeddable_field_stats_table.tsx | 14 +-- .../field_stats_embeddable_wrapper.tsx | 62 ++++++++++--- .../embeddables/grid_embeddable/types.ts | 7 +- .../esql/use_data_visualizer_esql_data.tsx | 93 ++++++++++++------- .../hooks/esql/use_esql_overall_stats_data.ts | 19 ++-- .../hooks/use_data_visualizer_grid_data.ts | 9 +- .../esql_requests/get_boolean_field_stats.ts | 4 +- .../get_count_and_cardinality.ts | 29 ++---- .../esql_requests/get_date_field_stats.ts | 4 +- .../esql_requests/get_keyword_fields.ts | 17 ++-- .../esql_requests/get_numeric_field_stats.ts | 4 +- .../search_strategy/requests/esql_utils.ts | 2 +- x-pack/plugins/data_visualizer/tsconfig.json | 3 +- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../data_visualizer/esql_data_visualizer.ts | 4 +- .../common/discover/esql/_esql_view.ts | 3 +- 40 files changed, 340 insertions(+), 223 deletions(-) diff --git a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx index 62c40ef529b7e..ca7c6424015e7 100644 --- a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx +++ b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx @@ -15,18 +15,22 @@ import { useAdditionalFieldGroups } from '../../hooks/sidebar/use_additional_fie export const FieldStatisticsTab: React.FC> = React.memo((props) => { const services = useDiscoverServices(); - const querySubscriberResult = useQuerySubscriber({ + const { query, filters } = useQuerySubscriber({ data: services.data, }); const additionalFieldGroups = useAdditionalFieldGroups(); if (!services.dataVisualizer) return null; - return ( ); diff --git a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx index c2a7f30a27117..5829bd42c68c9 100644 --- a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx +++ b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx @@ -10,18 +10,19 @@ import React, { useEffect, useMemo, useCallback } from 'react'; import { METRIC_TYPE } from '@kbn/analytics'; import { EuiFlexItem } from '@elastic/eui'; import { css } from '@emotion/react'; -import useObservable from 'react-use/lib/useObservable'; -import { of, map } from 'rxjs'; +import { of, map, filter } from 'rxjs'; import { BehaviorSubject } from 'rxjs'; +import useObservable from 'react-use/lib/useObservable'; import { convertFieldsToFallbackFields, getAllFallbackFields, getAssociatedSmartFieldsAsString, SmartFieldFallbackTooltip, } from '@kbn/unified-field-list'; -import type { DataVisualizerTableItem } from '@kbn/data-visualizer-plugin/public/application/common/components/stats_table/data_visualizer_stats_table'; +import type { DataVisualizerTableItem } from '@kbn/data-visualizer-plugin/public/application/common/components/stats_table/types'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { FIELD_STATISTICS_LOADED } from './constants'; + import type { NormalSamplingOption, FieldStatisticsTableProps } from './types'; export type { FieldStatisticsTableProps }; @@ -35,9 +36,11 @@ const statsTableCss = css({ }); const fallBacklastReloadRequestTime$ = new BehaviorSubject(0); +const fallbackTotalHits = of(undefined); -export const FieldStatisticsTable = (props: FieldStatisticsTableProps) => { +export const FieldStatisticsTable = React.memo((props: FieldStatisticsTableProps) => { const { + isEsqlMode, dataView, savedSearch, query, @@ -81,10 +84,15 @@ export const FieldStatisticsTable = (props: FieldStatisticsTableProps) => { [additionalFieldGroups, allFallbackFields] ); - const totalHits = useObservable(stateContainer?.dataState.data$.totalHits$ ?? of(undefined)); - const totalDocuments = useMemo(() => totalHits?.result, [totalHits]); - const services = useDiscoverServices(); + + // Other apps consuming Discover UI might inject their own proxied data services + // so we need override the kibana context services with the injected proxied services + // to make sure the table use the right service + const overridableServices = useMemo(() => { + return { data: services.data }; + }, [services.data]); + const dataVisualizerService = services.dataVisualizer; // State from Discover we want the embeddable to reflect @@ -95,11 +103,25 @@ export const FieldStatisticsTable = (props: FieldStatisticsTableProps) => { const lastReloadRequestTime$ = useMemo(() => { return stateContainer?.dataState?.refetch$ - ? stateContainer?.dataState?.refetch$.pipe(map(() => Date.now())) + ? stateContainer?.dataState?.refetch$.pipe( + map(() => { + return Date.now(); + }) + ) : fallBacklastReloadRequestTime$; }, [stateContainer]); - const lastReloadRequestTime = useObservable(lastReloadRequestTime$, 0); + const totalHitsComplete$ = useMemo(() => { + return stateContainer + ? stateContainer.dataState.data$.totalHits$.pipe( + filter((d) => d.fetchStatus === 'complete'), + map((d) => d?.result) + ) + : fallbackTotalHits; + }, [stateContainer]); + + const totalDocuments = useObservable(totalHitsComplete$); + const lastReloadRequestTime = useObservable(lastReloadRequestTime$); useEffect(() => { // Track should only be called once when component is loaded @@ -119,7 +141,7 @@ export const FieldStatisticsTable = (props: FieldStatisticsTableProps) => { const updateState = useCallback( (changes) => { if (changes.showDistributions !== undefined && stateContainer) { - stateContainer.appState.update({ hideAggregatedPreview: !changes.showDistributions }); + stateContainer.appState.update({ hideAggregatedPreview: !changes.showDistributions }, true); } }, [stateContainer] @@ -144,7 +166,9 @@ export const FieldStatisticsTable = (props: FieldStatisticsTableProps) => { showPreviewByDefault={showPreviewByDefault} onTableUpdate={updateState} renderFieldName={renderFieldName} + esql={isEsqlMode} + overridableServices={overridableServices} /> ); -}; +}); diff --git a/src/plugins/discover/public/application/main/components/field_stats_table/types.ts b/src/plugins/discover/public/application/main/components/field_stats_table/types.ts index 0ff28f2dcb700..ddd62285d044d 100644 --- a/src/plugins/discover/public/application/main/components/field_stats_table/types.ts +++ b/src/plugins/discover/public/application/main/components/field_stats_table/types.ts @@ -169,4 +169,8 @@ export interface FieldStatisticsTableProps { * Additional field groups (e.g. Smart Fields) */ additionalFieldGroups?: AdditionalFieldGroups; + /** + * If table should query using ES|QL + */ + isEsqlMode?: boolean; } diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index d141b89e453e3..0d94041738f54 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -75,6 +75,7 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { history, spaces, observabilityAIAssistant, + dataVisualizer: dataVisualizerService, } = useDiscoverServices(); const pageBackgroundColor = useEuiBackgroundColor('plain'); const globalQueryState = data.query.getState(); @@ -86,12 +87,13 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { state.sort, ]); const isEsqlMode = useIsEsqlMode(); + const viewMode: VIEW_MODE = useAppStateSelector((state) => { - if (state.viewMode === VIEW_MODE.DOCUMENT_LEVEL || state.viewMode === VIEW_MODE.PATTERN_LEVEL) { - return state.viewMode; - } - if (uiSettings.get(SHOW_FIELD_STATISTICS) !== true || isEsqlMode) + const fieldStatsNotAvailable = + !uiSettings.get(SHOW_FIELD_STATISTICS) && !!dataVisualizerService; + if (state.viewMode === VIEW_MODE.AGGREGATED_LEVEL && fieldStatsNotAvailable) { return VIEW_MODE.DOCUMENT_LEVEL; + } return state.viewMode ?? VIEW_MODE.DOCUMENT_LEVEL; }); const [dataView, dataViewLoading] = useInternalStateSelector((state) => [ diff --git a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx index 7c44ed1deff83..735eae1fa9039 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx @@ -67,7 +67,7 @@ export const DiscoverMainContent = ({ const setDiscoverViewMode = useCallback( (mode: VIEW_MODE) => { - stateContainer.appState.update({ viewMode: mode }); + stateContainer.appState.update({ viewMode: mode }, true); if (trackUiMetric) { if (mode === VIEW_MODE.AGGREGATED_LEVEL) { @@ -151,6 +151,7 @@ export const DiscoverMainContent = ({ stateContainer={stateContainer} onAddFilter={!isEsqlMode ? onAddFilter : undefined} trackUiMetric={trackUiMetric} + isEsqlMode={isEsqlMode} /> ) : null} diff --git a/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx b/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx index b24bcd3eb42d5..12109ea01a422 100644 --- a/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx +++ b/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx @@ -104,15 +104,12 @@ describe('useEsqlMode', () => { stateContainer.dataState.data$.documents$.next(msgComplete); expect(replaceUrlState).toHaveBeenCalledTimes(0); }); - test('should change viewMode to undefined (default) if it was AGGREGATED_LEVEL', async () => { + test('should not change viewMode to undefined (default) if it was AGGREGATED_LEVEL', async () => { const { replaceUrlState } = renderHookWithContext(false, { viewMode: VIEW_MODE.AGGREGATED_LEVEL, }); - await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); - expect(replaceUrlState).toHaveBeenCalledWith({ - viewMode: undefined, - }); + await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(0)); }); test('should change viewMode to undefined (default) if it was PATTERN_LEVEL', async () => { diff --git a/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts b/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts index 69ef4b03c742d..0a41f087c75ab 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts @@ -18,6 +18,7 @@ import { } from '@kbn/unified-histogram-plugin/public'; import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; import { isEqual, isFunction } from 'lodash'; +import { VIEW_MODE } from '../../../../common/constants'; import { restoreStateFromSavedSearch } from '../../../services/saved_searches/restore_from_saved_search'; import { updateSavedSearch } from './utils/update_saved_search'; import { addLog } from '../../../utils/add_log'; @@ -340,7 +341,12 @@ export function isEqualSavedSearch(savedSearchPrev: SavedSearch, savedSearchNext const prevValue = getSavedSearchFieldForComparison(prevSavedSearch, key); const nextValue = getSavedSearchFieldForComparison(nextSavedSearchWithoutSearchSource, key); - const isSame = isEqual(prevValue, nextValue); + const isSame = + isEqual(prevValue, nextValue) || + // By default, viewMode: undefined is equivalent to documents view + // So they should be treated as same + (key === 'viewMode' && + (prevValue ?? VIEW_MODE.DOCUMENT_LEVEL) === (nextValue ?? VIEW_MODE.DOCUMENT_LEVEL)); if (!isSame) { addLog('[savedSearch] difference between initial and changed version', { diff --git a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts index 28c562d3e7051..86d9ffe99c244 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts @@ -98,14 +98,14 @@ describe('getStateDefaults', () => { }); expect(actualForUndefinedViewMode.viewMode).toBeUndefined(); - const actualForEsqlWithInvalidAggLevelViewMode = getStateDefaults({ + const actualForEsqlWithAggregatedViewMode = getStateDefaults({ services: discoverServiceMock, savedSearch: { ...savedSearchMockWithESQL, viewMode: VIEW_MODE.AGGREGATED_LEVEL, }, }); - expect(actualForEsqlWithInvalidAggLevelViewMode.viewMode).toBe(VIEW_MODE.DOCUMENT_LEVEL); + expect(actualForEsqlWithAggregatedViewMode.viewMode).toBe(VIEW_MODE.AGGREGATED_LEVEL); const actualForEsqlWithInvalidPatternLevelViewMode = getStateDefaults({ services: discoverServiceMock, diff --git a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts index ff2d4250b3da8..7d8cd7ed3cc5e 100644 --- a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts +++ b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts @@ -60,7 +60,7 @@ describe('getValidViewMode', () => { viewMode: VIEW_MODE.AGGREGATED_LEVEL, isEsqlMode: true, }) - ).toBe(VIEW_MODE.DOCUMENT_LEVEL); + ).toBe(VIEW_MODE.AGGREGATED_LEVEL); expect( getValidViewMode({ diff --git a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts index 03c3500b7ab2d..96defe6711d95 100644 --- a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts +++ b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts @@ -20,11 +20,8 @@ export const getValidViewMode = ({ viewMode?: VIEW_MODE; isEsqlMode: boolean; }): VIEW_MODE | undefined => { - if ( - (viewMode === VIEW_MODE.PATTERN_LEVEL || viewMode === VIEW_MODE.AGGREGATED_LEVEL) && - isEsqlMode - ) { - // only this mode is supported for text-based languages + if (viewMode === VIEW_MODE.PATTERN_LEVEL && isEsqlMode) { + // only this mode is supported for ES|QL languages return VIEW_MODE.DOCUMENT_LEVEL; } diff --git a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx index 4d266af5e7949..08a56af81f4bc 100644 --- a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx +++ b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx @@ -105,14 +105,14 @@ describe('Document view mode toggle component', () => { expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(false); }); - it('should not render if ES|QL', async () => { + it('should show document and field stats view if ES|QL', async () => { const component = await mountComponent({ isEsqlMode: true }); - expect(findTestSubject(component, 'dscViewModeToggle').exists()).toBe(false); + expect(findTestSubject(component, 'dscViewModeToggle').exists()).toBe(true); expect(findTestSubject(component, 'discoverQueryTotalHits').exists()).toBe(true); - expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(false); + expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(true); expect(findTestSubject(component, 'dscViewModePatternAnalysisButton').exists()).toBe(false); - expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(false); + expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(true); }); it('should set the view mode to VIEW_MODE.DOCUMENT_LEVEL when dscViewModeDocumentButton is clicked', async () => { diff --git a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx index 11351893b6a26..28eeb9f3661ff 100644 --- a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx +++ b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx @@ -63,7 +63,7 @@ export const DocumentViewModeToggle = ({ useEffect( function checkForPatternAnalysis() { - if (!aiopsService) { + if (!aiopsService || isEsqlMode) { setShowPatternAnalysisTab(false); return; } @@ -76,7 +76,7 @@ export const DocumentViewModeToggle = ({ }) .catch(() => setShowPatternAnalysisTabWrapper(false)); }, - [aiopsService, dataView, setShowPatternAnalysisTabWrapper] + [aiopsService, dataView, isEsqlMode, setShowPatternAnalysisTabWrapper] ); useEffect(() => { @@ -121,7 +121,7 @@ export const DocumentViewModeToggle = ({ )} - {isEsqlMode || (showFieldStatisticsTab === false && showPatternAnalysisTab === false) ? ( + {showFieldStatisticsTab === false && showPatternAnalysisTab === false ? ( ) : ( diff --git a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx index 06aeaa42c1376..3a6f9f9c9c8ac 100644 --- a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx +++ b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx @@ -664,6 +664,7 @@ export class SavedSearchEmbeddable query={this.input.query} onAddFilter={searchProps.onFilter} searchSessionId={this.input.searchSessionId} + isEsqlMode={isEsqlMode} /> , diff --git a/test/functional/apps/discover/group4/_esql_view.ts b/test/functional/apps/discover/group4/_esql_view.ts index a1cecdbc36d4c..9f60f4991ab4c 100644 --- a/test/functional/apps/discover/group4/_esql_view.ts +++ b/test/functional/apps/discover/group4/_esql_view.ts @@ -79,7 +79,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await testSubjects.exists('showQueryBarMenu')).to.be(false); expect(await testSubjects.exists('addFilter')).to.be(false); - expect(await testSubjects.exists('dscViewModeDocumentButton')).to.be(false); + expect(await testSubjects.exists('dscViewModeDocumentButton')).to.be(true); // when Lens suggests a table, we render an ESQL based histogram expect(await testSubjects.exists('unifiedHistogramChart')).to.be(true); expect(await testSubjects.exists('discoverQueryHits')).to.be(true); diff --git a/test/functional/apps/discover/group6/_view_mode_toggle.ts b/test/functional/apps/discover/group6/_view_mode_toggle.ts index ba964c7532d70..415cb9f1fb85e 100644 --- a/test/functional/apps/discover/group6/_view_mode_toggle.ts +++ b/test/functional/apps/discover/group6/_view_mode_toggle.ts @@ -107,7 +107,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.existOrFail('dscViewModeToggle'); }); - it('should not show view mode toggle for ES|QL searches', async () => { + it('should still show view mode toggle for ES|QL searches', async () => { await testSubjects.click('dscViewModeDocumentButton'); await retry.try(async () => { @@ -119,7 +119,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.selectTextBaseLang(); - await testSubjects.missingOrFail('dscViewModeToggle'); + await testSubjects.existOrFail('dscViewModeToggle'); if (!useLegacyTable) { await testSubjects.existOrFail('unifiedDataTableToolbar'); diff --git a/x-pack/plugins/data_visualizer/common/types/field_request_config.ts b/x-pack/plugins/data_visualizer/common/types/field_request_config.ts index 43ba81eccd784..15db4c1d4832c 100644 --- a/x-pack/plugins/data_visualizer/common/types/field_request_config.ts +++ b/x-pack/plugins/data_visualizer/common/types/field_request_config.ts @@ -81,6 +81,7 @@ export interface FieldVisStats { examples?: Array; timeRangeEarliest?: number; timeRangeLatest?: number; + approximate?: boolean; } export interface DVErrorObject { diff --git a/x-pack/plugins/data_visualizer/common/types/field_stats.ts b/x-pack/plugins/data_visualizer/common/types/field_stats.ts index 2aeea5c4cf033..97a2739f34ae0 100644 --- a/x-pack/plugins/data_visualizer/common/types/field_stats.ts +++ b/x-pack/plugins/data_visualizer/common/types/field_stats.ts @@ -96,6 +96,11 @@ export interface StringFieldStats { sampledValues?: Bucket[]; topValuesSampleSize?: number; topValuesSamplerShardSize?: number; + /** + * Approximate: true for when the terms are from a random subset of the source data + * such that result/count for each term is not deterministic every time + */ + approximate?: boolean; } export interface DateFieldStats { diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/data_visualizer_stats_table.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/data_visualizer_stats_table.tsx index 75b7d98ec2468..74083dec0e5da 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/data_visualizer_stats_table.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/data_visualizer_stats_table.tsx @@ -35,10 +35,6 @@ import { IndexBasedNumberContentPreview } from './components/field_data_row/numb import { useTableSettings } from './use_table_settings'; import { TopValuesPreview } from './components/field_data_row/top_values_preview'; -import type { - FieldVisConfig, - FileBasedFieldVisConfig, -} from '../../../../../common/types/field_vis_config'; import { isIndexBasedFieldVisConfig } from '../../../../../common/types/field_vis_config'; import { FileBasedNumberContentPreview } from '../field_data_row'; import { BooleanContentPreview } from './components/field_data_row'; @@ -47,12 +43,12 @@ import { DistinctValues } from './components/field_data_row/distinct_values'; import { FieldTypeIcon } from '../field_type_icon'; import './_index.scss'; import type { FieldStatisticTableEmbeddableProps } from '../../../index_data_visualizer/embeddables/grid_embeddable/types'; +import type { DataVisualizerTableItem } from './types'; const FIELD_NAME = 'fieldName'; export type ItemIdToExpandedRowMap = Record; -export type DataVisualizerTableItem = FieldVisConfig | FileBasedFieldVisConfig; interface DataVisualizerTableProps { items: T[]; pageState: DataVisualizerTableState; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/index.ts b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/index.ts index 6d9f4d5b86d28..b9a0347079e54 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/index.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/index.ts @@ -5,11 +5,15 @@ * 2.0. */ export type { FieldDataRowProps } from './field_data_row'; -export type { +import type { FieldVisConfig, FileBasedFieldVisConfig, MetricFieldVisStats, } from '../../../../../../common/types/field_vis_config'; + +export type DataVisualizerTableItem = FieldVisConfig | FileBasedFieldVisConfig; + +export type { FieldVisConfig, FileBasedFieldVisConfig, MetricFieldVisStats }; export { isFileBasedFieldVisConfig, isIndexBasedFieldVisConfig, diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx index ef056c4c12f14..0d7d6b4c480e9 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx @@ -43,6 +43,8 @@ interface Props { function getPercentLabel(percent: number): string { if (percent >= 0.1) { return `${roundToDecimalPlace(percent, 1)}%`; + } else if (percent === 0) { + return '0%'; } else { return '< 0.1%'; } @@ -69,7 +71,7 @@ export const TopValues: FC = ({ } = useDataVisualizerKibana(); if (stats === undefined || !stats.topValues) return null; - const { fieldName, sampleCount } = stats; + const { fieldName, sampleCount, approximate } = stats; const originalTopValues = (showSampledValues ? stats.sampledValues : stats.topValues) ?? []; if (originalTopValues?.length === 0) return null; @@ -96,12 +98,28 @@ export const TopValues: FC = ({ /> ); } + /** + * For ES|QL, where are randomly sampling a subset from source data, then query is excuted on top of that data + * So the terms we get might not get the initial count + */ + const method = approximate ? ( + + ) : ( + + ); return totalDocuments > (sampleCount ?? 0) ? ( @@ -115,8 +133,9 @@ export const TopValues: FC = ({ ) : ( @@ -141,6 +160,7 @@ export const TopValues: FC = ({ typeof bucket.percent === 'number' ? bucket.percent : bucket.doc_count / totalDocuments, })); + const shouldShowOtherCount = approximate !== true; const topValuesOtherCountPercent = 1 - (topValues ? topValues.reduce((acc, bucket) => acc + bucket.percent, 0) : 0); const topValuesOtherCount = Math.floor(topValuesOtherCountPercent * (sampleCount ?? 0)); @@ -246,7 +266,7 @@ export const TopValues: FC = ({ ); }) : null} - {topValuesOtherCount > 0 ? ( + {shouldShowOtherCount && topValuesOtherCount > 0 ? ( true; export const IndexDataVisualizerESQL: FC = (dataVisualizerProps) => { const { services } = useDataVisualizerKibana(); const { data } = services; const euiTheme = useCurrentEuiTheme(); - const [query, setQuery] = useState({ esql: '' }); + // Query that has been typed, but has not submitted with cmd + enter + const [localQuery, setLocalQuery] = useState(DEFAULT_ESQL_QUERY); + const [query, setQuery] = useState(DEFAULT_ESQL_QUERY); const [currentDataView, setCurrentDataView] = useState(); const toggleShowEmptyFields = () => { @@ -92,9 +95,6 @@ export const IndexDataVisualizerESQL: FC = (dataVi } }; - // Query that has been typed, but has not submitted with cmd + enter - const [localQuery, setLocalQuery] = useState({ esql: '' }); - const indexPattern = useMemo(() => { let indexPatternFromQuery = ''; if (isESQLQuery(query)) { @@ -105,7 +105,7 @@ export const IndexDataVisualizerESQL: FC = (dataVi return undefined; } return indexPatternFromQuery; - }, [query]); + }, [query?.esql]); useEffect( function updateAdhocDataViewFromQuery() { @@ -169,11 +169,11 @@ export const IndexDataVisualizerESQL: FC = (dataVi metricsStats, timefilter, getItemIdToExpandedRowMap, - onQueryUpdate, + resetData, limitSize, showEmptyFields, fieldsCountStats, - } = useESQLDataVisualizerData(input, dataVisualizerListState, setQuery); + } = useESQLDataVisualizerData(input, dataVisualizerListState); const hasValidTimeField = useMemo( () => currentDataView?.timeFieldName !== undefined, @@ -199,6 +199,15 @@ export const IndexDataVisualizerESQL: FC = (dataVi setLocalQuery(q); } }, []); + const onTextLangQuerySubmit = useCallback( + async (q: AggregateQuery | undefined) => { + if (isESQLQuery(q)) { + resetData(); + setQuery(q); + } + }, + [resetData] + ); return ( = (dataVi false} + onTextLangQuerySubmit={onTextLangQuerySubmit} + expandCodeEditor={expandCodeEditor} isCodeEditorExpanded={true} detectTimestamp={true} hideMinimizeButton={true} diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_esql_field_stats_table.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_esql_field_stats_table.tsx index e5f6c5f3c1835..b4bcd3c0da5a9 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_esql_field_stats_table.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_esql_field_stats_table.tsx @@ -21,51 +21,53 @@ import { EmbeddableNoResultsEmptyPrompt } from './embeddable_field_stats_no_resu const restorableDefaults = getDefaultESQLDataVisualizerListState(); -const EmbeddableESQLFieldStatsTableWrapper = (props: ESQLDataVisualizerGridEmbeddableState) => { - const { onTableUpdate, ...state } = props; - const [dataVisualizerListState, setDataVisualizerListState] = - useState>(restorableDefaults); +const EmbeddableESQLFieldStatsTableWrapper = React.memo( + (props: ESQLDataVisualizerGridEmbeddableState) => { + const { onTableUpdate } = props; + const [dataVisualizerListState, setDataVisualizerListState] = + useState>(restorableDefaults); - const onTableChange = useCallback( - (update: DataVisualizerTableState) => { - setDataVisualizerListState({ ...dataVisualizerListState, ...update }); - if (onTableUpdate) { - onTableUpdate(update); - } - }, - [dataVisualizerListState, onTableUpdate] - ); + const onTableChange = useCallback( + (update: DataVisualizerTableState) => { + setDataVisualizerListState({ ...dataVisualizerListState, ...update }); + if (onTableUpdate) { + onTableUpdate(update); + } + }, + [dataVisualizerListState, onTableUpdate] + ); - const { - configs, - extendedColumns, - progress, - overallStatsProgress, - setLastRefresh, - getItemIdToExpandedRowMap, - } = useESQLDataVisualizerData(state, dataVisualizerListState); + const { + configs, + extendedColumns, + progress, + overallStatsProgress, + setLastRefresh, + getItemIdToExpandedRowMap, + } = useESQLDataVisualizerData(props, dataVisualizerListState); - useEffect(() => { - setLastRefresh(Date.now()); - }, [state?.lastReloadRequestTime, setLastRefresh]); + useEffect(() => { + setLastRefresh(Date.now()); + }, [props?.lastReloadRequestTime, setLastRefresh]); - if (progress === 100 && configs.length === 0) { - return ; + if (progress === 100 && configs.length === 0) { + return ; + } + return ( + + items={configs} + pageState={dataVisualizerListState} + updatePageState={onTableChange} + getItemIdToExpandedRowMap={getItemIdToExpandedRowMap} + extendedColumns={extendedColumns} + showPreviewByDefault={props?.showPreviewByDefault} + onChange={onTableUpdate} + loading={progress < 100} + overallStatsRunning={overallStatsProgress.isRunning} + /> + ); } - return ( - - items={configs} - pageState={dataVisualizerListState} - updatePageState={onTableChange} - getItemIdToExpandedRowMap={getItemIdToExpandedRowMap} - extendedColumns={extendedColumns} - showPreviewByDefault={state?.showPreviewByDefault} - onChange={onTableUpdate} - loading={progress < 100} - overallStatsRunning={overallStatsProgress.isRunning} - /> - ); -}; +); // exporting as default so it be lazy-loaded // eslint-disable-next-line import/no-default-export export default EmbeddableESQLFieldStatsTableWrapper; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_field_stats_table.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_field_stats_table.tsx index 96cf9c2f7c8fd..5c40b9e9c94f4 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_field_stats_table.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/embeddable_field_stats_table.tsx @@ -23,7 +23,7 @@ const restorableDefaults = getDefaultDataVisualizerListState(); const EmbeddableFieldStatsTableWrapper = ( props: Required ) => { - const { onTableUpdate, onAddFilter, ...state } = props; + const { onTableUpdate, onAddFilter } = props; const [dataVisualizerListState, setDataVisualizerListState] = useState>(restorableDefaults); @@ -46,11 +46,11 @@ const EmbeddableFieldStatsTableWrapper = ( progress, overallStatsProgress, setLastRefresh, - } = useDataVisualizerGridData(state, dataVisualizerListState); + } = useDataVisualizerGridData(props, dataVisualizerListState); useEffect(() => { setLastRefresh(Date.now()); - }, [state?.lastReloadRequestTime, setLastRefresh]); + }, [props?.lastReloadRequestTime, setLastRefresh]); const getItemIdToExpandedRowMap = useCallback( function (itemIds: string[], items: FieldVisConfig[]): ItemIdToExpandedRowMap { @@ -60,17 +60,17 @@ const EmbeddableFieldStatsTableWrapper = ( m[fieldName] = ( ); } return m; }, {} as ItemIdToExpandedRowMap); }, - [state.dataView, searchQueryLanguage, searchString, state.totalDocuments, onAddFilter] + [props.dataView, searchQueryLanguage, searchString, props.totalDocuments, onAddFilter] ); if (progress === 100 && configs.length === 0) { @@ -83,7 +83,7 @@ const EmbeddableFieldStatsTableWrapper = ( updatePageState={onTableChange} getItemIdToExpandedRowMap={getItemIdToExpandedRowMap} extendedColumns={extendedColumns} - showPreviewByDefault={state?.showPreviewByDefault} + showPreviewByDefault={props?.showPreviewByDefault} onChange={onTableUpdate} loading={progress < 100} overallStatsRunning={overallStatsProgress.isRunning} diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/field_stats_embeddable_wrapper.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/field_stats_embeddable_wrapper.tsx index c07e748ce2151..4d547635eb504 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/field_stats_embeddable_wrapper.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/field_stats_embeddable_wrapper.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EuiEmptyPrompt } from '@elastic/eui'; import type { Required } from 'utility-types'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -28,18 +28,15 @@ const EmbeddableESQLFieldStatsTableWrapper = dynamic( const EmbeddableFieldStatsTableWrapper = dynamic(() => import('./embeddable_field_stats_table')); function isESQLFieldStatisticTableEmbeddableState( - input: unknown + input: FieldStatisticTableEmbeddableProps ): input is ESQLDataVisualizerGridEmbeddableState { return isPopulatedObject(input, ['esql']) && input.esql === true; } function isFieldStatisticTableEmbeddableState( - input: unknown + input: FieldStatisticTableEmbeddableProps ): input is Required { - return ( - isPopulatedObject(input, ['dataView']) && - (!isPopulatedObject(input, ['esql']) || input.esql === false) - ); + return isPopulatedObject(input, ['dataView']) && Boolean(input.esql) === false; } const FieldStatisticsWrapperContent = (props: FieldStatisticTableEmbeddableProps) => { @@ -104,17 +101,54 @@ const FieldStatisticsWrapper = (props: FieldStatisticTableEmbeddableProps) => { unifiedSearch, }; - const kibanaRenderServices = pick(coreStart, 'analytics', 'i18n', 'theme'); - const datePickerDeps: DatePickerDependencies = { - ...pick(services, ['data', 'http', 'notifications', 'theme', 'uiSettings', 'i18n']), - uiSettingsKeys: UI_SETTINGS, - }; + const { overridableServices } = props; + + const kibanaRenderServices = useMemo( + () => pick(coreStart, 'analytics', 'i18n', 'theme'), + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + const servicesWithOverrides = useMemo( + () => ({ ...services, ...(overridableServices ?? {}) }), + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + + const datePickerDeps: DatePickerDependencies = useMemo( + () => ({ + ...pick(servicesWithOverrides, [ + 'data', + 'http', + 'notifications', + 'theme', + 'uiSettings', + 'i18n', + ]), + uiSettingsKeys: UI_SETTINGS, + }), + [servicesWithOverrides] + ); return ( - + - + diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts index c42f6dbec0624..a703c012a0575 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts @@ -12,13 +12,14 @@ import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { BehaviorSubject } from 'rxjs'; import type { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public'; import type { SerializedTitles } from '@kbn/presentation-publishing'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DataVisualizerTableState } from '../../../../../common/types'; import type { SamplingOption } from '../../../../../common/types/field_stats'; import type { DATA_VISUALIZER_INDEX_VIEWER } from '../../constants/index_data_visualizer_viewer'; import type { DataVisualizerIndexBasedAppState } from '../../types/index_data_visualizer_state'; import type { DataVisualizerStartDependencies } from '../../../common/types/data_visualizer_plugin'; import type { ESQLQuery } from '../../search_strategy/requests/esql_utils'; -import type { DataVisualizerTableItem } from '../../../common/components/stats_table/data_visualizer_stats_table'; +import type { DataVisualizerTableItem } from '../../../common/components/stats_table/types'; export interface FieldStatisticTableEmbeddableProps { /** @@ -92,6 +93,10 @@ export interface FieldStatisticTableEmbeddableProps { shouldGetSubfields?: boolean; lastReloadRequestTime?: number; onTableUpdate?: (update: Partial) => void; + /** + * Inject Kibana services to override in Kibana provider context + */ + overridableServices?: { data: DataPublicPluginStart }; renderFieldName?: (fieldName: string, item: DataVisualizerTableItem) => JSX.Element; } diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_data_visualizer_esql_data.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_data_visualizer_esql_data.tsx index 59638a485a3f0..8513df90d682b 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_data_visualizer_esql_data.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_data_visualizer_esql_data.tsx @@ -17,9 +17,9 @@ import useObservable from 'react-use/lib/useObservable'; import { SEARCH_QUERY_LANGUAGE } from '@kbn/ml-query-utils'; import type { KibanaExecutionContext } from '@kbn/core-execution-context-common'; import { useExecutionContext } from '@kbn/kibana-react-plugin/public'; -import type { AggregateQuery } from '@kbn/es-query'; +import type { AggregateQuery, Query } from '@kbn/es-query'; import { useTimeBuckets } from '@kbn/ml-time-buckets'; -import type { SamplingOption } from '../../../../../common/types/field_stats'; +import { buildEsQuery } from '@kbn/es-query'; import type { FieldVisConfig } from '../../../../../common/types/field_vis_config'; import type { SupportedFieldType } from '../../../../../common/types/job_field_type'; import type { ItemIdToExpandedRowMap } from '../../../common/components/stats_table'; @@ -44,18 +44,14 @@ import type { import { getDefaultPageState } from '../../constants/index_data_visualizer_viewer'; import { DEFAULT_ESQL_LIMIT } from '../../constants/esql_constants'; +type AnyQuery = Query | AggregateQuery; + const defaultSearchQuery = { match_all: {}, }; const FALLBACK_ESQL_QUERY: ESQLQuery = { esql: '' }; -const DEFAULT_SAMPLING_OPTION: SamplingOption = { - mode: 'random_sampling', - seed: '', - probability: 0, -}; const DEFAULT_LIMIT_SIZE = '10000'; - const defaults = getDefaultPageState(); export const getDefaultESQLDataVisualizerListState = ( @@ -82,8 +78,7 @@ export const getDefaultESQLDataVisualizerListState = ( }); export const useESQLDataVisualizerData = ( input: ESQLDataVisualizerGridEmbeddableState, - dataVisualizerListState: ESQLDataVisualizerIndexBasedAppState, - setQuery?: React.Dispatch> + dataVisualizerListState: ESQLDataVisualizerIndexBasedAppState ) => { const [lastRefresh, setLastRefresh] = useState(0); const { services } = useDataVisualizerKibana(); @@ -112,20 +107,31 @@ export const useESQLDataVisualizerData = ( autoRefreshSelector: true, }); - const { currentDataView, query, visibleFieldNames, indexPattern } = useMemo( - () => ({ - currentSavedSearch: input?.savedSearch, - currentDataView: input.dataView, - query: input?.query ?? FALLBACK_ESQL_QUERY, - visibleFieldNames: input?.visibleFieldNames ?? [], - currentFilters: input?.filters, - fieldsToFetch: input?.fieldsToFetch, - /** By default, use random sampling **/ - samplingOption: input?.samplingOption ?? DEFAULT_SAMPLING_OPTION, - indexPattern: input?.indexPattern, - }), - [input] - ); + const { currentDataView, parentQuery, parentFilters, query, visibleFieldNames, indexPattern } = + useMemo(() => { + let q = FALLBACK_ESQL_QUERY; + + if (input?.query && isESQLQuery(input?.query)) q = input.query; + if (input?.savedSearch && isESQLQuery(input.savedSearch.searchSource.getField('query'))) { + q = input.savedSearch.searchSource.getField('query') as ESQLQuery; + } + return { + currentDataView: input.dataView, + query: q ?? FALLBACK_ESQL_QUERY, + // It's possible that in a dashboard setting, we will have additional filters and queries + parentQuery: input?.query, + parentFilters: input?.filters, + visibleFieldNames: input?.visibleFieldNames ?? [], + indexPattern: input?.indexPattern, + }; + }, [ + input.query, + input.savedSearch, + input.dataView, + input?.filters, + input?.visibleFieldNames, + input?.indexPattern, + ]); const restorableDefaults = useMemo( () => getDefaultESQLDataVisualizerListState(dataVisualizerListState), @@ -170,8 +176,25 @@ export const useESQLDataVisualizerData = ( const aggInterval = buckets.getInterval(); - const filter = currentDataView?.timeFieldName - ? ({ + let filter: QueryDslQueryContainer = buildEsQuery( + input.dataView, + (Array.isArray(parentQuery) ? parentQuery : [parentQuery]) as AnyQuery | AnyQuery[], + parentFilters ?? [] + ); + + if (currentDataView?.timeFieldName) { + if (Array.isArray(filter?.bool?.filter)) { + filter.bool!.filter!.push({ + range: { + [currentDataView.timeFieldName]: { + format: 'strict_date_optional_time', + gte: timefilter.getTime().from, + lte: timefilter.getTime().to, + }, + }, + }); + } else { + filter = { bool: { must: [], filter: [ @@ -188,8 +211,9 @@ export const useESQLDataVisualizerData = ( should: [], must_not: [], }, - } as QueryDslQueryContainer) - : undefined; + } as QueryDslQueryContainer; + } + } return { earliest, latest, @@ -211,7 +235,7 @@ export const useESQLDataVisualizerData = ( timefilter, currentDataView?.id, // eslint-disable-next-line react-hooks/exhaustive-deps - JSON.stringify(query), + JSON.stringify({ query, parentQuery, parentFilters }), indexPattern, lastRefresh, limitSize, @@ -591,8 +615,8 @@ export const useESQLDataVisualizerData = ( [totalCount, overallStatsProgress.loaded, fieldStatsProgress.loaded] ); - const onQueryUpdate = useCallback( - async (q?: AggregateQuery) => { + const resetData = useCallback( + (q?: AggregateQuery) => { // When user submits a new query // resets all current requests and other data if (cancelOverallStatsRequest) { @@ -605,11 +629,8 @@ export const useESQLDataVisualizerData = ( setFieldStatFieldsToFetch(undefined); setMetricConfigs(defaults.metricConfigs); setNonMetricConfigs(defaults.nonMetricConfigs); - if (isESQLQuery(q) && setQuery) { - setQuery(q); - } }, - [cancelFieldStatsRequest, cancelOverallStatsRequest, setQuery] + [cancelFieldStatsRequest, cancelOverallStatsRequest] ); return { @@ -628,7 +649,7 @@ export const useESQLDataVisualizerData = ( getItemIdToExpandedRowMap, cancelOverallStatsRequest, cancelFieldStatsRequest, - onQueryUpdate, + resetData, limitSize, showEmptyFields, fieldsCountStats, diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts index 06e7737a7d2f8..4634c1991de8b 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ESQL_SEARCH_STRATEGY, KBN_FIELD_TYPES } from '@kbn/data-plugin/common'; +import { ESQL_ASYNC_SEARCH_STRATEGY, KBN_FIELD_TYPES } from '@kbn/data-plugin/common'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; import type { AggregateQuery } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; @@ -16,6 +16,7 @@ import type { ISearchOptions } from '@kbn/search-types'; import type { TimeBucketsInterval } from '@kbn/ml-time-buckets'; import { getESQLWithSafeLimit, appendToESQLQuery } from '@kbn/esql-utils'; import { isDefined } from '@kbn/ml-is-defined'; +import { ESQL_SAFE_LIMIT } from '@kbn/unified-field-list/src/constants'; import { OMIT_FIELDS } from '../../../../../common/constants'; import type { DataStatsFetchProgress, @@ -97,7 +98,10 @@ const getESQLDocumentCountStats = async ( }, }; try { - const esqlResults = await runRequest(request, { ...(searchOptions ?? {}), strategy: 'esql' }); + const esqlResults = await runRequest(request, { + ...(searchOptions ?? {}), + strategy: ESQL_ASYNC_SEARCH_STRATEGY, + }); let totalCount = 0; const _buckets: Record = {}; // @ts-expect-error ES types needs to be updated with columns and values as part of esql response @@ -142,7 +146,10 @@ const getESQLDocumentCountStats = async ( }, }; try { - const esqlResults = await runRequest(request, { ...(searchOptions ?? {}), strategy: 'esql' }); + const esqlResults = await runRequest(request, { + ...(searchOptions ?? {}), + strategy: ESQL_ASYNC_SEARCH_STRATEGY, + }); return { request, documentCountStats: undefined, @@ -266,12 +273,12 @@ export const useESQLOverallStatsData = ( { params: { // Doing this to match with the default limit - query: esqlBaseQuery, + query: getESQLWithSafeLimit(esqlBaseQuery, ESQL_SAFE_LIMIT), ...(filter ? { filter } : {}), dropNullColumns: true, }, }, - { strategy: ESQL_SEARCH_STRATEGY } + { strategy: ESQL_ASYNC_SEARCH_STRATEGY } )) as ESQLResponse | undefined; setQueryHistoryStatus(false); @@ -446,13 +453,13 @@ export const useESQLOverallStatsData = ( setTableData({ exampleDocs }); } } catch (error) { + setQueryHistoryStatus(false); // If error already handled in sub functions, no need to propogate if (error.name !== 'AbortError' && error.handled !== true) { toasts.addError(error, { title: fieldStatsErrorTitle, }); } - setQueryHistoryStatus(false); // Log error to console for better debugging // eslint-disable-next-line no-console console.error(`${fieldStatsErrorTitle}: fetchOverallStats`, error); diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts index 699cfaf787295..6cc039fd08b42 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts @@ -109,17 +109,16 @@ export const useDataVisualizerGridData = ( }, [security]); const { currentSavedSearch, currentDataView, currentQuery, currentFilters, samplingOption } = - useMemo( - () => ({ + useMemo(() => { + return { currentSavedSearch: input?.savedSearch, currentDataView: input.dataView, currentQuery: input?.query, currentFilters: input?.filters, /** By default, use random sampling **/ samplingOption: input?.samplingOption ?? DEFAULT_SAMPLING_OPTION, - }), - [input] - ); + }; + }, [input?.savedSearch, input.dataView, input?.query, input?.filters, input?.samplingOption]); const dataViewFields: DataViewField[] = useMemo(() => currentDataView.fields, [currentDataView]); const { visibleFieldNames, fieldsToFetch } = useMemo(() => { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts index 80941e4ff37fd..a91e42e2f8213 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts @@ -7,7 +7,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; -import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; +import { ESQL_ASYNC_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import pLimit from 'p-limit'; import { appendToESQLQuery } from '@kbn/esql-utils'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; @@ -57,7 +57,7 @@ export const getESQLBooleanFieldStats = async ({ if (booleanFields.length > 0) { const booleanTopTermsResp = await Promise.allSettled( booleanFields.map(({ request }) => - limiter(() => runRequest(request, { strategy: ESQL_SEARCH_STRATEGY })) + limiter(() => runRequest(request, { strategy: ESQL_ASYNC_SEARCH_STRATEGY })) ) ); if (booleanTopTermsResp) { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts index 80d3f56c4b907..fc4db29b758c4 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; +import { ESQL_ASYNC_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import pLimit from 'p-limit'; import { chunk } from 'lodash'; import { isDefined } from '@kbn/ml-is-defined'; @@ -50,8 +50,7 @@ const getESQLOverallStatsInChunk = async ({ let startIndex = 0; /** Example query: * from {indexPattern} | LIMIT {limitSize} - * | EVAL `ne_{aggregableField}` = MV_MIN({aggregableField}), - * | STATs `{aggregableField}_count` = COUNT(`ne_{aggregableField}`), + * | STATs `{aggregableField}_count` = COUNT(MV_MIN(`{aggregableField}`)), * `{aggregableField}_cardinality` = COUNT_DISTINCT({aggregableField}), * `{nonAggregableField}_count` = COUNT({nonAggregableField}) */ @@ -66,15 +65,11 @@ const getESQLOverallStatsInChunk = async ({ // Ex: for 2 docs, count(fieldName) might return 5 // So we need to do count(EVAL(MV_MIN(fieldName))) instead // to get accurate % of rows where field value exists - evalQuery: `${getSafeESQLName(`ne_${field.name}`)} = MV_MIN(${getSafeESQLName( - `${field.name}` - )})`, - query: `${getSafeESQLName(`${field.name}_count`)} = COUNT(${getSafeESQLName( - `ne_${field.name}` - )}), - ${getSafeESQLName(`${field.name}_cardinality`)} = COUNT_DISTINCT(${getSafeESQLName( + query: `${getSafeESQLName(`${field.name}_count`)} = COUNT(MV_MIN(${getSafeESQLName( field.name - )})`, + )})), ${getSafeESQLName( + `${field.name}_cardinality` + )} = COUNT_DISTINCT(${getSafeESQLName(field.name)})`, }; // +2 for count, and count_dictinct startIndex += 2; @@ -93,17 +88,9 @@ const getESQLOverallStatsInChunk = async ({ } }); - const evalQuery = fieldsToFetch - .map((field) => field.evalQuery) - .filter(isDefined) - .join(','); - let countQuery = fieldsToFetch.length > 0 ? '| STATS ' : ''; countQuery += fieldsToFetch.map((field) => field.query).join(','); - const query = appendToESQLQuery( - esqlBaseQueryWithLimit, - (evalQuery ? ' | EVAL ' + evalQuery : '') + countQuery - ); + const query = appendToESQLQuery(esqlBaseQueryWithLimit, countQuery); const request = { params: { @@ -113,7 +100,7 @@ const getESQLOverallStatsInChunk = async ({ }; try { - const esqlResults = await runRequest(request, { strategy: ESQL_SEARCH_STRATEGY }); + const esqlResults = await runRequest(request, { strategy: ESQL_ASYNC_SEARCH_STRATEGY }); const stats = { aggregatableExistsFields: [] as AggregatableField[], aggregatableNotExistsFields: [] as AggregatableField[], diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts index 4b160d7c18fbb..a7ba5a623e5bf 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts @@ -7,7 +7,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; -import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; +import { ESQL_ASYNC_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import { appendToESQLQuery } from '@kbn/esql-utils'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; import { getSafeESQLName } from '../requests/esql_utils'; @@ -45,7 +45,7 @@ export const getESQLDateFieldStats = async ({ }, }; try { - const dateFieldsResp = await runRequest(request, { strategy: ESQL_SEARCH_STRATEGY }); + const dateFieldsResp = await runRequest(request, { strategy: ESQL_ASYNC_SEARCH_STRATEGY }); if (dateFieldsResp) { return dateFields.map(({ field: dateField }, idx) => { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts index 02f9370de7b80..46756a5ef7b4e 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts @@ -7,7 +7,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; -import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; +import { ESQL_ASYNC_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import pLimit from 'p-limit'; import { appendToESQLQuery } from '@kbn/esql-utils'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; @@ -36,7 +36,7 @@ export const getESQLKeywordFieldStats = async ({ esqlBaseQuery, `| STATS ${getSafeESQLName(`${field.name}_in_records`)} = count(MV_MIN(${getSafeESQLName( field.name - )})), ${getSafeESQLName(`${field.name}_in_values`)} = count(${getSafeESQLName(field.name)}) + )})) BY ${getSafeESQLName(field.name)} | SORT ${getSafeESQLName(`${field.name}_in_records`)} DESC | LIMIT 10` @@ -55,7 +55,7 @@ export const getESQLKeywordFieldStats = async ({ if (keywordFields.length > 0) { const keywordTopTermsResp = await Promise.allSettled( keywordFields.map(({ request }) => - limiter(() => runRequest(request, { strategy: ESQL_SEARCH_STRATEGY })) + limiter(() => runRequest(request, { strategy: ESQL_ASYNC_SEARCH_STRATEGY })) ) ); if (keywordTopTermsResp) { @@ -70,24 +70,19 @@ export const getESQLKeywordFieldStats = async ({ if (results) { const topValuesSampleSize = results.reduce((acc, row) => { - return row[1] + acc; + return row[0] + acc; }, 0); - const sampledValues = results.map((row) => ({ - key: row[2], - doc_count: row[1], - })); - const terms = results.map((row) => ({ - key: row[2], + key: row[1], doc_count: row[0], })); return { fieldName: field.name, topValues: terms, - sampledValues, isTopValuesSampled: true, + approximate: true, topValuesSampleSize, } as StringFieldStats; } diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts index c943ed042fe95..2a83954503730 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts @@ -7,7 +7,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; -import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; +import { ESQL_ASYNC_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import { appendToESQLQuery } from '@kbn/esql-utils'; import { chunk } from 'lodash'; import pLimit from 'p-limit'; @@ -74,7 +74,7 @@ const getESQLNumericFieldStatsInChunk = async ({ }, }; try { - const fieldStatsResp = await runRequest(request, { strategy: ESQL_SEARCH_STRATEGY }); + const fieldStatsResp = await runRequest(request, { strategy: ESQL_ASYNC_SEARCH_STRATEGY }); if (fieldStatsResp) { const values = fieldStatsResp.rawResponse.values[0]; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts index fa2182f0bbc6e..05ebd45786021 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/esql_utils.ts @@ -23,7 +23,7 @@ export const getSafeESQLName = (str: string) => { }; export function isESQLQuery(arg: unknown): arg is ESQLQuery { - return isPopulatedObject(arg, ['esql']); + return isPopulatedObject(arg, ['esql']) && typeof arg.esql === 'string'; } export const PERCENTS = Array.from( Array(MAX_PERCENT / PERCENTILE_SPACING + 1), diff --git a/x-pack/plugins/data_visualizer/tsconfig.json b/x-pack/plugins/data_visualizer/tsconfig.json index 70d967d2a7128..5a166df52eed2 100644 --- a/x-pack/plugins/data_visualizer/tsconfig.json +++ b/x-pack/plugins/data_visualizer/tsconfig.json @@ -81,7 +81,8 @@ "@kbn/react-kibana-context-theme", "@kbn/presentation-publishing", "@kbn/shared-ux-utility", - "@kbn/search-types" + "@kbn/search-types", + "@kbn/unified-field-list" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index b5074f2d79934..31c1af10f51b9 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -13113,8 +13113,6 @@ "xpack.dataVisualizer.dataGrid.field.metricDistributionChart.tooltipValueBetweenLabel": "{percent} % des documents ont des valeurs comprises entre {minValFormatted} et {maxValFormatted}", "xpack.dataVisualizer.dataGrid.field.metricDistributionChart.tooltipValueEqualLabel": "{percent} % des documents ont une valeur de {valFormatted}", "xpack.dataVisualizer.dataGrid.field.removeFilterAriaLabel": "Exclure {fieldName} : \"{value}\"", - "xpack.dataVisualizer.dataGrid.field.topValues.calculatedFromSampleRecordsLabel": "Calculé à partir de {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", - "xpack.dataVisualizer.dataGrid.field.topValues.calculatedFromTotalRecordsLabel": "Calculé à partir de {totalDocumentsFormatted} {totalDocuments, plural, one {enregistrement} other {enregistrements}}.", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.choroplethMapTopValues.calculatedFromSampleRecordsLabel": "Calculé à partir de {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.choroplethMapTopValues.calculatedFromTotalRecordsLabel": "Calculé à partir de {totalDocumentsFormatted} {totalDocuments, plural, one {enregistrement} other {enregistrements}}.", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.numberContent.displayingPercentilesLabel": "Affichage de {minPercent} - {maxPercent} centiles", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index d9ff0f4932c25..c63d94591fe7b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -13094,8 +13094,6 @@ "xpack.dataVisualizer.dataGrid.field.metricDistributionChart.tooltipValueBetweenLabel": "{percent}% のドキュメントに {minValFormatted} から {maxValFormatted} の間の値があります", "xpack.dataVisualizer.dataGrid.field.metricDistributionChart.tooltipValueEqualLabel": "{percent}% のドキュメントに {valFormatted} の値があります", "xpack.dataVisualizer.dataGrid.field.removeFilterAriaLabel": "{fieldName}の除外:\"{value}\"", - "xpack.dataVisualizer.dataGrid.field.topValues.calculatedFromSampleRecordsLabel": "{sampledDocumentsFormatted}サンプル{sampledDocuments, plural, other {レコード}}から計算されました。", - "xpack.dataVisualizer.dataGrid.field.topValues.calculatedFromTotalRecordsLabel": "{totalDocumentsFormatted} {totalDocuments, plural, other {レコード}}から計算されました。", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.choroplethMapTopValues.calculatedFromSampleRecordsLabel": "{sampledDocumentsFormatted}サンプル{sampledDocuments, plural, other {レコード}}から計算されました。", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.choroplethMapTopValues.calculatedFromTotalRecordsLabel": "{totalDocumentsFormatted} {totalDocuments, plural, other {レコード}}から計算されました。", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.numberContent.displayingPercentilesLabel": "{minPercent} - {maxPercent} パーセンタイルを表示中", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5ddb8e643a359..4b7fcc5ca9c60 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -13119,8 +13119,6 @@ "xpack.dataVisualizer.dataGrid.field.metricDistributionChart.tooltipValueBetweenLabel": "{percent}% 的文档具有介于 {minValFormatted} 和 {maxValFormatted} 之间的值", "xpack.dataVisualizer.dataGrid.field.metricDistributionChart.tooltipValueEqualLabel": "{percent}% 的文档的值为 {valFormatted}", "xpack.dataVisualizer.dataGrid.field.removeFilterAriaLabel": "筛除 {fieldName}:“{value}”", - "xpack.dataVisualizer.dataGrid.field.topValues.calculatedFromSampleRecordsLabel": "基于 {sampledDocumentsFormatted} 个样例{sampledDocuments, plural, other {记录}}计算。", - "xpack.dataVisualizer.dataGrid.field.topValues.calculatedFromTotalRecordsLabel": "基于 {totalDocumentsFormatted} 个样例{totalDocuments, plural, other {记录}}计算。", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.choroplethMapTopValues.calculatedFromSampleRecordsLabel": "基于 {sampledDocumentsFormatted} 个样例{sampledDocuments, plural, other {记录}}计算。", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.choroplethMapTopValues.calculatedFromTotalRecordsLabel": "基于 {totalDocumentsFormatted} 个样例{totalDocuments, plural, other {记录}}计算。", "xpack.dataVisualizer.dataGrid.fieldExpandedRow.numberContent.displayingPercentilesLabel": "正在显示 {minPercent} - {maxPercent} 百分位数", diff --git a/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts b/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts index b4eebbc48b231..f6fe276ac33b7 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts @@ -91,7 +91,7 @@ const esqlFarequoteData = { existsInDocs: true, aggregatable: true, loading: false, - exampleCount: 11, + exampleCount: 10, docCountFormatted: '86,274 (100%)', viewableInLens: false, }, @@ -175,7 +175,7 @@ const esqlSampleLogData: TestData = { aggregatable: true, loading: false, docCountFormatted: '143 (100%)', - exampleCount: 11, + exampleCount: 10, viewableInLens: false, }, ], diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 8a0fec8355571..6ce8021024366 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -79,7 +79,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.missingOrFail('showQueryBarMenu'); await testSubjects.missingOrFail('addFilter'); - await testSubjects.missingOrFail('dscViewModeDocumentButton'); + await testSubjects.existOrFail('dscViewModeToggle'); + await testSubjects.existOrFail('dscViewModeDocumentButton'); // when Lens suggests a table, we render an ESQL based histogram await testSubjects.existOrFail('unifiedHistogramChart'); await testSubjects.existOrFail('discoverQueryHits'); From 23952db2bb3f687ed2411f3a2714401d502e0b0c Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 3 Jun 2024 22:01:22 +0200 Subject: [PATCH 17/82] [Synthetics]Lightweight monitors allow 10 and 30 seconds schedules (#184380) ## Summary Lightweight options image browser monitor options image Tested and seems to be working pretty nicely in synthetics service image Reflected in table as well image --- .../common/constants/monitor_defaults.ts | 3 ++ .../common/components/monitor_inspect.tsx | 4 +- .../monitor_add_edit/form/defaults.tsx | 5 ++ .../monitor_add_edit/form/field_config.tsx | 53 ++++++++++++++----- .../monitor_add_edit/form/formatter.ts | 17 +++++- .../monitor_add_edit/steps/index.tsx | 7 +-- .../steps/inspect_monitor_portal.tsx | 4 +- .../components/monitor_add_edit/types.ts | 1 + .../public/hooks/use_date_format.test.tsx | 6 +-- .../public/hooks/use_date_format.ts | 2 +- .../monitor_cruds/monitor_validation.test.ts | 2 +- .../migrations/monitors/8.8.0.test.ts | 4 +- 12 files changed, 77 insertions(+), 31 deletions(-) diff --git a/x-pack/plugins/observability_solution/synthetics/common/constants/monitor_defaults.ts b/x-pack/plugins/observability_solution/synthetics/common/constants/monitor_defaults.ts index add7eb2743cef..ccc8ab409420e 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/constants/monitor_defaults.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/constants/monitor_defaults.ts @@ -115,8 +115,11 @@ export const PROFILES_MAP = PROFILE_VALUES.reduce((acc, profile) => { return acc; }, {} as { [key: string]: ThrottlingConfig }); +export const ALLOWED_SCHEDULES_IN_SECONDS = ['10s', '30s']; + export const ALLOWED_SCHEDULES_IN_MINUTES = [ '1', + '2', '3', '5', '10', diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx index 6fa6bf7d320ee..f7fff9c9ce332 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx @@ -27,12 +27,12 @@ import { import { ClientPluginsStart } from '../../../../../plugin'; import { useSyntheticsSettingsContext } from '../../../contexts'; import { LoadingState } from '../../monitors_page/overview/overview/monitor_detail_flyout'; -import { MonitorTypeEnum, MonitorFields } from '../../../../../../common/runtime_types'; +import { MonitorTypeEnum, SyntheticsMonitor } from '../../../../../../common/runtime_types'; import { inspectMonitorAPI, MonitorInspectResponse } from '../../../state/monitor_management/api'; interface InspectorProps { isValid: boolean; - monitorFields: MonitorFields; + monitorFields: SyntheticsMonitor; } export const MonitorInspectWrapper = (props: InspectorProps) => { const { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/defaults.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/defaults.tsx index f24117f101666..5a4071182a4b4 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/defaults.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/defaults.tsx @@ -65,6 +65,11 @@ export const formatDefaultFormValues = (monitor?: SyntheticsMonitor) => { ...monitor, }; + const schedule = monitor[ConfigKey.SCHEDULE]; + if (schedule?.unit === 's') { + schedule.number = `${schedule.number}s`; + } + // handle default monitor types from Uptime, which don't contain `ConfigKey.FORM_MONITOR_TYPE` if (!formMonitorType) { formMonitorType = diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx index c1f74b27b88fa..7e24a0726a829 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx @@ -80,12 +80,24 @@ import { RequestBodyCheck, SourceType, } from '../types'; -import { AlertConfigKey, ALLOWED_SCHEDULES_IN_MINUTES } from '../constants'; +import { + AlertConfigKey, + ALLOWED_SCHEDULES_IN_MINUTES, + ALLOWED_SCHEDULES_IN_SECONDS, +} from '../constants'; import { getDefaultFormFields } from './defaults'; import { validate, validateHeaders, WHOLE_NUMBERS_ONLY, FLOATS_ONLY } from './validation'; import { KeyValuePairsFieldProps } from '../fields/key_value_field'; -const getScheduleContent = (value: number) => { +const getScheduleContent = (value: number, seconds?: boolean) => { + if (seconds) { + return i18n.translate('xpack.synthetics.monitorConfig.schedule.seconds.label', { + defaultMessage: 'Every {value, number} {value, plural, one {second} other {seconds}}', + values: { + value, + }, + }); + } if (value > 60) { return i18n.translate('xpack.synthetics.monitorConfig.schedule.label', { defaultMessage: 'Every {value, number} {value, plural, one {hour} other {hours}}', @@ -103,10 +115,25 @@ const getScheduleContent = (value: number) => { } }; -const SCHEDULES = ALLOWED_SCHEDULES_IN_MINUTES.map((value) => ({ - value, - text: getScheduleContent(parseInt(value, 10)), -})); +const getSchedules = (monitorType?: MonitorTypeEnum) => { + const minutes = ALLOWED_SCHEDULES_IN_MINUTES.map((value) => ({ + value, + text: getScheduleContent(parseInt(value, 10)), + })); + const allowSeconds = + monitorType === MonitorTypeEnum.HTTP || + monitorType === MonitorTypeEnum.TCP || + monitorType === MonitorTypeEnum.ICMP; + if (allowSeconds) { + const seconds = ALLOWED_SCHEDULES_IN_SECONDS.map((value) => ({ + value, + text: getScheduleContent(parseInt(value, 10), true), + })); + return [...seconds, ...minutes]; + } else { + return minutes; + } +}; export const MONITOR_TYPE_CONFIG = { [FormMonitorType.MULTISTEP]: { @@ -372,7 +399,7 @@ export const FIELD = (readOnly?: boolean): FieldMap => ({ }), }, ['schedule.number']: { - fieldKey: `${ConfigKey.SCHEDULE}.number`, + fieldKey: `schedule.number`, required: true, component: Select, label: i18n.translate('xpack.synthetics.monitorConfig.frequency.label', { @@ -382,13 +409,11 @@ export const FIELD = (readOnly?: boolean): FieldMap => ({ defaultMessage: 'How often do you want to run this test? Higher frequencies will increase your total cost.', }), - props: (): EuiSelectProps => { - return { - 'data-test-subj': 'syntheticsMonitorConfigSchedule', - options: SCHEDULES, - disabled: readOnly, - }; - }, + props: ({ formState }): EuiSelectProps => ({ + 'data-test-subj': 'syntheticsMonitorConfigSchedule', + options: getSchedules(formState.defaultValues?.[ConfigKey.MONITOR_TYPE]), + disabled: readOnly, + }), }, [ConfigKey.LOCATIONS]: { fieldKey: ConfigKey.LOCATIONS, diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.ts index d6ec887f324cb..db8a294effc28 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.ts @@ -5,7 +5,13 @@ * 2.0. */ import { get, pick } from 'lodash'; -import { ConfigKey, MonitorTypeEnum, FormMonitorType, MonitorFields } from '../types'; +import { + ConfigKey, + MonitorTypeEnum, + FormMonitorType, + MonitorFields, + SyntheticsMonitorSchedule, +} from '../types'; import { DEFAULT_FIELDS } from '../constants'; export const serializeNestedFormField = (fields: Record) => { @@ -28,6 +34,15 @@ export const format = (fields: Record, readOnly: boolean = fals ? ` await page.getByText('${formattedFields[ConfigKey.TEXT_ASSERTION]}').first().waitFor();` : ``; + + const schedule = formattedFields[ConfigKey.SCHEDULE]; + if (schedule.number.endsWith('s')) { + formattedFields[ConfigKey.SCHEDULE] = { + number: `${schedule.number.slice(0, -1)}`, + unit: 's' as SyntheticsMonitorSchedule['unit'], + }; + } + const formattedMap = { [FormMonitorType.SINGLE]: { ...formattedFields, diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx index 16f1a5488400f..8f529a9dc0601 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx @@ -10,7 +10,7 @@ import { EuiSteps, EuiPanel, EuiText, EuiSpacer } from '@elastic/eui'; import { useFormContext } from 'react-hook-form'; import { InspectMonitorPortal } from './inspect_monitor_portal'; import { ConfigKey, FormMonitorType, StepMap } from '../types'; -import { serializeNestedFormField } from '../form/formatter'; +import { format } from '../form/formatter'; import { AdvancedConfig } from '../advanced'; import { MonitorTypePortal } from './monitor_type_portal'; import { ReadOnlyCallout } from './read_only_callout'; @@ -51,10 +51,7 @@ export const MonitorSteps = ({ )} - + ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/inspect_monitor_portal.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/inspect_monitor_portal.tsx index 0f30bb43ab510..4a5556bcda0f2 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/inspect_monitor_portal.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/inspect_monitor_portal.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { InPortal } from 'react-reverse-portal'; -import { MonitorFields } from '../../../../../../common/runtime_types'; +import { SyntheticsMonitor } from '../../../../../../common/runtime_types'; import { MonitorInspectWrapper } from '../../common/components/monitor_inspect'; import { InspectMonitorPortalNode } from '../portals'; @@ -16,7 +16,7 @@ export const InspectMonitorPortal = ({ monitorFields, }: { isValid: boolean; - monitorFields: MonitorFields; + monitorFields: SyntheticsMonitor; }) => { return ( diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/types.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/types.ts index e779416014396..7ba092014ec88 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/types.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/types.ts @@ -46,6 +46,7 @@ export interface FormLocation { export type FormConfig = MonitorFields & { isTLSEnabled: boolean; ['schedule.number']: string; + ['schedule.unit']: string; ['source.inline']: string; [AlertConfigKey.STATUS_ENABLED]: boolean; [AlertConfigKey.TLS_ENABLED]: boolean; diff --git a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.test.tsx b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.test.tsx index 42cee2817e8f2..fac97ba610377 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.test.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.test.tsx @@ -31,7 +31,7 @@ describe('useDateFormat', () => { }); it('returns a formatter function that makes a date into the expected output', () => { const response = renderHook(() => useDateFormat()); - expect(response.result.current('2023-02-01 13:00:00')).toEqual('Feb 1, 2023 @ 1:00 PM'); + expect(response.result.current('2023-02-01 13:00:00')).toEqual('Feb 1, 2023 @ 1:00:00 PM'); }); it('adjusts formatter based on locale', () => { Object.defineProperty(global.navigator, 'language', { @@ -39,7 +39,7 @@ describe('useDateFormat', () => { writable: true, }); const response = renderHook(() => useDateFormat()); - expect(response.result.current('2023-02-01 13:00:00')).toEqual('1 Feb 2023 @ 13:00'); + expect(response.result.current('2023-02-01 13:00:00')).toEqual('1 Feb 2023 @ 13:00:00'); }); it('prefers Kibana locale if set', () => { jest.spyOn(i18n, 'getLocale').mockReturnValue('fr-FR'); @@ -49,6 +49,6 @@ describe('useDateFormat', () => { writable: true, }); const response = renderHook(() => useDateFormat()); - expect(response.result.current('2023-02-01 13:00:00')).toEqual('1 févr. 2023 @ 13:00'); + expect(response.result.current('2023-02-01 13:00:00')).toEqual('1 févr. 2023 @ 13:00:00'); }); }); diff --git a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.ts b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.ts index 6214deb9be4a8..f7bdff8e32fd0 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_date_format.ts @@ -24,6 +24,6 @@ export function useDateFormat(): DateFormatter { return (timestamp?: string) => { if (!timestamp) return ''; const date = moment(timestamp); - return `${date.format('ll')} @ ${date.format('LT')}`; + return `${date.format('ll')} @ ${date.format('LTS')}`; }; } diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts index 38917d62ead8c..0ddbb8c1845bb 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts @@ -241,7 +241,7 @@ describe('validateMonitor', () => { valid: false, reason: 'Monitor schedule is invalid', details: - 'Invalid schedule 4 minutes supplied to monitor configuration. Supported schedule values in minutes are 1, 3, 5, 10, 15, 20, 30, 60, 120, 240', + 'Invalid schedule 4 minutes supplied to monitor configuration. Supported schedule values in minutes are 1, 2, 3, 5, 10, 15, 20, 30, 60, 120, 240', }); }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/migrations/monitors/8.8.0.test.ts b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/migrations/monitors/8.8.0.test.ts index f816c2c2e2c83..546f1c0bdf008 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/migrations/monitors/8.8.0.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/migrations/monitors/8.8.0.test.ts @@ -410,7 +410,7 @@ describe('Monitor migrations v8.7.0 -> v8.8.0', () => { it.each([ [5, '5'], [4, '3'], - [2.5, '3'], + [2.5, '2'], ])('handles migrating schedule numeric values - browser', (invalidSchedule, migrated) => { const testMonitorWithSchedule = { ...browserUptimeUI, @@ -422,7 +422,7 @@ describe('Monitor migrations v8.7.0 -> v8.8.0', () => { }, }, }; - // @ts-ignore specificially testing monitors with invalid values for full coverage + // @ts-ignore specifically testing monitors with invalid values for full coverage const actual = migration880(encryptedSavedObjectsSetup)(testMonitorWithSchedule, context); expect(actual.attributes[ConfigKey.SCHEDULE].number).toEqual(migrated); expect( From 95eb12cc4582702d3e8ab9411e34fbc5292b130e Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:14:49 +0200 Subject: [PATCH 18/82] [Search] Renaming the search frontend group (#184565) ## Summary This renames the enterprise-search-frontend group to search-kibana to better align with what our group actually does. --- .github/CODEOWNERS | 30 +- packages/deeplinks/search/kibana.jsonc | 2 +- packages/kbn-ipynb/kibana.jsonc | 2 +- packages/kbn-search-api-panels/kibana.jsonc | 2 +- packages/kbn-search-connectors/kibana.jsonc | 2 +- .../kbn-search-index-documents/kibana.jsonc | 2 +- packages/kbn-try-in-console/kibana.jsonc | 2 +- .../settings/search_project/kibana.jsonc | 2 +- renovate.json | 675 ++++++++++++++---- x-pack/plugins/enterprise_search/README.md | 4 +- x-pack/plugins/enterprise_search/kibana.jsonc | 2 +- x-pack/plugins/search_connectors/kibana.jsonc | 2 +- x-pack/plugins/search_notebooks/kibana.jsonc | 6 +- x-pack/plugins/search_playground/kibana.jsonc | 2 +- x-pack/plugins/serverless_search/kibana.jsonc | 2 +- 15 files changed, 559 insertions(+), 178 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e9664ea90461b..914973516f4d0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -357,7 +357,7 @@ packages/deeplinks/fleet @elastic/fleet packages/deeplinks/management @elastic/kibana-management packages/deeplinks/ml @elastic/ml-ui packages/deeplinks/observability @elastic/obs-ux-logs-team -packages/deeplinks/search @elastic/enterprise-search-frontend +packages/deeplinks/search @elastic/search-kibana packages/deeplinks/security @elastic/security-solution packages/deeplinks/shared @elastic/appex-sharedux packages/default-nav/analytics @elastic/kibana-data-discovery @elastic/kibana-presentation @elastic/kibana-visualizations @@ -392,7 +392,7 @@ examples/embeddable_examples @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 -x-pack/plugins/enterprise_search @elastic/enterprise-search-frontend +x-pack/plugins/enterprise_search @elastic/search-kibana x-pack/packages/kbn-entities-schema @elastic/obs-knowledge-team examples/error_boundary @elastic/appex-sharedux packages/kbn-es @elastic/kibana-operations @@ -505,7 +505,7 @@ src/plugins/interactive_setup @elastic/kibana-security test/interactive_setup_api_integration/plugins/test_endpoints @elastic/kibana-security packages/kbn-interpreter @elastic/kibana-visualizations packages/kbn-io-ts-utils @elastic/obs-knowledge-team -packages/kbn-ipynb @elastic/enterprise-search-frontend +packages/kbn-ipynb @elastic/search-kibana packages/kbn-jest-serializers @elastic/kibana-operations packages/kbn-journeys @elastic/kibana-operations @elastic/appex-qa packages/kbn-json-ast @elastic/kibana-operations @@ -707,14 +707,14 @@ examples/screenshot_mode_example @elastic/appex-sharedux src/plugins/screenshot_mode @elastic/appex-sharedux x-pack/examples/screenshotting_example @elastic/appex-sharedux x-pack/plugins/screenshotting @elastic/kibana-reporting-services -packages/kbn-search-api-panels @elastic/enterprise-search-frontend -packages/kbn-search-connectors @elastic/enterprise-search-frontend -x-pack/plugins/search_connectors @elastic/enterprise-search-frontend +packages/kbn-search-api-panels @elastic/search-kibana +packages/kbn-search-connectors @elastic/search-kibana +x-pack/plugins/search_connectors @elastic/search-kibana packages/kbn-search-errors @elastic/kibana-data-discovery examples/search_examples @elastic/kibana-data-discovery -packages/kbn-search-index-documents @elastic/enterprise-search-frontend -x-pack/plugins/search_notebooks @elastic/enterprise-search-frontend -x-pack/plugins/search_playground @elastic/enterprise-search-frontend +packages/kbn-search-index-documents @elastic/search-kibana +x-pack/plugins/search_notebooks @elastic/search-kibana +x-pack/plugins/search_playground @elastic/search-kibana packages/kbn-search-response-warnings @elastic/kibana-data-discovery packages/kbn-search-types @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/kibana-management @@ -758,8 +758,8 @@ packages/serverless/settings/common @elastic/appex-sharedux @elastic/kibana-mana x-pack/plugins/serverless_observability @elastic/obs-ux-management-team packages/serverless/settings/observability_project @elastic/appex-sharedux @elastic/kibana-management @elastic/obs-ux-management-team packages/serverless/project_switcher @elastic/appex-sharedux -x-pack/plugins/serverless_search @elastic/enterprise-search-frontend -packages/serverless/settings/search_project @elastic/enterprise-search-frontend @elastic/kibana-management +x-pack/plugins/serverless_search @elastic/search-kibana +packages/serverless/settings/search_project @elastic/search-kibana @elastic/kibana-management packages/serverless/settings/security_project @elastic/security-solution @elastic/kibana-management packages/serverless/storybook/config @elastic/appex-sharedux packages/serverless/types @elastic/appex-sharedux @@ -867,7 +867,7 @@ x-pack/plugins/translations @elastic/kibana-localization x-pack/examples/triggers_actions_ui_example @elastic/response-ops x-pack/plugins/triggers_actions_ui @elastic/response-ops packages/kbn-triggers-actions-ui-types @elastic/response-ops -packages/kbn-try-in-console @elastic/enterprise-search-frontend +packages/kbn-try-in-console @elastic/search-kibana packages/kbn-ts-projects @elastic/kibana-operations packages/kbn-ts-type-check-cli @elastic/kibana-operations packages/kbn-typed-react-router-config @elastic/obs-knowledge-team @elastic/obs-ux-management-team @@ -1331,10 +1331,10 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/test_serverless/api_integration/test_suites/common/alerting/ @elastic/response-ops # Enterprise Search -/x-pack/test/functional_enterprise_search/ @elastic/enterprise-search-frontend +/x-pack/test/functional_enterprise_search/ @elastic/search-kibana /x-pack/plugins/enterprise_search/public/applications/shared/doc_links @elastic/ent-search-docs-team -/x-pack/test_serverless/api_integration/test_suites/search/serverless_search @elastic/enterprise-search-frontend -/x-pack/test_serverless/functional/test_suites/search/ @elastic/enterprise-search-frontend +/x-pack/test_serverless/api_integration/test_suites/search/serverless_search @elastic/search-kibana +/x-pack/test_serverless/functional/test_suites/search/ @elastic/search-kibana # Management Experience - Deployment Management /x-pack/test_serverless/**/test_suites/common/index_management/ @elastic/kibana-management diff --git a/packages/deeplinks/search/kibana.jsonc b/packages/deeplinks/search/kibana.jsonc index cb5584982e072..668514b989122 100644 --- a/packages/deeplinks/search/kibana.jsonc +++ b/packages/deeplinks/search/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/deeplinks-search", - "owner": "@elastic/enterprise-search-frontend" + "owner": "@elastic/search-kibana" } diff --git a/packages/kbn-ipynb/kibana.jsonc b/packages/kbn-ipynb/kibana.jsonc index adc8c05b75a74..74aa3e338fb65 100644 --- a/packages/kbn-ipynb/kibana.jsonc +++ b/packages/kbn-ipynb/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/ipynb", - "owner": "@elastic/enterprise-search-frontend" + "owner": "@elastic/search-kibana" } diff --git a/packages/kbn-search-api-panels/kibana.jsonc b/packages/kbn-search-api-panels/kibana.jsonc index 96c4e5beacf23..3e346c91d5554 100644 --- a/packages/kbn-search-api-panels/kibana.jsonc +++ b/packages/kbn-search-api-panels/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/search-api-panels", - "owner": "@elastic/enterprise-search-frontend" + "owner": "@elastic/search-kibana" } diff --git a/packages/kbn-search-connectors/kibana.jsonc b/packages/kbn-search-connectors/kibana.jsonc index 4c1162ed0300b..d5254ac9b68c7 100644 --- a/packages/kbn-search-connectors/kibana.jsonc +++ b/packages/kbn-search-connectors/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/search-connectors", - "owner": "@elastic/enterprise-search-frontend" + "owner": "@elastic/search-kibana" } diff --git a/packages/kbn-search-index-documents/kibana.jsonc b/packages/kbn-search-index-documents/kibana.jsonc index 4d8baf8aa6789..a0a69aff312c3 100644 --- a/packages/kbn-search-index-documents/kibana.jsonc +++ b/packages/kbn-search-index-documents/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/search-index-documents", - "owner": "@elastic/enterprise-search-frontend" + "owner": "@elastic/search-kibana" } diff --git a/packages/kbn-try-in-console/kibana.jsonc b/packages/kbn-try-in-console/kibana.jsonc index 59d0914ef7ad3..c5988280943db 100644 --- a/packages/kbn-try-in-console/kibana.jsonc +++ b/packages/kbn-try-in-console/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/try-in-console", - "owner": "@elastic/enterprise-search-frontend" + "owner": "@elastic/search-kibana" } diff --git a/packages/serverless/settings/search_project/kibana.jsonc b/packages/serverless/settings/search_project/kibana.jsonc index bcefb7f213dae..db71259a8ea6d 100644 --- a/packages/serverless/settings/search_project/kibana.jsonc +++ b/packages/serverless/settings/search_project/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/serverless-search-settings", - "owner": "@elastic/enterprise-search-frontend @elastic/kibana-management" + "owner": "@elastic/search-kibana @elastic/kibana-management" } diff --git a/renovate.json b/renovate.json index cb8c4e6bfc339..db3141fb3d3bd 100644 --- a/renovate.json +++ b/renovate.json @@ -1,9 +1,19 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base"], - "ignorePaths": ["**/__fixtures__/**", "**/fixtures/**"], - "enabledManagers": ["npm"], - "baseBranches": ["main", "7.17"], + "extends": [ + "config:base" + ], + "ignorePaths": [ + "**/__fixtures__/**", + "**/fixtures/**" + ], + "enabledManagers": [ + "npm" + ], + "baseBranches": [ + "main", + "7.17" + ], "prConcurrentLimit": 0, "prHourlyLimit": 0, "separateMajorMinor": false, @@ -17,17 +27,31 @@ }, "packageRules": [ { - "matchPackagePatterns": [".*"], + "matchPackagePatterns": [ + ".*" + ], "enabled": false, "prCreation": "not-pending", "stabilityDays": 7 }, { "groupName": "@elastic/charts", - "matchPackageNames": ["@elastic/charts"], - "reviewers": ["team:visualizations", "markov00", "nickofthyme"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "Team:Visualizations"], + "matchPackageNames": [ + "@elastic/charts" + ], + "reviewers": [ + "team:visualizations", + "markov00", + "nickofthyme" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip", + "Team:Visualizations" + ], "draftPR": true, "enabled": true, "assignAutomerge": true, @@ -35,117 +59,270 @@ }, { "groupName": "@elastic/elasticsearch", - "matchPackageNames": ["@elastic/elasticsearch"], - "reviewers": ["team:kibana-operations", "team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "Team:Operations", "Team:Core"], + "matchPackageNames": [ + "@elastic/elasticsearch" + ], + "reviewers": [ + "team:kibana-operations", + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip", + "Team:Operations", + "Team:Core" + ], "enabled": true }, { "groupName": "@elastic/elasticsearch", - "matchPackageNames": ["@elastic/elasticsearch"], - "reviewers": ["team:kibana-operations", "team:kibana-core"], - "matchBaseBranches": ["7.17"], - "labels": ["release_note:skip", "Team:Operations", "Team:Core", "backport:skip"], + "matchPackageNames": [ + "@elastic/elasticsearch" + ], + "reviewers": [ + "team:kibana-operations", + "team:kibana-core" + ], + "matchBaseBranches": [ + "7.17" + ], + "labels": [ + "release_note:skip", + "Team:Operations", + "Team:Core", + "backport:skip" + ], "enabled": true }, { "groupName": "LaunchDarkly", - "matchPackageNames": ["launchdarkly-js-client-sdk", "launchdarkly-node-server-sdk"], - "reviewers": ["team:kibana-security", "team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "Team:Security", "Team:Core", "backport:prev-minor"], + "matchPackageNames": [ + "launchdarkly-js-client-sdk", + "launchdarkly-node-server-sdk" + ], + "reviewers": [ + "team:kibana-security", + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "Team:Security", + "Team:Core", + "backport:prev-minor" + ], "enabled": true }, { "groupName": "APM", - "matchPackageNames": ["elastic-apm-node", "@elastic/apm-rum", "@elastic/apm-rum-react"], - "reviewers": ["team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "Team:Core", "backport:skip"], + "matchPackageNames": [ + "elastic-apm-node", + "@elastic/apm-rum", + "@elastic/apm-rum-react" + ], + "reviewers": [ + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "Team:Core", + "backport:skip" + ], "enabled": true, "prCreation": "immediate" }, { "groupName": "ansi-regex", - "matchPackageNames": ["ansi-regex"], - "reviewers": ["team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "Team:Core", "backport:skip"], + "matchPackageNames": [ + "ansi-regex" + ], + "reviewers": [ + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "Team:Core", + "backport:skip" + ], "enabled": true }, { "groupName": "OpenAPI Spec", - "matchPackageNames": ["@redocly/cli"], - "reviewers": ["team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "Team:Core", "backport:all-open"], + "matchPackageNames": [ + "@redocly/cli" + ], + "reviewers": [ + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "Team:Core", + "backport:all-open" + ], "enabled": true }, { "groupName": "babel", - "matchPackageNames": ["@types/babel__core"], - "matchPackagePatterns": ["^@babel", "^babel-plugin"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "matchPackageNames": [ + "@types/babel__core" + ], + "matchPackagePatterns": [ + "^@babel", + "^babel-plugin" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { "groupName": "typescript", - "matchPackageNames": ["typescript", "prettier", "@types/jsdom"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "matchPackageNames": [ + "typescript", + "prettier", + "@types/jsdom" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { "groupName": "typescript-eslint", - "matchPackagePatterns": ["^@typescript-eslint"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "matchPackagePatterns": [ + "^@typescript-eslint" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { "groupName": "polyfills", - "matchPackageNames": ["core-js"], - "matchPackagePatterns": ["polyfill"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "matchPackageNames": [ + "core-js" + ], + "matchPackagePatterns": [ + "polyfill" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { "groupName": "CLI tooling", - "matchPackageNames": ["listr2"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "backport:all-open", "release_note:skip"], + "matchPackageNames": [ + "listr2" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "backport:all-open", + "release_note:skip" + ], "enabled": true }, { "groupName": "vega related modules", - "matchPackageNames": ["vega", "vega-lite", "vega-schema-url-parser", "vega-tooltip"], - "reviewers": ["team:kibana-visualizations"], - "matchBaseBranches": ["main"], - "labels": ["Feature:Vega", "Team:Visualizations"], + "matchPackageNames": [ + "vega", + "vega-lite", + "vega-schema-url-parser", + "vega-tooltip" + ], + "reviewers": [ + "team:kibana-visualizations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Feature:Vega", + "Team:Visualizations" + ], "enabled": true }, { "groupName": "cypress", - "matchPackagePatterns": ["cypress"], - "reviewers": ["Team:apm", "Team: SecuritySolution"], - "matchBaseBranches": ["main"], - "labels": ["buildkite-ci", "ci:all-cypress-suites"], + "matchPackagePatterns": [ + "cypress" + ], + "reviewers": [ + "Team:apm", + "Team: SecuritySolution" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "buildkite-ci", + "ci:all-cypress-suites" + ], "enabled": true }, { "groupName": "security solution modules", - "matchPackageNames": ["zod", "langchain"], - "reviewers": ["Team: SecuritySolution"], - "matchBaseBranches": ["main"], - "labels": ["Team: SecuritySolution"], + "matchPackageNames": [ + "zod", + "langchain" + ], + "reviewers": [ + "Team: SecuritySolution" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team: SecuritySolution" + ], "enabled": true }, { @@ -162,9 +339,17 @@ "@types/xml-crypto", "@kayahr/text-encoding" ], - "reviewers": ["team:kibana-security"], - "matchBaseBranches": ["main"], - "labels": ["Team:Security", "release_note:skip", "backport:all-open"], + "reviewers": [ + "team:kibana-security" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Security", + "release_note:skip", + "backport:all-open" + ], "enabled": true }, { @@ -177,25 +362,52 @@ "ms-chromium-edge-driver", "selenium-webdriver" ], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { "groupName": "scss", - "packageNames": ["sass-embedded"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip", "backport:all-open"], + "packageNames": [ + "sass-embedded" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip", + "backport:all-open" + ], "enabled": true }, { "groupName": "minify", - "packageNames": ["gulp-terser", "terser"], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "packageNames": [ + "gulp-terser", + "terser" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { @@ -208,9 +420,16 @@ "@testing-library/user-event", "@types/testing-library__jest-dom" ], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { @@ -231,33 +450,67 @@ "jest-runtime", "jest-snapshot" ], - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "labels": ["Team:Operations", "release_note:skip"], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "release_note:skip" + ], "enabled": true }, { "groupName": "@storybook", - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "matchPackagePatterns": ["^@storybook"], - "excludePackageNames": ["@storybook/testing-react"], - "labels": ["Team:Operations", "release_note:skip", "ci:build-storybooks", "backport:skip"], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "matchPackagePatterns": [ + "^@storybook" + ], + "excludePackageNames": [ + "@storybook/testing-react" + ], + "labels": [ + "Team:Operations", + "release_note:skip", + "ci:build-storybooks", + "backport:skip" + ], "enabled": true, "allowedVersions": "<7.0" }, { "groupName": "@storybook/testing-react", - "reviewers": ["team:kibana-operations"], - "matchBaseBranches": ["main"], - "matchPackageNames": ["@storybook/testing-react"], - "labels": ["Team:Operations", "release_note:skip", "ci:build-storybooks", "backport:skip"], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "matchPackageNames": [ + "@storybook/testing-react" + ], + "labels": [ + "Team:Operations", + "release_note:skip", + "ci:build-storybooks", + "backport:skip" + ], "enabled": true, "allowedVersions": "<2.0" }, { "groupName": "react-query", - "packageNames": ["@tanstack/react-query", "@tanstack/react-query-devtools"], + "packageNames": [ + "@tanstack/react-query", + "@tanstack/react-query-devtools" + ], "reviewers": [ "team:response-ops", "team:kibana-cloud-security-posture", @@ -266,116 +519,242 @@ "team:awp-platform", "team:security-onboarding-and-lifecycle-mgt" ], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip", + "ci:all-cypress-suites" + ], "enabled": true }, { "groupName": "react-hook-form", - "packageNames": ["react-hook-form"], - "reviewers": ["team:security-asset-management", "team:uptime"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "packageNames": [ + "react-hook-form" + ], + "reviewers": [ + "team:security-asset-management", + "team:uptime" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip", + "ci:all-cypress-suites" + ], "enabled": true }, { "groupName": "redux", - "packageNames": ["redux", "react-redux"], + "packageNames": [ + "redux", + "react-redux" + ], "reviewers": [ - "team:enterprise-search-frontend", + "team:search-kibana", "team:kibana-presentation", "team:kibana-data-discovery", "team:kibana-management", "team:kibana-gis", "team:security-solution" ], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip", + "ci:all-cypress-suites" + ], "enabled": true }, { "groupName": "Profiling", - "matchPackageNames": ["peggy", "@types/dagre"], - "reviewers": ["team:profiling-ui"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip"], + "matchPackageNames": [ + "peggy", + "@types/dagre" + ], + "reviewers": [ + "team:profiling-ui" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip" + ], "enabled": true, "prCreation": "immediate" }, { "groupName": "TTY Output", - "matchPackageNames": ["xterm", "byte-size", "@types/byte-size"], - "reviewers": ["team:sec-cloudnative-integrations"], - "matchBaseBranches": ["main"], - "labels": ["Team: AWP: Visualization", "release_note:skip", "backport:skip"], + "matchPackageNames": [ + "xterm", + "byte-size", + "@types/byte-size" + ], + "reviewers": [ + "team:sec-cloudnative-integrations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team: AWP: Visualization", + "release_note:skip", + "backport:skip" + ], "enabled": true, "prCreation": "immediate" }, { "groupName": "Cloud Defend", - "matchPackageNames": ["monaco-yaml"], - "reviewers": ["team:sec-cloudnative-integrations"], - "matchBaseBranches": ["main"], - "labels": ["Team: Cloud Native Integrations", "release_note:skip", "backport:skip"], + "matchPackageNames": [ + "monaco-yaml" + ], + "reviewers": [ + "team:sec-cloudnative-integrations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team: Cloud Native Integrations", + "release_note:skip", + "backport:skip" + ], "enabled": true, "prCreation": "immediate" }, { "groupName": "JSON Web Token", - "matchPackageNames": ["jsonwebtoken"], - "reviewers": ["team:response-ops", "team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:all-open"], + "matchPackageNames": [ + "jsonwebtoken" + ], + "reviewers": [ + "team:response-ops", + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:all-open" + ], "enabled": true }, { "groupName": "XState", - "matchPackageNames": ["xstate"], - "matchPackagePrefixes": ["@xstate/"], - "reviewers": ["team:obs-ux-logs"], - "matchBaseBranches": ["main"], - "labels": ["Team:Obs UX Logs", "release_note:skip"], + "matchPackageNames": [ + "xstate" + ], + "matchPackagePrefixes": [ + "@xstate/" + ], + "reviewers": [ + "team:obs-ux-logs" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Obs UX Logs", + "release_note:skip" + ], "enabled": true, "prCreation": "immediate" }, { "groupName": "OpenTelemetry modules", - "matchPackagePrefixes": ["@opentelemetry/"], - "reviewers": ["team:monitoring"], - "matchBaseBranches": ["main"], - "labels": ["Team:Monitoring"], + "matchPackagePrefixes": [ + "@opentelemetry/" + ], + "reviewers": [ + "team:monitoring" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Monitoring" + ], "enabled": true }, { "groupName": "csp", - "packageNames": ["content-security-policy-parser"], - "reviewers": ["team:kibana-security", "team:kibana-core"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "ci:serverless-test-all"], + "packageNames": [ + "content-security-policy-parser" + ], + "reviewers": [ + "team:kibana-security", + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:skip", + "ci:serverless-test-all" + ], "enabled": true }, { "groupName": "AlertingEmails", - "matchPackageNames": ["nodemailer"], - "reviewers": ["team:response-ops"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:prev-minor"], + "matchPackageNames": [ + "nodemailer" + ], + "reviewers": [ + "team:response-ops" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "backport:prev-minor" + ], "enabled": true }, { "groupName": "machine learning modules", - "matchPackageNames": ["apidoc-markdown"], - "reviewers": ["team:ml-ui"], - "matchBaseBranches": ["main"], - "labels": ["Team:ML", "release_note:skip", "backport:all-open"], + "matchPackageNames": [ + "apidoc-markdown" + ], + "reviewers": [ + "team:ml-ui" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:ML", + "release_note:skip", + "backport:all-open" + ], "enabled": true }, { "groupName": "Kibana ES|QL Team", - "matchPackageNames": ["recast"], - "reviewers": ["team:kibana-esql"], - "matchBaseBranches": ["main"], - "labels": ["Team:ESQL", "release_note:skip"], + "matchPackageNames": [ + "recast" + ], + "reviewers": [ + "team:kibana-esql" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:ESQL", + "release_note:skip" + ], "enabled": true } ] diff --git a/x-pack/plugins/enterprise_search/README.md b/x-pack/plugins/enterprise_search/README.md index bc49c47fe6880..be7a06708c17a 100644 --- a/x-pack/plugins/enterprise_search/README.md +++ b/x-pack/plugins/enterprise_search/README.md @@ -21,7 +21,7 @@ Unify all your team's content into a personalized search experience. https://www 1. When developing locally, Enterprise Search should be running locally alongside Kibana on `localhost:3002`. 2. Update `config/kibana.dev.yml` with `enterpriseSearch.host: 'http://localhost:3002'` -Problems? If you're an Elastic Enterprise Search engineer, please reach out to @elastic/enterprise-search-frontend for questions or our in-depth Getting Started developer guide. +Problems? If you're an Elastic Enterprise Search engineer, please reach out to @elastic/search-kibana for questions or our in-depth Getting Started developer guide. Don't forget to read Kibana's [contributing documentation](https://github.com/elastic/kibana/#building-and-running-kibana-andor-contributing-code) and developer guides for more general info on the Kibana ecosystem. @@ -137,4 +137,4 @@ To track what Cypress is doing while running tests, you can pass in `--config vi See [our functional test runner README](../../test/functional_enterprise_search). -Our automated accessibility tests can be found in [x-pack/test/accessibility/apps](../../test/accessibility/apps/group3/enterprise_search.ts). \ No newline at end of file +Our automated accessibility tests can be found in [x-pack/test/accessibility/apps](../../test/accessibility/apps/group3/enterprise_search.ts). diff --git a/x-pack/plugins/enterprise_search/kibana.jsonc b/x-pack/plugins/enterprise_search/kibana.jsonc index 969ccab8b3c46..cefa247025aa5 100644 --- a/x-pack/plugins/enterprise_search/kibana.jsonc +++ b/x-pack/plugins/enterprise_search/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/enterprise-search-plugin", - "owner": "@elastic/enterprise-search-frontend", + "owner": "@elastic/search-kibana", "description": "Adds dashboards for discovering and managing Enterprise Search products.", "plugin": { "id": "enterpriseSearch", diff --git a/x-pack/plugins/search_connectors/kibana.jsonc b/x-pack/plugins/search_connectors/kibana.jsonc index 8b032a55052c5..e5aac900e89c0 100644 --- a/x-pack/plugins/search_connectors/kibana.jsonc +++ b/x-pack/plugins/search_connectors/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/search-connectors-plugin", - "owner": "@elastic/enterprise-search-frontend", + "owner": "@elastic/search-kibana", "description": "Plugin hosting shared features for connectors", "plugin": { "id": "searchConnectors", diff --git a/x-pack/plugins/search_notebooks/kibana.jsonc b/x-pack/plugins/search_notebooks/kibana.jsonc index ba760995422fa..d702cfb020275 100644 --- a/x-pack/plugins/search_notebooks/kibana.jsonc +++ b/x-pack/plugins/search_notebooks/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/search-notebooks", - "owner": "@elastic/enterprise-search-frontend", + "owner": "@elastic/search-kibana", "description": "Plugin to provide access to and rendering of python notebooks for use in the persistent developer console.", "plugin": { "id": "searchNotebooks", @@ -16,6 +16,8 @@ "console" ], "optionalPlugins": [], - "requiredBundles": ["kibanaReact"] + "requiredBundles": [ + "kibanaReact" + ] } } diff --git a/x-pack/plugins/search_playground/kibana.jsonc b/x-pack/plugins/search_playground/kibana.jsonc index 28a775eca341e..f1913dbd0f345 100644 --- a/x-pack/plugins/search_playground/kibana.jsonc +++ b/x-pack/plugins/search_playground/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/search-playground", - "owner": "@elastic/enterprise-search-frontend", + "owner": "@elastic/search-kibana", "plugin": { "id": "searchPlayground", "server": true, diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index 4e7fe08efba7b..fc298a895174e 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/serverless-search", - "owner": "@elastic/enterprise-search-frontend", + "owner": "@elastic/search-kibana", "description": "Serverless customizations for search.", "plugin": { "id": "serverlessSearch", From 1203de2c535f10dca706102ed52f1ad628bdd19b Mon Sep 17 00:00:00 2001 From: Ash <1849116+ashokaditya@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:22:47 +0200 Subject: [PATCH 19/82] [SecuritySolution][Endpoint] Add `scan` response action API (#184437) ## Summary Adds a `scan` action response route and related server side logic to handle `scan` action response. Note: A lot of the changes in the PR are due to test updates that resulted out of adding `scan` command to list of API commands. ### Testing 1. Add `responseActionScanEnabled` feature flag to `xpack.securitySolution.enableExperimental` 2. Run ES/Kibana 3. Run `node x-pack/plugins/security_solution/scripts/endpoint/run_endpoint_agent.js` to start a VM with Elastic Defend installed. 4. Visit `app/security/administration/endpoints` and click on the endpoint on the endpoint list. 5. Copy the endpoint id (`selected_endpopint`) from the URL. 6. Use `curl` to send out a `scan` request to the endpoint with `elastic` user. Use the curl command below:
curl curl --location 'http://localhost:5601/api/endpoint/action/scan' \ --header 'kbn-xsrf: test-xsrf' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic ZWxhc3RpYzpjaGFuZ2VtZQ==' \ --data '{ "endpoint_ids": [ "copied_endpoint_id" ], "parameters": { "path": "/home/ubuntu" } }'
7. You should see the action created on the response actions history for the endpoint. 8. Using any other non existing file path will result in a failed action. UX work to address this will follow. 9. Disabling/removing `responseActionScanEnabled` feature flag should give you a not found error when accessing the API. ### Checklist - [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) - [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 - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../actions/common/response_actions.ts | 2 + .../api/endpoint/actions/get_file.schema.yaml | 1 - .../common/api/endpoint/actions/scan.gen.ts | 28 +++ .../api/endpoint/actions/scan.schema.yaml | 41 ++++ .../common/api/endpoint/actions/scan_route.ts | 29 +++ .../common/api/endpoint/index.ts | 1 + .../common/endpoint/constants.ts | 1 + .../endpoint_action_generator.ts | 58 ++++- .../common/endpoint/schema/actions.test.ts | 30 +++ .../service/response_actions/constants.ts | 24 +- .../is_response_action_supported.ts | 12 + .../common/endpoint/types/actions.ts | 14 +- .../lib/endpoint_action_response_codes.ts | 30 +++ .../components/hooks.tsx | 5 + .../response_actions_log.test.tsx | 29 ++- .../serverless/feature_access/complete.cy.ts | 10 +- .../complete_with_endpoint.cy.ts | 10 +- .../feature_access/essentials.cy.ts | 10 +- .../essentials_with_endpoint.cy.ts | 10 +- .../management/cypress/screens/responder.ts | 5 +- .../endpoint/common/response_actions.ts | 13 + .../routes/actions/response_actions.test.ts | 223 ++++++++++-------- .../routes/actions/response_actions.ts | 62 +++-- .../actions/action_details_by_id.test.ts | 22 +- .../services/actions/action_list.test.ts | 62 +++-- .../endpoint/endpoint_actions_client.test.ts | 2 + .../endpoint/endpoint_actions_client.ts | 13 + .../lib/base_response_actions_client.ts | 14 +- .../services/actions/clients/lib/types.ts | 13 + .../services/actions/clients/mocks.ts | 21 +- .../utils/fetch_action_responses.test.ts | 68 +++--- .../services/actions/utils/utils.test.ts | 28 ++- .../services/feature_usage/feature_keys.ts | 6 +- 33 files changed, 660 insertions(+), 237 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/endpoint/actions/scan.gen.ts create mode 100644 x-pack/plugins/security_solution/common/api/endpoint/actions/scan.schema.yaml create mode 100644 x-pack/plugins/security_solution/common/api/endpoint/actions/scan_route.ts diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/common/response_actions.ts b/x-pack/plugins/security_solution/common/api/endpoint/actions/common/response_actions.ts index 269f041a25a10..66dc4d5828ce0 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/common/response_actions.ts +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/common/response_actions.ts @@ -10,6 +10,7 @@ import { schema } from '@kbn/config-schema'; import { UploadActionRequestSchema } from '../..'; import { ExecuteActionRequestSchema } from '../execute_route'; import { EndpointActionGetFileSchema } from '../get_file_route'; +import { ScanActionRequestSchema } from '../scan_route'; import { KillOrSuspendProcessRequestSchema, NoParametersRequestSchema } from './base'; export const ResponseActionBodySchema = schema.oneOf([ @@ -17,6 +18,7 @@ export const ResponseActionBodySchema = schema.oneOf([ KillOrSuspendProcessRequestSchema.body, EndpointActionGetFileSchema.body, ExecuteActionRequestSchema.body, + ScanActionRequestSchema.body, UploadActionRequestSchema.body, ]); diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/get_file.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/get_file.schema.yaml index 87b7b834e2077..4f2fdd471bce1 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/get_file.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/get_file.schema.yaml @@ -30,7 +30,6 @@ components: - type: object required: - parameters - - file properties: parameters: required: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/scan.gen.ts b/x-pack/plugins/security_solution/common/api/endpoint/actions/scan.gen.ts new file mode 100644 index 0000000000000..43ab2c4354845 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/scan.gen.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { z } from 'zod'; + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Scan Schema + * version: 2023-10-31 + */ + +import { BaseActionSchema } from '../model/schema/common.gen'; + +export type ScanActionRequestBody = z.infer; +export const ScanActionRequestBody = BaseActionSchema.merge( + z.object({ + parameters: z.object({ + path: z.string(), + }), + }) +); diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/scan.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/scan.schema.yaml new file mode 100644 index 0000000000000..be953b1330218 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/scan.schema.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + title: Scan Schema + version: '2023-10-31' +paths: + /api/endpoint/action/scan: + post: + summary: Scan Action + operationId: EndpointScanAction + x-codegen-enabled: false + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ScanActionRequestBody' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../model/schema/common.schema.yaml#/components/schemas/SuccessResponse' + +components: + schemas: + ScanActionRequestBody: + allOf: + - $ref: '../model/schema/common.schema.yaml#/components/schemas/BaseActionSchema' + - type: object + required: + - parameters + properties: + parameters: + required: + - path + type: object + properties: + path: + type: string + diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/scan_route.ts b/x-pack/plugins/security_solution/common/api/endpoint/actions/scan_route.ts new file mode 100644 index 0000000000000..1c9b3c6980d90 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/scan_route.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { TypeOf } from '@kbn/config-schema'; +import { schema } from '@kbn/config-schema'; +import { BaseActionRequestSchema } from './common/base'; + +export const ScanActionRequestSchema = { + body: schema.object({ + ...BaseActionRequestSchema, + + parameters: schema.object({ + path: schema.string({ + minLength: 1, + validate: (value) => { + if (!value.trim().length) { + return 'path cannot be an empty string'; + } + }, + }), + }), + }), +}; + +export type ScanActionRequestBody = TypeOf; diff --git a/x-pack/plugins/security_solution/common/api/endpoint/index.ts b/x-pack/plugins/security_solution/common/api/endpoint/index.ts index c31a71f449466..6dfbcd20d12fb 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/index.ts +++ b/x-pack/plugins/security_solution/common/api/endpoint/index.ts @@ -19,6 +19,7 @@ export * from './actions/suspend_process_route'; export * from './actions/get_processes_route'; export * from './actions/get_file_route'; export * from './actions/execute_route'; +export * from './actions/scan_route'; export * from './actions/common/base'; export * from './actions/common/response_actions'; diff --git a/x-pack/plugins/security_solution/common/endpoint/constants.ts b/x-pack/plugins/security_solution/common/endpoint/constants.ts index a4dd0b2b44518..3a10093b20a5b 100644 --- a/x-pack/plugins/security_solution/common/endpoint/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/constants.ts @@ -94,6 +94,7 @@ export const SUSPEND_PROCESS_ROUTE = `${BASE_ENDPOINT_ACTION_ROUTE}/suspend_proc export const GET_FILE_ROUTE = `${BASE_ENDPOINT_ACTION_ROUTE}/get_file`; export const EXECUTE_ROUTE = `${BASE_ENDPOINT_ACTION_ROUTE}/execute`; export const UPLOAD_ROUTE = `${BASE_ENDPOINT_ACTION_ROUTE}/upload`; +export const SCAN_ROUTE = `${BASE_ENDPOINT_ACTION_ROUTE}/scan`; /** Endpoint Actions Routes */ export const ENDPOINT_ACTION_LOG_ROUTE = `${BASE_ENDPOINT_ROUTE}/action_log/{agent_id}`; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_action_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_action_generator.ts index 83976ff215e82..9ba617ad0052d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_action_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_action_generator.ts @@ -28,6 +28,8 @@ import type { ResponseActionUploadParameters, EndpointActionResponseDataOutput, WithAllKeys, + ResponseActionScanOutputContent, + ResponseActionsScanParameters, } from '../types'; import { ActivityLogItemTypes } from '../types'; import { @@ -102,9 +104,13 @@ export class EndpointActionGenerator extends BaseDataGenerator { const command = overrides?.EndpointActions?.data?.command ?? this.randomResponseActionCommand(); let output: ActionResponseOutput< - ResponseActionGetFileOutputContent | ResponseActionExecuteOutputContent + | ResponseActionGetFileOutputContent + | ResponseActionExecuteOutputContent + | ResponseActionScanOutputContent > = overrides?.EndpointActions?.data?.output as unknown as ActionResponseOutput< - ResponseActionGetFileOutputContent | ResponseActionExecuteOutputContent + | ResponseActionGetFileOutputContent + | ResponseActionExecuteOutputContent + | ResponseActionScanOutputContent >; if (command === 'get-file') { @@ -128,6 +134,17 @@ export class EndpointActionGenerator extends BaseDataGenerator { } } + if (command === 'scan') { + if (!output) { + output = { + type: 'json', + content: { + code: 'ra_scan_success_done', + }, + }; + } + } + if (command === 'execute') { if (!output) { output = this.generateExecuteActionResponseOutput(); @@ -269,6 +286,35 @@ export class EndpointActionGenerator extends BaseDataGenerator { } } + if (command === 'scan') { + if (!details.parameters) { + ( + details as unknown as ActionDetails< + ResponseActionScanOutputContent, + ResponseActionsScanParameters + > + ).parameters = { + path: '/some/file.txt', + }; + } + + if (!details.outputs || Object.keys(details.outputs).length === 0) { + ( + details as unknown as ActionDetails< + ResponseActionScanOutputContent, + ResponseActionsScanParameters + > + ).outputs = { + [details.agents[0]]: { + type: 'json', + content: { + code: 'ra_scan_success_done', + }, + }, + }; + } + } + if (command === 'execute') { if (!details.parameters) { ( @@ -347,6 +393,14 @@ export class EndpointActionGenerator extends BaseDataGenerator { ]); } + randomScanFailureCode(): string { + return this.randomChoice([ + 'ra_scan_error_scan-invalid-input', + 'ra_scan_error_not-found', + 'ra_scan_error_scan-queue-quota', + ]); + } + generateActivityLogAction( overrides: DeepPartial ): EndpointActivityLogAction { diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/actions.test.ts b/x-pack/plugins/security_solution/common/endpoint/schema/actions.test.ts index bc32080fab1be..563633ed8413d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/actions.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/actions.test.ts @@ -20,6 +20,7 @@ import { NoParametersRequestSchema, } from '../../api/endpoint/actions/common/base'; import { ExecuteActionRequestSchema } from '../../api/endpoint/actions/execute_route'; +import { ScanActionRequestSchema } from '../../api/endpoint/actions/scan_route'; // NOTE: Even though schemas are kept in common/api/endpoint - we keep tests here, because common/api should import from outside describe('actions schemas', () => { @@ -759,4 +760,33 @@ describe('actions schemas', () => { }).toThrow('[file]: expected value of type [Stream] but got [Object]'); }); }); + + describe('ScanActionRequestSchema', () => { + it('should not accept empty string as path', () => { + expect(() => { + ScanActionRequestSchema.body.validate({ + endpoint_ids: ['endpoint_id'], + parameters: { path: ' ' }, + }); + }).toThrowError('path cannot be an empty string'); + }); + + it('should not accept when payload does not match', () => { + expect(() => { + ScanActionRequestSchema.body.validate({ + endpoint_ids: ['endpoint_id'], + path: 'some/path', + }); + }).toThrowError('[parameters.path]: expected value of type [string] but got [undefined]'); + }); + + it('should accept path in payload if not empty', () => { + expect(() => { + ScanActionRequestSchema.body.validate({ + endpoint_ids: ['endpoint_id'], + parameters: { path: 'some/path' }, + }); + }).not.toThrow(); + }); + }); }); diff --git a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts index 02716e09a882a..32773a3fafef4 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts @@ -27,8 +27,7 @@ export const RESPONSE_ACTION_API_COMMANDS_NAMES = [ 'get-file', 'execute', 'upload', - // TODO: for API changes in a subsequent PR - // 'scan', + 'scan', ] as const; export type ResponseActionsApiCommandNames = typeof RESPONSE_ACTION_API_COMMANDS_NAMES[number]; @@ -54,8 +53,7 @@ export const ENDPOINT_CAPABILITIES = [ 'get_file', 'execute', 'upload_file', - // TODO: for API changes in a subsequent PR - // 'scan', + 'scan', ] as const; export type EndpointCapabilities = typeof ENDPOINT_CAPABILITIES[number]; @@ -73,8 +71,7 @@ export const CONSOLE_RESPONSE_ACTION_COMMANDS = [ 'get-file', 'execute', 'upload', - // TODO: for API changes in a subsequent PR - // 'scan', + 'scan', ] as const; export type ConsoleResponseActionCommands = typeof CONSOLE_RESPONSE_ACTION_COMMANDS[number]; @@ -102,8 +99,7 @@ export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_RBAC_FEATURE_CONTROL: Record< 'get-file': 'writeFileOperations', execute: 'writeExecuteOperations', upload: 'writeFileOperations', - // TODO: for API changes in a subsequent PR - // scan: 'writeScanOperations', + scan: 'writeScanOperations', }); export const RESPONSE_ACTION_API_COMMAND_TO_CONSOLE_COMMAND_MAP = Object.freeze< @@ -117,8 +113,7 @@ export const RESPONSE_ACTION_API_COMMAND_TO_CONSOLE_COMMAND_MAP = Object.freeze< 'kill-process': 'kill-process', 'suspend-process': 'suspend-process', upload: 'upload', - // TODO: for API changes in a subsequent PR - // scan: 'scan', + scan: 'scan', }); export const RESPONSE_CONSOLE_COMMAND_TO_API_COMMAND_MAP = Object.freeze< @@ -132,8 +127,7 @@ export const RESPONSE_CONSOLE_COMMAND_TO_API_COMMAND_MAP = Object.freeze< 'kill-process': 'kill-process', 'suspend-process': 'suspend-process', upload: 'upload', - // TODO: for API changes in a subsequent PR - // scan: 'scan', + scan: 'scan', }); export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_ENDPOINT_CAPABILITY = Object.freeze< @@ -147,8 +141,7 @@ export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_ENDPOINT_CAPABILITY = Object.fr 'kill-process': 'kill_process', 'suspend-process': 'suspend_process', upload: 'upload_file', - // TODO: for API changes in a subsequent PR - // scan: 'scan', + scan: 'scan', }); /** @@ -165,8 +158,7 @@ export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_REQUIRED_AUTHZ = Object.freeze< processes: 'canGetRunningProcesses', 'kill-process': 'canKillProcess', 'suspend-process': 'canSuspendProcess', - // TODO: for API changes in a subsequent PR - // scan: 'canWriteScanOperations', + scan: 'canWriteScanOperations', }); // 4 hrs in seconds diff --git a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts index a2d55799c9943..0c0d0db960709 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/is_response_action_supported.ts @@ -114,6 +114,18 @@ const RESPONSE_ACTIONS_SUPPORT_MAP: SupportMap = { crowdstrike: false, }, }, + scan: { + automated: { + endpoint: false, + sentinel_one: false, + crowdstrike: false, + }, + manual: { + endpoint: true, + sentinel_one: false, + crowdstrike: false, + }, + }, }; /** diff --git a/x-pack/plugins/security_solution/common/endpoint/types/actions.ts b/x-pack/plugins/security_solution/common/endpoint/types/actions.ts index 21ca7780597b0..8727dff1b2f50 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/actions.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/actions.ts @@ -90,6 +90,10 @@ export interface ResponseActionExecuteOutputContent { output_file_stderr_truncated: boolean; } +export interface ResponseActionScanOutputContent { + code: string; +} + export const ActivityLogItemTypes = { ACTION: 'action' as const, RESPONSE: 'response' as const, @@ -197,12 +201,17 @@ export interface ResponseActionsExecuteParameters { timeout?: number; } +export interface ResponseActionsScanParameters { + path: string; +} + export type EndpointActionDataParameterTypes = | undefined | ResponseActionParametersWithPidOrEntityId | ResponseActionsExecuteParameters | ResponseActionGetFileParameters - | ResponseActionUploadParameters; + | ResponseActionUploadParameters + | ResponseActionsScanParameters; /** Output content of the different response actions */ export type EndpointActionResponseDataOutput = @@ -212,7 +221,8 @@ export type EndpointActionResponseDataOutput = | ResponseActionUploadOutputContent | GetProcessesActionOutputContent | SuspendProcessActionOutputContent - | KillProcessActionOutputContent; + | KillProcessActionOutputContent + | ResponseActionScanOutputContent; /** * The data stored with each Response Action under `EndpointActions.data` property diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/endpoint_action_response_codes.ts b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/endpoint_action_response_codes.ts index a26a5d319be63..2e40fc44d5aac 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/endpoint_action_response_codes.ts +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/lib/endpoint_action_response_codes.ts @@ -269,6 +269,36 @@ const CODES = Object.freeze({ 'xpack.securitySolution.endpointActionResponseCodes.upload.fileCorruption', { defaultMessage: 'Failed to save file to disk or validate its integrity' } ), + + // ----------------------------------------------------------------- + // SCAN CODES + // ----------------------------------------------------------------- + + 'ra_scan_error_scan-invalid-input': i18n.translate( + 'xpack.securitySolution.endpointActionResponseCodes.scan.invalidInput', + { defaultMessage: 'Scan failed. Invalid absolute file path provided.' } + ), + + // Dev: + // file path not found failure (404) + 'ra_scan_error_not-found': i18n.translate( + 'xpack.securitySolution.endpointActionResponseCodes.scan.notFound', + { defaultMessage: 'Scan failed. File path/folder was not found (404)' } + ), + + // Dev: + // scan quota exceeded failure + 'ra_scan_error_scan-queue-quota': i18n.translate( + 'xpack.securitySolution.endpointActionResponseCodes.scan.queueQuota', + { defaultMessage: 'Scan failed. Too many scans are queued.' } + ), + + // Dev: + // scan success/competed + ra_scan_success_done: i18n.translate( + 'xpack.securitySolution.endpointActionResponseCodes.scan.success', + { defaultMessage: 'Success. Scan completed.' } + ), }); /** diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/hooks.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/hooks.tsx index a91c87223e44c..0fe111965f463 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/hooks.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/hooks.tsx @@ -334,6 +334,11 @@ export const useActionsLogFilter = ({ return false; } + // `scan` - v8.15 + if (commandName === 'scan' && !featureFlags.responseActionScanEnabled) { + return false; + } + return true; }).map((commandName) => ({ key: commandName, diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx index 482edd42056e4..c10b661124bd7 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx @@ -1112,11 +1112,37 @@ describe('Response actions history', () => { ); }); - it('should show a list of actions when opened', () => { + it('should show a list of actions (without `scan`) when opened', () => { mockedContext.setExperimentalFlag({ responseActionUploadEnabled: true }); render(); const { getByTestId, getAllByTestId } = renderResult; + userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); + const filterList = getByTestId(`${testPrefix}-${filterPrefix}-popoverList`); + expect(filterList).toBeTruthy(); + expect(getAllByTestId(`${filterPrefix}-option`).length).toEqual( + RESPONSE_ACTION_API_COMMANDS_NAMES.length - 1 + ); + expect(getAllByTestId(`${filterPrefix}-option`).map((option) => option.textContent)).toEqual([ + 'isolate. To check this option, press Enter.', + 'release. To check this option, press Enter.', + 'kill-process. To check this option, press Enter.', + 'suspend-process. To check this option, press Enter.', + 'processes. To check this option, press Enter.', + 'get-file. To check this option, press Enter.', + 'execute. To check this option, press Enter.', + 'upload. To check this option, press Enter.', + ]); + }); + + it('should show a list of actions (with `scan`) when opened', () => { + mockedContext.setExperimentalFlag({ + responseActionUploadEnabled: true, + responseActionScanEnabled: true, + }); + render(); + const { getByTestId, getAllByTestId } = renderResult; + userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); const filterList = getByTestId(`${testPrefix}-${filterPrefix}-popoverList`); expect(filterList).toBeTruthy(); @@ -1132,6 +1158,7 @@ describe('Response actions history', () => { 'get-file. To check this option, press Enter.', 'execute. To check this option, press Enter.', 'upload. To check this option, press Enter.', + 'scan. To check this option, press Enter.', ]); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete.cy.ts index 83a70c84a2307..57b2820921dd9 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete.cy.ts @@ -53,9 +53,10 @@ describe( } // No access to response actions (except `unisolate`) + // TODO: update tests when `scan` is included in PLIs for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( - (apiName) => apiName !== 'unisolate' - )) { + (apiName) => apiName !== 'scan' + ).filter((apiName) => apiName !== 'unisolate')) { it(`should not allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('none', actionName, username, password); }); @@ -78,9 +79,10 @@ describe( }); // No access to response actions (except `unisolate`) + // TODO: update tests when `scan` is included in PLIs for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( - (apiName) => apiName !== 'unisolate' - )) { + (apiName) => apiName !== 'scan' + ).filter((apiName) => apiName !== 'unisolate')) { it(`should not allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('none', actionName, username, password); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete_with_endpoint.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete_with_endpoint.cy.ts index 13ffbfd848e88..da17beb14d760 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete_with_endpoint.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/complete_with_endpoint.cy.ts @@ -47,7 +47,10 @@ describe( }); } - for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES) { + // TODO: update tests when `scan` is included in PLIs + for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( + (apiName) => apiName !== 'scan' + )) { it(`should allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('all', actionName, username, password); }); @@ -70,7 +73,10 @@ describe( }); }); - for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES) { + // TODO: update tests when `scan` is included in PLIs + for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( + (apiName) => apiName !== 'scan' + )) { it(`should allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('all', actionName, username, password); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials.cy.ts index e7400b548debf..e4388924f05fc 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials.cy.ts @@ -55,9 +55,10 @@ describe( } // No access to response actions (except `unisolate`) + // TODO: update tests when `scan` is included in PLIs for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( - (apiName) => apiName !== 'unisolate' - )) { + (apiName) => apiName !== 'scan' + ).filter((apiName) => apiName !== 'unisolate')) { it(`should not allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('none', actionName, username, password); }); @@ -80,9 +81,10 @@ describe( }); // No access to response actions (except `unisolate`) + // TODO: update tests when `scan` is included in PLIs for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( - (apiName) => apiName !== 'unisolate' - )) { + (apiName) => apiName !== 'scan' + ).filter((apiName) => apiName !== 'unisolate')) { it(`should not allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('none', actionName, username, password); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials_with_endpoint.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials_with_endpoint.cy.ts index 87d48220be697..4a37f1089e897 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials_with_endpoint.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/feature_access/essentials_with_endpoint.cy.ts @@ -62,9 +62,10 @@ describe( }); } + // TODO: update tests when `scan` is included in PLIs for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( - (apiName) => apiName !== 'unisolate' - )) { + (apiName) => apiName !== 'scan' + ).filter((apiName) => apiName !== 'unisolate')) { it(`should not allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('none', actionName, username, password); }); @@ -91,9 +92,10 @@ describe( }); }); + // TODO: update tests when `scan` is included in PLIs for (const actionName of RESPONSE_ACTION_API_COMMANDS_NAMES.filter( - (apiName) => apiName !== 'unisolate' - )) { + (apiName) => apiName !== 'scan' + ).filter((apiName) => apiName !== 'unisolate')) { it(`should not allow access to Response Action: ${actionName}`, () => { ensureResponseActionAuthzAccess('none', actionName, username, password); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/screens/responder.ts b/x-pack/plugins/security_solution/public/management/cypress/screens/responder.ts index c612c99db17b3..7e920772374c5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/screens/responder.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/screens/responder.ts @@ -14,8 +14,9 @@ const TEST_SUBJ = Object.freeze({ actionLogFlyout: 'responderActionLogFlyout', }); +// TODO: 8.15 Include `scan` in return type when responseActionsScanEnabled when `scan` is categorized in PLIs export const getConsoleHelpPanelResponseActionTestSubj = (): Record< - ConsoleResponseActionCommands, + Exclude, string > => { return { @@ -27,6 +28,8 @@ export const getConsoleHelpPanelResponseActionTestSubj = (): Record< 'get-file': 'endpointResponseActionsConsole-commandList-Responseactions-get-file', execute: 'endpointResponseActionsConsole-commandList-Responseactions-execute', upload: 'endpointResponseActionsConsole-commandList-Responseactions-upload', + // TODO: 8.15 Include `scan` in return type when responseActionsScanEnabled when `scan` is categorized in PLIs + // scan: 'endpointResponseActionsConsole-commandList-Responseactions-scan', }; }; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/response_actions.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/response_actions.ts index c909b6323ad26..528078ca5d417 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/response_actions.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/response_actions.ts @@ -5,6 +5,8 @@ * 2.0. */ +/* eslint-disable complexity */ + import type { Client } from '@elastic/elasticsearch'; import type { SearchHit } from '@elastic/elasticsearch/lib/api/types'; import { basename } from 'path'; @@ -24,6 +26,7 @@ import type { ResponseActionGetFileOutputContent, ResponseActionGetFileParameters, EndpointActionResponseDataOutput, + ResponseActionScanOutputContent, } from '../../../common/endpoint/types'; import { getFileDownloadId } from '../../../common/endpoint/service/response_actions/get_file_download_id'; import { @@ -110,6 +113,16 @@ export const sendEndpointActionResponse = async ( ).code = endpointActionGenerator.randomGetFileFailureCode(); } + if ( + endpointResponse.EndpointActions.data.command === 'scan' && + endpointResponse.EndpointActions.data.output + ) { + ( + endpointResponse.EndpointActions.data.output + .content as unknown as ResponseActionScanOutputContent + ).code = endpointActionGenerator.randomScanFailureCode(); + } + if ( endpointResponse.EndpointActions.data.command === 'execute' && endpointResponse.EndpointActions.data.output diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts index d964d2bc00b70..8c1ba19ca626d 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts @@ -24,23 +24,24 @@ import type { CasesClientMock } from '@kbn/cases-plugin/server/client/mocks'; import { LicenseService } from '../../../../common/license'; import { - ISOLATE_HOST_ROUTE_V2, - UNISOLATE_HOST_ROUTE_V2, ENDPOINT_ACTIONS_INDEX, - KILL_PROCESS_ROUTE, - SUSPEND_PROCESS_ROUTE, + EXECUTE_ROUTE, + GET_FILE_ROUTE, GET_PROCESSES_ROUTE, ISOLATE_HOST_ROUTE, + ISOLATE_HOST_ROUTE_V2, + KILL_PROCESS_ROUTE, + SCAN_ROUTE, + SUSPEND_PROCESS_ROUTE, UNISOLATE_HOST_ROUTE, - GET_FILE_ROUTE, - EXECUTE_ROUTE, + UNISOLATE_HOST_ROUTE_V2, UPLOAD_ROUTE, } from '../../../../common/endpoint/constants'; import type { ActionDetails, - ResponseActionApiResponse, HostMetadata, LogsEndpointAction, + ResponseActionApiResponse, ResponseActionRequestBody, } from '../../../../common/endpoint/types'; import { EndpointDocGenerator } from '../../../../common/endpoint/generate_data'; @@ -74,6 +75,8 @@ import { responseActionsClientMock } from '../../services/actions/clients/mocks' import type { ActionsApiRequestHandlerContext } from '@kbn/actions-plugin/server'; import { sentinelOneMock } from '../../services/actions/clients/sentinelone/mocks'; import { ResponseActionsClientError } from '../../services/actions/clients/errors'; +import type { EndpointAppContext } from '../../types'; +import type { ExperimentalFeatures } from '../../../../common'; jest.mock('../../services', () => { const realModule = jest.requireActual('../../services'); @@ -116,6 +119,7 @@ describe('Response actions', () => { let mockResponse: jest.Mocked; let licenseService: LicenseService; let licenseEmitter: Subject; + let endpointContext: EndpointAppContext; let callRoute: ( routePrefix: string, @@ -129,6 +133,13 @@ describe('Response actions', () => { const docGen = new EndpointDocGenerator(); + const setFeatureFlag = (ff: Partial) => { + endpointContext.experimentalFeatures = { + ...endpointContext.experimentalFeatures, + ...ff, + }; + }; + beforeEach(() => { // instantiate... everything const mockScopedClient = elasticsearchServiceMock.createScopedClusterClient(); @@ -150,7 +161,7 @@ describe('Response actions', () => { licenseService = new LicenseService(); licenseService.start(licenseEmitter); - const endpointContext = { + endpointContext = { ...createMockEndpointAppContext(), service: endpointAppContextService, }; @@ -161,6 +172,8 @@ describe('Response actions', () => { licenseService, }); + setFeatureFlag({ responseActionScanEnabled: true }); + // add the host isolation route handlers to routerMock registerResponseActionRoutes(routerMock, endpointContext); @@ -285,10 +298,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ agents: [AgentID], @@ -304,10 +315,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ user_id: testUser.username, @@ -322,10 +331,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ comment }), @@ -347,10 +354,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ action_id: expect.any(String), @@ -374,10 +379,8 @@ describe('Response actions', () => { body: { endpoint_ids: ['XYZ'] }, version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ timeout: 300, @@ -395,10 +398,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ agents: [agentId], @@ -412,10 +413,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -431,10 +430,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -450,10 +447,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -469,10 +464,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -488,10 +481,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -507,10 +498,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -526,10 +515,8 @@ describe('Response actions', () => { version: '2023-10-31', }); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -539,6 +526,24 @@ describe('Response actions', () => { ); }); + it('sends the `scan` command payload from the scan route', async () => { + await callRoute(SCAN_ROUTE, { + body: { endpoint_ids: ['XYZ'], parameters: { path: '/home/usr/' } }, + version: '2023-10-31', + }); + + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock + ).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ + command: 'scan', + parameters: { path: '/home/usr/' }, + }), + }) + ); + }); + describe('With endpoint data streams', () => { it('handles unisolation', async () => { const ctx = await callRoute( @@ -550,10 +555,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -585,10 +588,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -621,10 +622,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -659,10 +658,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -696,10 +693,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -731,10 +726,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -768,10 +761,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -806,10 +797,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -836,6 +825,41 @@ describe('Response actions', () => { expect(responseBody.action).toBeUndefined(); }); + it('handles scan', async () => { + const ctx = await callRoute( + SCAN_ROUTE, + { + body: { endpoint_ids: ['XYZ'], parameters: { path: '/home/usr/' } }, + version: '2023-10-31', + }, + { endpointDsExists: true } + ); + + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock + ).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ + command: 'scan', + comment: undefined, + parameters: { path: '/home/usr/' }, + }), + }) + ); + + const indexDoc = ctx.core.elasticsearch.client.asInternalUser.index; + const actionDocs: [{ index: string; document?: LogsEndpointAction }] = [ + indexDoc.mock.calls[0][0] as estypes.IndexRequest, + ]; + + expect(actionDocs[0].index).toEqual(ENDPOINT_ACTIONS_INDEX); + expect(actionDocs[0].document!.EndpointActions.data.command).toEqual('scan'); + + expect(mockResponse.ok).toBeCalled(); + const responseBody = mockResponse.ok.mock.calls[0][0]?.body as ResponseActionApiResponse; + expect(responseBody.action).toBeUndefined(); + }); + it('signs the action', async () => { await callRoute( ISOLATE_HOST_ROUTE_V2, @@ -846,10 +870,8 @@ describe('Response actions', () => { { endpointDsExists: true } ); - await expect( - ( - await endpointAppContextService.getFleetActionsClient() - ).create as jest.Mock + expect( + (await endpointAppContextService.getFleetActionsClient()).create as jest.Mock ).toHaveBeenCalledWith( expect.objectContaining({ signed: { @@ -960,6 +982,15 @@ describe('Response actions', () => { }); expect(mockResponse.forbidden).toBeCalled(); }); + + it('prohibits user from performing `scan` action if `canWriteScanOperations` is `false`', async () => { + await callRoute(SCAN_ROUTE, { + body: { endpoint_ids: ['XYZ'] }, + authz: { canWriteScanOperations: false }, + version: '2023-10-31', + }); + expect(mockResponse.forbidden).toBeCalled(); + }); }); describe('Cases', () => { diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts index 54af1f4716607..09512b7cbc5ed 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import type { RequestHandler } from '@kbn/core/server'; import type { TypeOf } from '@kbn/config-schema'; @@ -12,42 +13,44 @@ import { stringify } from '../../utils/stringify'; import { getResponseActionsClient, NormalizedExternalConnectorClient } from '../../services'; import type { ResponseActionsClient } from '../../services/actions/clients/lib/types'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; -import type { - NoParametersRequestSchema, - ResponseActionsRequestBody, - ExecuteActionRequestBody, - ResponseActionGetFileRequestBody, - UploadActionApiRequestBody, -} from '../../../../common/api/endpoint'; import { - ExecuteActionRequestSchema, EndpointActionGetFileSchema, + type ExecuteActionRequestBody, + ExecuteActionRequestSchema, + GetProcessesRouteRequestSchema, IsolateRouteRequestSchema, KillProcessRouteRequestSchema, + type NoParametersRequestSchema, + type ResponseActionGetFileRequestBody, + type ResponseActionsRequestBody, + type ScanActionRequestBody, + ScanActionRequestSchema, SuspendProcessRouteRequestSchema, UnisolateRouteRequestSchema, - GetProcessesRouteRequestSchema, + type UploadActionApiRequestBody, UploadActionRequestSchema, } from '../../../../common/api/endpoint'; import { + EXECUTE_ROUTE, + GET_FILE_ROUTE, + GET_PROCESSES_ROUTE, + ISOLATE_HOST_ROUTE, ISOLATE_HOST_ROUTE_V2, - UNISOLATE_HOST_ROUTE_V2, KILL_PROCESS_ROUTE, + SCAN_ROUTE, SUSPEND_PROCESS_ROUTE, - GET_PROCESSES_ROUTE, - ISOLATE_HOST_ROUTE, UNISOLATE_HOST_ROUTE, - GET_FILE_ROUTE, - EXECUTE_ROUTE, + UNISOLATE_HOST_ROUTE_V2, UPLOAD_ROUTE, } from '../../../../common/endpoint/constants'; import type { + ActionDetails, EndpointActionDataParameterTypes, + KillOrSuspendProcessRequestBody, ResponseActionParametersWithPidOrEntityId, ResponseActionsExecuteParameters, - ActionDetails, - KillOrSuspendProcessRequestBody, + ResponseActionsScanParameters, } from '../../../../common/endpoint/types'; import type { ResponseActionsApiCommandNames } from '../../../../common/endpoint/service/response_actions/constants'; import type { @@ -279,6 +282,29 @@ export function registerResponseActionRoutes( responseActionRequestHandler(endpointContext, 'upload') ) ); + + // 8.15 route + if (endpointContext.experimentalFeatures.responseActionScanEnabled) { + router.versioned + .post({ + access: 'public', + path: SCAN_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: ScanActionRequestSchema, + }, + }, + withEndpointAuthz( + { all: ['canWriteScanOperations'] }, + logger, + responseActionRequestHandler(endpointContext, 'scan') + ) + ); + } } function responseActionRequestHandler( @@ -368,6 +394,10 @@ function responseActionRequestHandler { outputs: { 'agent-a': { content: { - code: 'ra_get-file_success_done', - contents: [ - { - file_name: 'bad_file.txt', - path: '/some/path/bad_file.txt', - sha256: '9558c5cb39622e9b3653203e772b129d6c634e7dbd7af1b244352fc1d704601f', - size: 1234, - type: 'file', - }, - ], - zip_size: 123, + code: 'ra_execute_success_done', + cwd: '/some/path', + output_file_id: 'some-output-file-id', + output_file_stderr_truncated: false, + output_file_stdout_truncated: true, + shell: 'bash', + shell_code: 0, + stderr: expect.any(String), + stderr_truncated: true, + stdout: expect.any(String), + stdout_truncated: true, }, type: 'json', }, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts index fe9e6febeb21e..f94663fe90fdd 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts @@ -95,6 +95,7 @@ describe('When using `getActionList()', () => { agentType: 'endpoint', hosts: { 'agent-a': { name: 'Host-agent-a' } }, command: 'kill-process', + alertIds: undefined, completedAt: '2022-04-30T16:08:47.449Z', wasSuccessful: true, errors: undefined, @@ -108,6 +109,7 @@ describe('When using `getActionList()', () => { parameters: doc?.EndpointActions.data.parameters, agentState: { 'agent-a': { + errors: undefined, completedAt: '2022-04-30T16:08:47.449Z', isCompleted: true, wasSuccessful: true, @@ -116,17 +118,17 @@ describe('When using `getActionList()', () => { outputs: { 'agent-a': { content: { - code: 'ra_get-file_success_done', - contents: [ - { - file_name: 'bad_file.txt', - path: '/some/path/bad_file.txt', - sha256: '9558c5cb39622e9b3653203e772b129d6c634e7dbd7af1b244352fc1d704601f', - size: 1234, - type: 'file', - }, - ], - zip_size: 123, + code: 'ra_execute_success_done', + cwd: '/some/path', + output_file_id: 'some-output-file-id', + output_file_stderr_truncated: false, + output_file_stdout_truncated: true, + shell: 'bash', + shell_code: 0, + stderr: expect.any(String), + stderr_truncated: true, + stdout: expect.any(String), + stdout_truncated: true, }, type: 'json', }, @@ -166,6 +168,7 @@ describe('When using `getActionList()', () => { ).resolves.toEqual({ page: 1, pageSize: 10, + agentTypes: undefined, commands: undefined, userIds: undefined, startDate: undefined, @@ -179,8 +182,8 @@ describe('When using `getActionList()', () => { hosts: { 'agent-a': { name: 'Host-agent-a' } }, command: 'kill-process', completedAt: '2022-04-30T16:08:47.449Z', - wasSuccessful: true, errors: undefined, + wasSuccessful: true, id: '123', isCompleted: true, isExpired: false, @@ -189,17 +192,17 @@ describe('When using `getActionList()', () => { outputs: { 'agent-a': { content: { - code: 'ra_get-file_success_done', - contents: [ - { - file_name: 'bad_file.txt', - path: '/some/path/bad_file.txt', - sha256: '9558c5cb39622e9b3653203e772b129d6c634e7dbd7af1b244352fc1d704601f', - size: 1234, - type: 'file', - }, - ], - zip_size: 123, + code: 'ra_execute_success_done', + cwd: '/some/path', + output_file_id: 'some-output-file-id', + output_file_stderr_truncated: false, + output_file_stdout_truncated: true, + shell: 'bash', + shell_code: 0, + stderr: expect.any(String), + stderr_truncated: true, + stdout: expect.any(String), + stdout_truncated: true, }, type: 'json', }, @@ -262,6 +265,7 @@ describe('When using `getActionList()', () => { page: 1, pageSize: 10, commands: undefined, + agentTypes: undefined, userIds: undefined, startDate: undefined, elasticAgentIds: undefined, @@ -277,6 +281,7 @@ describe('When using `getActionList()', () => { 'agent-b': { name: 'Host-agent-b' }, 'agent-x': { name: '' }, }, + alertIds: undefined, command: 'kill-process', completedAt: undefined, wasSuccessful: false, @@ -289,6 +294,8 @@ describe('When using `getActionList()', () => { comment: doc?.EndpointActions.data.comment, createdBy: doc?.user.id, parameters: doc?.EndpointActions.data.parameters, + ruleId: undefined, + ruleName: undefined, agentState: { 'agent-a': { completedAt: '2022-04-30T16:08:47.449Z', @@ -309,7 +316,14 @@ describe('When using `getActionList()', () => { errors: undefined, }, }, - outputs: {}, + outputs: { + 'agent-a': { + content: { + code: 'ra_scan_success_done', + }, + type: 'json', + }, + }, }, ], total: 1, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.test.ts index 9fce2a5e609f3..858a1f53a10d6 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.test.ts @@ -261,6 +261,8 @@ describe('EndpointActionsClient', () => { execute: responseActionsClientMock.createExecuteOptions(getCommonResponseActionOptions()), upload: responseActionsClientMock.createUploadOptions(getCommonResponseActionOptions()), + + scan: responseActionsClientMock.createScanOptions(getCommonResponseActionOptions()), }; it.each(Object.keys(responseActionMethods) as ResponseActionsMethodsOnly[])( diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.ts index 96e77be833e3c..690dd6d84730c 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/endpoint/endpoint_actions_client.ts @@ -23,6 +23,7 @@ import type { ResponseActionGetFileRequestBody, UploadActionApiRequestBody, ResponseActionsRequestBody, + ScanActionRequestBody, } from '../../../../../../common/api/endpoint'; import { ResponseActionsClientImpl } from '../lib/base_response_actions_client'; import type { @@ -42,6 +43,8 @@ import type { LogsEndpointAction, EndpointActionDataParameterTypes, UploadedFileInfo, + ResponseActionsScanParameters, + ResponseActionScanOutputContent, } from '../../../../../../common/endpoint/types'; import type { CommonResponseActionMethodOptions, @@ -286,6 +289,16 @@ export class EndpointActionsClient extends ResponseActionsClientImpl { >('execute', actionRequestWithDefaults, options); } + async scan( + actionRequest: ScanActionRequestBody, + options: CommonResponseActionMethodOptions = {} + ): Promise> { + return this.handleResponseAction< + ScanActionRequestBody, + ActionDetails + >('scan', actionRequest, options); + } + async upload( actionRequest: UploadActionApiRequestBody, options: CommonResponseActionMethodOptions = {} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts index ddd2eef4aa65e..09180f97b72d6 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts @@ -40,9 +40,9 @@ import { } from '../../../../../../common/endpoint/constants'; import type { CommonResponseActionMethodOptions, + GetFileDownloadMethodResponse, ProcessPendingActionsMethodOptions, ResponseActionsClient, - GetFileDownloadMethodResponse, } from './types'; import type { ActionDetails, @@ -57,12 +57,14 @@ import type { ResponseActionGetFileOutputContent, ResponseActionGetFileParameters, ResponseActionParametersWithPidOrEntityId, + ResponseActionScanOutputContent, ResponseActionsExecuteParameters, + ResponseActionsScanParameters, ResponseActionUploadOutputContent, ResponseActionUploadParameters, SuspendProcessActionOutputContent, - WithAllKeys, UploadedFileInfo, + WithAllKeys, } from '../../../../../../common/endpoint/types'; import type { ExecuteActionRequestBody, @@ -70,6 +72,7 @@ import type { IsolationRouteRequestBody, ResponseActionGetFileRequestBody, ResponseActionsRequestBody, + ScanActionRequestBody, UploadActionApiRequestBody, } from '../../../../../../common/api/endpoint'; import { stringify } from '../../../../utils/stringify'; @@ -692,6 +695,13 @@ export abstract class ResponseActionsClientImpl implements ResponseActionsClient throw new ResponseActionsNotSupportedError('upload'); } + public async scan( + actionRequest: ScanActionRequestBody, + options?: CommonResponseActionMethodOptions + ): Promise> { + throw new ResponseActionsNotSupportedError('scan'); + } + public async processPendingActions(_: ProcessPendingActionsMethodOptions): Promise { this.log.debug(`#processPendingActions() method is not implemented for ${this.agentType}!`); } diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts index 9cc7f088c3840..fa20bc9ec6895 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/types.ts @@ -22,6 +22,8 @@ import type { EndpointActionData, LogsEndpointActionResponse, UploadedFileInfo, + ResponseActionScanOutputContent, + ResponseActionsScanParameters, } from '../../../../../../common/endpoint/types'; import type { IsolationRouteRequestBody, @@ -30,6 +32,7 @@ import type { ExecuteActionRequestBody, UploadActionApiRequestBody, BaseActionRequestBody, + ScanActionRequestBody, } from '../../../../../../common/api/endpoint'; type OmitUnsupportedAttributes = Omit< @@ -140,4 +143,14 @@ export interface ResponseActionsClient { * @param fileId */ getFileInfo(actionId: string, fileId: string): Promise; + + /** + * Scan a file path/folder + * @param actionRequest + * @param options + */ + scan: ( + actionRequest: OmitUnsupportedAttributes, + options?: CommonResponseActionMethodOptions + ) => Promise>; } diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts index c64b107b86761..e8b62fb014306 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts @@ -20,7 +20,9 @@ import type { TransportResult } from '@elastic/elasticsearch'; import type { AttachmentsSubClient } from '@kbn/cases-plugin/server/client/attachments/client'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; + import type { ResponseActionsClient } from '../..'; +import { NormalizedExternalConnectorClient } from '../..'; import type { KillOrSuspendProcessRequestBody } from '../../../../../common/endpoint/types'; import { BaseDataGenerator } from '../../../../../common/endpoint/data_generators/base_data_generator'; import { @@ -43,12 +45,11 @@ import { ACTION_RESPONSE_INDICES } from '../constants'; import type { ExecuteActionRequestBody, GetProcessesRequestBody, - ResponseActionGetFileRequestBody, IsolationRouteRequestBody, + ResponseActionGetFileRequestBody, UploadActionApiRequestBody, + ScanActionRequestBody, } from '../../../../../common/api/endpoint'; -import { NormalizedExternalConnectorClient } from '../..'; -import {} from '@kbn/utility-types-jest'; export interface ResponseActionsClientOptionsMock extends ResponseActionsClientOptions { esClient: ElasticsearchClientMock; @@ -68,6 +69,7 @@ const createResponseActionClientMock = (): jest.Mocked => processPendingActions: jest.fn().mockReturnValue(Promise.resolve()), getFileInfo: jest.fn().mockReturnValue(Promise.resolve()), getFileDownload: jest.fn().mockReturnValue(Promise.resolve()), + scan: jest.fn().mockReturnValue(Promise.resolve()), }; }; @@ -224,6 +226,18 @@ const createUploadOptionsMock = ( return merge(options, overrides); }; +const createScanOptionsMock = ( + overrides: Partial = {} +): ScanActionRequestBody => { + const options: ScanActionRequestBody = { + ...createNoParamsResponseActionOptionsMock(), + parameters: { + path: '/scan/folder', + }, + }; + return merge(options, overrides); +}; + const createConnectorMock = ( overrides: DeepPartial = {} ): ConnectorWithExtraFindData => { @@ -299,6 +313,7 @@ export const responseActionsClientMock = Object.freeze({ createGetFileOptions: createGetFileOptionsMock, createExecuteOptions: createExecuteOptionsMock, createUploadOptions: createUploadOptionsMock, + createScanOptions: createScanOptionsMock, createIndexedResponse: createEsIndexTransportResponseMock, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/fetch_action_responses.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/fetch_action_responses.test.ts index 5f84107a85135..8e759ac848910 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/fetch_action_responses.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/fetch_action_responses.test.ts @@ -26,15 +26,16 @@ describe('fetchActionResponses()', () => { await expect(fetchActionResponses({ esClient: esClientMock })).resolves.toEqual({ endpointResponses: [ { - '@timestamp': '2022-04-30T16:08:47.449Z', - action_data: { - command: 'get-file', - comment: '', - }, action_id: '123', agent_id: 'agent-a', completed_at: '2022-04-30T10:53:59.449Z', error: '', + '@timestamp': '2022-04-30T16:08:47.449Z', + action_data: { + command: 'execute', + comment: '', + parameter: undefined, + }, started_at: '2022-04-30T12:56:00.449Z', }, { @@ -43,38 +44,40 @@ describe('fetchActionResponses()', () => { action_id: '123', completed_at: '2022-04-30T10:53:59.449Z', data: { - command: 'get-file', + command: 'execute', comment: '', output: { content: { - code: 'ra_get-file_success_done', - contents: [ - { - file_name: 'bad_file.txt', - path: '/some/path/bad_file.txt', - sha256: '9558c5cb39622e9b3653203e772b129d6c634e7dbd7af1b244352fc1d704601f', - size: 1234, - type: 'file', - }, - ], - zip_size: 123, + code: 'ra_execute_success_done', + cwd: '/some/path', + output_file_id: 'some-output-file-id', + output_file_stderr_truncated: false, + output_file_stdout_truncated: true, + shell: 'bash', + shell_code: 0, + stderr: expect.any(String), + stderr_truncated: true, + stdout_truncated: true, + stdout: expect.any(String), }, type: 'json', }, }, - started_at: '2022-04-30T12:56:00.449Z', + started_at: '2022-04-30T13:56:00.449Z', }, agent: { id: 'agent-a', }, + error: undefined, }, ], fleetResponses: [ { '@timestamp': '2022-04-30T16:08:47.449Z', action_data: { - command: 'get-file', + command: 'execute', comment: '', + parameter: undefined, }, action_id: '123', agent_id: 'agent-a', @@ -88,30 +91,31 @@ describe('fetchActionResponses()', () => { action_id: '123', completed_at: '2022-04-30T10:53:59.449Z', data: { - command: 'get-file', + command: 'execute', comment: '', output: { content: { - code: 'ra_get-file_success_done', - contents: [ - { - file_name: 'bad_file.txt', - path: '/some/path/bad_file.txt', - sha256: '9558c5cb39622e9b3653203e772b129d6c634e7dbd7af1b244352fc1d704601f', - size: 1234, - type: 'file', - }, - ], - zip_size: 123, + code: 'ra_execute_success_done', + cwd: '/some/path', + output_file_id: 'some-output-file-id', + output_file_stderr_truncated: false, + output_file_stdout_truncated: true, + shell: 'bash', + shell_code: 0, + stderr_truncated: true, + stdout_truncated: true, + stderr: expect.any(String), + stdout: expect.any(String), }, type: 'json', }, }, - started_at: '2022-04-30T12:56:00.449Z', + started_at: '2022-04-30T13:56:00.449Z', }, agent: { id: 'agent-a', }, + error: undefined, }, ], }); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.test.ts index 59e99c91a1afd..69c66f90e4286 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.test.ts @@ -1036,20 +1036,24 @@ describe('When using Actions service utilities', () => { id: '90d62689-f72d-4a05-b5e3-500cad0dc366', agentType: 'endpoint', agents: ['6e6796b0-af39-4f12-b025-fcb06db499e5'], + alertIds: undefined, command: 'kill-process', comment: 'kill this one', completedAt: expect.any(String), startedAt: '2022-04-27T16:08:47.449Z', status: 'successful', wasSuccessful: true, - errors: undefined, createdBy: 'elastic', + errors: undefined, isCompleted: true, isExpired: false, parameters: undefined, + ruleId: undefined, + ruleName: undefined, agentState: { '6e6796b0-af39-4f12-b025-fcb06db499e5': { completedAt: expect.any(String), + errors: undefined, isCompleted: true, wasSuccessful: true, }, @@ -1062,17 +1066,17 @@ describe('When using Actions service utilities', () => { outputs: { '6e6796b0-af39-4f12-b025-fcb06db499e5': { content: { - code: 'ra_get-file_success_done', - contents: [ - { - file_name: 'bad_file.txt', - path: '/some/path/bad_file.txt', - sha256: '9558c5cb39622e9b3653203e772b129d6c634e7dbd7af1b244352fc1d704601f', - size: 1234, - type: 'file', - }, - ], - zip_size: 123, + code: 'ra_execute_success_done', + cwd: '/some/path', + output_file_id: 'some-output-file-id', + output_file_stderr_truncated: false, + output_file_stdout_truncated: true, + shell: 'bash', + shell_code: 0, + stderr: expect.any(String), + stderr_truncated: true, + stdout: expect.any(String), + stdout_truncated: true, }, type: 'json', }, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts b/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts index c367c3d1bd91a..52f6cd3671123 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts @@ -23,8 +23,7 @@ export const FEATURE_KEYS = { GET_FILE: 'Get file', UPLOAD: 'Upload file', EXECUTE: 'Execute command', - // TODO: for API changes in a subsequent PR - // SCAN: 'Scan files', + SCAN: 'Scan files', ALERTS_BY_PROCESS_ANCESTRY: 'Get related alerts by process ancestry', ENDPOINT_EXCEPTIONS: 'Endpoint exceptions', } as const; @@ -41,8 +40,7 @@ const RESPONSE_ACTIONS_FEATURE_KEY: Readonly Date: Mon, 3 Jun 2024 15:27:17 -0500 Subject: [PATCH 20/82] [Security Solution][Alert KPI] Fix leading wildcard in KPI visualizations (#182875) ## Summary Summary charts and tree map were not handling leading wildcards. This PR updated the query to reflect advanced settings. If leading wildcard is not selected, an error toast should appear. ![image](https://github.com/elastic/kibana/assets/18648970/c05c9ca4-2f33-4d84-9479-c09a6a81a6d5) Related: https://github.com/elastic/kibana/issues/182757 After: when leading wildcard is set to true: ![image](https://github.com/elastic/kibana/assets/18648970/38a57cbb-a818-410e-b73b-08b545be4725) ![image](https://github.com/elastic/kibana/assets/18648970/66d6647b-ef77-42c0-b431-fd99c4705b7e) --- .../common/components/alerts_treemap_panel/index.tsx | 9 +++++++-- .../use_summary_chart_data.test.tsx | 2 ++ .../use_summary_chart_data.tsx | 9 +++++++-- .../pages/detection_engine/detection_engine.test.tsx | 3 --- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx index 33e526932c3e6..176671fa33667 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx @@ -10,6 +10,7 @@ import type { EuiComboBox } from '@elastic/eui'; import { EuiProgress } from '@elastic/eui'; import type { Filter, Query } from '@kbn/es-query'; import { buildEsQuery } from '@kbn/es-query'; +import { getEsQueryConfig } from '@kbn/data-plugin/common'; import React, { useEffect, useMemo } from 'react'; import { v4 as uuidv4 } from 'uuid'; @@ -24,6 +25,7 @@ import { HeaderSection } from '../header_section'; import { InspectButtonContainer } from '../inspect'; import { DEFAULT_STACK_BY_FIELD0_SIZE, getAlertsRiskQuery } from '../alerts_treemap/query'; import type { AlertsTreeMapAggregation } from '../alerts_treemap/types'; +import { useKibana } from '../../lib/kibana'; const DEFAULT_HEIGHT = DEFAULT_MIN_CHART_HEIGHT + 134; // px @@ -81,23 +83,26 @@ const AlertsTreemapPanelComponent: React.FC = ({ title, }: Props) => { const { to, from, deleteQuery, setQuery } = useGlobalTime(); + const { uiSettings } = useKibana().services; // create a unique, but stable (across re-renders) query id const uniqueQueryId = useMemo(() => `${ALERTS_TREEMAP_ID}-${uuidv4()}`, []); const additionalFilters = useMemo(() => { try { + const config = getEsQueryConfig(uiSettings); return [ buildEsQuery( undefined, query != null ? [query] : [], - filters?.filter((f) => f.meta.disabled === false) ?? [] + filters?.filter((f) => f.meta.disabled === false) ?? [], + config ), ]; } catch (e) { return []; } - }, [query, filters]); + }, [query, filters, uiSettings]); const { data: alertsData, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx index f25e4d9803c8b..7719fd47ea606 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx @@ -25,6 +25,8 @@ const dateNow = new Date(to).valueOf(); const mockDateNow = jest.fn().mockReturnValue(dateNow); Date.now = jest.fn(() => mockDateNow()) as unknown as DateConstructor['now']; +jest.mock('../../../../common/lib/kibana'); + const defaultUseQueryAlertsReturn = { loading: false, data: null, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.tsx index e8d0ddd061e81..db4f1881448f9 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.tsx @@ -9,7 +9,9 @@ import { useEffect, useState, useMemo, useCallback } from 'react'; import { buildEsQuery } from '@kbn/es-query'; import type { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/types'; import type { Filter, Query } from '@kbn/es-query'; +import { getEsQueryConfig } from '@kbn/data-plugin/common'; import type { SummaryChartsAgg, SummaryChartsData } from './types'; +import { useKibana } from '../../../../common/lib/kibana'; import type { EntityFilter } from '../../../../overview/components/detection_response/alerts_by_status/use_alerts_by_status'; import type { ESBoolQuery } from '../../../../../common/typed_json'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; @@ -86,19 +88,22 @@ export const useSummaryChartData: UseAlerts = ({ const [updatedAt, setUpdatedAt] = useState(Date.now()); const [items, setItems] = useState([]); + const { uiSettings } = useKibana().services; const additionalFilters = useMemo(() => { try { + const config = getEsQueryConfig(uiSettings); return [ buildEsQuery( undefined, query != null ? [query] : [], - filters?.filter((f) => f.meta.disabled === false) ?? [] + filters?.filter((f) => f.meta.disabled === false) ?? [], + config ), ]; } catch (e) { return []; } - }, [query, filters]); + }, [query, filters, uiSettings]); const { data, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx index f7907eaf1099c..d7e16697ce250 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx @@ -111,9 +111,6 @@ jest.mock('../../../common/lib/kibana', () => { cases: { ui: { getCasesContext: mockCasesContext }, }, - uiSettings: { - get: jest.fn(), - }, timelines: { ...mockTimelines }, data: { query: { From ce9774151da5683075099f182dec3bd08b7e4b26 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 3 Jun 2024 21:29:53 +0100 Subject: [PATCH 21/82] skip flaky suite (#181884) --- test/functional/apps/visualize/group2/_heatmap_chart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/apps/visualize/group2/_heatmap_chart.ts b/test/functional/apps/visualize/group2/_heatmap_chart.ts index 2f9ecc5a89d06..09439635ebc5e 100644 --- a/test/functional/apps/visualize/group2/_heatmap_chart.ts +++ b/test/functional/apps/visualize/group2/_heatmap_chart.ts @@ -16,7 +16,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['visualize', 'visEditor', 'visChart', 'timePicker']); // FLAKY: https://github.com/elastic/kibana/issues/181884 - describe('heatmap chart', function indexPatternCreation() { + describe.skip('heatmap chart', function indexPatternCreation() { const vizName1 = 'Visualization HeatmapChart'; let isNewChartsLibraryEnabled = false; From 74ae374c4928802e139cece6e710a97139d4812a Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 3 Jun 2024 14:08:39 -0700 Subject: [PATCH 22/82] [HTTP/OAS] Add Fleet API descriptions (#184613) --- x-pack/plugins/fleet/server/routes/agent_policy/index.ts | 8 ++++++++ x-pack/plugins/fleet/server/routes/app/index.ts | 2 ++ x-pack/plugins/fleet/server/routes/epm/index.ts | 5 +++++ x-pack/plugins/fleet/server/routes/health_check/index.ts | 1 + x-pack/plugins/fleet/server/routes/settings/index.ts | 3 +++ x-pack/plugins/fleet/server/routes/setup/index.ts | 1 + 6 files changed, 20 insertions(+) diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/index.ts b/x-pack/plugins/fleet/server/routes/agent_policy/index.ts index 9b45342f730cd..66e84cf4a76fe 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/index.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/index.ts @@ -47,6 +47,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { // Allow to retrieve agent policies metadata (no full) for user with only read agents permissions return authz.fleet.readAgentPolicies || authz.fleet.readAgents; }, + description: `Get agent policies`, }) .addVersion( { @@ -80,6 +81,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { // Allow to retrieve agent policies metadata (no full) for user with only read agents permissions return authz.fleet.readAgentPolicies || authz.fleet.readAgents; }, + description: `Get an agent policy by ID`, }) .addVersion( { @@ -96,6 +98,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgentPolicies: true }, }, + description: `Create an agent policy`, }) .addVersion( { @@ -112,6 +115,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgentPolicies: true }, }, + description: `Update an agent policy by ID`, }) .addVersion( { @@ -128,6 +132,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgentPolicies: true }, }, + description: `Copy an agent policy by ID`, }) .addVersion( { @@ -160,6 +165,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { readAgentPolicies: true }, }, + description: `Get a full agent policy by ID`, }) .addVersion( { @@ -177,6 +183,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleet: { readAgentPolicies: true }, }, enableQueryVersion: true, + description: `Download an agent policy by ID`, }) .addVersion( { @@ -193,6 +200,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { readAgentPolicies: true }, }, + description: `Get full K8s agent manifest`, }) .addVersion( { diff --git a/x-pack/plugins/fleet/server/routes/app/index.ts b/x-pack/plugins/fleet/server/routes/app/index.ts index 262bdc867df35..71f528454f29b 100644 --- a/x-pack/plugins/fleet/server/routes/app/index.ts +++ b/x-pack/plugins/fleet/server/routes/app/index.ts @@ -158,6 +158,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgents: true }, }, + description: `Create a service token`, }) .addVersion( { @@ -175,6 +176,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgents: true }, }, + description: `Create a service token`, }) .addVersion( { diff --git a/x-pack/plugins/fleet/server/routes/epm/index.ts b/x-pack/plugins/fleet/server/routes/epm/index.ts index 9108ab1df32df..3b7260c79aa7f 100644 --- a/x-pack/plugins/fleet/server/routes/epm/index.ts +++ b/x-pack/plugins/fleet/server/routes/epm/index.ts @@ -86,6 +86,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { .get({ path: EPM_API_ROUTES.CATEGORIES_PATTERN, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, + description: `Get package categories`, }) .addVersion( { @@ -99,6 +100,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { .get({ path: EPM_API_ROUTES.LIST_PATTERN, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, + description: `Get list of packages`, }) .addVersion( { @@ -125,6 +127,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { .get({ path: EPM_API_ROUTES.LIMITED_LIST_PATTERN, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, + description: `Get limited package list`, }) .addVersion( { @@ -287,6 +290,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { .get({ path: EPM_API_ROUTES.VERIFICATION_KEY_ID, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, + description: `Get a package signature verification key ID`, }) .addVersion( { @@ -313,6 +317,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { .post({ path: EPM_API_ROUTES.BULK_ASSETS_PATTERN, fleetAuthz: READ_PACKAGE_INFO_AUTHZ, + description: `Get bulk assets`, }) .addVersion( { diff --git a/x-pack/plugins/fleet/server/routes/health_check/index.ts b/x-pack/plugins/fleet/server/routes/health_check/index.ts index 44f26e2a66167..7f30d7f92a859 100644 --- a/x-pack/plugins/fleet/server/routes/health_check/index.ts +++ b/x-pack/plugins/fleet/server/routes/health_check/index.ts @@ -25,6 +25,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { all: true }, }, + description: `Check Fleet Server health`, }) .addVersion( { diff --git a/x-pack/plugins/fleet/server/routes/settings/index.ts b/x-pack/plugins/fleet/server/routes/settings/index.ts index 083839cef2e11..6a814eae0f801 100644 --- a/x-pack/plugins/fleet/server/routes/settings/index.ts +++ b/x-pack/plugins/fleet/server/routes/settings/index.ts @@ -78,6 +78,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { readSettings: true }, }, + description: `Get settings`, }) .addVersion( { @@ -92,6 +93,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allSettings: true }, }, + description: `Update settings`, }) .addVersion( { @@ -106,6 +108,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: (authz) => { return authz.fleet.addAgents || authz.fleet.addFleetServers; }, + description: `Get enrollment settings`, }) .addVersion( { diff --git a/x-pack/plugins/fleet/server/routes/setup/index.ts b/x-pack/plugins/fleet/server/routes/setup/index.ts index f09ff70e145aa..7052aacfc329d 100644 --- a/x-pack/plugins/fleet/server/routes/setup/index.ts +++ b/x-pack/plugins/fleet/server/routes/setup/index.ts @@ -21,6 +21,7 @@ export const registerFleetSetupRoute = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { setup: true }, }, + description: `Initiate Fleet setup`, }) .addVersion( { From d5f2c13e5512de1d65d0cec262e028914a942713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Mon, 3 Jun 2024 23:23:43 +0200 Subject: [PATCH 23/82] [Search] Add last_seen status for the connector (#184653) ## Summary - Adds error message when connector `last_seen` is less than 30 mins. - Makes status consistent in between indices and connectors lists. Screenshot 2024-06-03 at 15 33 54 Screenshot 2024-06-03 at 15 33 59 Screenshot 2024-06-03 at 15 34 06 Still showing banners if `last_seen` is recent Screenshot 2024-06-03 at 15 34 49 ### 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) - [ ] [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 - [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) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../connector_configuration.tsx | 27 ++++++++++--------- .../connector_detail/connector_view_logic.ts | 16 ++++++----- .../utils/connector_status_helpers.ts | 21 ++++++++++++++- 3 files changed, 44 insertions(+), 20 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 acbfee25ae73b..70c5c46902b69 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 @@ -41,6 +41,7 @@ import { LicensingLogic } from '../../../shared/licensing'; import { EuiButtonTo, EuiLinkTo } from '../../../shared/react_router_helpers'; import { GenerateConnectorApiKeyApiLogic } from '../../api/connector/generate_connector_api_key_api_logic'; import { CONNECTOR_DETAIL_TAB_PATH } from '../../routes'; +import { isLastSeenOld } from '../../utils/connector_status_helpers'; import { isAdvancedSyncRuleSnippetEmpty } from '../../utils/sync_rules_helpers'; import { ApiKeyConfig } from '../search_index/connector/api_key_configuration'; @@ -282,18 +283,20 @@ export const ConnectorConfiguration: React.FC = () => { ) : ( - + !isLastSeenOld(connector) && ( + + ) )} {connector.status && diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts index 69049a2709f58..8c85969915523 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_view_logic.ts @@ -33,6 +33,7 @@ import { hasDocumentLevelSecurityFeature, hasIncrementalSyncFeature, } from '../../utils/connector_helpers'; +import { getConnectorLastSeenError, isLastSeenOld } from '../../utils/connector_status_helpers'; import { ConnectorNameAndDescriptionLogic, @@ -57,7 +58,6 @@ export interface ConnectorViewActions { } export interface ConnectorViewValues { - updateConnectorConfigurationStatus: Status; connector: Connector | undefined; connectorData: CachedFetchConnectorByIdApiLogicValues['connectorData']; connectorError: string | undefined; @@ -84,6 +84,7 @@ export interface ConnectorViewValues { pipelineData: IngestPipelineParams | undefined; recheckIndexLoading: boolean; syncTriggeredLocally: boolean; // holds local value after update so UI updates correctly + updateConnectorConfigurationStatus: Status; } export const ConnectorViewLogic = kea>({ @@ -170,14 +171,9 @@ export const ConnectorViewLogic = kea [selectors.connector], - (connector: Connector | undefined) => { - return connector?.index_name || undefined; - }, - ], hasAdvancedFilteringFeature: [ () => [selectors.connector], (connector?: Connector) => @@ -211,6 +207,12 @@ export const ConnectorViewLogic = kea connector?.configuration.extract_full_html?.value ?? undefined, ], + indexName: [ + () => [selectors.connector], + (connector: Connector | undefined) => { + return connector?.index_name || undefined; + }, + ], isLoading: [ () => [selectors.fetchConnectorApiStatus, selectors.fetchIndexApiStatus, selectors.index], ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts index 587539498c786..52d59ae81ccef 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts @@ -5,9 +5,27 @@ * 2.0. */ +import moment from 'moment'; + import { i18n } from '@kbn/i18n'; import { Connector, ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; +export const isLastSeenOld = (connector: Connector): boolean => + connector.last_seen + ? moment(connector.last_seen).isBefore(moment().subtract(30, 'minutes')) + : false; + +export const getConnectorLastSeenError = (connector: Connector): string => { + return i18n.translate( + 'xpack.enterpriseSearch.content.searchIndices.connectorStatus.lastSeenError.label', + { + defaultMessage: + 'Your connector has not checked in for over 30 minutes. (last_seen: {lastSeen})', + values: { lastSeen: connector.last_seen }, + } + ); +}; + const incompleteText = i18n.translate( 'xpack.enterpriseSearch.content.searchIndices.ingestionStatus.incomplete.label', { defaultMessage: 'Incomplete' } @@ -35,7 +53,7 @@ export function connectorStatusToText(connector: Connector): string { { defaultMessage: 'Sync Failure' } ); } - if (connectorStatus === ConnectorStatus.ERROR) { + if (isLastSeenOld(connector) || connectorStatus === ConnectorStatus.ERROR) { return i18n.translate( 'xpack.enterpriseSearch.content.searchIndices.connectorStatus.connectorFailure.label', { defaultMessage: 'Connector Failure' } @@ -67,6 +85,7 @@ export function connectorStatusToColor(connector: Connector): 'warning' | 'dange return 'warning'; } if ( + isLastSeenOld(connector) || connectorStatus === ConnectorStatus.ERROR || connector.error === SyncStatus.ERROR || connector.last_sync_error !== null || From bb9aa8df314579e8e865555eb204c672589eea8c Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Mon, 3 Jun 2024 17:12:49 -0500 Subject: [PATCH 24/82] [Security Solution] - remove alertsPageFiltersEnabled feature flag (#184486) --- .../common/experimental_features.ts | 5 - .../detection_engine/detection_engine.tsx | 122 ++++-------------- 2 files changed, 23 insertions(+), 104 deletions(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 04f18af241849..a3248bc4374ba 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -125,11 +125,6 @@ export const allowedExperimentalValues = Object.freeze({ expandableTimelineFlyoutEnabled: true, /* - /** - * Enables new Set of filters on the Alerts page. - */ - alertsPageFiltersEnabled: true, - /** * Enables the Assistant Model Evaluation advanced setting and API endpoint, introduced in `8.11.0`. */ diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx index 767ac31b025ea..284c9451c3e85 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx @@ -38,7 +38,6 @@ import { FilterByAssigneesPopover } from '../../../common/components/filter_by_a import type { AssigneesIdsSelection } from '../../../common/components/assignees/types'; import { ALERTS_TABLE_REGISTRY_CONFIG_IDS } from '../../../../common/constants'; import { useDataTableFilters } from '../../../common/hooks/use_data_table_filters'; -import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; import { InputsModelId } from '../../../common/store/inputs/constants'; import { useDeepEqualSelector, useShallowEqualSelector } from '../../../common/hooks/use_selector'; import { SecurityPageName } from '../../../app/types'; @@ -68,7 +67,6 @@ import { } from '../../../timelines/components/timeline/helpers'; import { buildAlertAssigneesFilter, - buildAlertStatusFilter, buildShowBuildingBlockFilter, buildThreatMatchFilter, } from '../../components/alerts_table/default_config'; @@ -84,7 +82,6 @@ import { NoPrivileges } from '../../../common/components/no_privileges'; import { HeaderPage } from '../../../common/components/header_page'; import { EmptyPrompt } from '../../../common/components/empty_prompt'; import type { Status } from '../../../../common/api/detection_engine'; -import { AlertsTableFilterGroup } from '../../components/alerts_table/alerts_filter_group'; import { GroupedAlertsTable } from '../../components/alerts_table/alerts_grouping'; import { AlertsTableComponent } from '../../components/alerts_table'; import type { AddFilterProps } from '../../components/alerts_kpis/common/types'; @@ -100,10 +97,7 @@ const StyledFullHeightContainer = styled.div` type DetectionEngineComponentProps = PropsFromRedux; -const DetectionEnginePageComponent: React.FC = ({ - clearEventsLoading, - clearEventsDeleted, -}) => { +const DetectionEnginePageComponent: React.FC = () => { const dispatch = useDispatch(); const containerElement = useRef(null); const getTable = useMemo(() => dataTableSelectors.getTableByIdSelector(), []); @@ -150,16 +144,7 @@ const DetectionEnginePageComponent: React.FC = ({ [assignees] ); - const arePageFiltersEnabled = useIsExperimentalFeatureEnabled('alertsPageFiltersEnabled'); - - // when arePageFiltersEnabled === false const [statusFilter, setStatusFilter] = useState([]); - - const updatedAt = useShallowEqualSelector( - (state) => (getTable(state, TableId.alertsOnAlertsPage) ?? tableDefaults).updated - ); - - // when arePageFiltersEnabled === true const [detectionPageFilters, setDetectionPageFilters] = useState(); const [detectionPageFilterHandler, setDetectionPageFilterHandler] = useState< FilterGroupHandler | undefined @@ -181,7 +166,6 @@ const DetectionEnginePageComponent: React.FC = ({ const loading = userInfoLoading || listsConfigLoading; const { application: { navigateToUrl }, - timelines: timelinesUi, data, } = useKibana().services; @@ -196,13 +180,6 @@ const DetectionEnginePageComponent: React.FC = ({ ]; }, [assignees, showBuildingBlockAlerts, showOnlyThreatIndicatorAlerts, filters]); - const alertPageFilters = useMemo(() => { - if (arePageFiltersEnabled) { - return detectionPageFilters; - } - return buildAlertStatusFilter(statusFilter[0] ?? 'open'); - }, [statusFilter, detectionPageFilters, arePageFiltersEnabled]); - useEffect(() => { if (!detectionPageFilterHandler) return; // if Alert is reloaded because of action by the user. @@ -254,8 +231,8 @@ const DetectionEnginePageComponent: React.FC = ({ ); const alertsDefaultFilters = useMemo( - () => [...topLevelFilters, ...(alertPageFilters ?? [])], - [topLevelFilters, alertPageFilters] + () => [...topLevelFilters, ...(detectionPageFilters ?? [])], + [topLevelFilters, detectionPageFilters] ); // AlertsTable manages global filters itself, so not including `filters` @@ -263,10 +240,10 @@ const DetectionEnginePageComponent: React.FC = ({ () => [ ...buildShowBuildingBlockFilter(showBuildingBlockAlerts), ...buildThreatMatchFilter(showOnlyThreatIndicatorAlerts), - ...(alertPageFilters ?? []), + ...(detectionPageFilters ?? []), ...buildAlertAssigneesFilter(assignees), ], - [assignees, showBuildingBlockAlerts, showOnlyThreatIndicatorAlerts, alertPageFilters] + [assignees, showBuildingBlockAlerts, showOnlyThreatIndicatorAlerts, detectionPageFilters] ); const { signalIndexNeedsInit, pollForSignalIndex } = useSignalHelpers(); @@ -310,24 +287,11 @@ const DetectionEnginePageComponent: React.FC = ({ } }, []); - // Callback for when open/closed filter changes - const onFilterGroupChangedCallback = useCallback( - (newFilterGroup: Status) => { - const timelineId = TableId.alertsOnAlertsPage; - clearEventsLoading({ id: timelineId }); - clearEventsDeleted({ id: timelineId }); - setStatusFilter([newFilterGroup]); - }, - [clearEventsLoading, clearEventsDeleted, setStatusFilter] + const areDetectionPageFiltersLoading = useMemo( + () => !Array.isArray(detectionPageFilters), + [detectionPageFilters] ); - const areDetectionPageFiltersLoading = useMemo(() => { - if (arePageFiltersEnabled) { - return !Array.isArray(detectionPageFilters); - } - return false; - }, [detectionPageFilters, arePageFiltersEnabled]); - const isAlertTableLoading = useMemo( () => loading || areDetectionPageFiltersLoading, [loading, areDetectionPageFiltersLoading] @@ -338,62 +302,22 @@ const DetectionEnginePageComponent: React.FC = ({ [isLoadingIndexPattern, areDetectionPageFiltersLoading] ); - const showUpdating = useMemo( - () => isAlertTableLoading || loading, - [isAlertTableLoading, loading] - ); - const AlertPageFilters = useMemo( - () => - !arePageFiltersEnabled ? ( - - - - - - - - - {updatedAt && - timelinesUi.getLastUpdated({ - updatedAt: updatedAt || Date.now(), - showUpdating, - })} - - - - - ) : ( - - ), - [ - arePageFiltersEnabled, - from, - indexPattern, - onFilterControlsChange, - onFilterGroupChangedCallback, - query, - showUpdating, - statusFilter, - timelinesUi, - to, - topLevelFilters, - updatedAt, - ] + () => ( + + ), + [from, indexPattern, onFilterControlsChange, query, to, topLevelFilters] ); const renderAlertTable = useCallback( From 03639a2b3de381ea770aad807146c513762971f4 Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Mon, 3 Jun 2024 16:41:16 -0600 Subject: [PATCH 25/82] [Global Search] Fix cmd + click open in new tab for results (#183762) ## Summary Closes https://github.com/elastic/kibana/issues/147710 This PR follows the pattern set up in https://github.com/elastic/kibana/blob/main/x-pack/plugins/spaces/public/nav_control/components/spaces_menu.tsx#L164-L170 to allow the cmd click behavior to work for kibana global search. I'm exploring contributing to the EUI repository in this https://github.com/elastic/eui/pull/7788 but that avenue may not be fruitful. This implementation is already being used in spaces and can immediately provide value for global search with this PR merge. --- .../public/components/search_bar.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index 53f749fc3f7ad..04e519a83b534 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -18,6 +18,7 @@ import { euiSelectableTemplateSitewideRenderOptions, useEuiTheme, } from '@elastic/eui'; +import { EuiSelectableOnChangeEvent } from '@elastic/eui/src/components/selectable/selectable'; import { css } from '@emotion/react'; import type { GlobalSearchFindParams, GlobalSearchResult } from '@kbn/global-search-plugin/public'; import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; @@ -198,7 +199,7 @@ export const SearchBar: FC = (opts) => { ); const onChange = useCallback( - (selection: EuiSelectableTemplateSitewideOption[]) => { + (selection: EuiSelectableTemplateSitewideOption[], event: EuiSelectableOnChangeEvent) => { let selectedRank: number | null = null; const selected = selection.find(({ checked }, rank) => { const isChecked = checked === 'on'; @@ -249,7 +250,13 @@ export const SearchBar: FC = (opts) => { console.log('Error trying to track searchbar metrics', err); } - navigateToUrl(url); + if (event.shiftKey) { + window.open(url); + } else if (event.ctrlKey || event.metaKey) { + window.open(url, '_blank'); + } else { + navigateToUrl(url); + } (document.activeElement as HTMLElement).blur(); if (searchRef) { From 79e51d64f83da6af56107a633a5a3b49947f1ebe Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 4 Jun 2024 00:36:47 +0100 Subject: [PATCH 26/82] skip flaky suite (#184438) --- .../observability/dataset_quality/dataset_quality_flyout.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 a79c93f922a33..a88c3881a4746 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 @@ -473,7 +473,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Until then, the below describe block is added to cover the tests for the // newly added degraded Fields Table. This must be merged under the above // describe block once the tech debt is fixed. - describe('Dataset quality flyout with degraded fields', () => { + // + // FLAKY: https://github.com/elastic/kibana/issues/184438 + describe.skip('Dataset quality flyout with degraded fields', () => { const goodDatasetName = 'good'; const degradedDatasetName = 'degraded'; const today = new Date().toISOString(); From 652236e2ec9e0cc76813b82b7f16329ae4cdd4f8 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:58:00 -0400 Subject: [PATCH 27/82] [api-docs] 2024-06-04 Daily api_docs build (#184709) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/727 --- api_docs/actions.mdx | 2 +- 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.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/assets_data_access.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.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.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.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.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 | 4 +- 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_comparators.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.devdocs.json | 12 +- api_docs/kbn_core_http_server.mdx | 2 +- ...kbn_core_http_server_internal.devdocs.json | 16 +- api_docs/kbn_core_http_server_internal.mdx | 4 +- .../kbn_core_http_server_mocks.devdocs.json | 4 +- 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 +- ..._core_logging_common_internal.devdocs.json | 39 ++ api_docs/kbn_core_logging_common_internal.mdx | 4 +- 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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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 | 4 +- 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_entities_schema.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.mdx | 2 +- 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_grouping.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 | 4 +- 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 +- ..._padded_alert_time_range_util.devdocs.json | 40 +- ...ility_get_padded_alert_time_range_util.mdx | 4 +- 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 +- api_docs/kbn_presentation_publishing.mdx | 2 +- 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_hooks.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 | 4 +- api_docs/kbn_search_connectors.devdocs.json | 22 +- api_docs/kbn_search_connectors.mdx | 6 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 4 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.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_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.devdocs.json | 132 +++- api_docs/kbn_server_http_tools.mdx | 7 +- 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 | 4 +- 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_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_try_in_console.mdx | 4 +- 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.devdocs.json | 35 +- api_docs/kbn_unified_data_table.mdx | 4 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.devdocs.json | 569 +++++++++++++++++- api_docs/kbn_unified_field_list.mdx | 4 +- 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_data_access.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.devdocs.json | 19 +- api_docs/navigation.mdx | 4 +- 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 | 42 +- 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 | 4 +- api_docs/search_notebooks.mdx | 4 +- api_docs/search_playground.mdx | 4 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 18 +- api_docs/security_solution.mdx | 2 +- 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 | 4 +- 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 +- 703 files changed, 1566 insertions(+), 807 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 5ea59e2679e76..028c3f5826ee6 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index dbc64e3efc72f..33f2f684d461f 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-06-03 +date: 2024-06-04 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 55384a4db2d9f..9ac7c7a38dced 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-06-03 +date: 2024-06-04 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 77278a32d0924..57b2a4f7cf82c 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-06-03 +date: 2024-06-04 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 1f68650e7799a..93302dd1b5891 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index c51bc2d808f43..559d9b3ea0b68 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-06-03 +date: 2024-06-04 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 222e730f31998..a14e26b1d3778 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-06-03 +date: 2024-06-04 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 83e9593f6e6bc..565acd62fe824 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 3dbb6016fb488..ad458c0282c25 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 62f40d496161d..aa12c1ea03a77 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-06-03 +date: 2024-06-04 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 ff1abccb55b75..a0883535cf3be 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-06-03 +date: 2024-06-04 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 42ab3dcf3d7c0..45db093ed6f7a 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-06-03 +date: 2024-06-04 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 7fdcb763b5238..994e8035b21fd 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-06-03 +date: 2024-06-04 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 be1e86d43620e..dc67650af4d31 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-06-03 +date: 2024-06-04 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 f7312692738ca..ceecacd199c28 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-06-03 +date: 2024-06-04 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 abd14c852f257..ddf0863ee5169 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-06-03 +date: 2024-06-04 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 453deaa6ad560..468c3536775a3 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-06-03 +date: 2024-06-04 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 1b61ecb3a833f..306bc458e742e 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-06-03 +date: 2024-06-04 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 5b2c9d5e126f9..c0d66f0018664 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-06-03 +date: 2024-06-04 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 4f5308eb2d1c2..160913a1192dd 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-06-03 +date: 2024-06-04 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 5edb55cad4735..58cf70a7fbd6c 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-06-03 +date: 2024-06-04 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 33a360ca75c8d..f8492dc8f3ae5 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-06-03 +date: 2024-06-04 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 3be178a36d13f..14bf9269367cc 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index bec012641abb3..760c47d576b77 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-06-03 +date: 2024-06-04 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 cbb8f7f80a150..78d3130f27e61 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-06-03 +date: 2024-06-04 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 51673a5271061..eed40154c8d05 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 2008ff401b98f..61c608068b0db 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index be470e1bfeeb4..1d6042c2856ee 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-06-03 +date: 2024-06-04 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 4d56736aabfb9..5216d6189d5d4 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-06-03 +date: 2024-06-04 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 d950cf1d1094b..1eefbfb4492d7 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-06-03 +date: 2024-06-04 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 6ca55b004d8b9..ff4e26cd53f5b 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-06-03 +date: 2024-06-04 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 0162d54f6c863..d412ee1bedbcf 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-06-03 +date: 2024-06-04 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 81e04c1d556df..527363d613424 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-06-03 +date: 2024-06-04 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 11d87c9a433e8..21fa8a1031faf 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-06-03 +date: 2024-06-04 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 3405faaa01bdb..6bd5dab529f2f 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-06-03 +date: 2024-06-04 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 db947d358525c..33c7093cad04a 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 036ec5bb09be8..9e94db37eea2e 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 7083466e08496..a89b3fe8fe5f5 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 9ece680f06dd5..c060929daea96 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 50b7061963525..76647f3fbc66f 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index aa9378edd043b..dcdcca0208b67 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index a1ecfb5d5e7f1..59e5502571071 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 3728210142263..e9ab1f3be3a14 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-06-03 +date: 2024-06-04 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 ae77307e4c288..ca12d6bde7837 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-06-03 +date: 2024-06-04 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 6c75d9f99bae8..f9e5f34c82299 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-06-03 +date: 2024-06-04 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 72b6b85bc79b5..d9293a0204d84 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-06-03 +date: 2024-06-04 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 bf956b94ad9da..14d1b7d3f9c21 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-06-03 +date: 2024-06-04 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 cbebf36d4fe60..0b5c68ff50098 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; Adds dashboards for discovering and managing Enterprise Search products. -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 942428e509bf0..71a9645efda5c 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-06-03 +date: 2024-06-04 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 4bd7e1c765b3f..b3a6dc929c5ec 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-06-03 +date: 2024-06-04 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 30bc4b3014fde..bad94c0124410 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-06-03 +date: 2024-06-04 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 0b2807f9f6aae..ab90734e44a87 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-06-03 +date: 2024-06-04 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 9a18bfe813e79..423ebb61cf3ac 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-06-03 +date: 2024-06-04 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 62220675fd5b1..d125060d8ce8d 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-06-03 +date: 2024-06-04 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 366251b225f6f..de337d8bee6fd 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-06-03 +date: 2024-06-04 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 421c058434f2d..dbcd862e445f8 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-06-03 +date: 2024-06-04 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 f10a73b289924..9c953bef505a1 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-06-03 +date: 2024-06-04 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 2f3687c26d7b2..cb77bad5bd893 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-06-03 +date: 2024-06-04 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 ea102fdbcebe7..850fa5fa805f1 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-06-03 +date: 2024-06-04 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 9ba2fe4791664..c60fb93ea73b5 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-06-03 +date: 2024-06-04 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 3f69ade1aaae3..2a6fc980df565 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-06-03 +date: 2024-06-04 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 64713f882a4a6..098fb08094b90 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-06-03 +date: 2024-06-04 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 6493bea2bacb8..069657a7bcdcd 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-06-03 +date: 2024-06-04 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 ca85f53607f22..b35fed2c4c456 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-06-03 +date: 2024-06-04 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 0737ac3a98cb1..e1225e91b7880 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-06-03 +date: 2024-06-04 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 14b178520a338..19cc4f6d04f3c 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-06-03 +date: 2024-06-04 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 a6f751610985e..2e156f5930bb7 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-06-03 +date: 2024-06-04 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 eb98203dbfce3..36fc161efdadf 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-06-03 +date: 2024-06-04 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 48d9ffe7dcd65..c7c65c5c383be 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-06-03 +date: 2024-06-04 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 d5b4362f44750..bb894cc556b78 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-06-03 +date: 2024-06-04 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 f51293a7f4512..639a4cb36e0b2 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-06-03 +date: 2024-06-04 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 c9b43e078c5a5..bcc4e2bd3a68e 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-06-03 +date: 2024-06-04 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 8cd86fef31682..de2da8b4dd96f 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-06-03 +date: 2024-06-04 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 dd7a4b3641f40..ca8e1abe471ce 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-06-03 +date: 2024-06-04 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 745779397e2e5..882821661629e 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-06-03 +date: 2024-06-04 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 7493895d8294c..3fd16f60f7b94 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-06-03 +date: 2024-06-04 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 d229339e23d01..c00eb5720ac4b 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-06-03 +date: 2024-06-04 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 31a79a326fe99..20349438903de 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-06-03 +date: 2024-06-04 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 b50b64b7908db..616390e6c685c 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-06-03 +date: 2024-06-04 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 c3f05f7e3bb3a..5d6363ab77317 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-06-03 +date: 2024-06-04 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 ca98988b840f8..d43cfe447afb1 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-06-03 +date: 2024-06-04 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 7193d6b32785f..542a795eea5e3 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-06-03 +date: 2024-06-04 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 8a1a119fb5329..fda41793da726 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-06-03 +date: 2024-06-04 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 8e9dfa9e6a726..7c49d66d9c8c7 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-06-03 +date: 2024-06-04 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 595d6297a547c..967ad868d6a9d 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-06-03 +date: 2024-06-04 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 797c17e9db621..464a7d9bfcb31 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-06-03 +date: 2024-06-04 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 49eed9b56b5c7..ea659d0937c67 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-06-03 +date: 2024-06-04 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 fc2f2f4c4a6e7..495ed8bcfbf5b 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-06-03 +date: 2024-06-04 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 30480871a5110..ab878f2d36145 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-06-03 +date: 2024-06-04 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index fe782fb234843..a7a540e87ffc6 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 7560d01bb8f15..1be15045e1fcd 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-06-03 +date: 2024-06-04 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 47154cedfa059..94d65b7a59804 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-06-03 +date: 2024-06-04 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 59300bec67357..4da94dbc6109d 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-06-03 +date: 2024-06-04 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 ae912dbcec551..335df80c02b50 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-06-03 +date: 2024-06-04 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 6d8197fc47a68..1cd026b13a275 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-06-03 +date: 2024-06-04 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 30e1f0eacf2d4..faa75fd800077 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-06-03 +date: 2024-06-04 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 4508ec53cb3b1..29b8ccd064971 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-06-03 +date: 2024-06-04 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 759f312406a9f..93406bdb49d0c 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-06-03 +date: 2024-06-04 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 788f7eb67221f..953cc1eb6c347 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-06-03 +date: 2024-06-04 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 d74add16f4c48..07c5d27e9d130 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-06-03 +date: 2024-06-04 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 acbcf70ec4856..5b000681cea53 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-06-03 +date: 2024-06-04 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 3a4ae0b490efc..41dd7ca30617a 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-06-03 +date: 2024-06-04 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 f627ec1642989..f9daef169c71f 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-06-03 +date: 2024-06-04 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 ec7c292c674fc..dc2ad635820b2 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-06-03 +date: 2024-06-04 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 bf64f8719e13c..2d823a0e2c3aa 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-06-03 +date: 2024-06-04 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 e6c289e7e9a42..6c69b86aaa71c 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-06-03 +date: 2024-06-04 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 013d2b856accd..33b86c0431a36 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-06-03 +date: 2024-06-04 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 12ebee7f312a2..770f3c427fa33 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-06-03 +date: 2024-06-04 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 1c16470f6662e..e3ba7859dccce 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-06-03 +date: 2024-06-04 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 a711e469ffe81..67e048a4332b2 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-06-03 +date: 2024-06-04 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 a7a2712440f90..d2737b17ffbc6 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-06-03 +date: 2024-06-04 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 770ad692403ea..648c94dda587a 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-06-03 +date: 2024-06-04 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 12b9991118126..0f91b94a582a0 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-06-03 +date: 2024-06-04 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 1240a89e3723f..cea3e7043c3b4 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-06-03 +date: 2024-06-04 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 7f6eb2583bc3e..a4e8b813a916c 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-06-03 +date: 2024-06-04 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 9b4a374a39d60..be23146abd52f 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-06-03 +date: 2024-06-04 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 98f874a05b05b..e5b12be624369 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-06-03 +date: 2024-06-04 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 37abb601b2c95..39e006e0680a7 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-06-03 +date: 2024-06-04 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 eab901068f139..201a367aae706 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-06-03 +date: 2024-06-04 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 83b076fb928d3..5ac72aa90777c 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-06-03 +date: 2024-06-04 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 3028302776051..f491cb9e6f8cd 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-06-03 +date: 2024-06-04 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 52b5ac7531d9f..20c368ef2a3dc 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-06-03 +date: 2024-06-04 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 15c60a0e946f2..1416f2b240a58 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-06-03 +date: 2024-06-04 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 ea0d15e4c0253..0517ceb71546c 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-06-03 +date: 2024-06-04 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 4755653bf5a9e..374cabec39a92 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-06-03 +date: 2024-06-04 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 b46a6e3fa25a4..8be0510fbde31 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-06-03 +date: 2024-06-04 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 98822fc3952b8..4558ee6fae5cb 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-06-03 +date: 2024-06-04 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 ec5f6a9598cea..52db9c4058c96 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-06-03 +date: 2024-06-04 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 c5212647d9316..62e65a2f61fd6 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-06-03 +date: 2024-06-04 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 4fa068e88ab13..db743aa34a398 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-06-03 +date: 2024-06-04 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 0f1b9a56cd5e9..184881a89128c 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-06-03 +date: 2024-06-04 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 3539e1c76067b..4bf21ec454de5 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-06-03 +date: 2024-06-04 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 e542f04d7388d..9df3e45b857b6 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-06-03 +date: 2024-06-04 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 5496e7bc0ebf7..cce588320617b 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-06-03 +date: 2024-06-04 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 4cfc9ce4d643c..bc218f488f0b1 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-06-03 +date: 2024-06-04 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 d266386e6cffb..ec4375d89fe2a 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-06-03 +date: 2024-06-04 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 64d3cd4b99d91..f3bda3c405d9b 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-06-03 +date: 2024-06-04 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 0e03f4687a9dc..5447df9edd3f5 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-06-03 +date: 2024-06-04 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 0f0e7a3a6c649..b6ac2e2fee819 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-06-03 +date: 2024-06-04 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 d47415b940506..167d2229ce9d7 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-06-03 +date: 2024-06-04 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 cd669a4f1a8fa..52d82a3b9d6ff 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-06-03 +date: 2024-06-04 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 4125196682097..e8396206ae0dc 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-06-03 +date: 2024-06-04 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 d0560fc128e27..de1a00d858b99 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-06-03 +date: 2024-06-04 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 81e89b00d026c..d0b8c2b3f7ca6 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-06-03 +date: 2024-06-04 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 cf8ec9387e3b7..d8d7f290a727f 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-06-03 +date: 2024-06-04 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 1e9378234c366..e07965ae025cc 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-06-03 +date: 2024-06-04 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 849158007a400..7f38c77ea7e98 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-06-03 +date: 2024-06-04 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 00287d31f1b94..61b8985e10a11 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-06-03 +date: 2024-06-04 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 0a9b60cad0475..19e4e5aba1cf9 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-06-03 +date: 2024-06-04 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 f6bb08871d96b..28352db383f6f 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-06-03 +date: 2024-06-04 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 dacba7869bd3f..d2d19a2ae518a 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-06-03 +date: 2024-06-04 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 c676910ee2df8..e93349600512c 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-06-03 +date: 2024-06-04 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 18d27c72bd2b4..1e6b6aad930da 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-06-03 +date: 2024-06-04 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 0a87f1c491fb3..d8d339cbc4862 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-06-03 +date: 2024-06-04 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 c11b00a5b2eb6..e6a16da623589 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-06-03 +date: 2024-06-04 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 251489152a84e..de5b55cc32475 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-06-03 +date: 2024-06-04 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 224ae42c5d0b0..a779c5137d597 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-06-03 +date: 2024-06-04 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 c92de6ec9d94b..af254b3f73fdd 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-06-03 +date: 2024-06-04 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 03f80516685d2..2ed41250db2f4 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-06-03 +date: 2024-06-04 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 b63196ba6d6a4..dcccdd71e5c3f 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-06-03 +date: 2024-06-04 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 b1fbfd8468521..11f6cce3fb119 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-06-03 +date: 2024-06-04 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 2ffa2575d3b15..ecaf7e7a52fc0 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-06-03 +date: 2024-06-04 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 fa83317ca466e..04ee4e05a864e 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-06-03 +date: 2024-06-04 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 88e0f0a72e105..8f9c77c76ec0a 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-06-03 +date: 2024-06-04 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 2435657a24ddc..40336c0b1d72f 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-06-03 +date: 2024-06-04 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 a103f31319c61..4cf74fc6ef3df 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-06-03 +date: 2024-06-04 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 75b75e348f6fa..f493ddad08bff 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-06-03 +date: 2024-06-04 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 ebabcca358760..13b227589c6ff 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-06-03 +date: 2024-06-04 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 e32e9054e9a0f..5b4fa9d22f143 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-06-03 +date: 2024-06-04 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 d4db087631cf9..2329fed6f4516 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-06-03 +date: 2024-06-04 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 a7a03058a433d..14a5b34c77d42 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-06-03 +date: 2024-06-04 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 0235ccf2f17b8..5d9d23d8c5052 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-06-03 +date: 2024-06-04 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 514e39228a13e..a0d7cc3233257 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-06-03 +date: 2024-06-04 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 64a03cd0dd3e4..5d53b1e6edc80 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-06-03 +date: 2024-06-04 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 59d758fe2f194..16d0424321a7e 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-06-03 +date: 2024-06-04 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 dcac3030bd3a1..febf10d5ebed7 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-06-03 +date: 2024-06-04 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 70d834fff7623..9618a471eae66 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-06-03 +date: 2024-06-04 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 9efc804006c65..aa72cf8759d0b 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-06-03 +date: 2024-06-04 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 8a0f02e022b41..3cced4d0ab428 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-06-03 +date: 2024-06-04 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 914542d885054..9e6435d856149 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-06-03 +date: 2024-06-04 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 1bda6978dd2dd..b17e499115a50 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-06-03 +date: 2024-06-04 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 3f82053e0f2cf..d7f980a842b03 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-06-03 +date: 2024-06-04 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 1a988fbe03ba7..5bb5385c9211a 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-06-03 +date: 2024-06-04 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 75589bdc27389..860c4becb552f 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-06-03 +date: 2024-06-04 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 fdd497f6aeee6..13777d9768b53 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-06-03 +date: 2024-06-04 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 d81964ee33d45..5b8e8d51824a3 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-06-03 +date: 2024-06-04 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 f7d32bee03d86..49b06352831fc 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-06-03 +date: 2024-06-04 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 a2b4ac64eb0b1..2bb8265c14b56 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-06-03 +date: 2024-06-04 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 ea59544e7e1f7..ee7e8217fb465 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-06-03 +date: 2024-06-04 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 b0a73bbc27ae1..fcd501d2dd156 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-06-03 +date: 2024-06-04 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 520b3c1667282..e5e4dd09df325 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-06-03 +date: 2024-06-04 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 d0cc82012ffd3..70b206d04abac 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-06-03 +date: 2024-06-04 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 205f93d6cdbba..7b01202a35264 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-06-03 +date: 2024-06-04 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 dd31aab900ae5..ffd3840ed6f3d 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-06-03 +date: 2024-06-04 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 0e8dcc9e0aad9..16a559a3f71e8 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-06-03 +date: 2024-06-04 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 205d52449edad..11e2b35d9d729 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-06-03 +date: 2024-06-04 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 47d1d96edfe63..fdf2ba551f9e7 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-06-03 +date: 2024-06-04 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 a916b4e9c293f..0295ec6600b48 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-06-03 +date: 2024-06-04 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 d5f872b971848..160a2ff396e44 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-06-03 +date: 2024-06-04 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 36728dfb23ef2..63dc7c17f9638 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 3d2aef4cd7cb9..79dd391fa119b 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -10954,14 +10954,14 @@ { "parentPluginId": "@kbn/core-http-server", "id": "def-common.KibanaRequest.protocol", - "type": "string", + "type": "CompoundType", "tags": [], "label": "protocol", "description": [ "\nThe protocol used by the client, inferred from the httpVersion." ], "signature": [ - "\"http1\"" + "\"http1\" | \"http2\"" ], "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, @@ -16002,6 +16002,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts" @@ -17212,10 +17216,10 @@ "tags": [], "label": "HttpProtocol", "description": [ - "\nDefines an http protocol.\n(Only supporting http1 for now)\n\n- http1: regroups all http/1.x protocols" + "\nDefines an http protocol.\n(Only supporting http1 for now)\n\n- http1: regroups all http/1.x protocols\n- http2: h2" ], "signature": [ - "\"http1\"" + "\"http1\" | \"http2\"" ], "path": "packages/core/http/core-http-server/src/http_contract.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index d601a5645aee2..48a248df02c02 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_core_http_server_internal.devdocs.json index 6b7e5650c3bc1..e27b8b2b2a987 100644 --- a/api_docs/kbn_core_http_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_server_internal.devdocs.json @@ -275,6 +275,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server-internal", + "id": "def-common.HttpConfig.protocol", + "type": "CompoundType", + "tags": [], + "label": "protocol", + "description": [], + "signature": [ + "\"http1\" | \"http2\"" + ], + "path": "packages/core/http/core-http-server-internal/src/http_config.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server-internal", "id": "def-common.HttpConfig.host", @@ -1449,7 +1463,7 @@ "label": "HttpConfigType", "description": [], "signature": [ - "{ readonly uuid?: string | undefined; readonly basePath?: string | undefined; readonly publicBaseUrl?: string | undefined; readonly name: string; readonly ssl: Readonly<{ key?: string | undefined; certificateAuthorities?: string | string[] | undefined; certificate?: string | undefined; keyPassphrase?: string | undefined; redirectHttpFromPort?: number | undefined; } & { enabled: boolean; keystore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; truststore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; readonly host: string; readonly port: number; readonly compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; readonly cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; readonly versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; readonly autoListen: boolean; readonly shutdownTimeout: moment.Duration; readonly cdn: Readonly<{ url?: string | null | undefined; } & {}>; readonly oas: Readonly<{} & { enabled: boolean; }>; readonly securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; readonly customResponseHeaders: Record; readonly maxPayload: ", + "{ readonly uuid?: string | undefined; readonly basePath?: string | undefined; readonly publicBaseUrl?: string | undefined; readonly name: string; readonly ssl: Readonly<{ key?: string | undefined; certificateAuthorities?: string | string[] | undefined; certificate?: string | undefined; keyPassphrase?: string | undefined; redirectHttpFromPort?: number | undefined; } & { enabled: boolean; keystore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; truststore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; readonly host: string; readonly http2: Readonly<{} & { allowUnsecure: boolean; }>; readonly protocol: \"http1\" | \"http2\"; readonly port: number; readonly compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; readonly cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; readonly versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; readonly autoListen: boolean; readonly shutdownTimeout: moment.Duration; readonly cdn: Readonly<{ url?: string | null | undefined; } & {}>; readonly oas: Readonly<{} & { enabled: boolean; }>; readonly securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; readonly customResponseHeaders: Record; readonly maxPayload: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index c9a568d85602a..2ff22f119f171 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 91 | 0 | 78 | 10 | +| 92 | 0 | 79 | 10 | ## Common diff --git a/api_docs/kbn_core_http_server_mocks.devdocs.json b/api_docs/kbn_core_http_server_mocks.devdocs.json index 322c432b28c54..765ba95d4de08 100644 --- a/api_docs/kbn_core_http_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_server_mocks.devdocs.json @@ -27,7 +27,7 @@ "label": "createConfigService", "description": [], "signature": [ - "({ server, externalUrl, csp, }?: Partial<{ server: Partial; truststore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; port: number; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | null | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", + "({ server, externalUrl, csp, }?: Partial<{ server: Partial; truststore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; http2: Readonly<{} & { allowUnsecure: boolean; }>; protocol: \"http1\" | \"http2\"; port: number; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | null | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -64,7 +64,7 @@ "label": "{\n server,\n externalUrl,\n csp,\n}", "description": [], "signature": [ - "Partial<{ server: Partial; truststore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; port: number; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | null | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", + "Partial<{ server: Partial; truststore: Readonly<{ password?: string | undefined; path?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; http2: Readonly<{} & { allowUnsecure: boolean; }>; protocol: \"http1\" | \"http2\"; port: number; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | null | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index d4955e1cb5374..e35bfa9e0e7b2 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-06-03 +date: 2024-06-04 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 f73745d815e05..b130b2a0c6041 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-06-03 +date: 2024-06-04 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 4f24570ba648c..0bdd287700816 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-06-03 +date: 2024-06-04 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 1dc15b1f461ea..533287a4e45ca 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-06-03 +date: 2024-06-04 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 73b2c21769995..d22c74bec78c8 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-06-03 +date: 2024-06-04 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 58aaa7100c4c7..dfbe96c0b0273 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-06-03 +date: 2024-06-04 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 4d90ea495ff97..2891d8967078c 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-06-03 +date: 2024-06-04 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 f74c1859d9e91..a131a5b273a0c 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-06-03 +date: 2024-06-04 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 c272854c845a7..017d4fe10c5c0 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-06-03 +date: 2024-06-04 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 fa36553a30f9a..2d446fde07793 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-06-03 +date: 2024-06-04 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 9629eda97ad8a..170838110e32c 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-06-03 +date: 2024-06-04 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 60882026c4a00..1f865eb4bf3b9 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-06-03 +date: 2024-06-04 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 a31ecfe987cf9..507f7a57f9b64 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-06-03 +date: 2024-06-04 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 0c3ec04f6aab3..c821759313228 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_core_logging_common_internal.devdocs.json index 74dbf77a108bd..c38854fc7076a 100644 --- a/api_docs/kbn_core_logging_common_internal.devdocs.json +++ b/api_docs/kbn_core_logging_common_internal.devdocs.json @@ -99,6 +99,45 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/core-logging-common-internal", + "id": "def-common.BrowserLoggerConfig", + "type": "Interface", + "tags": [], + "label": "BrowserLoggerConfig", + "description": [], + "path": "packages/core/logging/core-logging-common-internal/src/browser_config.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-logging-common-internal", + "id": "def-common.BrowserLoggerConfig.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/logging/core-logging-common-internal/src/browser_config.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-logging-common-internal", + "id": "def-common.BrowserLoggerConfig.level", + "type": "CompoundType", + "tags": [], + "label": "level", + "description": [], + "signature": [ + "\"error\" | \"info\" | \"all\" | \"debug\" | \"off\" | \"warn\" | \"trace\" | \"fatal\"" + ], + "path": "packages/core/logging/core-logging-common-internal/src/browser_config.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-logging-common-internal", "id": "def-common.Conversion", diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index c229c50afc308..403249b152685 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 38 | 0 | 31 | 0 | +| 41 | 0 | 34 | 0 | ## Common diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index b8a5d4cafd98b..817fc4f601ae7 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-06-03 +date: 2024-06-04 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 ff99198f00b5f..f18f55f356bc6 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-06-03 +date: 2024-06-04 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 92b31ed7be09f..f692e8ddbaac6 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-06-03 +date: 2024-06-04 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 b0c62e59792ec..62cf629f961f0 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-06-03 +date: 2024-06-04 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 89e081a3c51d3..f16d349ae500f 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-06-03 +date: 2024-06-04 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 9ea5d5fb09b97..f5e3d5a140629 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-06-03 +date: 2024-06-04 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 1ba73408746c6..6225f120ac13c 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-06-03 +date: 2024-06-04 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 9eb08b6dcc85c..3f977035d2f46 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-06-03 +date: 2024-06-04 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 470703b0fbec8..0adc1dd54c9eb 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-06-03 +date: 2024-06-04 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 587df3864d6ca..91bdfa219133b 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-06-03 +date: 2024-06-04 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 dae88aca99c27..3d64a07f8d287 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-06-03 +date: 2024-06-04 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 5f1fffde223f8..b7e0a265cca9e 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-06-03 +date: 2024-06-04 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 6f893e25c0ac3..18b0eb5b5ea5b 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-06-03 +date: 2024-06-04 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 9b8ed84c71c6b..a8b0588f27bd5 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-06-03 +date: 2024-06-04 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 bd9740e3c5111..e843e40ff293f 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-06-03 +date: 2024-06-04 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 2e4d2a9f4790d..afc5cb3a4a43f 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-06-03 +date: 2024-06-04 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 4c90c4b80986c..319afeb0de0fd 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-06-03 +date: 2024-06-04 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 b802a07318123..71de587344a39 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-06-03 +date: 2024-06-04 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 36688b4f85c04..e33eecd1ac6da 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-06-03 +date: 2024-06-04 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 3bd3dd8a9924a..3b1ee2436bb2d 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-06-03 +date: 2024-06-04 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 00407f7c6bdec..d641846e582d7 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-06-03 +date: 2024-06-04 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 e4ab57026294d..435f4ae34b463 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-06-03 +date: 2024-06-04 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 e81a9a8b639f3..9351e0d001974 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-06-03 +date: 2024-06-04 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 7355ffdd90e51..5018aaad8680a 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-06-03 +date: 2024-06-04 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 4ecf41b468d2d..f166162c30ed8 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-06-03 +date: 2024-06-04 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 b69ab80486335..d7497b6977038 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-06-03 +date: 2024-06-04 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 7e2426c790c75..450e5a214ae86 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-06-03 +date: 2024-06-04 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 c685f41fad9b5..b7c393509a4df 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-06-03 +date: 2024-06-04 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 09cbb5d19b3e5..acc10d82f1900 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-06-03 +date: 2024-06-04 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 caa1abaf5bbb1..d61ca771f4c0b 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-06-03 +date: 2024-06-04 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 40a126902ad29..8c79e5d5edbaf 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-06-03 +date: 2024-06-04 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 071bb8d2962e6..5cbad3ce85047 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-06-03 +date: 2024-06-04 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 6fde52ec61000..9611d831ab034 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-06-03 +date: 2024-06-04 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 e75f7be14c31a..8631d1e1dfe3b 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-06-03 +date: 2024-06-04 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 101774a292130..fb2bae778ca1f 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-06-03 +date: 2024-06-04 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 fe97499bf1de7..ca5851036cc16 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-06-03 +date: 2024-06-04 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 d8a4a8bac5a0e..ee130d770c987 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-06-03 +date: 2024-06-04 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 f93bf12bb357c..6d2bebc3488dd 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-06-03 +date: 2024-06-04 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 92f9d5ffa9d0d..b2a0d6415a414 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-06-03 +date: 2024-06-04 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 805c429daef07..0b9c7aa63b0b2 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-06-03 +date: 2024-06-04 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 4be323e05989a..3af76a281c3ce 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-06-03 +date: 2024-06-04 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 66b0905cdac28..1a0ad2fce2b04 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-06-03 +date: 2024-06-04 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 a951a35465462..5c98bd42597e5 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-06-03 +date: 2024-06-04 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 6c481ba6f5095..ce91309e1cdec 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-06-03 +date: 2024-06-04 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 bc148b909ab19..7e04b448184b7 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-06-03 +date: 2024-06-04 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 7775d806cf134..8844bf6baf45e 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-06-03 +date: 2024-06-04 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 fcf380a2e2afa..6457865139442 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-06-03 +date: 2024-06-04 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 a59d57c55021b..d8a29d7d581c6 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-06-03 +date: 2024-06-04 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 5659953bd7694..5635959ab816d 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-06-03 +date: 2024-06-04 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 05ad04b26fbf6..b050290affb37 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-06-03 +date: 2024-06-04 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 dc436173b7d3c..6e4e7c77e2059 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-06-03 +date: 2024-06-04 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 4ce47d935ec0b..cc6c068f8bedf 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-06-03 +date: 2024-06-04 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 2a57479066d0c..4b0c94ff482a2 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-06-03 +date: 2024-06-04 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 033c5c7f3a043..95631c7f2f249 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-06-03 +date: 2024-06-04 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 ca6d137b13588..fece3557a9e8a 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-06-03 +date: 2024-06-04 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 3f303148a1190..0bffa2e0fb2cc 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-06-03 +date: 2024-06-04 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 37cbbd9c3c299..0fcbcf5bd503b 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-06-03 +date: 2024-06-04 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 56979d12dd01f..49a2c6c562baa 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-06-03 +date: 2024-06-04 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 a68064ef5a78c..50befde81f7fa 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-06-03 +date: 2024-06-04 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 ab10db88cba75..351f0049bf3e6 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-06-03 +date: 2024-06-04 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 c94edf47fff0f..c6e79e790f57c 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-06-03 +date: 2024-06-04 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 c5b32fc69c1db..3e25d1c60c76a 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-06-03 +date: 2024-06-04 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 a27ae483fa57f..fe59232602135 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-06-03 +date: 2024-06-04 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 53ac831948190..c58c268c56524 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-06-03 +date: 2024-06-04 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 8171d82c75415..acc97a45e4751 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-06-03 +date: 2024-06-04 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 09a763a5d57ba..ce3935d5f5f47 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-06-03 +date: 2024-06-04 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 7d66cccc7c44f..843c449b458c0 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-06-03 +date: 2024-06-04 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 f951de2be9b1b..ea51d69ab0404 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-06-03 +date: 2024-06-04 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 217bbdc379d42..7dd3092c80f0a 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-06-03 +date: 2024-06-04 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 89b570545c9a7..2230fefb38a7e 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-06-03 +date: 2024-06-04 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 940c2964ceaff..0547bb0349e8c 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-06-03 +date: 2024-06-04 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 b35006deda281..f1cb012de3001 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-06-03 +date: 2024-06-04 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 b8cb49e830f54..6d274cc87d066 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-06-03 +date: 2024-06-04 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 429a46bb55b4a..068f29f341fd6 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-06-03 +date: 2024-06-04 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 a12f52e4da602..d441c62b4aac1 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-06-03 +date: 2024-06-04 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 196269f819489..218005991cac0 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-06-03 +date: 2024-06-04 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 3e14d3553c3d8..9bec6da576890 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-06-03 +date: 2024-06-04 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 178bf11b94bba..77b77b318f552 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index eeaabb7bb2e62..52df67da36be9 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 5b19d58732092..a1dae2b0f9e11 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 1104c44549ce3..4e29ee8c8bc2f 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 56d2019bb00fb..830c6124ca291 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index fd86f0bf580db..0365e494d8f40 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 829aec5a016c5..2c66e326b4004 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 e4f500eb830f0..6fa7da61e2650 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-06-03 +date: 2024-06-04 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 2369c631af911..273abd0348c57 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-06-03 +date: 2024-06-04 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 1db6a6b62a377..fadcde462e683 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-06-03 +date: 2024-06-04 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 7a3418524b837..84637b4fbaa32 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-06-03 +date: 2024-06-04 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 539c2914d34e5..4e9bb326bf1e9 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-06-03 +date: 2024-06-04 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 b9d27a0063b01..5127b22098660 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-06-03 +date: 2024-06-04 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 07f135f565560..52e768f06465c 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-06-03 +date: 2024-06-04 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 aab3ecc4e5e2a..74cb9faae50fa 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-06-03 +date: 2024-06-04 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 e3b6d3edce908..2162245eca191 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-06-03 +date: 2024-06-04 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 fef505f91fe68..08ffa6ac374bc 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-06-03 +date: 2024-06-04 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 837582422db1f..c4d8c10fe8ab8 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-06-03 +date: 2024-06-04 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 4316797d5d865..3fd554a0323a9 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-06-03 +date: 2024-06-04 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 b71511523ced1..b6b449deea51d 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-06-03 +date: 2024-06-04 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 da8f0f296e431..530f8ee72c11e 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-06-03 +date: 2024-06-04 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 ac362e30c438b..99c5766ec5839 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-06-03 +date: 2024-06-04 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 4259f7516c7bd..0f06995ecca4c 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-06-03 +date: 2024-06-04 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 6e38dfa2ec33b..4b7774f32c091 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-06-03 +date: 2024-06-04 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 7a58b4fe800f8..96954980d80d5 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-06-03 +date: 2024-06-04 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 d04b9e2880e17..8ec4fd3c46e1b 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,14 +8,14 @@ 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 5d092ae2591a8..a2db6da2c92d5 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-06-03 +date: 2024-06-04 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 890e8a7911958..2f957b2f3a61d 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-06-03 +date: 2024-06-04 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 f6be33b3d48ab..c8baa779ef6d9 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-06-03 +date: 2024-06-04 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 45579116e0a73..d39b7eb45d612 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-06-03 +date: 2024-06-04 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 174f81d391cb6..1c694aacb8843 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-06-03 +date: 2024-06-04 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 a709569ae47a7..306ed0162c087 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-06-03 +date: 2024-06-04 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 af76dd0cd9bba..b5271eeb5805c 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-06-03 +date: 2024-06-04 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 8f036a80c8908..664633c8d97ff 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-06-03 +date: 2024-06-04 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 d26d7165cb8d1..c129ceabeedf4 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-06-03 +date: 2024-06-04 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 155d11ba42b1e..ee0a22c9f92a8 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-06-03 +date: 2024-06-04 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 911383dc4f41f..92821eb905ae4 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-06-03 +date: 2024-06-04 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 55b746a1c3994..f3d7cdb44191a 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-06-03 +date: 2024-06-04 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 53ff4339327fe..e02f4404dd1d0 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-06-03 +date: 2024-06-04 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 48754d3ff4b19..09c6e37a0c796 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-06-03 +date: 2024-06-04 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 7a915ebde403d..372d1f286746b 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-06-03 +date: 2024-06-04 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 63d9690d64fc1..54847fe2c10d2 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-06-03 +date: 2024-06-04 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 90423a6da34fa..be7a91548bae5 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-06-03 +date: 2024-06-04 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 c5f8a1e264fcb..ed3894dff4503 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-06-03 +date: 2024-06-04 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 832242eb74cfe..1edc9992c0523 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 0061adf4dc6ca..efb97a4a1ae0e 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index ece25b33b12a8..44d7ab7f8c53a 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-06-03 +date: 2024-06-04 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 11d7ef26e44f6..42a1944b87a3e 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-06-03 +date: 2024-06-04 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 390baed10a5aa..c81c0be064094 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-06-03 +date: 2024-06-04 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 a4665cef5408a..ba6c59e29991e 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-06-03 +date: 2024-06-04 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 e9e0bed1ece7e..4ea5f5cc026ad 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-06-03 +date: 2024-06-04 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 b2f9fb0b907fc..71138c91ad267 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-06-03 +date: 2024-06-04 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 49d1888e05dce..b23947085fe94 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 4f4ede0ad66c2..e0ec156decedb 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 281a5568c7f57..3c85a79ce5d37 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-06-03 +date: 2024-06-04 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 f1419332c03aa..3b7448a7bc3e1 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-06-03 +date: 2024-06-04 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 597fa36145cb5..8ce9c56e9c982 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-06-03 +date: 2024-06-04 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 e8ba196ce6219..636ac4ac178d3 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-06-03 +date: 2024-06-04 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 28c91e66c7c0d..85e347b8186bc 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-06-03 +date: 2024-06-04 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 5460b80ca6741..d943a69f53937 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-06-03 +date: 2024-06-04 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 21a6efdc88d69..6e40763ededb3 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-06-03 +date: 2024-06-04 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 823f089aeacf8..42970892eaf54 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-06-03 +date: 2024-06-04 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 8bbca7dd50d10..b078882fffeaa 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-06-03 +date: 2024-06-04 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 c0bf6cd9d0bb0..8c4976201b73b 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-06-03 +date: 2024-06-04 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 06d4ad314ac21..70072a31e504c 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-06-03 +date: 2024-06-04 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 7f7a18213ee35..71a5df1e80681 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-06-03 +date: 2024-06-04 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 3491480542503..ac1d795947570 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 2d9c8ba2eb93b..93a06d168f2cd 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 43221f1c967da..de4d567addd6c 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-06-03 +date: 2024-06-04 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 1164f06185947..fdeb9dd386be5 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-06-03 +date: 2024-06-04 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 febe1c880e943..75dcf1df12c2e 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-06-03 +date: 2024-06-04 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 f9c08c837f5f0..c702583f73068 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-06-03 +date: 2024-06-04 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 ffa7d4036c6ef..3f2ada6b4f069 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-06-03 +date: 2024-06-04 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 0f185eae7bfd4..5c88d8956f87b 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-06-03 +date: 2024-06-04 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 3bef194b972df..243e0940f4ea1 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-06-03 +date: 2024-06-04 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 48b2fe271cfc9..7df61de04a245 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-06-03 +date: 2024-06-04 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 09953fa571606..c1b5c3ef7fb6a 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-06-03 +date: 2024-06-04 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 ef694ed87d851..797f6d151003a 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-06-03 +date: 2024-06-04 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 25b6016a29b03..e3326c573b8c1 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-06-03 +date: 2024-06-04 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 92a62a1fc85dd..2617649cdaff7 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-06-03 +date: 2024-06-04 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 fccc06371ceab..eff62687bc1cd 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-06-03 +date: 2024-06-04 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 4e17e272c355c..1565102572ce0 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-06-03 +date: 2024-06-04 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 a695b483302c8..a85f9f9272bb7 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,14 +8,14 @@ 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index c79e560bed3f2..574a279756c37 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-06-03 +date: 2024-06-04 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 71e2a906e6bb9..7b08d05929d24 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-06-03 +date: 2024-06-04 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 a8edb7e008cca..5cbb10e387d0a 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-06-03 +date: 2024-06-04 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 7027be8607194..854b7fba23146 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-06-03 +date: 2024-06-04 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 a440ae655a6f7..0a5ce2b816446 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-06-03 +date: 2024-06-04 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 04aca7106f7cb..c05e6db7262aa 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-06-03 +date: 2024-06-04 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 77b82c1496df4..210079631146e 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-06-03 +date: 2024-06-04 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 1e02a84e1a1e4..653d4991ae495 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-06-03 +date: 2024-06-04 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 a2953e89d66fc..99b4d9c9598ae 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-06-03 +date: 2024-06-04 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 e212b7e4fca9a..c7ae4fcfceef2 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-06-03 +date: 2024-06-04 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 d4451e466a92a..903130838a219 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-06-03 +date: 2024-06-04 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 573950cff1aa1..44863aa603d32 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-06-03 +date: 2024-06-04 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 b33704ad22790..354164cc36ab8 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-06-03 +date: 2024-06-04 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 570ea881f9d4e..715f10ef5f9f2 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-06-03 +date: 2024-06-04 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 93ab8aaeb1da2..486257ce26f26 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-06-03 +date: 2024-06-04 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 885ea55f39bee..592ebcb45bc78 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-06-03 +date: 2024-06-04 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 d94f318a0ceeb..c2ada2fde336b 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-06-03 +date: 2024-06-04 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 f8326486ed1e0..4c04eb4916b56 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-06-03 +date: 2024-06-04 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 6031645d67237..6f85622c5f5c4 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-06-03 +date: 2024-06-04 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 12d6d86657bc0..37e314eb44b38 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-06-03 +date: 2024-06-04 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 7d8b54afd936b..b88cd0435f533 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-06-03 +date: 2024-06-04 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 b71b73f173ca5..a04fb90342dac 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-06-03 +date: 2024-06-04 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 87b4bbfc8f289..b753e3f117b77 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-06-03 +date: 2024-06-04 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 0bfae36b39028..6dd5aadd3c274 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-06-03 +date: 2024-06-04 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 afc579a33dc7c..ba89747d7c753 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-06-03 +date: 2024-06-04 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 05191e2ae3e1b..14a05b2bcbb9a 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-06-03 +date: 2024-06-04 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 0d887da8cb1f0..e10d7e099180f 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-06-03 +date: 2024-06-04 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 cf698ed71801b..4d0b553462606 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-06-03 +date: 2024-06-04 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 6ada199c5e956..50d310a9bc0d5 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-06-03 +date: 2024-06-04 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 3209ee8f13e21..ae0970aea3c41 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-06-03 +date: 2024-06-04 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 64152a5436b39..aa2ef35916fd0 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-06-03 +date: 2024-06-04 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 4c2eefe6a2b9a..2bc871e272dc8 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-06-03 +date: 2024-06-04 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 ff78eb2e73efe..935e5eae32c4e 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-06-03 +date: 2024-06-04 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 12782189714c5..b7f8af8a66a22 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-06-03 +date: 2024-06-04 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 581f0b87a0f2a..d32411e565207 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-06-03 +date: 2024-06-04 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 4cd2bd9411e89..adbaab9e40a53 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-06-03 +date: 2024-06-04 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 20ec7fd240a93..f15d7620a7981 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-06-03 +date: 2024-06-04 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 61f9b928cdf8a..ce84ad9f80440 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-06-03 +date: 2024-06-04 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 371fe714676f3..06d177de15ae2 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-06-03 +date: 2024-06-04 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 3040c20b93e4c..58823cf6b1a1b 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-06-03 +date: 2024-06-04 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 b23c7e2de8f99..f7cf28fa1db09 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-06-03 +date: 2024-06-04 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 12cfb2e7b577a..891b9c6f8a7b5 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-06-03 +date: 2024-06-04 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 c7c1e22b3e86e..58e8e6db77fd5 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-06-03 +date: 2024-06-04 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 0e4a68b911b0f..65c32edf4851e 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-06-03 +date: 2024-06-04 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 10421bb197f1e..0ce3c444047b3 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-06-03 +date: 2024-06-04 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 c55a9e9da2a23..7735369f1d016 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-06-03 +date: 2024-06-04 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 d05f1e45e2d82..7b3003eed8c68 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-06-03 +date: 2024-06-04 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 070a800f2173e..07a835fb6957b 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-06-03 +date: 2024-06-04 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 dfdf82b54a85c..f2e833cb15fbf 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-06-03 +date: 2024-06-04 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 c47a6a1f3cdbe..8e3f026ad565b 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-06-03 +date: 2024-06-04 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 ea4a2809ddee9..1514d2b6a1ec6 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-06-03 +date: 2024-06-04 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 0a2154efdc52d..87e13e34826b5 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-06-03 +date: 2024-06-04 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 f533e2e8da098..430f78e588efe 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-06-03 +date: 2024-06-04 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 78b2f527dd4d9..8850a04ce117d 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-06-03 +date: 2024-06-04 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 e015b3cb3dd5a..5cb2e77ff2802 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-06-03 +date: 2024-06-04 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 1adc481e9b9ea..7cadb4266a3cb 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_observability_get_padded_alert_time_range_util.devdocs.json index 932169e8a5c2d..be1ffb88134bc 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.devdocs.json +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.devdocs.json @@ -27,7 +27,7 @@ "label": "getPaddedAlertTimeRange", "description": [], "signature": [ - "(alertStart: string, alertEnd?: string | undefined) => ", + "(alertStart: string, alertEnd?: string | undefined, lookBackWindow?: { size: number; unit: \"m\" | \"d\" | \"h\" | \"s\"; } | undefined) => ", "TimeRange" ], "path": "x-pack/packages/observability/get_padded_alert_time_range_util/src/get_padded_alert_time_range.ts", @@ -63,6 +63,44 @@ "deprecated": false, "trackAdoption": false, "isRequired": false + }, + { + "parentPluginId": "@kbn/observability-get-padded-alert-time-range-util", + "id": "def-common.getPaddedAlertTimeRange.$3", + "type": "Object", + "tags": [], + "label": "lookBackWindow", + "description": [], + "path": "x-pack/packages/observability/get_padded_alert_time_range_util/src/get_padded_alert_time_range.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/observability-get-padded-alert-time-range-util", + "id": "def-common.getPaddedAlertTimeRange.$3.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "path": "x-pack/packages/observability/get_padded_alert_time_range_util/src/get_padded_alert_time_range.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/observability-get-padded-alert-time-range-util", + "id": "def-common.getPaddedAlertTimeRange.$3.unit", + "type": "CompoundType", + "tags": [], + "label": "unit", + "description": [], + "signature": [ + "\"m\" | \"d\" | \"h\" | \"s\"" + ], + "path": "x-pack/packages/observability/get_padded_alert_time_range_util/src/get_padded_alert_time_range.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "returnComment": [], 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 6d0638875466f..b92deaf1a1bf8 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-06-03 +date: 2024-06-04 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'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3 | 0 | 3 | 1 | +| 6 | 0 | 6 | 1 | ## Common diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index a0f277cf29537..e3c5077875d42 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-06-03 +date: 2024-06-04 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 86645da1b0997..8b5bd8bfa7877 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-06-03 +date: 2024-06-04 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 6ba3f1a9ed2ab..b0e344bc46df8 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-06-03 +date: 2024-06-04 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 9198af526b3af..c905fd4ddad70 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-06-03 +date: 2024-06-04 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 14249f97d9aac..7fb7c9941a0c3 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-06-03 +date: 2024-06-04 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 d6532ef1f8e63..be29329400638 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-06-03 +date: 2024-06-04 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 ea55a62e25adc..e7d888cae4edb 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-06-03 +date: 2024-06-04 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 9d026d0a3916b..3268611d09d7f 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-06-03 +date: 2024-06-04 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 9327fc9d31884..598c93332ae77 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-06-03 +date: 2024-06-04 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 58d7867eb20b9..4a17ce1226c28 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-06-03 +date: 2024-06-04 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 2094546206883..72b59397f62e6 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index e5a3a39e96e21..5cfe1e6e940a8 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 765dc75779f28..6624c617d2e25 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-06-03 +date: 2024-06-04 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 8c007d60f55f5..68544ce818b6e 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-06-03 +date: 2024-06-04 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 eb277daaf947c..56d8035a9c18f 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index e4581fe998df5..8db17f82ba2e0 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 823a9c9ec5577..75f7ac331d362 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-06-03 +date: 2024-06-04 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 0c35251288955..ff0164930f51f 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-06-03 +date: 2024-06-04 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 08490211e8ca6..25b64c4369887 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-06-03 +date: 2024-06-04 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 b9c55e11a6803..c57d9c3bcbc63 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-06-03 +date: 2024-06-04 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 209ba55e3ff21..8441039eb7608 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-06-03 +date: 2024-06-04 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 d612be998dbcb..70563f79707ca 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-06-03 +date: 2024-06-04 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 7f0e8c9bfa2fe..f8ccbf9eeb318 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-06-03 +date: 2024-06-04 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 3e8edbeb3c0fd..0e6c7ee6bb294 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-06-03 +date: 2024-06-04 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 0fea7c4bc1d87..acf67abc205a0 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-06-03 +date: 2024-06-04 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 bf7ddd4cd2bca..2ec5edc70869b 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-06-03 +date: 2024-06-04 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 d50d29ecdb728..b6d88f8e3aa01 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-06-03 +date: 2024-06-04 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 565c90c8388c9..b1bed6ce5e471 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-06-03 +date: 2024-06-04 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 945628f51857c..af7131d29e809 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-06-03 +date: 2024-06-04 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 5b5aa8a143a30..4ff5ec5702d57 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-06-03 +date: 2024-06-04 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 d555b18e35405..87582709bfd1e 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-06-03 +date: 2024-06-04 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 c54e9f36d4105..76b1d7e286659 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-06-03 +date: 2024-06-04 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 52784f63fb86c..a757a5272c669 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-06-03 +date: 2024-06-04 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 2808657da5290..340e0473e66c1 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-06-03 +date: 2024-06-04 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 2f0e01807a692..c882d5a5f1360 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-06-03 +date: 2024-06-04 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 2ee0641bfcb83..c75d6bf2d8041 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-06-03 +date: 2024-06-04 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 f54df360295a8..b9eb92c987f5c 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-06-03 +date: 2024-06-04 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 d16167b6bf30f..392ef81c16236 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-06-03 +date: 2024-06-04 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 b10505bfe863e..34d2a5b654f42 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-06-03 +date: 2024-06-04 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 5eabc753f7696..2d64a5ebbceb7 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-06-03 +date: 2024-06-04 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 69da4222f3c08..41572188cb19f 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-06-03 +date: 2024-06-04 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 0926057b0ec0f..32eef0fe810ea 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-06-03 +date: 2024-06-04 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 a5981fe6e20b4..13302c3fd507b 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-06-03 +date: 2024-06-04 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 48d424341d87c..ed044e269f4ed 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-06-03 +date: 2024-06-04 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 1782959320745..dcbea6fbfcbc0 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,14 +8,14 @@ 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_search_connectors.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json index 669f5be7fa9c1..1e94d2d2d2d87 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -1686,7 +1686,7 @@ "section": "def-common.ElasticsearchClient", "text": "ElasticsearchClient" }, - ", { connectorId, jobType, targetIndexName, }: { connectorId: string; jobType?: ", + ", { connectorId, jobType, }: { connectorId: string; jobType?: ", { "pluginId": "@kbn/search-connectors", "scope": "common", @@ -1694,9 +1694,7 @@ "section": "def-common.SyncJobType", "text": "SyncJobType" }, - " | undefined; targetIndexName?: string | undefined; }) => Promise<", - "WriteResponseBase", - ">" + " | undefined; }) => Promise<{ id: string; }>" ], "path": "packages/kbn-search-connectors/lib/start_sync.ts", "deprecated": false, @@ -1728,7 +1726,7 @@ "id": "def-common.startConnectorSync.$2", "type": "Object", "tags": [], - "label": "{\n connectorId,\n jobType,\n targetIndexName,\n }", + "label": "{\n connectorId,\n jobType,\n }", "description": [], "path": "packages/kbn-search-connectors/lib/start_sync.ts", "deprecated": false, @@ -1765,20 +1763,6 @@ "path": "packages/kbn-search-connectors/lib/start_sync.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.startConnectorSync.$2.targetIndexName", - "type": "string", - "tags": [], - "label": "targetIndexName", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-search-connectors/lib/start_sync.ts", - "deprecated": false, - "trackAdoption": false } ] } diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index e02f68c6df030..375b3b8380bf7 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,20 +8,20 @@ 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3689 | 0 | 3689 | 0 | +| 3688 | 0 | 3688 | 0 | ## Common diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 981723600aff8..34f2be6a21c62 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-06-03 +date: 2024-06-04 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 a46a587cc7ff1..4138b8718d36d 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,14 +8,14 @@ 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index a08e010b50811..fa3754e1271de 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index be79b791b8d31..0058b2a44033f 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index c9d722939b7bf..c03c11d502ee8 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-06-03 +date: 2024-06-04 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 853e135c23fb0..54177ea5f76b3 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-06-03 +date: 2024-06-04 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 4cc56966f5058..e152e3ba1c8e3 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-06-03 +date: 2024-06-04 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 74e451fec8311..77a3ae21d5342 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-06-03 +date: 2024-06-04 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 0ab5bd2d60b74..f9925717d160d 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-06-03 +date: 2024-06-04 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 1202171368bc4..48edea46ff52c 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-06-03 +date: 2024-06-04 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 0ddeea134f5bd..fbbf079873b23 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-06-03 +date: 2024-06-04 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 7461bb2cd348e..7a7e621602751 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-06-03 +date: 2024-06-04 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 79c9b824a07f8..d5d8caa7c47b1 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-06-03 +date: 2024-06-04 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 b425160c7dafa..b498f7f2293fd 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-06-03 +date: 2024-06-04 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 a9090951c55db..48724c039c797 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-06-03 +date: 2024-06-04 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 0ba88017f85f1..07b72ac0a94ac 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-06-03 +date: 2024-06-04 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 719e2bda020a5..1881bc407d8ed 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-06-03 +date: 2024-06-04 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 0eb18bb6bc50a..d423faed4f6ef 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-06-03 +date: 2024-06-04 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 297d198d1d924..feae86006ef11 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-06-03 +date: 2024-06-04 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 ba0d9ebad056a..6de4cdab04abe 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-06-03 +date: 2024-06-04 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 9f092208485c8..3b340c9a1e0bf 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-06-03 +date: 2024-06-04 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 6cd5601698f3f..579598104c568 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-06-03 +date: 2024-06-04 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 3c4e46db0b5bb..930c9466af6d0 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-06-03 +date: 2024-06-04 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 ededf00bef9d4..8006fe3c5c51e 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-06-03 +date: 2024-06-04 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 244095e5d95e9..0780e67d92889 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-06-03 +date: 2024-06-04 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 0be8dd6853e54..ab71f21b181f4 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-06-03 +date: 2024-06-04 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 8f4af48cd0338..e7249b40b1261 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-06-03 +date: 2024-06-04 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 e92f9af5eabb3..c97515ca78479 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-06-03 +date: 2024-06-04 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 5f7adf788877d..fc9c9ca9dfb21 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_server_http_tools.devdocs.json index 1fe0296f941f7..c5fb8122cb494 100644 --- a/api_docs/kbn_server_http_tools.devdocs.json +++ b/api_docs/kbn_server_http_tools.devdocs.json @@ -426,7 +426,13 @@ "text": "IHttpConfig" }, ", options: GetServerListenerOptions) => ", - "ServerListener" + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.ServerListener", + "text": "ServerListener" + } ], "path": "packages/kbn-server-http-tools/src/get_listener.ts", "deprecated": false, @@ -719,6 +725,20 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.IHttpConfig.protocol", + "type": "CompoundType", + "tags": [], + "label": "protocol", + "description": [], + "signature": [ + "\"http1\" | \"http2\"" + ], + "path": "packages/kbn-server-http-tools/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/server-http-tools", "id": "def-common.IHttpConfig.host", @@ -1003,7 +1023,115 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.ServerListener", + "type": "Type", + "tags": [], + "label": "ServerListener", + "description": [ + "\nComposite type of all possible kind of Listener types.\n\nUnfortunately, there's no real common interface between all those concrete classes,\nas `net.Server` and `tls.Server` don't list all the APIs we're using (such as event binding)" + ], + "signature": [ + "Http2Server", + " | ", + "Http2SecureServer", + " | ", + "Server", + " | ", + "Server", + "" + ], + "path": "packages/kbn-server-http-tools/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.ServerProtocol", + "type": "Type", + "tags": [], + "label": "ServerProtocol", + "description": [], + "signature": [ + "\"http1\" | \"http2\"" + ], + "path": "packages/kbn-server-http-tools/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.TLS_V1", + "type": "string", + "tags": [], + "label": "TLS_V1", + "description": [], + "signature": [ + "\"TLSv1\"" + ], + "path": "packages/kbn-server-http-tools/src/ssl/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.TLS_V1_1", + "type": "string", + "tags": [], + "label": "TLS_V1_1", + "description": [], + "signature": [ + "\"TLSv1.1\"" + ], + "path": "packages/kbn-server-http-tools/src/ssl/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.TLS_V1_2", + "type": "string", + "tags": [], + "label": "TLS_V1_2", + "description": [], + "signature": [ + "\"TLSv1.2\"" + ], + "path": "packages/kbn-server-http-tools/src/ssl/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.TLS_V1_3", + "type": "string", + "tags": [], + "label": "TLS_V1_3", + "description": [], + "signature": [ + "\"TLSv1.3\"" + ], + "path": "packages/kbn-server-http-tools/src/ssl/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [ { "parentPluginId": "@kbn/server-http-tools", diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index d9ea87f7d977f..5ad85ce655b40 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 62 | 0 | 58 | 1 | +| 69 | 0 | 64 | 0 | ## Common @@ -37,3 +37,6 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core ### Interfaces +### Consts, variables and types + + diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 9de6f637a5bef..36416aad90ecb 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-06-03 +date: 2024-06-04 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 ea4b3e9f67c0b..b6d7a6ef1d604 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-06-03 +date: 2024-06-04 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 b50f399505ca1..7b44e4529465d 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-06-03 +date: 2024-06-04 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 63f0fbe32aada..13f4fe1b5be78 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-06-03 +date: 2024-06-04 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 e6161f16e5515..1ffb6c3631923 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,14 +8,14 @@ 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; -Contact [@elastic/enterprise-search-frontend @elastic/kibana-management](https://github.com/orgs/elastic/teams/enterprise-search-frontend ) for questions regarding this plugin. +Contact [@elastic/search-kibana @elastic/kibana-management](https://github.com/orgs/elastic/teams/search-kibana ) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index b074a5bcfe658..ad421bb0f58cf 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-06-03 +date: 2024-06-04 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 9901949cdf76c..9829f8c88a64a 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-06-03 +date: 2024-06-04 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 d66def742d2c8..37ae621f25c1b 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-06-03 +date: 2024-06-04 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 670798622a62a..b3e854a5fd569 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-06-03 +date: 2024-06-04 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 6db947b53b5b2..f986ba7fcd8da 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-06-03 +date: 2024-06-04 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 5167c4115fa98..b1f9a57be0a69 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-06-03 +date: 2024-06-04 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 731da11610b15..58b716ca56db2 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-06-03 +date: 2024-06-04 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 a62cbfd324b51..463c20be58ad1 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-06-03 +date: 2024-06-04 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 d1a3fc9a1ab58..63fc262be2225 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-06-03 +date: 2024-06-04 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 eda2299ac635e..ddd4bab29696c 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-06-03 +date: 2024-06-04 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 7f0174722587d..3705f2404056d 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-06-03 +date: 2024-06-04 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 3dff1baa02967..342dbe38787a3 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-06-03 +date: 2024-06-04 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 59f21a48defbf..d506fbc2a4a28 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-06-03 +date: 2024-06-04 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 fc575362846ed..bac14a33a1ccd 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-06-03 +date: 2024-06-04 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 be7809bdb9b83..e40cebda23a69 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-06-03 +date: 2024-06-04 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 ed331ac28ab7f..d55875c5b6025 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-06-03 +date: 2024-06-04 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 9641172deaf18..2bda47f698624 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-06-03 +date: 2024-06-04 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 8207dba63e547..8137a97da64d8 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-06-03 +date: 2024-06-04 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 f1f5f0f456627..77cb645f6b43f 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-06-03 +date: 2024-06-04 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 a9cadb860fd0f..5500cb7e41d40 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-06-03 +date: 2024-06-04 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 e3627ec2c03c1..5d29035f61c39 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-06-03 +date: 2024-06-04 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 7bb644f60301a..895edeacf68f6 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-06-03 +date: 2024-06-04 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 9c75f8f07234b..cf715bdb36593 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-06-03 +date: 2024-06-04 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 a407508af374a..c397aeb92b2e4 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-06-03 +date: 2024-06-04 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 7fe1a75e5b780..94d38dfd54782 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-06-03 +date: 2024-06-04 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 6266f824c2446..e0761e759b837 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-06-03 +date: 2024-06-04 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 fb66fe31e3eb8..a4e9f91351140 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-06-03 +date: 2024-06-04 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 2dbc35a724ccc..f4d5968b0a337 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-06-03 +date: 2024-06-04 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 8cf4fd1f6cd4d..0a5164fd5c76a 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-06-03 +date: 2024-06-04 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 b776251448260..90690632183a4 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-06-03 +date: 2024-06-04 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 af23fd316aed2..d08f0722c6151 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-06-03 +date: 2024-06-04 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 c40ae59269bb4..eb5d02f99ddba 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-06-03 +date: 2024-06-04 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 338ccb24b9df4..9bc94feb14a8b 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-06-03 +date: 2024-06-04 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 c03a911174cb1..c328cbabcb744 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-06-03 +date: 2024-06-04 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 dd2c5bed2abb1..17a19b9f7cfc0 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-06-03 +date: 2024-06-04 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 bbda55713f6d3..ebb38aabd6c25 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-06-03 +date: 2024-06-04 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 062ea76a0460f..f1d9b5815ae8b 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-06-03 +date: 2024-06-04 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 2c961d7c9eff6..6664130e78292 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-06-03 +date: 2024-06-04 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 cee5e97d7c74f..2966b3db82372 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-06-03 +date: 2024-06-04 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 0ceaf131a9ddf..6a94cc7c53360 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-06-03 +date: 2024-06-04 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 bc3924ec64d3f..9afbe4446698c 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-06-03 +date: 2024-06-04 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 0c8c824c87b27..eed75a199e0ed 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-06-03 +date: 2024-06-04 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 376b151d20dc6..4c255fc80b4a8 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 88a2ee02d062b..ca31c85679193 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-06-03 +date: 2024-06-04 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 4c3a0aa3bda3a..9c7b1b93cf9de 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-06-03 +date: 2024-06-04 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 0e91aec189c4b..f92ede7b57f2d 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-06-03 +date: 2024-06-04 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 5891c4b6af9a3..19bf3c52e3afc 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-06-03 +date: 2024-06-04 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 8e544aac4fa37..d2cb6ca687029 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-06-03 +date: 2024-06-04 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 5a260cdfbaf07..a55c69027b05b 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-06-03 +date: 2024-06-04 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 bcd55c035e7d4..58ab6a9175848 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-06-03 +date: 2024-06-04 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 62b4d2d4b35f9..56ad2884c9809 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-06-03 +date: 2024-06-04 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 ce8d93414ec90..49e9af52900d2 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-06-03 +date: 2024-06-04 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 d8e041eabb5e9..8b4e27598ec1a 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-06-03 +date: 2024-06-04 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 d41ff60011229..883ac5a574579 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-06-03 +date: 2024-06-04 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 dae1e7781db7d..e988cb9111b78 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-06-03 +date: 2024-06-04 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 5ef569f96b4a2..32586ac126066 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-06-03 +date: 2024-06-04 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 7e625beec31ac..37c1287066f9b 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-06-03 +date: 2024-06-04 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index f6feab6d054b1..8ef5eabc1ff01 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 5a91310ec9b47..c5ce9c4b89390 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-06-03 +date: 2024-06-04 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 551d4dfdd8650..c7883dd67c5cf 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-06-03 +date: 2024-06-04 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 9ba210a58c66b..f003d7c103466 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-06-03 +date: 2024-06-04 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 a0b8936fdafae..c8c59dfc253e3 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-06-03 +date: 2024-06-04 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 9e93f030bee2a..af8227058ba14 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_unified_data_table.devdocs.json index 62ec6c771ecc3..951029c44915f 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -532,7 +532,7 @@ "label": "UnifiedDataTable", "description": [], "signature": [ - "({ ariaLabelledBy, columns, columnsMeta, showColumnTokens, configHeaderRowHeight, headerRowHeightState, onUpdateHeaderRowHeight, controlColumnIds, dataView, loadingState, onFilter, onResize, onSetColumns, onSort, rows, searchDescription, searchTitle, settings, showTimeCol, showFullScreenButton, sort, useNewFieldsApi, isSortEnabled, isPaginationEnabled, cellActionsTriggerId, className, rowHeightState, onUpdateRowHeight, maxAllowedSampleSize, sampleSizeState, onUpdateSampleSize, isPlainRecord, rowsPerPageState, onUpdateRowsPerPage, onFieldEdited, services, renderCustomGridBody, renderCustomToolbar, trailingControlColumns, totalHits, onFetchMoreRecords, renderDocumentView, setExpandedDoc, expandedDoc, configRowHeight, showMultiFields, maxDocFieldsDisplayed, externalControlColumns, externalAdditionalControls, rowsPerPageOptions, visibleCellActions, externalCustomRenderers, consumer, componentsTourSteps, gridStyleOverride, rowLineHeightOverride, cellActionsMetadata, customGridColumnsConfiguration, customControlColumnsConfiguration, enableComparisonMode, cellContext, renderCellPopover, }: ", + "({ ariaLabelledBy, columns, columnsMeta, showColumnTokens, configHeaderRowHeight, headerRowHeightState, onUpdateHeaderRowHeight, controlColumnIds, dataView, loadingState, onFilter, onResize, onSetColumns, onSort, rows, searchDescription, searchTitle, settings, showTimeCol, showFullScreenButton, sort, useNewFieldsApi, isSortEnabled, isPaginationEnabled, cellActionsTriggerId, className, rowHeightState, onUpdateRowHeight, maxAllowedSampleSize, sampleSizeState, onUpdateSampleSize, isPlainRecord, rowsPerPageState, onUpdateRowsPerPage, onFieldEdited, services, renderCustomGridBody, renderCustomToolbar, trailingControlColumns, totalHits, onFetchMoreRecords, renderDocumentView, setExpandedDoc, expandedDoc, configRowHeight, showMultiFields, maxDocFieldsDisplayed, externalControlColumns, externalAdditionalControls, rowsPerPageOptions, visibleCellActions, externalCustomRenderers, additionalFieldGroups, consumer, componentsTourSteps, gridStyleOverride, rowLineHeightOverride, cellActionsMetadata, customGridColumnsConfiguration, customControlColumnsConfiguration, enableComparisonMode, cellContext, renderCellPopover, }: ", { "pluginId": "@kbn/unified-data-table", "scope": "common", @@ -551,7 +551,7 @@ "id": "def-common.UnifiedDataTable.$1", "type": "Object", "tags": [], - "label": "{\n ariaLabelledBy,\n columns,\n columnsMeta,\n showColumnTokens,\n configHeaderRowHeight,\n headerRowHeightState,\n onUpdateHeaderRowHeight,\n controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT,\n dataView,\n loadingState,\n onFilter,\n onResize,\n onSetColumns,\n onSort,\n rows,\n searchDescription,\n searchTitle,\n settings,\n showTimeCol,\n showFullScreenButton = true,\n sort,\n useNewFieldsApi,\n isSortEnabled = true,\n isPaginationEnabled = true,\n cellActionsTriggerId,\n className,\n rowHeightState,\n onUpdateRowHeight,\n maxAllowedSampleSize,\n sampleSizeState,\n onUpdateSampleSize,\n isPlainRecord = false,\n rowsPerPageState,\n onUpdateRowsPerPage,\n onFieldEdited,\n services,\n renderCustomGridBody,\n renderCustomToolbar,\n trailingControlColumns,\n totalHits,\n onFetchMoreRecords,\n renderDocumentView,\n setExpandedDoc,\n expandedDoc,\n configRowHeight,\n showMultiFields = true,\n maxDocFieldsDisplayed = 50,\n externalControlColumns,\n externalAdditionalControls,\n rowsPerPageOptions,\n visibleCellActions,\n externalCustomRenderers,\n consumer = 'discover',\n componentsTourSteps,\n gridStyleOverride,\n rowLineHeightOverride,\n cellActionsMetadata,\n customGridColumnsConfiguration,\n customControlColumnsConfiguration,\n enableComparisonMode,\n cellContext,\n renderCellPopover,\n}", + "label": "{\n ariaLabelledBy,\n columns,\n columnsMeta,\n showColumnTokens,\n configHeaderRowHeight,\n headerRowHeightState,\n onUpdateHeaderRowHeight,\n controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT,\n dataView,\n loadingState,\n onFilter,\n onResize,\n onSetColumns,\n onSort,\n rows,\n searchDescription,\n searchTitle,\n settings,\n showTimeCol,\n showFullScreenButton = true,\n sort,\n useNewFieldsApi,\n isSortEnabled = true,\n isPaginationEnabled = true,\n cellActionsTriggerId,\n className,\n rowHeightState,\n onUpdateRowHeight,\n maxAllowedSampleSize,\n sampleSizeState,\n onUpdateSampleSize,\n isPlainRecord = false,\n rowsPerPageState,\n onUpdateRowsPerPage,\n onFieldEdited,\n services,\n renderCustomGridBody,\n renderCustomToolbar,\n trailingControlColumns,\n totalHits,\n onFetchMoreRecords,\n renderDocumentView,\n setExpandedDoc,\n expandedDoc,\n configRowHeight,\n showMultiFields = true,\n maxDocFieldsDisplayed = 50,\n externalControlColumns,\n externalAdditionalControls,\n rowsPerPageOptions,\n visibleCellActions,\n externalCustomRenderers,\n additionalFieldGroups,\n consumer = 'discover',\n componentsTourSteps,\n gridStyleOverride,\n rowLineHeightOverride,\n cellActionsMetadata,\n customGridColumnsConfiguration,\n customControlColumnsConfiguration,\n enableComparisonMode,\n cellContext,\n renderCellPopover,\n}", "description": [], "signature": [ { @@ -2159,6 +2159,37 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-common.UnifiedDataTableProps.additionalFieldGroups", + "type": "Object", + "tags": [], + "label": "additionalFieldGroups", + "description": [ + "\nAn optional prop to provide awareness of additional field groups when paired with the Unified Field List." + ], + "signature": [ + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-common.UnifiedDataTableProps.customGridColumnsConfiguration", diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index e80b5673c1031..46e899eae011f 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.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 | |-------------------|-----------|------------------------|-----------------| -| 151 | 0 | 80 | 2 | +| 152 | 0 | 80 | 2 | ## Common diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 2a28e0e4d661c..f3bc90bb13cb3 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-06-03 +date: 2024-06-04 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.devdocs.json b/api_docs/kbn_unified_field_list.devdocs.json index 0b81540944ce4..c9bc5510c86c2 100644 --- a/api_docs/kbn_unified_field_list.devdocs.json +++ b/api_docs/kbn_unified_field_list.devdocs.json @@ -19,6 +19,41 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.convertFieldsToFallbackFields", + "type": "Function", + "tags": [], + "label": "convertFieldsToFallbackFields", + "description": [ + "\nConverts fields to fallback fields where necessary, e.g. in the case of Smart Fields which\ndon't map 1:1 with a real backing field." + ], + "signature": [ + "(props: FieldsInfo) => string[]" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.convertFieldsToFallbackFields.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "FieldsInfo" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-field-list", "id": "def-common.FieldItemButton", @@ -559,6 +594,249 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAllFallbackFields", + "type": "Function", + "tags": [], + "label": "getAllFallbackFields", + "description": [ + "\nProvides a flat list of all fallback fields" + ], + "signature": [ + "(additionalFieldGroups?: ", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined) => string[]" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAllFallbackFields.$1", + "type": "Object", + "tags": [], + "label": "additionalFieldGroups", + "description": [], + "signature": [ + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFields", + "type": "Function", + "tags": [], + "label": "getAssociatedSmartFields", + "description": [ + "\nReturns a list of Smart Fields associated with a given fallback field name." + ], + "signature": [ + "(fieldName: string, additionalFieldGroups?: ", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined) => string[]" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFields.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFields.$2", + "type": "Object", + "tags": [], + "label": "additionalFieldGroups", + "description": [], + "signature": [ + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFieldsAsString", + "type": "Function", + "tags": [], + "label": "getAssociatedSmartFieldsAsString", + "description": [ + "\nReturns a list of Smart Fields associated with a given fallback field name formatted as a string." + ], + "signature": [ + "(fieldName: string, additionalFieldGroups?: ", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined, delimiter?: string) => string" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFieldsAsString.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFieldsAsString.$2", + "type": "Object", + "tags": [], + "label": "additionalFieldGroups", + "description": [], + "signature": [ + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "<", + { + "pluginId": "@kbn/field-utils", + "scope": "common", + "docId": "kibKbnFieldUtilsPluginApi", + "section": "def-common.FieldBase", + "text": "FieldBase" + }, + "> | undefined" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.getAssociatedSmartFieldsAsString.$3", + "type": "string", + "tags": [], + "label": "delimiter", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-unified-field-list/src/utils/fallback_fields.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-field-list", "id": "def-common.getSearchMode", @@ -974,6 +1252,38 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.SmartFieldFallbackTooltip", + "type": "Function", + "tags": [], + "label": "SmartFieldFallbackTooltip", + "description": [], + "signature": [ + "React.ForwardRefExoticComponent<{ associatedSmartFields: string; } & { children?: React.ReactNode; } & React.RefAttributes<{}>>" + ], + "path": "packages/kbn-unified-field-list/src/components/fallback_fields/index.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.SmartFieldFallbackTooltip.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-field-list", "id": "def-common.triggerVisualizeActions", @@ -1600,6 +1910,58 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.AdditionalFieldGroups", + "type": "Interface", + "tags": [], + "label": "AdditionalFieldGroups", + "description": [], + "signature": [ + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + "" + ], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.AdditionalFieldGroups.smartFields", + "type": "Array", + "tags": [], + "label": "smartFields", + "description": [], + "signature": [ + "T[] | undefined" + ], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.AdditionalFieldGroups.fallbackFields", + "type": "Object", + "tags": [], + "label": "fallbackFields", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-field-list", "id": "def-common.BucketedAggregation", @@ -2947,21 +3309,69 @@ "description": [], "signature": [ "{ SpecialFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; SelectedFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; PopularFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; AvailableFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; EmptyFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; MetaFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; UnmappedFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; SmartFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; }" ], "path": "packages/kbn-unified-field-list/src/components/field_list_grouped/field_list_grouped.tsx", @@ -3486,6 +3896,76 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.FieldsGroup", + "type": "Interface", + "tags": [], + "label": "FieldsGroup", + "description": [], + "signature": [ + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, + " extends ", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroupDetails", + "text": "FieldsGroupDetails" + } + ], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.FieldsGroup.fields", + "type": "Array", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "T[]" + ], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.FieldsGroup.fieldCount", + "type": "number", + "tags": [], + "label": "fieldCount", + "description": [], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-field-list", + "id": "def-common.FieldsGroup.fieldSearchHighlight", + "type": "string", + "tags": [], + "label": "fieldSearchHighlight", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-unified-field-list/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-field-list", "id": "def-common.FieldsGroupDetails", @@ -4725,7 +5205,14 @@ "label": "additionalFieldGroups", "description": [], "signature": [ - "{ smartFields?: T[] | undefined; } | undefined" + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.AdditionalFieldGroups", + "text": "AdditionalFieldGroups" + }, + " | undefined" ], "path": "packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts", "deprecated": false, @@ -5429,21 +5916,69 @@ "description": [], "signature": [ "{ SpecialFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; SelectedFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; PopularFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; AvailableFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; EmptyFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; MetaFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; UnmappedFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; SmartFields?: ", - "FieldsGroup", + { + "pluginId": "@kbn/unified-field-list", + "scope": "common", + "docId": "kibKbnUnifiedFieldListPluginApi", + "section": "def-common.FieldsGroup", + "text": "FieldsGroup" + }, " | undefined; }" ], "path": "packages/kbn-unified-field-list/src/types.ts", diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index ea61067c12af0..a0186235a7a8f 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.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 | |-------------------|-----------|------------------------|-----------------| -| 293 | 0 | 269 | 9 | +| 313 | 0 | 284 | 8 | ## Common diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index f8debcbd743f8..12b3f70e5d8c4 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-06-03 +date: 2024-06-04 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 a466aa51f1741..4cecac96ef7b8 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-06-03 +date: 2024-06-04 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 512de884623fa..94e9edba2c556 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-06-03 +date: 2024-06-04 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 3e85c3f48733f..7c02ca9c037fa 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-06-03 +date: 2024-06-04 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 5b4f7885bbcbe..3a78c867a5933 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-06-03 +date: 2024-06-04 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 2bacd286e655a..ff8b8b83a4130 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-06-03 +date: 2024-06-04 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 fbf954fe03dd3..a2994f0efc73d 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-06-03 +date: 2024-06-04 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 a57443928bd87..0254c2e191923 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-06-03 +date: 2024-06-04 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 b3dd8c35cdcc3..4eb77d9b2450a 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-06-03 +date: 2024-06-04 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 d7ff9d9f424af..7eb62236f89ab 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-06-03 +date: 2024-06-04 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 68b7573491045..2a93666e7d5dc 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-06-03 +date: 2024-06-04 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 dc9b4d4c235d9..62b4f53dc3d85 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-06-03 +date: 2024-06-04 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 d5eccaeba5d70..f94119037f13a 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-06-03 +date: 2024-06-04 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 69ff9d8860e00..4af6dfa240796 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-06-03 +date: 2024-06-04 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 812bc47e169e3..73c0fd38181b8 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-06-03 +date: 2024-06-04 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 b2bd29b7cbbfc..5c0a387a3a4b3 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-06-03 +date: 2024-06-04 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 71b03e7271d09..d5e111d88c9e1 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-06-03 +date: 2024-06-04 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 2088b41eb1280..7d13cfcb77fc1 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-06-03 +date: 2024-06-04 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 927686eca4f5d..dd2c454636094 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-06-03 +date: 2024-06-04 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 d34bc601bf5c7..4106c89d16aaf 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-06-03 +date: 2024-06-04 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 92a7ce31964a3..dacf1a7d516ed 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index a53c5599b62ca..e3863f9840afa 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 575bfb3f1475c..822ad7ef859f5 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-06-03 +date: 2024-06-04 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 e4a52a2ab0100..39d5da75d1a74 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-06-03 +date: 2024-06-04 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 3a1cd6092091d..13b2b23fd3cc7 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-06-03 +date: 2024-06-04 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 e57b9ee86a787..9568d3a987895 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-06-03 +date: 2024-06-04 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 e08e5e85d68db..d42771ec6d16c 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-06-03 +date: 2024-06-04 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 a4a680866aa24..3c5517e607752 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-06-03 +date: 2024-06-04 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 13b94c3868b0d..d37441d295689 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-06-03 +date: 2024-06-04 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 3a1b9c760297c..95ba3fc6c3bf3 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-06-03 +date: 2024-06-04 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 fa5fc4acf42ef..dacb914d39fd6 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-06-03 +date: 2024-06-04 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 e793bcbdaa061..d255ead74837a 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.devdocs.json b/api_docs/navigation.devdocs.json index b7efc6f653965..477be6c8ab345 100644 --- a/api_docs/navigation.devdocs.json +++ b/api_docs/navigation.devdocs.json @@ -80,9 +80,7 @@ "section": "def-common.PluginInitializerContext", "text": "PluginInitializerContext" }, - "<", - "ConfigSchema", - ">" + "" ], "path": "src/plugins/navigation/public/plugin.tsx", "deprecated": false, @@ -1173,21 +1171,6 @@ "interfaces": [], "enums": [], "misc": [ - { - "parentPluginId": "navigation", - "id": "def-common.ENABLE_SOLUTION_NAV_UI_SETTING_ID", - "type": "string", - "tags": [], - "label": "ENABLE_SOLUTION_NAV_UI_SETTING_ID", - "description": [], - "signature": [ - "\"solutionNav:enable\"" - ], - "path": "src/plugins/navigation/common/constants.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "navigation", "id": "def-common.SOLUTION_NAV_FEATURE_FLAG_NAME", diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 021fce542ed61..818f64429f02f 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 50 | 0 | 48 | 5 | +| 49 | 0 | 47 | 4 | ## Client diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 5b0d5f0db5d5d..3e8b44a7caa0b 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-06-03 +date: 2024-06-04 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 6c641f5bd8568..74eb10c72c657 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-06-03 +date: 2024-06-04 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 b76e2285d8919..94eccc7b8e00c 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-06-03 +date: 2024-06-04 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 3c24e2fd03c90..4f782560a945d 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-06-03 +date: 2024-06-04 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 f84ba71db9f39..7238458b1cbd3 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-06-03 +date: 2024-06-04 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 13e2a95c54f10..603f447b04508 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-06-03 +date: 2024-06-04 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 f9b3e3953ecad..bb022b9fc2818 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-06-03 +date: 2024-06-04 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 fb1a8a0d57477..1b77d6f6561ec 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-06-03 +date: 2024-06-04 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 671aae415d564..fbedbb55cd24a 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-06-03 +date: 2024-06-04 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 07fc014614801..cdbc1d35c1fc3 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-06-03 +date: 2024-06-04 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 eca1c43f178cf..1583be3436896 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-06-03 +date: 2024-06-04 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 ee58fa6b718c4..c1ddf3e633355 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-06-03 +date: 2024-06-04 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 650e25faafcbb..df4bd9986df52 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48630 | 239 | 37135 | 1874 | +| 48663 | 239 | 37161 | 1871 | ## Plugin Directory @@ -74,7 +74,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 554 | 1 | 444 | 8 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 99 | 3 | 97 | 3 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The Event Annotation service contains expressions for event annotations | 201 | 0 | 201 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The listing page for event annotations. | 15 | 0 | 15 | 0 | @@ -139,7 +139,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 2 | 0 | 2 | 0 | | | [@elastic/stack-monitoring](https://github.com/orgs/elastic/teams/stack-monitoring) | - | 15 | 3 | 13 | 1 | | | [@elastic/stack-monitoring](https://github.com/orgs/elastic/teams/stack-monitoring) | - | 9 | 0 | 9 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 50 | 0 | 48 | 5 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 47 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | @@ -169,9 +169,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 80 | 0 | 79 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 32 | 0 | 8 | 4 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Plugin hosting shared features for connectors | 19 | 0 | 19 | 3 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 6 | 0 | 6 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 18 | 0 | 10 | 1 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Plugin hosting shared features for connectors | 19 | 0 | 19 | 3 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 6 | 0 | 6 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 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. | 413 | 0 | 205 | 3 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 191 | 0 | 121 | 37 | @@ -179,7 +179,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | Serverless customizations for observability. | 6 | 0 | 6 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Serverless customizations for search. | 6 | 0 | 6 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Serverless customizations for search. | 6 | 0 | 6 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 120 | 0 | 59 | 12 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 64 | 0 | 64 | 1 | @@ -348,7 +348,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 7 | 54 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 486 | 2 | 193 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 91 | 0 | 78 | 10 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 92 | 0 | 79 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 44 | 0 | 43 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | @@ -363,7 +363,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 40 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 38 | 0 | 31 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 41 | 0 | 34 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 61 | 0 | 34 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 5 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 0 | @@ -466,7 +466,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 3 | 0 | 3 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 45 | 0 | 33 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 16 | 0 | 16 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 16 | 0 | 16 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 5 | 0 | 5 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 8 | 0 | 8 | 0 | @@ -523,7 +523,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 59 | 0 | 59 | 4 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 44 | 0 | 44 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 44 | 0 | 44 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 13 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 86 | 0 | 78 | 6 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 35 | 0 | @@ -580,7 +580,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 55 | 1 | 50 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 10 | 0 | 10 | 2 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 99 | 1 | 99 | 0 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 3 | 0 | 3 | 1 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 6 | 0 | 6 | 1 | | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 6 | 0 | 6 | 0 | | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 15 | 0 | 15 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 45 | 0 | 45 | 10 | @@ -625,10 +625,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 125 | 0 | 122 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 76 | 0 | 76 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 3689 | 0 | 3689 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 76 | 0 | 76 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 3688 | 0 | 3688 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 25 | 0 | 25 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 25 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 7 | 0 | 7 | 0 | @@ -656,12 +656,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 28 | 0 | 25 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 120 | 0 | 116 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 49 | 0 | 44 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 62 | 0 | 58 | 1 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 69 | 0 | 64 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 31 | 0 | 30 | 1 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux @elastic/kibana-management @elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 7 | 1 | -| | [@elastic/enterprise-search-frontend @elastic/kibana-management](https://github.com/orgs/elastic/teams/enterprise-search-frontend ) | - | 1 | 0 | 1 | 0 | +| | [@elastic/search-kibana @elastic/kibana-management](https://github.com/orgs/elastic/teams/search-kibana ) | - | 1 | 0 | 1 | 0 | | | [@elastic/security-solution @elastic/kibana-management](https://github.com/orgs/elastic/teams/security-solution ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 4 | 0 | 4 | 0 | @@ -719,15 +719,15 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 72 | 0 | 55 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 11 | 0 | 11 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2 | 0 | 2 | 1 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 2 | 0 | 2 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 56 | 0 | 47 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 151 | 0 | 80 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 152 | 0 | 80 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 293 | 0 | 269 | 9 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 313 | 0 | 284 | 8 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 3 | 0 | 2 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 81 | 1 | 21 | 2 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index d5c6be8e22a5b..49fc72f2e3971 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-06-03 +date: 2024-06-04 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 c9fc75e2f6c37..56de8884b7c30 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-06-03 +date: 2024-06-04 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 62f88f52b51b1..71eb43fa2bf59 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-06-03 +date: 2024-06-04 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 85854e35038f7..35439b21b6924 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-06-03 +date: 2024-06-04 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 fd10f49523373..a301cc4b288b8 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-06-03 +date: 2024-06-04 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 fff12897c1fe2..832c2a0a7a3d8 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-06-03 +date: 2024-06-04 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 2921fc4e88a42..c014db72963d2 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-06-03 +date: 2024-06-04 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 e9e548b624c37..7a48328fdf9ec 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-06-03 +date: 2024-06-04 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 0f136356c5caf..a68ae9582e631 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-06-03 +date: 2024-06-04 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 194ed44bfca46..ed184b117b530 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-06-03 +date: 2024-06-04 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 e4c1b0eadbbf4..79b85027a872a 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-06-03 +date: 2024-06-04 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 f496f1838d1d0..e9dc040afc568 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-06-03 +date: 2024-06-04 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 324d6e21e2607..a7698dd7c3e66 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-06-03 +date: 2024-06-04 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 51d477d19ce61..8ab80c321153a 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-06-03 +date: 2024-06-04 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 88c6d77dcf52f..49899f3b26b6b 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-06-03 +date: 2024-06-04 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 4b28cf4fcdb69..81adee9a2860f 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-06-03 +date: 2024-06-04 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 2f23b6cf6391c..7b95c816ca250 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-06-03 +date: 2024-06-04 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 5ee754c0bbbbf..66785e44debea 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; Plugin hosting shared features for connectors -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 777977c3c9d4c..82351bc02e286 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 957a30f7e118b..91e613c57d9f7 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 5ea18291a811d..e6bc9204f407a 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-06-03 +date: 2024-06-04 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 bba0491d97d13..e23e3cae4b2fd 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -2762,14 +2762,14 @@ }, { "parentPluginId": "securitySolution", - "id": "def-server.SecuritySolutionApiRequestHandlerContext.getRulesManagementClient", + "id": "def-server.SecuritySolutionApiRequestHandlerContext.getDetectionRulesClient", "type": "Function", "tags": [], - "label": "getRulesManagementClient", + "label": "getDetectionRulesClient", "description": [], "signature": [ "() => ", - "IRulesManagementClient" + "IDetectionRulesClient" ], "path": "x-pack/plugins/security_solution/server/types.ts", "deprecated": false, @@ -3071,7 +3071,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3247,7 +3247,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3313,7 +3313,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index e3c0bb68af068..0dd6df84b3077 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index f35a3801361c9..e5d04ae6b556a 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-06-03 +date: 2024-06-04 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 a7164b9ffa9c4..2dbb3f871c840 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-06-03 +date: 2024-06-04 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 3c83361773180..280a7751c15e5 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-06-03 +date: 2024-06-04 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 83397ceb0753f..022a89830b987 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-06-03 +date: 2024-06-04 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 b65f369871182..2a567594b6bea 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; Serverless customizations for search. -Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. +Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index fe2c8e2981a77..5f9cee0d197e4 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-06-03 +date: 2024-06-04 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 b469f1a4ddc10..83ea1ecbe8ecb 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-06-03 +date: 2024-06-04 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 5cb0576893c6f..9ed2c6af9ded0 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-06-03 +date: 2024-06-04 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 42933f29c1b0e..19873ac479b89 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-06-03 +date: 2024-06-04 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 77d8128b7c3b6..71534892eaeab 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-06-03 +date: 2024-06-04 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 40d8bff136816..64a6f6689affe 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-06-03 +date: 2024-06-04 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 5fbc7e14c27c9..34f0ce2c7f6b3 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-06-03 +date: 2024-06-04 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 a48429d4a0c0d..5bc5e55948a7d 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-06-03 +date: 2024-06-04 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 742d1f9a288d8..6ff7cb029267c 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-06-03 +date: 2024-06-04 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 0e84afda5958b..2948f7a2c0b70 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-06-03 +date: 2024-06-04 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 a033e4ff84585..9f9f68e082c98 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-06-03 +date: 2024-06-04 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 db79160b90731..08e984131d364 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-06-03 +date: 2024-06-04 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 357cda7a10c77..623d4907c0b66 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-06-03 +date: 2024-06-04 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 1efb885c356ed..18fccff1df096 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-06-03 +date: 2024-06-04 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 4bfc7e28b8fbc..e16099051ee69 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-06-03 +date: 2024-06-04 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 64e5d81b4c896..053a25eeadb87 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-06-03 +date: 2024-06-04 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 19c0810cf12f4..62c5ff30f344f 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-06-03 +date: 2024-06-04 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 a5e2961454bf2..8e9c130946d1f 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-06-03 +date: 2024-06-04 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 fe68f2ac5dd08..15401bfddd611 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-06-03 +date: 2024-06-04 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 f36eda095cf51..892e1f2454b3c 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-06-03 +date: 2024-06-04 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 d751380491735..87b948582d9de 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-06-03 +date: 2024-06-04 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 2fbdff10b59ac..a64c2979a564c 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-06-03 +date: 2024-06-04 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 3ebbae14adfb1..2b6b1b59fb118 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-06-03 +date: 2024-06-04 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 f31cef6c357da..6ff011970c798 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-06-03 +date: 2024-06-04 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 9547822c0c145..a398871daa668 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-06-03 +date: 2024-06-04 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 671820bc464fe..53ce5f03606ab 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-06-03 +date: 2024-06-04 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 5f43c1ce7c97f..d46e89f1f085e 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-06-03 +date: 2024-06-04 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 ff4e1a89fc709..0a7f3c6c6891c 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-06-03 +date: 2024-06-04 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 aeec398bc4cce..5826f50b834b7 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-06-03 +date: 2024-06-04 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 82cf00f1c4aab..0b9b3054f0efc 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-06-03 +date: 2024-06-04 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 1b74efe0c392d..45d97506e4f8d 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-06-03 +date: 2024-06-04 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 413fc3e97870f..558d8755518f3 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-06-03 +date: 2024-06-04 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 76fc47660ebc1..365db00290378 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-06-03 +date: 2024-06-04 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 c995d516ad76e..54cb1d0d69c55 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-06-03 +date: 2024-06-04 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 73f89cc50ccea..1bbc4ad14065c 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-06-03 +date: 2024-06-04 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 2414fbcc3e0c7..75f05bb802217 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-06-03 +date: 2024-06-04 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 10b0a7dc69eb4..f33f110da39ac 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-06-03 +date: 2024-06-04 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 438b0917dcf8d..ab71f47a35e3d 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-06-03 +date: 2024-06-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From fb349c70067f82e398d6c2858e21493d6c03e543 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 4 Jun 2024 01:22:49 -0400 Subject: [PATCH 28/82] [ES|QL] Update grammars (#184625) This PR updates the ES|QL grammars (lexer and parser) to match the latest version in Elasticsearch. --------- Co-authored-by: Stratoula Kalafateli Co-authored-by: Drew Tate --- packages/kbn-esql-ast/src/antlr/esql_lexer.g4 | 45 + .../kbn-esql-ast/src/antlr/esql_lexer.interp | 34 +- .../kbn-esql-ast/src/antlr/esql_lexer.tokens | 326 ++-- packages/kbn-esql-ast/src/antlr/esql_lexer.ts | 1178 ++++++------ .../kbn-esql-ast/src/antlr/esql_parser.g4 | 13 +- .../kbn-esql-ast/src/antlr/esql_parser.interp | 18 +- .../kbn-esql-ast/src/antlr/esql_parser.tokens | 326 ++-- .../kbn-esql-ast/src/antlr/esql_parser.ts | 1643 +++++++++-------- .../src/antlr/esql_parser_listener.ts | 22 + packages/kbn-esql-ast/src/ast_walker.ts | 2 +- .../esql_validation_meta_tests.json | 13 +- .../src/validation/validation.test.ts | 12 +- 12 files changed, 1982 insertions(+), 1650 deletions(-) diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 index 1f0ba47ebbda2..39cb43b84d356 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 @@ -20,6 +20,7 @@ GROK : 'grok' -> pushMode(EXPRESSION_MODE); INLINESTATS : 'inlinestats' -> pushMode(EXPRESSION_MODE); KEEP : 'keep' -> pushMode(PROJECT_MODE); LIMIT : 'limit' -> pushMode(EXPRESSION_MODE); +LOOKUP : 'lookup' -> pushMode(LOOKUP_MODE); META : 'meta' -> pushMode(META_MODE); METRICS : 'metrics' -> pushMode(METRICS_MODE); MV_EXPAND : 'mv_expand' -> pushMode(MVEXPAND_MODE); @@ -354,6 +355,50 @@ ENRICH_FIELD_WS : WS -> channel(HIDDEN) ; +// LOOKUP ON key +mode LOOKUP_MODE; +LOOKUP_PIPE : PIPE -> type(PIPE), popMode; +LOOKUP_COMMA : COMMA -> type(COMMA); +LOOKUP_DOT: DOT -> type(DOT); +LOOKUP_ON : ON -> type(ON), pushMode(LOOKUP_FIELD_MODE); + +LOOKUP_INDEX_UNQUOTED_IDENTIFIER + : INDEX_UNQUOTED_IDENTIFIER -> type(INDEX_UNQUOTED_IDENTIFIER) + ; + +LOOKUP_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +LOOKUP_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +LOOKUP_WS + : WS -> channel(HIDDEN) + ; + +mode LOOKUP_FIELD_MODE; +LOOKUP_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode; +LOOKUP_FIELD_COMMA : COMMA -> type(COMMA); +LOOKUP_FIELD_DOT: DOT -> type(DOT); + +LOOKUP_FIELD_ID_PATTERN + : ID_PATTERN -> type(ID_PATTERN) + ; + +LOOKUP_FIELD_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +LOOKUP_FIELD_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +LOOKUP_FIELD_WS + : WS -> channel(HIDDEN) + ; + mode MVEXPAND_MODE; MVEXPAND_PIPE : PIPE -> type(PIPE), popMode; MVEXPAND_DOT: DOT -> type(DOT); diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp index 83ae6a73b0576..df8215d1a0461 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp @@ -10,6 +10,7 @@ null 'inlinestats' 'keep' 'limit' +'lookup' 'meta' 'metrics' 'mv_expand' @@ -97,6 +98,12 @@ null null null null +null +null +null +null +null +null 'info' null null @@ -129,6 +136,7 @@ GROK INLINESTATS KEEP LIMIT +LOOKUP META METRICS MV_EXPAND @@ -213,6 +221,12 @@ ENRICH_WS ENRICH_FIELD_LINE_COMMENT ENRICH_FIELD_MULTILINE_COMMENT ENRICH_FIELD_WS +LOOKUP_LINE_COMMENT +LOOKUP_MULTILINE_COMMENT +LOOKUP_WS +LOOKUP_FIELD_LINE_COMMENT +LOOKUP_FIELD_MULTILINE_COMMENT +LOOKUP_FIELD_WS MVEXPAND_LINE_COMMENT MVEXPAND_MULTILINE_COMMENT MVEXPAND_WS @@ -247,6 +261,7 @@ GROK INLINESTATS KEEP LIMIT +LOOKUP META METRICS MV_EXPAND @@ -374,6 +389,21 @@ ENRICH_FIELD_QUOTED_IDENTIFIER ENRICH_FIELD_LINE_COMMENT ENRICH_FIELD_MULTILINE_COMMENT ENRICH_FIELD_WS +LOOKUP_PIPE +LOOKUP_COMMA +LOOKUP_DOT +LOOKUP_ON +LOOKUP_INDEX_UNQUOTED_IDENTIFIER +LOOKUP_LINE_COMMENT +LOOKUP_MULTILINE_COMMENT +LOOKUP_WS +LOOKUP_FIELD_PIPE +LOOKUP_FIELD_COMMA +LOOKUP_FIELD_DOT +LOOKUP_FIELD_ID_PATTERN +LOOKUP_FIELD_LINE_COMMENT +LOOKUP_FIELD_MULTILINE_COMMENT +LOOKUP_FIELD_WS MVEXPAND_PIPE MVEXPAND_DOT MVEXPAND_QUOTED_IDENTIFIER @@ -424,6 +454,8 @@ PROJECT_MODE RENAME_MODE ENRICH_MODE ENRICH_FIELD_MODE +LOOKUP_MODE +LOOKUP_FIELD_MODE MVEXPAND_MODE SHOW_MODE META_MODE @@ -432,4 +464,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 116, 1297, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 522, 8, 19, 11, 19, 12, 19, 523, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 532, 8, 20, 10, 20, 12, 20, 535, 9, 20, 1, 20, 3, 20, 538, 8, 20, 1, 20, 3, 20, 541, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 550, 8, 21, 10, 21, 12, 21, 553, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 4, 22, 561, 8, 22, 11, 22, 12, 22, 562, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 3, 23, 570, 8, 23, 1, 24, 4, 24, 573, 8, 24, 11, 24, 12, 24, 574, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 3, 35, 614, 8, 35, 1, 35, 4, 35, 617, 8, 35, 11, 35, 12, 35, 618, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 628, 8, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 635, 8, 40, 1, 41, 1, 41, 1, 41, 5, 41, 640, 8, 41, 10, 41, 12, 41, 643, 9, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 651, 8, 41, 10, 41, 12, 41, 654, 9, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 661, 8, 41, 1, 41, 3, 41, 664, 8, 41, 3, 41, 666, 8, 41, 1, 42, 4, 42, 669, 8, 42, 11, 42, 12, 42, 670, 1, 43, 4, 43, 674, 8, 43, 11, 43, 12, 43, 675, 1, 43, 1, 43, 5, 43, 680, 8, 43, 10, 43, 12, 43, 683, 9, 43, 1, 43, 1, 43, 4, 43, 687, 8, 43, 11, 43, 12, 43, 688, 1, 43, 4, 43, 692, 8, 43, 11, 43, 12, 43, 693, 1, 43, 1, 43, 5, 43, 698, 8, 43, 10, 43, 12, 43, 701, 9, 43, 3, 43, 703, 8, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 709, 8, 43, 11, 43, 12, 43, 710, 1, 43, 1, 43, 3, 43, 715, 8, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 5, 81, 846, 8, 81, 10, 81, 12, 81, 849, 9, 81, 1, 81, 1, 81, 3, 81, 853, 8, 81, 1, 81, 4, 81, 856, 8, 81, 11, 81, 12, 81, 857, 3, 81, 860, 8, 81, 1, 82, 1, 82, 4, 82, 864, 8, 82, 11, 82, 12, 82, 865, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 951, 8, 101, 1, 102, 1, 102, 3, 102, 955, 8, 102, 1, 102, 5, 102, 958, 8, 102, 10, 102, 12, 102, 961, 9, 102, 1, 102, 1, 102, 3, 102, 965, 8, 102, 1, 102, 4, 102, 968, 8, 102, 11, 102, 12, 102, 969, 3, 102, 972, 8, 102, 1, 103, 1, 103, 4, 103, 976, 8, 103, 11, 103, 12, 103, 977, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 4, 121, 1053, 8, 121, 11, 121, 12, 121, 1054, 1, 121, 1, 121, 3, 121, 1059, 8, 121, 1, 121, 4, 121, 1062, 8, 121, 11, 121, 12, 121, 1063, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 4, 156, 1218, 8, 156, 11, 156, 12, 156, 1219, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 2, 551, 652, 0, 173, 14, 1, 16, 2, 18, 3, 20, 4, 22, 5, 24, 6, 26, 7, 28, 8, 30, 9, 32, 10, 34, 11, 36, 12, 38, 13, 40, 14, 42, 15, 44, 16, 46, 17, 48, 18, 50, 19, 52, 20, 54, 21, 56, 22, 58, 23, 60, 0, 62, 24, 64, 0, 66, 0, 68, 25, 70, 26, 72, 27, 74, 28, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 29, 98, 30, 100, 31, 102, 32, 104, 33, 106, 34, 108, 35, 110, 36, 112, 37, 114, 38, 116, 39, 118, 40, 120, 41, 122, 42, 124, 43, 126, 44, 128, 45, 130, 46, 132, 47, 134, 48, 136, 49, 138, 50, 140, 51, 142, 52, 144, 53, 146, 54, 148, 55, 150, 56, 152, 57, 154, 58, 156, 59, 158, 60, 160, 61, 162, 62, 164, 63, 166, 64, 168, 65, 170, 66, 172, 67, 174, 68, 176, 69, 178, 0, 180, 70, 182, 71, 184, 72, 186, 73, 188, 0, 190, 0, 192, 0, 194, 0, 196, 0, 198, 0, 200, 74, 202, 0, 204, 75, 206, 76, 208, 77, 210, 0, 212, 0, 214, 0, 216, 0, 218, 0, 220, 78, 222, 79, 224, 80, 226, 81, 228, 0, 230, 0, 232, 0, 234, 0, 236, 82, 238, 0, 240, 83, 242, 84, 244, 85, 246, 0, 248, 0, 250, 86, 252, 87, 254, 0, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 91, 268, 0, 270, 0, 272, 0, 274, 0, 276, 0, 278, 0, 280, 0, 282, 92, 284, 93, 286, 94, 288, 0, 290, 0, 292, 0, 294, 0, 296, 95, 298, 96, 300, 97, 302, 0, 304, 98, 306, 99, 308, 100, 310, 101, 312, 0, 314, 102, 316, 103, 318, 104, 320, 105, 322, 0, 324, 106, 326, 107, 328, 108, 330, 109, 332, 110, 334, 0, 336, 0, 338, 111, 340, 112, 342, 113, 344, 0, 346, 114, 348, 115, 350, 116, 352, 0, 354, 0, 356, 0, 358, 0, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 2, 0, 85, 85, 117, 117, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1322, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 1, 64, 1, 0, 0, 0, 1, 66, 1, 0, 0, 0, 1, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 2, 74, 1, 0, 0, 0, 2, 96, 1, 0, 0, 0, 2, 98, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 3, 190, 1, 0, 0, 0, 3, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 4, 210, 1, 0, 0, 0, 4, 212, 1, 0, 0, 0, 4, 214, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 6, 246, 1, 0, 0, 0, 6, 248, 1, 0, 0, 0, 6, 250, 1, 0, 0, 0, 6, 252, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 7, 268, 1, 0, 0, 0, 7, 270, 1, 0, 0, 0, 7, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 8, 290, 1, 0, 0, 0, 8, 292, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 9, 302, 1, 0, 0, 0, 9, 304, 1, 0, 0, 0, 9, 306, 1, 0, 0, 0, 9, 308, 1, 0, 0, 0, 9, 310, 1, 0, 0, 0, 10, 312, 1, 0, 0, 0, 10, 314, 1, 0, 0, 0, 10, 316, 1, 0, 0, 0, 10, 318, 1, 0, 0, 0, 10, 320, 1, 0, 0, 0, 11, 322, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 11, 326, 1, 0, 0, 0, 11, 328, 1, 0, 0, 0, 11, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 12, 334, 1, 0, 0, 0, 12, 336, 1, 0, 0, 0, 12, 338, 1, 0, 0, 0, 12, 340, 1, 0, 0, 0, 12, 342, 1, 0, 0, 0, 13, 344, 1, 0, 0, 0, 13, 346, 1, 0, 0, 0, 13, 348, 1, 0, 0, 0, 13, 350, 1, 0, 0, 0, 13, 352, 1, 0, 0, 0, 13, 354, 1, 0, 0, 0, 13, 356, 1, 0, 0, 0, 13, 358, 1, 0, 0, 0, 14, 360, 1, 0, 0, 0, 16, 370, 1, 0, 0, 0, 18, 377, 1, 0, 0, 0, 20, 386, 1, 0, 0, 0, 22, 393, 1, 0, 0, 0, 24, 403, 1, 0, 0, 0, 26, 410, 1, 0, 0, 0, 28, 417, 1, 0, 0, 0, 30, 431, 1, 0, 0, 0, 32, 438, 1, 0, 0, 0, 34, 446, 1, 0, 0, 0, 36, 453, 1, 0, 0, 0, 38, 463, 1, 0, 0, 0, 40, 475, 1, 0, 0, 0, 42, 484, 1, 0, 0, 0, 44, 490, 1, 0, 0, 0, 46, 497, 1, 0, 0, 0, 48, 504, 1, 0, 0, 0, 50, 512, 1, 0, 0, 0, 52, 521, 1, 0, 0, 0, 54, 527, 1, 0, 0, 0, 56, 544, 1, 0, 0, 0, 58, 560, 1, 0, 0, 0, 60, 569, 1, 0, 0, 0, 62, 572, 1, 0, 0, 0, 64, 576, 1, 0, 0, 0, 66, 581, 1, 0, 0, 0, 68, 586, 1, 0, 0, 0, 70, 590, 1, 0, 0, 0, 72, 594, 1, 0, 0, 0, 74, 598, 1, 0, 0, 0, 76, 602, 1, 0, 0, 0, 78, 604, 1, 0, 0, 0, 80, 606, 1, 0, 0, 0, 82, 609, 1, 0, 0, 0, 84, 611, 1, 0, 0, 0, 86, 620, 1, 0, 0, 0, 88, 622, 1, 0, 0, 0, 90, 627, 1, 0, 0, 0, 92, 629, 1, 0, 0, 0, 94, 634, 1, 0, 0, 0, 96, 665, 1, 0, 0, 0, 98, 668, 1, 0, 0, 0, 100, 714, 1, 0, 0, 0, 102, 716, 1, 0, 0, 0, 104, 719, 1, 0, 0, 0, 106, 723, 1, 0, 0, 0, 108, 727, 1, 0, 0, 0, 110, 729, 1, 0, 0, 0, 112, 732, 1, 0, 0, 0, 114, 734, 1, 0, 0, 0, 116, 739, 1, 0, 0, 0, 118, 741, 1, 0, 0, 0, 120, 747, 1, 0, 0, 0, 122, 753, 1, 0, 0, 0, 124, 758, 1, 0, 0, 0, 126, 760, 1, 0, 0, 0, 128, 763, 1, 0, 0, 0, 130, 766, 1, 0, 0, 0, 132, 771, 1, 0, 0, 0, 134, 775, 1, 0, 0, 0, 136, 780, 1, 0, 0, 0, 138, 786, 1, 0, 0, 0, 140, 789, 1, 0, 0, 0, 142, 791, 1, 0, 0, 0, 144, 797, 1, 0, 0, 0, 146, 799, 1, 0, 0, 0, 148, 804, 1, 0, 0, 0, 150, 807, 1, 0, 0, 0, 152, 810, 1, 0, 0, 0, 154, 813, 1, 0, 0, 0, 156, 815, 1, 0, 0, 0, 158, 818, 1, 0, 0, 0, 160, 820, 1, 0, 0, 0, 162, 823, 1, 0, 0, 0, 164, 825, 1, 0, 0, 0, 166, 827, 1, 0, 0, 0, 168, 829, 1, 0, 0, 0, 170, 831, 1, 0, 0, 0, 172, 833, 1, 0, 0, 0, 174, 838, 1, 0, 0, 0, 176, 859, 1, 0, 0, 0, 178, 861, 1, 0, 0, 0, 180, 869, 1, 0, 0, 0, 182, 871, 1, 0, 0, 0, 184, 875, 1, 0, 0, 0, 186, 879, 1, 0, 0, 0, 188, 883, 1, 0, 0, 0, 190, 888, 1, 0, 0, 0, 192, 892, 1, 0, 0, 0, 194, 896, 1, 0, 0, 0, 196, 900, 1, 0, 0, 0, 198, 904, 1, 0, 0, 0, 200, 908, 1, 0, 0, 0, 202, 917, 1, 0, 0, 0, 204, 921, 1, 0, 0, 0, 206, 925, 1, 0, 0, 0, 208, 929, 1, 0, 0, 0, 210, 933, 1, 0, 0, 0, 212, 938, 1, 0, 0, 0, 214, 942, 1, 0, 0, 0, 216, 950, 1, 0, 0, 0, 218, 971, 1, 0, 0, 0, 220, 975, 1, 0, 0, 0, 222, 979, 1, 0, 0, 0, 224, 983, 1, 0, 0, 0, 226, 987, 1, 0, 0, 0, 228, 991, 1, 0, 0, 0, 230, 996, 1, 0, 0, 0, 232, 1000, 1, 0, 0, 0, 234, 1004, 1, 0, 0, 0, 236, 1008, 1, 0, 0, 0, 238, 1011, 1, 0, 0, 0, 240, 1015, 1, 0, 0, 0, 242, 1019, 1, 0, 0, 0, 244, 1023, 1, 0, 0, 0, 246, 1027, 1, 0, 0, 0, 248, 1032, 1, 0, 0, 0, 250, 1037, 1, 0, 0, 0, 252, 1042, 1, 0, 0, 0, 254, 1049, 1, 0, 0, 0, 256, 1058, 1, 0, 0, 0, 258, 1065, 1, 0, 0, 0, 260, 1069, 1, 0, 0, 0, 262, 1073, 1, 0, 0, 0, 264, 1077, 1, 0, 0, 0, 266, 1081, 1, 0, 0, 0, 268, 1085, 1, 0, 0, 0, 270, 1091, 1, 0, 0, 0, 272, 1095, 1, 0, 0, 0, 274, 1099, 1, 0, 0, 0, 276, 1103, 1, 0, 0, 0, 278, 1107, 1, 0, 0, 0, 280, 1111, 1, 0, 0, 0, 282, 1115, 1, 0, 0, 0, 284, 1119, 1, 0, 0, 0, 286, 1123, 1, 0, 0, 0, 288, 1127, 1, 0, 0, 0, 290, 1132, 1, 0, 0, 0, 292, 1136, 1, 0, 0, 0, 294, 1140, 1, 0, 0, 0, 296, 1144, 1, 0, 0, 0, 298, 1148, 1, 0, 0, 0, 300, 1152, 1, 0, 0, 0, 302, 1156, 1, 0, 0, 0, 304, 1161, 1, 0, 0, 0, 306, 1166, 1, 0, 0, 0, 308, 1170, 1, 0, 0, 0, 310, 1174, 1, 0, 0, 0, 312, 1178, 1, 0, 0, 0, 314, 1183, 1, 0, 0, 0, 316, 1193, 1, 0, 0, 0, 318, 1197, 1, 0, 0, 0, 320, 1201, 1, 0, 0, 0, 322, 1205, 1, 0, 0, 0, 324, 1210, 1, 0, 0, 0, 326, 1217, 1, 0, 0, 0, 328, 1221, 1, 0, 0, 0, 330, 1225, 1, 0, 0, 0, 332, 1229, 1, 0, 0, 0, 334, 1233, 1, 0, 0, 0, 336, 1238, 1, 0, 0, 0, 338, 1244, 1, 0, 0, 0, 340, 1248, 1, 0, 0, 0, 342, 1252, 1, 0, 0, 0, 344, 1256, 1, 0, 0, 0, 346, 1262, 1, 0, 0, 0, 348, 1266, 1, 0, 0, 0, 350, 1270, 1, 0, 0, 0, 352, 1274, 1, 0, 0, 0, 354, 1280, 1, 0, 0, 0, 356, 1286, 1, 0, 0, 0, 358, 1292, 1, 0, 0, 0, 360, 361, 7, 0, 0, 0, 361, 362, 7, 1, 0, 0, 362, 363, 7, 2, 0, 0, 363, 364, 7, 2, 0, 0, 364, 365, 7, 3, 0, 0, 365, 366, 7, 4, 0, 0, 366, 367, 7, 5, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 6, 0, 0, 0, 369, 15, 1, 0, 0, 0, 370, 371, 7, 0, 0, 0, 371, 372, 7, 6, 0, 0, 372, 373, 7, 7, 0, 0, 373, 374, 7, 8, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 6, 1, 1, 0, 376, 17, 1, 0, 0, 0, 377, 378, 7, 3, 0, 0, 378, 379, 7, 9, 0, 0, 379, 380, 7, 6, 0, 0, 380, 381, 7, 1, 0, 0, 381, 382, 7, 4, 0, 0, 382, 383, 7, 10, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 6, 2, 2, 0, 385, 19, 1, 0, 0, 0, 386, 387, 7, 3, 0, 0, 387, 388, 7, 11, 0, 0, 388, 389, 7, 12, 0, 0, 389, 390, 7, 13, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 6, 3, 0, 0, 392, 21, 1, 0, 0, 0, 393, 394, 7, 3, 0, 0, 394, 395, 7, 14, 0, 0, 395, 396, 7, 8, 0, 0, 396, 397, 7, 13, 0, 0, 397, 398, 7, 12, 0, 0, 398, 399, 7, 1, 0, 0, 399, 400, 7, 9, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 6, 4, 3, 0, 402, 23, 1, 0, 0, 0, 403, 404, 7, 15, 0, 0, 404, 405, 7, 6, 0, 0, 405, 406, 7, 7, 0, 0, 406, 407, 7, 16, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 6, 5, 4, 0, 409, 25, 1, 0, 0, 0, 410, 411, 7, 17, 0, 0, 411, 412, 7, 6, 0, 0, 412, 413, 7, 7, 0, 0, 413, 414, 7, 18, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 6, 6, 0, 0, 416, 27, 1, 0, 0, 0, 417, 418, 7, 1, 0, 0, 418, 419, 7, 9, 0, 0, 419, 420, 7, 13, 0, 0, 420, 421, 7, 1, 0, 0, 421, 422, 7, 9, 0, 0, 422, 423, 7, 3, 0, 0, 423, 424, 7, 2, 0, 0, 424, 425, 7, 5, 0, 0, 425, 426, 7, 12, 0, 0, 426, 427, 7, 5, 0, 0, 427, 428, 7, 2, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 6, 7, 0, 0, 430, 29, 1, 0, 0, 0, 431, 432, 7, 18, 0, 0, 432, 433, 7, 3, 0, 0, 433, 434, 7, 3, 0, 0, 434, 435, 7, 8, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 6, 8, 1, 0, 437, 31, 1, 0, 0, 0, 438, 439, 7, 13, 0, 0, 439, 440, 7, 1, 0, 0, 440, 441, 7, 16, 0, 0, 441, 442, 7, 1, 0, 0, 442, 443, 7, 5, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 6, 9, 0, 0, 445, 33, 1, 0, 0, 0, 446, 447, 7, 16, 0, 0, 447, 448, 7, 3, 0, 0, 448, 449, 7, 5, 0, 0, 449, 450, 7, 12, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 10, 5, 0, 452, 35, 1, 0, 0, 0, 453, 454, 7, 16, 0, 0, 454, 455, 7, 3, 0, 0, 455, 456, 7, 5, 0, 0, 456, 457, 7, 6, 0, 0, 457, 458, 7, 1, 0, 0, 458, 459, 7, 4, 0, 0, 459, 460, 7, 2, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 6, 11, 6, 0, 462, 37, 1, 0, 0, 0, 463, 464, 7, 16, 0, 0, 464, 465, 7, 11, 0, 0, 465, 466, 5, 95, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 14, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 7, 12, 0, 0, 470, 471, 7, 9, 0, 0, 471, 472, 7, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 6, 12, 7, 0, 474, 39, 1, 0, 0, 0, 475, 476, 7, 6, 0, 0, 476, 477, 7, 3, 0, 0, 477, 478, 7, 9, 0, 0, 478, 479, 7, 12, 0, 0, 479, 480, 7, 16, 0, 0, 480, 481, 7, 3, 0, 0, 481, 482, 1, 0, 0, 0, 482, 483, 6, 13, 8, 0, 483, 41, 1, 0, 0, 0, 484, 485, 7, 6, 0, 0, 485, 486, 7, 7, 0, 0, 486, 487, 7, 19, 0, 0, 487, 488, 1, 0, 0, 0, 488, 489, 6, 14, 0, 0, 489, 43, 1, 0, 0, 0, 490, 491, 7, 2, 0, 0, 491, 492, 7, 10, 0, 0, 492, 493, 7, 7, 0, 0, 493, 494, 7, 19, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 6, 15, 9, 0, 496, 45, 1, 0, 0, 0, 497, 498, 7, 2, 0, 0, 498, 499, 7, 7, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 5, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 6, 16, 0, 0, 503, 47, 1, 0, 0, 0, 504, 505, 7, 2, 0, 0, 505, 506, 7, 5, 0, 0, 506, 507, 7, 12, 0, 0, 507, 508, 7, 5, 0, 0, 508, 509, 7, 2, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 6, 17, 0, 0, 511, 49, 1, 0, 0, 0, 512, 513, 7, 19, 0, 0, 513, 514, 7, 10, 0, 0, 514, 515, 7, 3, 0, 0, 515, 516, 7, 6, 0, 0, 516, 517, 7, 3, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 6, 18, 0, 0, 519, 51, 1, 0, 0, 0, 520, 522, 8, 20, 0, 0, 521, 520, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 6, 19, 0, 0, 526, 53, 1, 0, 0, 0, 527, 528, 5, 47, 0, 0, 528, 529, 5, 47, 0, 0, 529, 533, 1, 0, 0, 0, 530, 532, 8, 21, 0, 0, 531, 530, 1, 0, 0, 0, 532, 535, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 537, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 536, 538, 5, 13, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 540, 1, 0, 0, 0, 539, 541, 5, 10, 0, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 20, 10, 0, 543, 55, 1, 0, 0, 0, 544, 545, 5, 47, 0, 0, 545, 546, 5, 42, 0, 0, 546, 551, 1, 0, 0, 0, 547, 550, 3, 56, 21, 0, 548, 550, 9, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 555, 5, 42, 0, 0, 555, 556, 5, 47, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 21, 10, 0, 558, 57, 1, 0, 0, 0, 559, 561, 7, 22, 0, 0, 560, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 6, 22, 10, 0, 565, 59, 1, 0, 0, 0, 566, 570, 8, 23, 0, 0, 567, 568, 5, 47, 0, 0, 568, 570, 8, 24, 0, 0, 569, 566, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 570, 61, 1, 0, 0, 0, 571, 573, 3, 60, 23, 0, 572, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 572, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 63, 1, 0, 0, 0, 576, 577, 3, 172, 79, 0, 577, 578, 1, 0, 0, 0, 578, 579, 6, 25, 11, 0, 579, 580, 6, 25, 12, 0, 580, 65, 1, 0, 0, 0, 581, 582, 3, 74, 30, 0, 582, 583, 1, 0, 0, 0, 583, 584, 6, 26, 13, 0, 584, 585, 6, 26, 14, 0, 585, 67, 1, 0, 0, 0, 586, 587, 3, 58, 22, 0, 587, 588, 1, 0, 0, 0, 588, 589, 6, 27, 10, 0, 589, 69, 1, 0, 0, 0, 590, 591, 3, 54, 20, 0, 591, 592, 1, 0, 0, 0, 592, 593, 6, 28, 10, 0, 593, 71, 1, 0, 0, 0, 594, 595, 3, 56, 21, 0, 595, 596, 1, 0, 0, 0, 596, 597, 6, 29, 10, 0, 597, 73, 1, 0, 0, 0, 598, 599, 5, 124, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 6, 30, 14, 0, 601, 75, 1, 0, 0, 0, 602, 603, 7, 25, 0, 0, 603, 77, 1, 0, 0, 0, 604, 605, 7, 26, 0, 0, 605, 79, 1, 0, 0, 0, 606, 607, 5, 92, 0, 0, 607, 608, 7, 27, 0, 0, 608, 81, 1, 0, 0, 0, 609, 610, 8, 28, 0, 0, 610, 83, 1, 0, 0, 0, 611, 613, 7, 3, 0, 0, 612, 614, 7, 29, 0, 0, 613, 612, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 617, 3, 76, 31, 0, 616, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 85, 1, 0, 0, 0, 620, 621, 5, 64, 0, 0, 621, 87, 1, 0, 0, 0, 622, 623, 5, 96, 0, 0, 623, 89, 1, 0, 0, 0, 624, 628, 8, 30, 0, 0, 625, 626, 5, 96, 0, 0, 626, 628, 5, 96, 0, 0, 627, 624, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 628, 91, 1, 0, 0, 0, 629, 630, 5, 95, 0, 0, 630, 93, 1, 0, 0, 0, 631, 635, 3, 78, 32, 0, 632, 635, 3, 76, 31, 0, 633, 635, 3, 92, 39, 0, 634, 631, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 633, 1, 0, 0, 0, 635, 95, 1, 0, 0, 0, 636, 641, 5, 34, 0, 0, 637, 640, 3, 80, 33, 0, 638, 640, 3, 82, 34, 0, 639, 637, 1, 0, 0, 0, 639, 638, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 644, 1, 0, 0, 0, 643, 641, 1, 0, 0, 0, 644, 666, 5, 34, 0, 0, 645, 646, 5, 34, 0, 0, 646, 647, 5, 34, 0, 0, 647, 648, 5, 34, 0, 0, 648, 652, 1, 0, 0, 0, 649, 651, 8, 21, 0, 0, 650, 649, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 652, 650, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 655, 656, 5, 34, 0, 0, 656, 657, 5, 34, 0, 0, 657, 658, 5, 34, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 5, 34, 0, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 664, 5, 34, 0, 0, 663, 662, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 666, 1, 0, 0, 0, 665, 636, 1, 0, 0, 0, 665, 645, 1, 0, 0, 0, 666, 97, 1, 0, 0, 0, 667, 669, 3, 76, 31, 0, 668, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 99, 1, 0, 0, 0, 672, 674, 3, 76, 31, 0, 673, 672, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 673, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 681, 3, 116, 51, 0, 678, 680, 3, 76, 31, 0, 679, 678, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 715, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 686, 3, 116, 51, 0, 685, 687, 3, 76, 31, 0, 686, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 715, 1, 0, 0, 0, 690, 692, 3, 76, 31, 0, 691, 690, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 702, 1, 0, 0, 0, 695, 699, 3, 116, 51, 0, 696, 698, 3, 76, 31, 0, 697, 696, 1, 0, 0, 0, 698, 701, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 703, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 702, 695, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 705, 3, 84, 35, 0, 705, 715, 1, 0, 0, 0, 706, 708, 3, 116, 51, 0, 707, 709, 3, 76, 31, 0, 708, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 713, 3, 84, 35, 0, 713, 715, 1, 0, 0, 0, 714, 673, 1, 0, 0, 0, 714, 684, 1, 0, 0, 0, 714, 691, 1, 0, 0, 0, 714, 706, 1, 0, 0, 0, 715, 101, 1, 0, 0, 0, 716, 717, 7, 31, 0, 0, 717, 718, 7, 32, 0, 0, 718, 103, 1, 0, 0, 0, 719, 720, 7, 12, 0, 0, 720, 721, 7, 9, 0, 0, 721, 722, 7, 0, 0, 0, 722, 105, 1, 0, 0, 0, 723, 724, 7, 12, 0, 0, 724, 725, 7, 2, 0, 0, 725, 726, 7, 4, 0, 0, 726, 107, 1, 0, 0, 0, 727, 728, 5, 61, 0, 0, 728, 109, 1, 0, 0, 0, 729, 730, 5, 58, 0, 0, 730, 731, 5, 58, 0, 0, 731, 111, 1, 0, 0, 0, 732, 733, 5, 44, 0, 0, 733, 113, 1, 0, 0, 0, 734, 735, 7, 0, 0, 0, 735, 736, 7, 3, 0, 0, 736, 737, 7, 2, 0, 0, 737, 738, 7, 4, 0, 0, 738, 115, 1, 0, 0, 0, 739, 740, 5, 46, 0, 0, 740, 117, 1, 0, 0, 0, 741, 742, 7, 15, 0, 0, 742, 743, 7, 12, 0, 0, 743, 744, 7, 13, 0, 0, 744, 745, 7, 2, 0, 0, 745, 746, 7, 3, 0, 0, 746, 119, 1, 0, 0, 0, 747, 748, 7, 15, 0, 0, 748, 749, 7, 1, 0, 0, 749, 750, 7, 6, 0, 0, 750, 751, 7, 2, 0, 0, 751, 752, 7, 5, 0, 0, 752, 121, 1, 0, 0, 0, 753, 754, 7, 13, 0, 0, 754, 755, 7, 12, 0, 0, 755, 756, 7, 2, 0, 0, 756, 757, 7, 5, 0, 0, 757, 123, 1, 0, 0, 0, 758, 759, 5, 40, 0, 0, 759, 125, 1, 0, 0, 0, 760, 761, 7, 1, 0, 0, 761, 762, 7, 9, 0, 0, 762, 127, 1, 0, 0, 0, 763, 764, 7, 1, 0, 0, 764, 765, 7, 2, 0, 0, 765, 129, 1, 0, 0, 0, 766, 767, 7, 13, 0, 0, 767, 768, 7, 1, 0, 0, 768, 769, 7, 18, 0, 0, 769, 770, 7, 3, 0, 0, 770, 131, 1, 0, 0, 0, 771, 772, 7, 9, 0, 0, 772, 773, 7, 7, 0, 0, 773, 774, 7, 5, 0, 0, 774, 133, 1, 0, 0, 0, 775, 776, 7, 9, 0, 0, 776, 777, 7, 33, 0, 0, 777, 778, 7, 13, 0, 0, 778, 779, 7, 13, 0, 0, 779, 135, 1, 0, 0, 0, 780, 781, 7, 9, 0, 0, 781, 782, 7, 33, 0, 0, 782, 783, 7, 13, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 2, 0, 0, 785, 137, 1, 0, 0, 0, 786, 787, 7, 7, 0, 0, 787, 788, 7, 6, 0, 0, 788, 139, 1, 0, 0, 0, 789, 790, 5, 63, 0, 0, 790, 141, 1, 0, 0, 0, 791, 792, 7, 6, 0, 0, 792, 793, 7, 13, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 18, 0, 0, 795, 796, 7, 3, 0, 0, 796, 143, 1, 0, 0, 0, 797, 798, 5, 41, 0, 0, 798, 145, 1, 0, 0, 0, 799, 800, 7, 5, 0, 0, 800, 801, 7, 6, 0, 0, 801, 802, 7, 33, 0, 0, 802, 803, 7, 3, 0, 0, 803, 147, 1, 0, 0, 0, 804, 805, 5, 61, 0, 0, 805, 806, 5, 61, 0, 0, 806, 149, 1, 0, 0, 0, 807, 808, 5, 61, 0, 0, 808, 809, 5, 126, 0, 0, 809, 151, 1, 0, 0, 0, 810, 811, 5, 33, 0, 0, 811, 812, 5, 61, 0, 0, 812, 153, 1, 0, 0, 0, 813, 814, 5, 60, 0, 0, 814, 155, 1, 0, 0, 0, 815, 816, 5, 60, 0, 0, 816, 817, 5, 61, 0, 0, 817, 157, 1, 0, 0, 0, 818, 819, 5, 62, 0, 0, 819, 159, 1, 0, 0, 0, 820, 821, 5, 62, 0, 0, 821, 822, 5, 61, 0, 0, 822, 161, 1, 0, 0, 0, 823, 824, 5, 43, 0, 0, 824, 163, 1, 0, 0, 0, 825, 826, 5, 45, 0, 0, 826, 165, 1, 0, 0, 0, 827, 828, 5, 42, 0, 0, 828, 167, 1, 0, 0, 0, 829, 830, 5, 47, 0, 0, 830, 169, 1, 0, 0, 0, 831, 832, 5, 37, 0, 0, 832, 171, 1, 0, 0, 0, 833, 834, 5, 91, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 6, 79, 0, 0, 836, 837, 6, 79, 0, 0, 837, 173, 1, 0, 0, 0, 838, 839, 5, 93, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 6, 80, 14, 0, 841, 842, 6, 80, 14, 0, 842, 175, 1, 0, 0, 0, 843, 847, 3, 78, 32, 0, 844, 846, 3, 94, 40, 0, 845, 844, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 845, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 860, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 850, 853, 3, 92, 39, 0, 851, 853, 3, 86, 36, 0, 852, 850, 1, 0, 0, 0, 852, 851, 1, 0, 0, 0, 853, 855, 1, 0, 0, 0, 854, 856, 3, 94, 40, 0, 855, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 855, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 1, 0, 0, 0, 859, 843, 1, 0, 0, 0, 859, 852, 1, 0, 0, 0, 860, 177, 1, 0, 0, 0, 861, 863, 3, 88, 37, 0, 862, 864, 3, 90, 38, 0, 863, 862, 1, 0, 0, 0, 864, 865, 1, 0, 0, 0, 865, 863, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 867, 1, 0, 0, 0, 867, 868, 3, 88, 37, 0, 868, 179, 1, 0, 0, 0, 869, 870, 3, 178, 82, 0, 870, 181, 1, 0, 0, 0, 871, 872, 3, 54, 20, 0, 872, 873, 1, 0, 0, 0, 873, 874, 6, 84, 10, 0, 874, 183, 1, 0, 0, 0, 875, 876, 3, 56, 21, 0, 876, 877, 1, 0, 0, 0, 877, 878, 6, 85, 10, 0, 878, 185, 1, 0, 0, 0, 879, 880, 3, 58, 22, 0, 880, 881, 1, 0, 0, 0, 881, 882, 6, 86, 10, 0, 882, 187, 1, 0, 0, 0, 883, 884, 3, 74, 30, 0, 884, 885, 1, 0, 0, 0, 885, 886, 6, 87, 13, 0, 886, 887, 6, 87, 14, 0, 887, 189, 1, 0, 0, 0, 888, 889, 3, 172, 79, 0, 889, 890, 1, 0, 0, 0, 890, 891, 6, 88, 11, 0, 891, 191, 1, 0, 0, 0, 892, 893, 3, 174, 80, 0, 893, 894, 1, 0, 0, 0, 894, 895, 6, 89, 15, 0, 895, 193, 1, 0, 0, 0, 896, 897, 3, 112, 49, 0, 897, 898, 1, 0, 0, 0, 898, 899, 6, 90, 16, 0, 899, 195, 1, 0, 0, 0, 900, 901, 3, 108, 47, 0, 901, 902, 1, 0, 0, 0, 902, 903, 6, 91, 17, 0, 903, 197, 1, 0, 0, 0, 904, 905, 3, 96, 41, 0, 905, 906, 1, 0, 0, 0, 906, 907, 6, 92, 18, 0, 907, 199, 1, 0, 0, 0, 908, 909, 7, 16, 0, 0, 909, 910, 7, 3, 0, 0, 910, 911, 7, 5, 0, 0, 911, 912, 7, 12, 0, 0, 912, 913, 7, 0, 0, 0, 913, 914, 7, 12, 0, 0, 914, 915, 7, 5, 0, 0, 915, 916, 7, 12, 0, 0, 916, 201, 1, 0, 0, 0, 917, 918, 3, 62, 24, 0, 918, 919, 1, 0, 0, 0, 919, 920, 6, 94, 19, 0, 920, 203, 1, 0, 0, 0, 921, 922, 3, 54, 20, 0, 922, 923, 1, 0, 0, 0, 923, 924, 6, 95, 10, 0, 924, 205, 1, 0, 0, 0, 925, 926, 3, 56, 21, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 96, 10, 0, 928, 207, 1, 0, 0, 0, 929, 930, 3, 58, 22, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 97, 10, 0, 932, 209, 1, 0, 0, 0, 933, 934, 3, 74, 30, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 98, 13, 0, 936, 937, 6, 98, 14, 0, 937, 211, 1, 0, 0, 0, 938, 939, 3, 116, 51, 0, 939, 940, 1, 0, 0, 0, 940, 941, 6, 99, 20, 0, 941, 213, 1, 0, 0, 0, 942, 943, 3, 112, 49, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 100, 16, 0, 945, 215, 1, 0, 0, 0, 946, 951, 3, 78, 32, 0, 947, 951, 3, 76, 31, 0, 948, 951, 3, 92, 39, 0, 949, 951, 3, 166, 76, 0, 950, 946, 1, 0, 0, 0, 950, 947, 1, 0, 0, 0, 950, 948, 1, 0, 0, 0, 950, 949, 1, 0, 0, 0, 951, 217, 1, 0, 0, 0, 952, 955, 3, 78, 32, 0, 953, 955, 3, 166, 76, 0, 954, 952, 1, 0, 0, 0, 954, 953, 1, 0, 0, 0, 955, 959, 1, 0, 0, 0, 956, 958, 3, 216, 101, 0, 957, 956, 1, 0, 0, 0, 958, 961, 1, 0, 0, 0, 959, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 972, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 962, 965, 3, 92, 39, 0, 963, 965, 3, 86, 36, 0, 964, 962, 1, 0, 0, 0, 964, 963, 1, 0, 0, 0, 965, 967, 1, 0, 0, 0, 966, 968, 3, 216, 101, 0, 967, 966, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 972, 1, 0, 0, 0, 971, 954, 1, 0, 0, 0, 971, 964, 1, 0, 0, 0, 972, 219, 1, 0, 0, 0, 973, 976, 3, 218, 102, 0, 974, 976, 3, 178, 82, 0, 975, 973, 1, 0, 0, 0, 975, 974, 1, 0, 0, 0, 976, 977, 1, 0, 0, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 221, 1, 0, 0, 0, 979, 980, 3, 54, 20, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 104, 10, 0, 982, 223, 1, 0, 0, 0, 983, 984, 3, 56, 21, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 105, 10, 0, 986, 225, 1, 0, 0, 0, 987, 988, 3, 58, 22, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 106, 10, 0, 990, 227, 1, 0, 0, 0, 991, 992, 3, 74, 30, 0, 992, 993, 1, 0, 0, 0, 993, 994, 6, 107, 13, 0, 994, 995, 6, 107, 14, 0, 995, 229, 1, 0, 0, 0, 996, 997, 3, 108, 47, 0, 997, 998, 1, 0, 0, 0, 998, 999, 6, 108, 17, 0, 999, 231, 1, 0, 0, 0, 1000, 1001, 3, 112, 49, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 6, 109, 16, 0, 1003, 233, 1, 0, 0, 0, 1004, 1005, 3, 116, 51, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 6, 110, 20, 0, 1007, 235, 1, 0, 0, 0, 1008, 1009, 7, 12, 0, 0, 1009, 1010, 7, 2, 0, 0, 1010, 237, 1, 0, 0, 0, 1011, 1012, 3, 220, 103, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 6, 112, 21, 0, 1014, 239, 1, 0, 0, 0, 1015, 1016, 3, 54, 20, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 6, 113, 10, 0, 1018, 241, 1, 0, 0, 0, 1019, 1020, 3, 56, 21, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 6, 114, 10, 0, 1022, 243, 1, 0, 0, 0, 1023, 1024, 3, 58, 22, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 115, 10, 0, 1026, 245, 1, 0, 0, 0, 1027, 1028, 3, 74, 30, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 116, 13, 0, 1030, 1031, 6, 116, 14, 0, 1031, 247, 1, 0, 0, 0, 1032, 1033, 3, 172, 79, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 6, 117, 11, 0, 1035, 1036, 6, 117, 22, 0, 1036, 249, 1, 0, 0, 0, 1037, 1038, 7, 7, 0, 0, 1038, 1039, 7, 9, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 118, 23, 0, 1041, 251, 1, 0, 0, 0, 1042, 1043, 7, 19, 0, 0, 1043, 1044, 7, 1, 0, 0, 1044, 1045, 7, 5, 0, 0, 1045, 1046, 7, 10, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1048, 6, 119, 23, 0, 1048, 253, 1, 0, 0, 0, 1049, 1050, 8, 34, 0, 0, 1050, 255, 1, 0, 0, 0, 1051, 1053, 3, 254, 120, 0, 1052, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1057, 3, 324, 155, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1052, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1061, 1, 0, 0, 0, 1060, 1062, 3, 254, 120, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 257, 1, 0, 0, 0, 1065, 1066, 3, 180, 83, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 6, 122, 24, 0, 1068, 259, 1, 0, 0, 0, 1069, 1070, 3, 256, 121, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1072, 6, 123, 25, 0, 1072, 261, 1, 0, 0, 0, 1073, 1074, 3, 54, 20, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 124, 10, 0, 1076, 263, 1, 0, 0, 0, 1077, 1078, 3, 56, 21, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 6, 125, 10, 0, 1080, 265, 1, 0, 0, 0, 1081, 1082, 3, 58, 22, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 126, 10, 0, 1084, 267, 1, 0, 0, 0, 1085, 1086, 3, 74, 30, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1088, 6, 127, 13, 0, 1088, 1089, 6, 127, 14, 0, 1089, 1090, 6, 127, 14, 0, 1090, 269, 1, 0, 0, 0, 1091, 1092, 3, 108, 47, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 128, 17, 0, 1094, 271, 1, 0, 0, 0, 1095, 1096, 3, 112, 49, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 129, 16, 0, 1098, 273, 1, 0, 0, 0, 1099, 1100, 3, 116, 51, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 130, 20, 0, 1102, 275, 1, 0, 0, 0, 1103, 1104, 3, 252, 119, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 6, 131, 26, 0, 1106, 277, 1, 0, 0, 0, 1107, 1108, 3, 220, 103, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 132, 21, 0, 1110, 279, 1, 0, 0, 0, 1111, 1112, 3, 180, 83, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 133, 24, 0, 1114, 281, 1, 0, 0, 0, 1115, 1116, 3, 54, 20, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 134, 10, 0, 1118, 283, 1, 0, 0, 0, 1119, 1120, 3, 56, 21, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 135, 10, 0, 1122, 285, 1, 0, 0, 0, 1123, 1124, 3, 58, 22, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 136, 10, 0, 1126, 287, 1, 0, 0, 0, 1127, 1128, 3, 74, 30, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 137, 13, 0, 1130, 1131, 6, 137, 14, 0, 1131, 289, 1, 0, 0, 0, 1132, 1133, 3, 116, 51, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 138, 20, 0, 1135, 291, 1, 0, 0, 0, 1136, 1137, 3, 180, 83, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 6, 139, 24, 0, 1139, 293, 1, 0, 0, 0, 1140, 1141, 3, 176, 81, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1143, 6, 140, 27, 0, 1143, 295, 1, 0, 0, 0, 1144, 1145, 3, 54, 20, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 6, 141, 10, 0, 1147, 297, 1, 0, 0, 0, 1148, 1149, 3, 56, 21, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1151, 6, 142, 10, 0, 1151, 299, 1, 0, 0, 0, 1152, 1153, 3, 58, 22, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 6, 143, 10, 0, 1155, 301, 1, 0, 0, 0, 1156, 1157, 3, 74, 30, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 6, 144, 13, 0, 1159, 1160, 6, 144, 14, 0, 1160, 303, 1, 0, 0, 0, 1161, 1162, 7, 1, 0, 0, 1162, 1163, 7, 9, 0, 0, 1163, 1164, 7, 15, 0, 0, 1164, 1165, 7, 7, 0, 0, 1165, 305, 1, 0, 0, 0, 1166, 1167, 3, 54, 20, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 146, 10, 0, 1169, 307, 1, 0, 0, 0, 1170, 1171, 3, 56, 21, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 147, 10, 0, 1173, 309, 1, 0, 0, 0, 1174, 1175, 3, 58, 22, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 148, 10, 0, 1177, 311, 1, 0, 0, 0, 1178, 1179, 3, 74, 30, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 149, 13, 0, 1181, 1182, 6, 149, 14, 0, 1182, 313, 1, 0, 0, 0, 1183, 1184, 7, 15, 0, 0, 1184, 1185, 7, 33, 0, 0, 1185, 1186, 7, 9, 0, 0, 1186, 1187, 7, 4, 0, 0, 1187, 1188, 7, 5, 0, 0, 1188, 1189, 7, 1, 0, 0, 1189, 1190, 7, 7, 0, 0, 1190, 1191, 7, 9, 0, 0, 1191, 1192, 7, 2, 0, 0, 1192, 315, 1, 0, 0, 0, 1193, 1194, 3, 54, 20, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 6, 151, 10, 0, 1196, 317, 1, 0, 0, 0, 1197, 1198, 3, 56, 21, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1200, 6, 152, 10, 0, 1200, 319, 1, 0, 0, 0, 1201, 1202, 3, 58, 22, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 153, 10, 0, 1204, 321, 1, 0, 0, 0, 1205, 1206, 3, 174, 80, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 154, 15, 0, 1208, 1209, 6, 154, 14, 0, 1209, 323, 1, 0, 0, 0, 1210, 1211, 5, 58, 0, 0, 1211, 325, 1, 0, 0, 0, 1212, 1218, 3, 86, 36, 0, 1213, 1218, 3, 76, 31, 0, 1214, 1218, 3, 116, 51, 0, 1215, 1218, 3, 78, 32, 0, 1216, 1218, 3, 92, 39, 0, 1217, 1212, 1, 0, 0, 0, 1217, 1213, 1, 0, 0, 0, 1217, 1214, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1216, 1, 0, 0, 0, 1218, 1219, 1, 0, 0, 0, 1219, 1217, 1, 0, 0, 0, 1219, 1220, 1, 0, 0, 0, 1220, 327, 1, 0, 0, 0, 1221, 1222, 3, 54, 20, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1224, 6, 157, 10, 0, 1224, 329, 1, 0, 0, 0, 1225, 1226, 3, 56, 21, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 158, 10, 0, 1228, 331, 1, 0, 0, 0, 1229, 1230, 3, 58, 22, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 159, 10, 0, 1232, 333, 1, 0, 0, 0, 1233, 1234, 3, 74, 30, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 6, 160, 13, 0, 1236, 1237, 6, 160, 14, 0, 1237, 335, 1, 0, 0, 0, 1238, 1239, 3, 62, 24, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 161, 19, 0, 1241, 1242, 6, 161, 14, 0, 1242, 1243, 6, 161, 28, 0, 1243, 337, 1, 0, 0, 0, 1244, 1245, 3, 54, 20, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 162, 10, 0, 1247, 339, 1, 0, 0, 0, 1248, 1249, 3, 56, 21, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 163, 10, 0, 1251, 341, 1, 0, 0, 0, 1252, 1253, 3, 58, 22, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 164, 10, 0, 1255, 343, 1, 0, 0, 0, 1256, 1257, 3, 112, 49, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 6, 165, 16, 0, 1259, 1260, 6, 165, 14, 0, 1260, 1261, 6, 165, 6, 0, 1261, 345, 1, 0, 0, 0, 1262, 1263, 3, 54, 20, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 166, 10, 0, 1265, 347, 1, 0, 0, 0, 1266, 1267, 3, 56, 21, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 167, 10, 0, 1269, 349, 1, 0, 0, 0, 1270, 1271, 3, 58, 22, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 168, 10, 0, 1273, 351, 1, 0, 0, 0, 1274, 1275, 3, 180, 83, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 169, 14, 0, 1277, 1278, 6, 169, 0, 0, 1278, 1279, 6, 169, 24, 0, 1279, 353, 1, 0, 0, 0, 1280, 1281, 3, 176, 81, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 6, 170, 14, 0, 1283, 1284, 6, 170, 0, 0, 1284, 1285, 6, 170, 27, 0, 1285, 355, 1, 0, 0, 0, 1286, 1287, 3, 102, 44, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 171, 14, 0, 1289, 1290, 6, 171, 0, 0, 1290, 1291, 6, 171, 29, 0, 1291, 357, 1, 0, 0, 0, 1292, 1293, 3, 74, 30, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 6, 172, 13, 0, 1295, 1296, 6, 172, 14, 0, 1296, 359, 1, 0, 0, 0, 60, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 523, 533, 537, 540, 549, 551, 562, 569, 574, 613, 618, 627, 634, 639, 641, 652, 660, 663, 665, 670, 675, 681, 688, 693, 699, 702, 710, 714, 847, 852, 857, 859, 865, 950, 954, 959, 964, 969, 971, 975, 977, 1054, 1058, 1063, 1217, 1219, 30, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 10, 0, 5, 12, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 67, 0, 5, 0, 0, 7, 28, 0, 4, 0, 0, 7, 68, 0, 7, 37, 0, 7, 35, 0, 7, 29, 0, 7, 24, 0, 7, 39, 0, 7, 78, 0, 5, 11, 0, 5, 7, 0, 7, 70, 0, 7, 88, 0, 7, 87, 0, 7, 69, 0, 5, 13, 0, 7, 32, 0] \ No newline at end of file +[4, 0, 123, 1404, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 565, 8, 20, 11, 20, 12, 20, 566, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 575, 8, 21, 10, 21, 12, 21, 578, 9, 21, 1, 21, 3, 21, 581, 8, 21, 1, 21, 3, 21, 584, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 593, 8, 22, 10, 22, 12, 22, 596, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 604, 8, 23, 11, 23, 12, 23, 605, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 3, 24, 613, 8, 24, 1, 25, 4, 25, 616, 8, 25, 11, 25, 12, 25, 617, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 3, 36, 657, 8, 36, 1, 36, 4, 36, 660, 8, 36, 11, 36, 12, 36, 661, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 671, 8, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 678, 8, 41, 1, 42, 1, 42, 1, 42, 5, 42, 683, 8, 42, 10, 42, 12, 42, 686, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 694, 8, 42, 10, 42, 12, 42, 697, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 704, 8, 42, 1, 42, 3, 42, 707, 8, 42, 3, 42, 709, 8, 42, 1, 43, 4, 43, 712, 8, 43, 11, 43, 12, 43, 713, 1, 44, 4, 44, 717, 8, 44, 11, 44, 12, 44, 718, 1, 44, 1, 44, 5, 44, 723, 8, 44, 10, 44, 12, 44, 726, 9, 44, 1, 44, 1, 44, 4, 44, 730, 8, 44, 11, 44, 12, 44, 731, 1, 44, 4, 44, 735, 8, 44, 11, 44, 12, 44, 736, 1, 44, 1, 44, 5, 44, 741, 8, 44, 10, 44, 12, 44, 744, 9, 44, 3, 44, 746, 8, 44, 1, 44, 1, 44, 1, 44, 1, 44, 4, 44, 752, 8, 44, 11, 44, 12, 44, 753, 1, 44, 1, 44, 3, 44, 758, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 5, 82, 889, 8, 82, 10, 82, 12, 82, 892, 9, 82, 1, 82, 1, 82, 3, 82, 896, 8, 82, 1, 82, 4, 82, 899, 8, 82, 11, 82, 12, 82, 900, 3, 82, 903, 8, 82, 1, 83, 1, 83, 4, 83, 907, 8, 83, 11, 83, 12, 83, 908, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 3, 102, 994, 8, 102, 1, 103, 1, 103, 3, 103, 998, 8, 103, 1, 103, 5, 103, 1001, 8, 103, 10, 103, 12, 103, 1004, 9, 103, 1, 103, 1, 103, 3, 103, 1008, 8, 103, 1, 103, 4, 103, 1011, 8, 103, 11, 103, 12, 103, 1012, 3, 103, 1015, 8, 103, 1, 104, 1, 104, 4, 104, 1019, 8, 104, 11, 104, 12, 104, 1020, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 4, 122, 1096, 8, 122, 11, 122, 12, 122, 1097, 1, 122, 1, 122, 3, 122, 1102, 8, 122, 1, 122, 4, 122, 1105, 8, 122, 11, 122, 12, 122, 1106, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 4, 172, 1325, 8, 172, 11, 172, 12, 172, 1326, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 2, 594, 695, 0, 189, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 0, 66, 25, 68, 0, 70, 0, 72, 26, 74, 27, 76, 28, 78, 29, 80, 0, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 30, 102, 31, 104, 32, 106, 33, 108, 34, 110, 35, 112, 36, 114, 37, 116, 38, 118, 39, 120, 40, 122, 41, 124, 42, 126, 43, 128, 44, 130, 45, 132, 46, 134, 47, 136, 48, 138, 49, 140, 50, 142, 51, 144, 52, 146, 53, 148, 54, 150, 55, 152, 56, 154, 57, 156, 58, 158, 59, 160, 60, 162, 61, 164, 62, 166, 63, 168, 64, 170, 65, 172, 66, 174, 67, 176, 68, 178, 69, 180, 70, 182, 0, 184, 71, 186, 72, 188, 73, 190, 74, 192, 0, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 75, 206, 0, 208, 76, 210, 77, 212, 78, 214, 0, 216, 0, 218, 0, 220, 0, 222, 0, 224, 79, 226, 80, 228, 81, 230, 82, 232, 0, 234, 0, 236, 0, 238, 0, 240, 83, 242, 0, 244, 84, 246, 85, 248, 86, 250, 0, 252, 0, 254, 87, 256, 88, 258, 0, 260, 89, 262, 0, 264, 0, 266, 90, 268, 91, 270, 92, 272, 0, 274, 0, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 93, 288, 94, 290, 95, 292, 0, 294, 0, 296, 0, 298, 0, 300, 0, 302, 96, 304, 97, 306, 98, 308, 0, 310, 0, 312, 0, 314, 0, 316, 99, 318, 100, 320, 101, 322, 0, 324, 0, 326, 0, 328, 0, 330, 102, 332, 103, 334, 104, 336, 0, 338, 105, 340, 106, 342, 107, 344, 108, 346, 0, 348, 109, 350, 110, 352, 111, 354, 112, 356, 0, 358, 113, 360, 114, 362, 115, 364, 116, 366, 117, 368, 0, 370, 0, 372, 118, 374, 119, 376, 120, 378, 0, 380, 121, 382, 122, 384, 123, 386, 0, 388, 0, 390, 0, 392, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 85, 85, 117, 117, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1427, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 1, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 1, 74, 1, 0, 0, 0, 1, 76, 1, 0, 0, 0, 2, 78, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 3, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 4, 214, 1, 0, 0, 0, 4, 216, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 228, 1, 0, 0, 0, 4, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 6, 250, 1, 0, 0, 0, 6, 252, 1, 0, 0, 0, 6, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 7, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 8, 292, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 9, 308, 1, 0, 0, 0, 9, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 10, 332, 1, 0, 0, 0, 10, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 13, 356, 1, 0, 0, 0, 13, 358, 1, 0, 0, 0, 13, 360, 1, 0, 0, 0, 13, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 14, 368, 1, 0, 0, 0, 14, 370, 1, 0, 0, 0, 14, 372, 1, 0, 0, 0, 14, 374, 1, 0, 0, 0, 14, 376, 1, 0, 0, 0, 15, 378, 1, 0, 0, 0, 15, 380, 1, 0, 0, 0, 15, 382, 1, 0, 0, 0, 15, 384, 1, 0, 0, 0, 15, 386, 1, 0, 0, 0, 15, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 16, 394, 1, 0, 0, 0, 18, 404, 1, 0, 0, 0, 20, 411, 1, 0, 0, 0, 22, 420, 1, 0, 0, 0, 24, 427, 1, 0, 0, 0, 26, 437, 1, 0, 0, 0, 28, 444, 1, 0, 0, 0, 30, 451, 1, 0, 0, 0, 32, 465, 1, 0, 0, 0, 34, 472, 1, 0, 0, 0, 36, 480, 1, 0, 0, 0, 38, 489, 1, 0, 0, 0, 40, 496, 1, 0, 0, 0, 42, 506, 1, 0, 0, 0, 44, 518, 1, 0, 0, 0, 46, 527, 1, 0, 0, 0, 48, 533, 1, 0, 0, 0, 50, 540, 1, 0, 0, 0, 52, 547, 1, 0, 0, 0, 54, 555, 1, 0, 0, 0, 56, 564, 1, 0, 0, 0, 58, 570, 1, 0, 0, 0, 60, 587, 1, 0, 0, 0, 62, 603, 1, 0, 0, 0, 64, 612, 1, 0, 0, 0, 66, 615, 1, 0, 0, 0, 68, 619, 1, 0, 0, 0, 70, 624, 1, 0, 0, 0, 72, 629, 1, 0, 0, 0, 74, 633, 1, 0, 0, 0, 76, 637, 1, 0, 0, 0, 78, 641, 1, 0, 0, 0, 80, 645, 1, 0, 0, 0, 82, 647, 1, 0, 0, 0, 84, 649, 1, 0, 0, 0, 86, 652, 1, 0, 0, 0, 88, 654, 1, 0, 0, 0, 90, 663, 1, 0, 0, 0, 92, 665, 1, 0, 0, 0, 94, 670, 1, 0, 0, 0, 96, 672, 1, 0, 0, 0, 98, 677, 1, 0, 0, 0, 100, 708, 1, 0, 0, 0, 102, 711, 1, 0, 0, 0, 104, 757, 1, 0, 0, 0, 106, 759, 1, 0, 0, 0, 108, 762, 1, 0, 0, 0, 110, 766, 1, 0, 0, 0, 112, 770, 1, 0, 0, 0, 114, 772, 1, 0, 0, 0, 116, 775, 1, 0, 0, 0, 118, 777, 1, 0, 0, 0, 120, 782, 1, 0, 0, 0, 122, 784, 1, 0, 0, 0, 124, 790, 1, 0, 0, 0, 126, 796, 1, 0, 0, 0, 128, 801, 1, 0, 0, 0, 130, 803, 1, 0, 0, 0, 132, 806, 1, 0, 0, 0, 134, 809, 1, 0, 0, 0, 136, 814, 1, 0, 0, 0, 138, 818, 1, 0, 0, 0, 140, 823, 1, 0, 0, 0, 142, 829, 1, 0, 0, 0, 144, 832, 1, 0, 0, 0, 146, 834, 1, 0, 0, 0, 148, 840, 1, 0, 0, 0, 150, 842, 1, 0, 0, 0, 152, 847, 1, 0, 0, 0, 154, 850, 1, 0, 0, 0, 156, 853, 1, 0, 0, 0, 158, 856, 1, 0, 0, 0, 160, 858, 1, 0, 0, 0, 162, 861, 1, 0, 0, 0, 164, 863, 1, 0, 0, 0, 166, 866, 1, 0, 0, 0, 168, 868, 1, 0, 0, 0, 170, 870, 1, 0, 0, 0, 172, 872, 1, 0, 0, 0, 174, 874, 1, 0, 0, 0, 176, 876, 1, 0, 0, 0, 178, 881, 1, 0, 0, 0, 180, 902, 1, 0, 0, 0, 182, 904, 1, 0, 0, 0, 184, 912, 1, 0, 0, 0, 186, 914, 1, 0, 0, 0, 188, 918, 1, 0, 0, 0, 190, 922, 1, 0, 0, 0, 192, 926, 1, 0, 0, 0, 194, 931, 1, 0, 0, 0, 196, 935, 1, 0, 0, 0, 198, 939, 1, 0, 0, 0, 200, 943, 1, 0, 0, 0, 202, 947, 1, 0, 0, 0, 204, 951, 1, 0, 0, 0, 206, 960, 1, 0, 0, 0, 208, 964, 1, 0, 0, 0, 210, 968, 1, 0, 0, 0, 212, 972, 1, 0, 0, 0, 214, 976, 1, 0, 0, 0, 216, 981, 1, 0, 0, 0, 218, 985, 1, 0, 0, 0, 220, 993, 1, 0, 0, 0, 222, 1014, 1, 0, 0, 0, 224, 1018, 1, 0, 0, 0, 226, 1022, 1, 0, 0, 0, 228, 1026, 1, 0, 0, 0, 230, 1030, 1, 0, 0, 0, 232, 1034, 1, 0, 0, 0, 234, 1039, 1, 0, 0, 0, 236, 1043, 1, 0, 0, 0, 238, 1047, 1, 0, 0, 0, 240, 1051, 1, 0, 0, 0, 242, 1054, 1, 0, 0, 0, 244, 1058, 1, 0, 0, 0, 246, 1062, 1, 0, 0, 0, 248, 1066, 1, 0, 0, 0, 250, 1070, 1, 0, 0, 0, 252, 1075, 1, 0, 0, 0, 254, 1080, 1, 0, 0, 0, 256, 1085, 1, 0, 0, 0, 258, 1092, 1, 0, 0, 0, 260, 1101, 1, 0, 0, 0, 262, 1108, 1, 0, 0, 0, 264, 1112, 1, 0, 0, 0, 266, 1116, 1, 0, 0, 0, 268, 1120, 1, 0, 0, 0, 270, 1124, 1, 0, 0, 0, 272, 1128, 1, 0, 0, 0, 274, 1134, 1, 0, 0, 0, 276, 1138, 1, 0, 0, 0, 278, 1142, 1, 0, 0, 0, 280, 1146, 1, 0, 0, 0, 282, 1150, 1, 0, 0, 0, 284, 1154, 1, 0, 0, 0, 286, 1158, 1, 0, 0, 0, 288, 1162, 1, 0, 0, 0, 290, 1166, 1, 0, 0, 0, 292, 1170, 1, 0, 0, 0, 294, 1175, 1, 0, 0, 0, 296, 1179, 1, 0, 0, 0, 298, 1183, 1, 0, 0, 0, 300, 1188, 1, 0, 0, 0, 302, 1192, 1, 0, 0, 0, 304, 1196, 1, 0, 0, 0, 306, 1200, 1, 0, 0, 0, 308, 1204, 1, 0, 0, 0, 310, 1210, 1, 0, 0, 0, 312, 1214, 1, 0, 0, 0, 314, 1218, 1, 0, 0, 0, 316, 1222, 1, 0, 0, 0, 318, 1226, 1, 0, 0, 0, 320, 1230, 1, 0, 0, 0, 322, 1234, 1, 0, 0, 0, 324, 1239, 1, 0, 0, 0, 326, 1243, 1, 0, 0, 0, 328, 1247, 1, 0, 0, 0, 330, 1251, 1, 0, 0, 0, 332, 1255, 1, 0, 0, 0, 334, 1259, 1, 0, 0, 0, 336, 1263, 1, 0, 0, 0, 338, 1268, 1, 0, 0, 0, 340, 1273, 1, 0, 0, 0, 342, 1277, 1, 0, 0, 0, 344, 1281, 1, 0, 0, 0, 346, 1285, 1, 0, 0, 0, 348, 1290, 1, 0, 0, 0, 350, 1300, 1, 0, 0, 0, 352, 1304, 1, 0, 0, 0, 354, 1308, 1, 0, 0, 0, 356, 1312, 1, 0, 0, 0, 358, 1317, 1, 0, 0, 0, 360, 1324, 1, 0, 0, 0, 362, 1328, 1, 0, 0, 0, 364, 1332, 1, 0, 0, 0, 366, 1336, 1, 0, 0, 0, 368, 1340, 1, 0, 0, 0, 370, 1345, 1, 0, 0, 0, 372, 1351, 1, 0, 0, 0, 374, 1355, 1, 0, 0, 0, 376, 1359, 1, 0, 0, 0, 378, 1363, 1, 0, 0, 0, 380, 1369, 1, 0, 0, 0, 382, 1373, 1, 0, 0, 0, 384, 1377, 1, 0, 0, 0, 386, 1381, 1, 0, 0, 0, 388, 1387, 1, 0, 0, 0, 390, 1393, 1, 0, 0, 0, 392, 1399, 1, 0, 0, 0, 394, 395, 7, 0, 0, 0, 395, 396, 7, 1, 0, 0, 396, 397, 7, 2, 0, 0, 397, 398, 7, 2, 0, 0, 398, 399, 7, 3, 0, 0, 399, 400, 7, 4, 0, 0, 400, 401, 7, 5, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 6, 0, 0, 0, 403, 17, 1, 0, 0, 0, 404, 405, 7, 0, 0, 0, 405, 406, 7, 6, 0, 0, 406, 407, 7, 7, 0, 0, 407, 408, 7, 8, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 6, 1, 1, 0, 410, 19, 1, 0, 0, 0, 411, 412, 7, 3, 0, 0, 412, 413, 7, 9, 0, 0, 413, 414, 7, 6, 0, 0, 414, 415, 7, 1, 0, 0, 415, 416, 7, 4, 0, 0, 416, 417, 7, 10, 0, 0, 417, 418, 1, 0, 0, 0, 418, 419, 6, 2, 2, 0, 419, 21, 1, 0, 0, 0, 420, 421, 7, 3, 0, 0, 421, 422, 7, 11, 0, 0, 422, 423, 7, 12, 0, 0, 423, 424, 7, 13, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 6, 3, 0, 0, 426, 23, 1, 0, 0, 0, 427, 428, 7, 3, 0, 0, 428, 429, 7, 14, 0, 0, 429, 430, 7, 8, 0, 0, 430, 431, 7, 13, 0, 0, 431, 432, 7, 12, 0, 0, 432, 433, 7, 1, 0, 0, 433, 434, 7, 9, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 6, 4, 3, 0, 436, 25, 1, 0, 0, 0, 437, 438, 7, 15, 0, 0, 438, 439, 7, 6, 0, 0, 439, 440, 7, 7, 0, 0, 440, 441, 7, 16, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 6, 5, 4, 0, 443, 27, 1, 0, 0, 0, 444, 445, 7, 17, 0, 0, 445, 446, 7, 6, 0, 0, 446, 447, 7, 7, 0, 0, 447, 448, 7, 18, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 6, 0, 0, 450, 29, 1, 0, 0, 0, 451, 452, 7, 1, 0, 0, 452, 453, 7, 9, 0, 0, 453, 454, 7, 13, 0, 0, 454, 455, 7, 1, 0, 0, 455, 456, 7, 9, 0, 0, 456, 457, 7, 3, 0, 0, 457, 458, 7, 2, 0, 0, 458, 459, 7, 5, 0, 0, 459, 460, 7, 12, 0, 0, 460, 461, 7, 5, 0, 0, 461, 462, 7, 2, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 7, 0, 0, 464, 31, 1, 0, 0, 0, 465, 466, 7, 18, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 8, 1, 0, 471, 33, 1, 0, 0, 0, 472, 473, 7, 13, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 16, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 5, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 9, 0, 0, 479, 35, 1, 0, 0, 0, 480, 481, 7, 13, 0, 0, 481, 482, 7, 7, 0, 0, 482, 483, 7, 7, 0, 0, 483, 484, 7, 18, 0, 0, 484, 485, 7, 19, 0, 0, 485, 486, 7, 8, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 6, 10, 5, 0, 488, 37, 1, 0, 0, 0, 489, 490, 7, 16, 0, 0, 490, 491, 7, 3, 0, 0, 491, 492, 7, 5, 0, 0, 492, 493, 7, 12, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 6, 11, 6, 0, 495, 39, 1, 0, 0, 0, 496, 497, 7, 16, 0, 0, 497, 498, 7, 3, 0, 0, 498, 499, 7, 5, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 1, 0, 0, 501, 502, 7, 4, 0, 0, 502, 503, 7, 2, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 6, 12, 7, 0, 505, 41, 1, 0, 0, 0, 506, 507, 7, 16, 0, 0, 507, 508, 7, 11, 0, 0, 508, 509, 5, 95, 0, 0, 509, 510, 7, 3, 0, 0, 510, 511, 7, 14, 0, 0, 511, 512, 7, 8, 0, 0, 512, 513, 7, 12, 0, 0, 513, 514, 7, 9, 0, 0, 514, 515, 7, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 6, 13, 8, 0, 517, 43, 1, 0, 0, 0, 518, 519, 7, 6, 0, 0, 519, 520, 7, 3, 0, 0, 520, 521, 7, 9, 0, 0, 521, 522, 7, 12, 0, 0, 522, 523, 7, 16, 0, 0, 523, 524, 7, 3, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 6, 14, 9, 0, 526, 45, 1, 0, 0, 0, 527, 528, 7, 6, 0, 0, 528, 529, 7, 7, 0, 0, 529, 530, 7, 20, 0, 0, 530, 531, 1, 0, 0, 0, 531, 532, 6, 15, 0, 0, 532, 47, 1, 0, 0, 0, 533, 534, 7, 2, 0, 0, 534, 535, 7, 10, 0, 0, 535, 536, 7, 7, 0, 0, 536, 537, 7, 20, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 6, 16, 10, 0, 539, 49, 1, 0, 0, 0, 540, 541, 7, 2, 0, 0, 541, 542, 7, 7, 0, 0, 542, 543, 7, 6, 0, 0, 543, 544, 7, 5, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 6, 17, 0, 0, 546, 51, 1, 0, 0, 0, 547, 548, 7, 2, 0, 0, 548, 549, 7, 5, 0, 0, 549, 550, 7, 12, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 6, 18, 0, 0, 554, 53, 1, 0, 0, 0, 555, 556, 7, 20, 0, 0, 556, 557, 7, 10, 0, 0, 557, 558, 7, 3, 0, 0, 558, 559, 7, 6, 0, 0, 559, 560, 7, 3, 0, 0, 560, 561, 1, 0, 0, 0, 561, 562, 6, 19, 0, 0, 562, 55, 1, 0, 0, 0, 563, 565, 8, 21, 0, 0, 564, 563, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 6, 20, 0, 0, 569, 57, 1, 0, 0, 0, 570, 571, 5, 47, 0, 0, 571, 572, 5, 47, 0, 0, 572, 576, 1, 0, 0, 0, 573, 575, 8, 22, 0, 0, 574, 573, 1, 0, 0, 0, 575, 578, 1, 0, 0, 0, 576, 574, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 580, 1, 0, 0, 0, 578, 576, 1, 0, 0, 0, 579, 581, 5, 13, 0, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 583, 1, 0, 0, 0, 582, 584, 5, 10, 0, 0, 583, 582, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 6, 21, 11, 0, 586, 59, 1, 0, 0, 0, 587, 588, 5, 47, 0, 0, 588, 589, 5, 42, 0, 0, 589, 594, 1, 0, 0, 0, 590, 593, 3, 60, 22, 0, 591, 593, 9, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 591, 1, 0, 0, 0, 593, 596, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 595, 597, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 598, 5, 42, 0, 0, 598, 599, 5, 47, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 6, 22, 11, 0, 601, 61, 1, 0, 0, 0, 602, 604, 7, 23, 0, 0, 603, 602, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 6, 23, 11, 0, 608, 63, 1, 0, 0, 0, 609, 613, 8, 24, 0, 0, 610, 611, 5, 47, 0, 0, 611, 613, 8, 25, 0, 0, 612, 609, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 65, 1, 0, 0, 0, 614, 616, 3, 64, 24, 0, 615, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 67, 1, 0, 0, 0, 619, 620, 3, 176, 80, 0, 620, 621, 1, 0, 0, 0, 621, 622, 6, 26, 12, 0, 622, 623, 6, 26, 13, 0, 623, 69, 1, 0, 0, 0, 624, 625, 3, 78, 31, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 27, 14, 0, 627, 628, 6, 27, 15, 0, 628, 71, 1, 0, 0, 0, 629, 630, 3, 62, 23, 0, 630, 631, 1, 0, 0, 0, 631, 632, 6, 28, 11, 0, 632, 73, 1, 0, 0, 0, 633, 634, 3, 58, 21, 0, 634, 635, 1, 0, 0, 0, 635, 636, 6, 29, 11, 0, 636, 75, 1, 0, 0, 0, 637, 638, 3, 60, 22, 0, 638, 639, 1, 0, 0, 0, 639, 640, 6, 30, 11, 0, 640, 77, 1, 0, 0, 0, 641, 642, 5, 124, 0, 0, 642, 643, 1, 0, 0, 0, 643, 644, 6, 31, 15, 0, 644, 79, 1, 0, 0, 0, 645, 646, 7, 26, 0, 0, 646, 81, 1, 0, 0, 0, 647, 648, 7, 27, 0, 0, 648, 83, 1, 0, 0, 0, 649, 650, 5, 92, 0, 0, 650, 651, 7, 28, 0, 0, 651, 85, 1, 0, 0, 0, 652, 653, 8, 29, 0, 0, 653, 87, 1, 0, 0, 0, 654, 656, 7, 3, 0, 0, 655, 657, 7, 30, 0, 0, 656, 655, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 660, 3, 80, 32, 0, 659, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 89, 1, 0, 0, 0, 663, 664, 5, 64, 0, 0, 664, 91, 1, 0, 0, 0, 665, 666, 5, 96, 0, 0, 666, 93, 1, 0, 0, 0, 667, 671, 8, 31, 0, 0, 668, 669, 5, 96, 0, 0, 669, 671, 5, 96, 0, 0, 670, 667, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 671, 95, 1, 0, 0, 0, 672, 673, 5, 95, 0, 0, 673, 97, 1, 0, 0, 0, 674, 678, 3, 82, 33, 0, 675, 678, 3, 80, 32, 0, 676, 678, 3, 96, 40, 0, 677, 674, 1, 0, 0, 0, 677, 675, 1, 0, 0, 0, 677, 676, 1, 0, 0, 0, 678, 99, 1, 0, 0, 0, 679, 684, 5, 34, 0, 0, 680, 683, 3, 84, 34, 0, 681, 683, 3, 86, 35, 0, 682, 680, 1, 0, 0, 0, 682, 681, 1, 0, 0, 0, 683, 686, 1, 0, 0, 0, 684, 682, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 687, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 687, 709, 5, 34, 0, 0, 688, 689, 5, 34, 0, 0, 689, 690, 5, 34, 0, 0, 690, 691, 5, 34, 0, 0, 691, 695, 1, 0, 0, 0, 692, 694, 8, 22, 0, 0, 693, 692, 1, 0, 0, 0, 694, 697, 1, 0, 0, 0, 695, 696, 1, 0, 0, 0, 695, 693, 1, 0, 0, 0, 696, 698, 1, 0, 0, 0, 697, 695, 1, 0, 0, 0, 698, 699, 5, 34, 0, 0, 699, 700, 5, 34, 0, 0, 700, 701, 5, 34, 0, 0, 701, 703, 1, 0, 0, 0, 702, 704, 5, 34, 0, 0, 703, 702, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 706, 1, 0, 0, 0, 705, 707, 5, 34, 0, 0, 706, 705, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 709, 1, 0, 0, 0, 708, 679, 1, 0, 0, 0, 708, 688, 1, 0, 0, 0, 709, 101, 1, 0, 0, 0, 710, 712, 3, 80, 32, 0, 711, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 103, 1, 0, 0, 0, 715, 717, 3, 80, 32, 0, 716, 715, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 720, 1, 0, 0, 0, 720, 724, 3, 120, 52, 0, 721, 723, 3, 80, 32, 0, 722, 721, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 758, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 729, 3, 120, 52, 0, 728, 730, 3, 80, 32, 0, 729, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 729, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 758, 1, 0, 0, 0, 733, 735, 3, 80, 32, 0, 734, 733, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 745, 1, 0, 0, 0, 738, 742, 3, 120, 52, 0, 739, 741, 3, 80, 32, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 746, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 738, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 3, 88, 36, 0, 748, 758, 1, 0, 0, 0, 749, 751, 3, 120, 52, 0, 750, 752, 3, 80, 32, 0, 751, 750, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 3, 88, 36, 0, 756, 758, 1, 0, 0, 0, 757, 716, 1, 0, 0, 0, 757, 727, 1, 0, 0, 0, 757, 734, 1, 0, 0, 0, 757, 749, 1, 0, 0, 0, 758, 105, 1, 0, 0, 0, 759, 760, 7, 32, 0, 0, 760, 761, 7, 33, 0, 0, 761, 107, 1, 0, 0, 0, 762, 763, 7, 12, 0, 0, 763, 764, 7, 9, 0, 0, 764, 765, 7, 0, 0, 0, 765, 109, 1, 0, 0, 0, 766, 767, 7, 12, 0, 0, 767, 768, 7, 2, 0, 0, 768, 769, 7, 4, 0, 0, 769, 111, 1, 0, 0, 0, 770, 771, 5, 61, 0, 0, 771, 113, 1, 0, 0, 0, 772, 773, 5, 58, 0, 0, 773, 774, 5, 58, 0, 0, 774, 115, 1, 0, 0, 0, 775, 776, 5, 44, 0, 0, 776, 117, 1, 0, 0, 0, 777, 778, 7, 0, 0, 0, 778, 779, 7, 3, 0, 0, 779, 780, 7, 2, 0, 0, 780, 781, 7, 4, 0, 0, 781, 119, 1, 0, 0, 0, 782, 783, 5, 46, 0, 0, 783, 121, 1, 0, 0, 0, 784, 785, 7, 15, 0, 0, 785, 786, 7, 12, 0, 0, 786, 787, 7, 13, 0, 0, 787, 788, 7, 2, 0, 0, 788, 789, 7, 3, 0, 0, 789, 123, 1, 0, 0, 0, 790, 791, 7, 15, 0, 0, 791, 792, 7, 1, 0, 0, 792, 793, 7, 6, 0, 0, 793, 794, 7, 2, 0, 0, 794, 795, 7, 5, 0, 0, 795, 125, 1, 0, 0, 0, 796, 797, 7, 13, 0, 0, 797, 798, 7, 12, 0, 0, 798, 799, 7, 2, 0, 0, 799, 800, 7, 5, 0, 0, 800, 127, 1, 0, 0, 0, 801, 802, 5, 40, 0, 0, 802, 129, 1, 0, 0, 0, 803, 804, 7, 1, 0, 0, 804, 805, 7, 9, 0, 0, 805, 131, 1, 0, 0, 0, 806, 807, 7, 1, 0, 0, 807, 808, 7, 2, 0, 0, 808, 133, 1, 0, 0, 0, 809, 810, 7, 13, 0, 0, 810, 811, 7, 1, 0, 0, 811, 812, 7, 18, 0, 0, 812, 813, 7, 3, 0, 0, 813, 135, 1, 0, 0, 0, 814, 815, 7, 9, 0, 0, 815, 816, 7, 7, 0, 0, 816, 817, 7, 5, 0, 0, 817, 137, 1, 0, 0, 0, 818, 819, 7, 9, 0, 0, 819, 820, 7, 19, 0, 0, 820, 821, 7, 13, 0, 0, 821, 822, 7, 13, 0, 0, 822, 139, 1, 0, 0, 0, 823, 824, 7, 9, 0, 0, 824, 825, 7, 19, 0, 0, 825, 826, 7, 13, 0, 0, 826, 827, 7, 13, 0, 0, 827, 828, 7, 2, 0, 0, 828, 141, 1, 0, 0, 0, 829, 830, 7, 7, 0, 0, 830, 831, 7, 6, 0, 0, 831, 143, 1, 0, 0, 0, 832, 833, 5, 63, 0, 0, 833, 145, 1, 0, 0, 0, 834, 835, 7, 6, 0, 0, 835, 836, 7, 13, 0, 0, 836, 837, 7, 1, 0, 0, 837, 838, 7, 18, 0, 0, 838, 839, 7, 3, 0, 0, 839, 147, 1, 0, 0, 0, 840, 841, 5, 41, 0, 0, 841, 149, 1, 0, 0, 0, 842, 843, 7, 5, 0, 0, 843, 844, 7, 6, 0, 0, 844, 845, 7, 19, 0, 0, 845, 846, 7, 3, 0, 0, 846, 151, 1, 0, 0, 0, 847, 848, 5, 61, 0, 0, 848, 849, 5, 61, 0, 0, 849, 153, 1, 0, 0, 0, 850, 851, 5, 61, 0, 0, 851, 852, 5, 126, 0, 0, 852, 155, 1, 0, 0, 0, 853, 854, 5, 33, 0, 0, 854, 855, 5, 61, 0, 0, 855, 157, 1, 0, 0, 0, 856, 857, 5, 60, 0, 0, 857, 159, 1, 0, 0, 0, 858, 859, 5, 60, 0, 0, 859, 860, 5, 61, 0, 0, 860, 161, 1, 0, 0, 0, 861, 862, 5, 62, 0, 0, 862, 163, 1, 0, 0, 0, 863, 864, 5, 62, 0, 0, 864, 865, 5, 61, 0, 0, 865, 165, 1, 0, 0, 0, 866, 867, 5, 43, 0, 0, 867, 167, 1, 0, 0, 0, 868, 869, 5, 45, 0, 0, 869, 169, 1, 0, 0, 0, 870, 871, 5, 42, 0, 0, 871, 171, 1, 0, 0, 0, 872, 873, 5, 47, 0, 0, 873, 173, 1, 0, 0, 0, 874, 875, 5, 37, 0, 0, 875, 175, 1, 0, 0, 0, 876, 877, 5, 91, 0, 0, 877, 878, 1, 0, 0, 0, 878, 879, 6, 80, 0, 0, 879, 880, 6, 80, 0, 0, 880, 177, 1, 0, 0, 0, 881, 882, 5, 93, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 6, 81, 15, 0, 884, 885, 6, 81, 15, 0, 885, 179, 1, 0, 0, 0, 886, 890, 3, 82, 33, 0, 887, 889, 3, 98, 41, 0, 888, 887, 1, 0, 0, 0, 889, 892, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 903, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 893, 896, 3, 96, 40, 0, 894, 896, 3, 90, 37, 0, 895, 893, 1, 0, 0, 0, 895, 894, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 98, 41, 0, 898, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 886, 1, 0, 0, 0, 902, 895, 1, 0, 0, 0, 903, 181, 1, 0, 0, 0, 904, 906, 3, 92, 38, 0, 905, 907, 3, 94, 39, 0, 906, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 911, 3, 92, 38, 0, 911, 183, 1, 0, 0, 0, 912, 913, 3, 182, 83, 0, 913, 185, 1, 0, 0, 0, 914, 915, 3, 58, 21, 0, 915, 916, 1, 0, 0, 0, 916, 917, 6, 85, 11, 0, 917, 187, 1, 0, 0, 0, 918, 919, 3, 60, 22, 0, 919, 920, 1, 0, 0, 0, 920, 921, 6, 86, 11, 0, 921, 189, 1, 0, 0, 0, 922, 923, 3, 62, 23, 0, 923, 924, 1, 0, 0, 0, 924, 925, 6, 87, 11, 0, 925, 191, 1, 0, 0, 0, 926, 927, 3, 78, 31, 0, 927, 928, 1, 0, 0, 0, 928, 929, 6, 88, 14, 0, 929, 930, 6, 88, 15, 0, 930, 193, 1, 0, 0, 0, 931, 932, 3, 176, 80, 0, 932, 933, 1, 0, 0, 0, 933, 934, 6, 89, 12, 0, 934, 195, 1, 0, 0, 0, 935, 936, 3, 178, 81, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 90, 16, 0, 938, 197, 1, 0, 0, 0, 939, 940, 3, 116, 50, 0, 940, 941, 1, 0, 0, 0, 941, 942, 6, 91, 17, 0, 942, 199, 1, 0, 0, 0, 943, 944, 3, 112, 48, 0, 944, 945, 1, 0, 0, 0, 945, 946, 6, 92, 18, 0, 946, 201, 1, 0, 0, 0, 947, 948, 3, 100, 42, 0, 948, 949, 1, 0, 0, 0, 949, 950, 6, 93, 19, 0, 950, 203, 1, 0, 0, 0, 951, 952, 7, 16, 0, 0, 952, 953, 7, 3, 0, 0, 953, 954, 7, 5, 0, 0, 954, 955, 7, 12, 0, 0, 955, 956, 7, 0, 0, 0, 956, 957, 7, 12, 0, 0, 957, 958, 7, 5, 0, 0, 958, 959, 7, 12, 0, 0, 959, 205, 1, 0, 0, 0, 960, 961, 3, 66, 25, 0, 961, 962, 1, 0, 0, 0, 962, 963, 6, 95, 20, 0, 963, 207, 1, 0, 0, 0, 964, 965, 3, 58, 21, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 96, 11, 0, 967, 209, 1, 0, 0, 0, 968, 969, 3, 60, 22, 0, 969, 970, 1, 0, 0, 0, 970, 971, 6, 97, 11, 0, 971, 211, 1, 0, 0, 0, 972, 973, 3, 62, 23, 0, 973, 974, 1, 0, 0, 0, 974, 975, 6, 98, 11, 0, 975, 213, 1, 0, 0, 0, 976, 977, 3, 78, 31, 0, 977, 978, 1, 0, 0, 0, 978, 979, 6, 99, 14, 0, 979, 980, 6, 99, 15, 0, 980, 215, 1, 0, 0, 0, 981, 982, 3, 120, 52, 0, 982, 983, 1, 0, 0, 0, 983, 984, 6, 100, 21, 0, 984, 217, 1, 0, 0, 0, 985, 986, 3, 116, 50, 0, 986, 987, 1, 0, 0, 0, 987, 988, 6, 101, 17, 0, 988, 219, 1, 0, 0, 0, 989, 994, 3, 82, 33, 0, 990, 994, 3, 80, 32, 0, 991, 994, 3, 96, 40, 0, 992, 994, 3, 170, 77, 0, 993, 989, 1, 0, 0, 0, 993, 990, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 993, 992, 1, 0, 0, 0, 994, 221, 1, 0, 0, 0, 995, 998, 3, 82, 33, 0, 996, 998, 3, 170, 77, 0, 997, 995, 1, 0, 0, 0, 997, 996, 1, 0, 0, 0, 998, 1002, 1, 0, 0, 0, 999, 1001, 3, 220, 102, 0, 1000, 999, 1, 0, 0, 0, 1001, 1004, 1, 0, 0, 0, 1002, 1000, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1015, 1, 0, 0, 0, 1004, 1002, 1, 0, 0, 0, 1005, 1008, 3, 96, 40, 0, 1006, 1008, 3, 90, 37, 0, 1007, 1005, 1, 0, 0, 0, 1007, 1006, 1, 0, 0, 0, 1008, 1010, 1, 0, 0, 0, 1009, 1011, 3, 220, 102, 0, 1010, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1015, 1, 0, 0, 0, 1014, 997, 1, 0, 0, 0, 1014, 1007, 1, 0, 0, 0, 1015, 223, 1, 0, 0, 0, 1016, 1019, 3, 222, 103, 0, 1017, 1019, 3, 182, 83, 0, 1018, 1016, 1, 0, 0, 0, 1018, 1017, 1, 0, 0, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1018, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 225, 1, 0, 0, 0, 1022, 1023, 3, 58, 21, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 105, 11, 0, 1025, 227, 1, 0, 0, 0, 1026, 1027, 3, 60, 22, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 106, 11, 0, 1029, 229, 1, 0, 0, 0, 1030, 1031, 3, 62, 23, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 107, 11, 0, 1033, 231, 1, 0, 0, 0, 1034, 1035, 3, 78, 31, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 6, 108, 14, 0, 1037, 1038, 6, 108, 15, 0, 1038, 233, 1, 0, 0, 0, 1039, 1040, 3, 112, 48, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 109, 18, 0, 1042, 235, 1, 0, 0, 0, 1043, 1044, 3, 116, 50, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 6, 110, 17, 0, 1046, 237, 1, 0, 0, 0, 1047, 1048, 3, 120, 52, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1050, 6, 111, 21, 0, 1050, 239, 1, 0, 0, 0, 1051, 1052, 7, 12, 0, 0, 1052, 1053, 7, 2, 0, 0, 1053, 241, 1, 0, 0, 0, 1054, 1055, 3, 224, 104, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1057, 6, 113, 22, 0, 1057, 243, 1, 0, 0, 0, 1058, 1059, 3, 58, 21, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1061, 6, 114, 11, 0, 1061, 245, 1, 0, 0, 0, 1062, 1063, 3, 60, 22, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1065, 6, 115, 11, 0, 1065, 247, 1, 0, 0, 0, 1066, 1067, 3, 62, 23, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1069, 6, 116, 11, 0, 1069, 249, 1, 0, 0, 0, 1070, 1071, 3, 78, 31, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 6, 117, 14, 0, 1073, 1074, 6, 117, 15, 0, 1074, 251, 1, 0, 0, 0, 1075, 1076, 3, 176, 80, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 118, 12, 0, 1078, 1079, 6, 118, 23, 0, 1079, 253, 1, 0, 0, 0, 1080, 1081, 7, 7, 0, 0, 1081, 1082, 7, 9, 0, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 119, 24, 0, 1084, 255, 1, 0, 0, 0, 1085, 1086, 7, 20, 0, 0, 1086, 1087, 7, 1, 0, 0, 1087, 1088, 7, 5, 0, 0, 1088, 1089, 7, 10, 0, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 120, 24, 0, 1091, 257, 1, 0, 0, 0, 1092, 1093, 8, 34, 0, 0, 1093, 259, 1, 0, 0, 0, 1094, 1096, 3, 258, 121, 0, 1095, 1094, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 3, 358, 171, 0, 1100, 1102, 1, 0, 0, 0, 1101, 1095, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1104, 1, 0, 0, 0, 1103, 1105, 3, 258, 121, 0, 1104, 1103, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 261, 1, 0, 0, 0, 1108, 1109, 3, 184, 84, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 6, 123, 25, 0, 1111, 263, 1, 0, 0, 0, 1112, 1113, 3, 260, 122, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 6, 124, 26, 0, 1115, 265, 1, 0, 0, 0, 1116, 1117, 3, 58, 21, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 125, 11, 0, 1119, 267, 1, 0, 0, 0, 1120, 1121, 3, 60, 22, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 126, 11, 0, 1123, 269, 1, 0, 0, 0, 1124, 1125, 3, 62, 23, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 127, 11, 0, 1127, 271, 1, 0, 0, 0, 1128, 1129, 3, 78, 31, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1131, 6, 128, 14, 0, 1131, 1132, 6, 128, 15, 0, 1132, 1133, 6, 128, 15, 0, 1133, 273, 1, 0, 0, 0, 1134, 1135, 3, 112, 48, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 6, 129, 18, 0, 1137, 275, 1, 0, 0, 0, 1138, 1139, 3, 116, 50, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1141, 6, 130, 17, 0, 1141, 277, 1, 0, 0, 0, 1142, 1143, 3, 120, 52, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 131, 21, 0, 1145, 279, 1, 0, 0, 0, 1146, 1147, 3, 256, 120, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1149, 6, 132, 27, 0, 1149, 281, 1, 0, 0, 0, 1150, 1151, 3, 224, 104, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 6, 133, 22, 0, 1153, 283, 1, 0, 0, 0, 1154, 1155, 3, 184, 84, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 134, 25, 0, 1157, 285, 1, 0, 0, 0, 1158, 1159, 3, 58, 21, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 6, 135, 11, 0, 1161, 287, 1, 0, 0, 0, 1162, 1163, 3, 60, 22, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 6, 136, 11, 0, 1165, 289, 1, 0, 0, 0, 1166, 1167, 3, 62, 23, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 137, 11, 0, 1169, 291, 1, 0, 0, 0, 1170, 1171, 3, 78, 31, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 138, 14, 0, 1173, 1174, 6, 138, 15, 0, 1174, 293, 1, 0, 0, 0, 1175, 1176, 3, 116, 50, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 6, 139, 17, 0, 1178, 295, 1, 0, 0, 0, 1179, 1180, 3, 120, 52, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 6, 140, 21, 0, 1182, 297, 1, 0, 0, 0, 1183, 1184, 3, 254, 119, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 6, 141, 28, 0, 1186, 1187, 6, 141, 29, 0, 1187, 299, 1, 0, 0, 0, 1188, 1189, 3, 66, 25, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 142, 20, 0, 1191, 301, 1, 0, 0, 0, 1192, 1193, 3, 58, 21, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 143, 11, 0, 1195, 303, 1, 0, 0, 0, 1196, 1197, 3, 60, 22, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 144, 11, 0, 1199, 305, 1, 0, 0, 0, 1200, 1201, 3, 62, 23, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 145, 11, 0, 1203, 307, 1, 0, 0, 0, 1204, 1205, 3, 78, 31, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 146, 14, 0, 1207, 1208, 6, 146, 15, 0, 1208, 1209, 6, 146, 15, 0, 1209, 309, 1, 0, 0, 0, 1210, 1211, 3, 116, 50, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1213, 6, 147, 17, 0, 1213, 311, 1, 0, 0, 0, 1214, 1215, 3, 120, 52, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 6, 148, 21, 0, 1217, 313, 1, 0, 0, 0, 1218, 1219, 3, 224, 104, 0, 1219, 1220, 1, 0, 0, 0, 1220, 1221, 6, 149, 22, 0, 1221, 315, 1, 0, 0, 0, 1222, 1223, 3, 58, 21, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1225, 6, 150, 11, 0, 1225, 317, 1, 0, 0, 0, 1226, 1227, 3, 60, 22, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1229, 6, 151, 11, 0, 1229, 319, 1, 0, 0, 0, 1230, 1231, 3, 62, 23, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 6, 152, 11, 0, 1233, 321, 1, 0, 0, 0, 1234, 1235, 3, 78, 31, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 6, 153, 14, 0, 1237, 1238, 6, 153, 15, 0, 1238, 323, 1, 0, 0, 0, 1239, 1240, 3, 120, 52, 0, 1240, 1241, 1, 0, 0, 0, 1241, 1242, 6, 154, 21, 0, 1242, 325, 1, 0, 0, 0, 1243, 1244, 3, 184, 84, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1246, 6, 155, 25, 0, 1246, 327, 1, 0, 0, 0, 1247, 1248, 3, 180, 82, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 6, 156, 30, 0, 1250, 329, 1, 0, 0, 0, 1251, 1252, 3, 58, 21, 0, 1252, 1253, 1, 0, 0, 0, 1253, 1254, 6, 157, 11, 0, 1254, 331, 1, 0, 0, 0, 1255, 1256, 3, 60, 22, 0, 1256, 1257, 1, 0, 0, 0, 1257, 1258, 6, 158, 11, 0, 1258, 333, 1, 0, 0, 0, 1259, 1260, 3, 62, 23, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 6, 159, 11, 0, 1262, 335, 1, 0, 0, 0, 1263, 1264, 3, 78, 31, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 6, 160, 14, 0, 1266, 1267, 6, 160, 15, 0, 1267, 337, 1, 0, 0, 0, 1268, 1269, 7, 1, 0, 0, 1269, 1270, 7, 9, 0, 0, 1270, 1271, 7, 15, 0, 0, 1271, 1272, 7, 7, 0, 0, 1272, 339, 1, 0, 0, 0, 1273, 1274, 3, 58, 21, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 162, 11, 0, 1276, 341, 1, 0, 0, 0, 1277, 1278, 3, 60, 22, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 163, 11, 0, 1280, 343, 1, 0, 0, 0, 1281, 1282, 3, 62, 23, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 164, 11, 0, 1284, 345, 1, 0, 0, 0, 1285, 1286, 3, 78, 31, 0, 1286, 1287, 1, 0, 0, 0, 1287, 1288, 6, 165, 14, 0, 1288, 1289, 6, 165, 15, 0, 1289, 347, 1, 0, 0, 0, 1290, 1291, 7, 15, 0, 0, 1291, 1292, 7, 19, 0, 0, 1292, 1293, 7, 9, 0, 0, 1293, 1294, 7, 4, 0, 0, 1294, 1295, 7, 5, 0, 0, 1295, 1296, 7, 1, 0, 0, 1296, 1297, 7, 7, 0, 0, 1297, 1298, 7, 9, 0, 0, 1298, 1299, 7, 2, 0, 0, 1299, 349, 1, 0, 0, 0, 1300, 1301, 3, 58, 21, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1303, 6, 167, 11, 0, 1303, 351, 1, 0, 0, 0, 1304, 1305, 3, 60, 22, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 6, 168, 11, 0, 1307, 353, 1, 0, 0, 0, 1308, 1309, 3, 62, 23, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 6, 169, 11, 0, 1311, 355, 1, 0, 0, 0, 1312, 1313, 3, 178, 81, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 170, 16, 0, 1315, 1316, 6, 170, 15, 0, 1316, 357, 1, 0, 0, 0, 1317, 1318, 5, 58, 0, 0, 1318, 359, 1, 0, 0, 0, 1319, 1325, 3, 90, 37, 0, 1320, 1325, 3, 80, 32, 0, 1321, 1325, 3, 120, 52, 0, 1322, 1325, 3, 82, 33, 0, 1323, 1325, 3, 96, 40, 0, 1324, 1319, 1, 0, 0, 0, 1324, 1320, 1, 0, 0, 0, 1324, 1321, 1, 0, 0, 0, 1324, 1322, 1, 0, 0, 0, 1324, 1323, 1, 0, 0, 0, 1325, 1326, 1, 0, 0, 0, 1326, 1324, 1, 0, 0, 0, 1326, 1327, 1, 0, 0, 0, 1327, 361, 1, 0, 0, 0, 1328, 1329, 3, 58, 21, 0, 1329, 1330, 1, 0, 0, 0, 1330, 1331, 6, 173, 11, 0, 1331, 363, 1, 0, 0, 0, 1332, 1333, 3, 60, 22, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1335, 6, 174, 11, 0, 1335, 365, 1, 0, 0, 0, 1336, 1337, 3, 62, 23, 0, 1337, 1338, 1, 0, 0, 0, 1338, 1339, 6, 175, 11, 0, 1339, 367, 1, 0, 0, 0, 1340, 1341, 3, 78, 31, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1343, 6, 176, 14, 0, 1343, 1344, 6, 176, 15, 0, 1344, 369, 1, 0, 0, 0, 1345, 1346, 3, 66, 25, 0, 1346, 1347, 1, 0, 0, 0, 1347, 1348, 6, 177, 20, 0, 1348, 1349, 6, 177, 15, 0, 1349, 1350, 6, 177, 31, 0, 1350, 371, 1, 0, 0, 0, 1351, 1352, 3, 58, 21, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 6, 178, 11, 0, 1354, 373, 1, 0, 0, 0, 1355, 1356, 3, 60, 22, 0, 1356, 1357, 1, 0, 0, 0, 1357, 1358, 6, 179, 11, 0, 1358, 375, 1, 0, 0, 0, 1359, 1360, 3, 62, 23, 0, 1360, 1361, 1, 0, 0, 0, 1361, 1362, 6, 180, 11, 0, 1362, 377, 1, 0, 0, 0, 1363, 1364, 3, 116, 50, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 181, 17, 0, 1366, 1367, 6, 181, 15, 0, 1367, 1368, 6, 181, 7, 0, 1368, 379, 1, 0, 0, 0, 1369, 1370, 3, 58, 21, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 182, 11, 0, 1372, 381, 1, 0, 0, 0, 1373, 1374, 3, 60, 22, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1376, 6, 183, 11, 0, 1376, 383, 1, 0, 0, 0, 1377, 1378, 3, 62, 23, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 184, 11, 0, 1380, 385, 1, 0, 0, 0, 1381, 1382, 3, 184, 84, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 6, 185, 15, 0, 1384, 1385, 6, 185, 0, 0, 1385, 1386, 6, 185, 25, 0, 1386, 387, 1, 0, 0, 0, 1387, 1388, 3, 180, 82, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 186, 15, 0, 1390, 1391, 6, 186, 0, 0, 1391, 1392, 6, 186, 30, 0, 1392, 389, 1, 0, 0, 0, 1393, 1394, 3, 106, 45, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 187, 15, 0, 1396, 1397, 6, 187, 0, 0, 1397, 1398, 6, 187, 32, 0, 1398, 391, 1, 0, 0, 0, 1399, 1400, 3, 78, 31, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 6, 188, 14, 0, 1402, 1403, 6, 188, 15, 0, 1403, 393, 1, 0, 0, 0, 62, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 566, 576, 580, 583, 592, 594, 605, 612, 617, 656, 661, 670, 677, 682, 684, 695, 703, 706, 708, 713, 718, 724, 731, 736, 742, 745, 753, 757, 890, 895, 900, 902, 908, 993, 997, 1002, 1007, 1012, 1014, 1018, 1020, 1097, 1101, 1106, 1324, 1326, 33, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 12, 0, 5, 14, 0, 5, 10, 0, 5, 5, 0, 5, 11, 0, 0, 1, 0, 7, 68, 0, 5, 0, 0, 7, 29, 0, 4, 0, 0, 7, 69, 0, 7, 38, 0, 7, 36, 0, 7, 30, 0, 7, 25, 0, 7, 40, 0, 7, 79, 0, 5, 13, 0, 5, 7, 0, 7, 71, 0, 7, 89, 0, 7, 88, 0, 7, 87, 0, 5, 9, 0, 7, 70, 0, 5, 15, 0, 7, 33, 0] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens index 0e2d796eda847..30ce0d5eea55b 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens @@ -8,112 +8,119 @@ GROK=7 INLINESTATS=8 KEEP=9 LIMIT=10 -META=11 -METRICS=12 -MV_EXPAND=13 -RENAME=14 -ROW=15 -SHOW=16 -SORT=17 -STATS=18 -WHERE=19 -UNKNOWN_CMD=20 -LINE_COMMENT=21 -MULTILINE_COMMENT=22 -WS=23 -INDEX_UNQUOTED_IDENTIFIER=24 -EXPLAIN_WS=25 -EXPLAIN_LINE_COMMENT=26 -EXPLAIN_MULTILINE_COMMENT=27 -PIPE=28 -QUOTED_STRING=29 -INTEGER_LITERAL=30 -DECIMAL_LITERAL=31 -BY=32 -AND=33 -ASC=34 -ASSIGN=35 -CAST_OP=36 -COMMA=37 -DESC=38 -DOT=39 -FALSE=40 -FIRST=41 -LAST=42 -LP=43 -IN=44 -IS=45 -LIKE=46 -NOT=47 -NULL=48 -NULLS=49 -OR=50 -PARAM=51 -RLIKE=52 -RP=53 -TRUE=54 -EQ=55 -CIEQ=56 -NEQ=57 -LT=58 -LTE=59 -GT=60 -GTE=61 -PLUS=62 -MINUS=63 -ASTERISK=64 -SLASH=65 -PERCENT=66 -OPENING_BRACKET=67 -CLOSING_BRACKET=68 -UNQUOTED_IDENTIFIER=69 -QUOTED_IDENTIFIER=70 -EXPR_LINE_COMMENT=71 -EXPR_MULTILINE_COMMENT=72 -EXPR_WS=73 -METADATA=74 -FROM_LINE_COMMENT=75 -FROM_MULTILINE_COMMENT=76 -FROM_WS=77 -ID_PATTERN=78 -PROJECT_LINE_COMMENT=79 -PROJECT_MULTILINE_COMMENT=80 -PROJECT_WS=81 -AS=82 -RENAME_LINE_COMMENT=83 -RENAME_MULTILINE_COMMENT=84 -RENAME_WS=85 -ON=86 -WITH=87 -ENRICH_POLICY_NAME=88 -ENRICH_LINE_COMMENT=89 -ENRICH_MULTILINE_COMMENT=90 -ENRICH_WS=91 -ENRICH_FIELD_LINE_COMMENT=92 -ENRICH_FIELD_MULTILINE_COMMENT=93 -ENRICH_FIELD_WS=94 -MVEXPAND_LINE_COMMENT=95 -MVEXPAND_MULTILINE_COMMENT=96 -MVEXPAND_WS=97 -INFO=98 -SHOW_LINE_COMMENT=99 -SHOW_MULTILINE_COMMENT=100 -SHOW_WS=101 -FUNCTIONS=102 -META_LINE_COMMENT=103 -META_MULTILINE_COMMENT=104 -META_WS=105 -COLON=106 -SETTING=107 -SETTING_LINE_COMMENT=108 -SETTTING_MULTILINE_COMMENT=109 -SETTING_WS=110 -METRICS_LINE_COMMENT=111 -METRICS_MULTILINE_COMMENT=112 -METRICS_WS=113 -CLOSING_METRICS_LINE_COMMENT=114 -CLOSING_METRICS_MULTILINE_COMMENT=115 -CLOSING_METRICS_WS=116 +LOOKUP=11 +META=12 +METRICS=13 +MV_EXPAND=14 +RENAME=15 +ROW=16 +SHOW=17 +SORT=18 +STATS=19 +WHERE=20 +UNKNOWN_CMD=21 +LINE_COMMENT=22 +MULTILINE_COMMENT=23 +WS=24 +INDEX_UNQUOTED_IDENTIFIER=25 +EXPLAIN_WS=26 +EXPLAIN_LINE_COMMENT=27 +EXPLAIN_MULTILINE_COMMENT=28 +PIPE=29 +QUOTED_STRING=30 +INTEGER_LITERAL=31 +DECIMAL_LITERAL=32 +BY=33 +AND=34 +ASC=35 +ASSIGN=36 +CAST_OP=37 +COMMA=38 +DESC=39 +DOT=40 +FALSE=41 +FIRST=42 +LAST=43 +LP=44 +IN=45 +IS=46 +LIKE=47 +NOT=48 +NULL=49 +NULLS=50 +OR=51 +PARAM=52 +RLIKE=53 +RP=54 +TRUE=55 +EQ=56 +CIEQ=57 +NEQ=58 +LT=59 +LTE=60 +GT=61 +GTE=62 +PLUS=63 +MINUS=64 +ASTERISK=65 +SLASH=66 +PERCENT=67 +OPENING_BRACKET=68 +CLOSING_BRACKET=69 +UNQUOTED_IDENTIFIER=70 +QUOTED_IDENTIFIER=71 +EXPR_LINE_COMMENT=72 +EXPR_MULTILINE_COMMENT=73 +EXPR_WS=74 +METADATA=75 +FROM_LINE_COMMENT=76 +FROM_MULTILINE_COMMENT=77 +FROM_WS=78 +ID_PATTERN=79 +PROJECT_LINE_COMMENT=80 +PROJECT_MULTILINE_COMMENT=81 +PROJECT_WS=82 +AS=83 +RENAME_LINE_COMMENT=84 +RENAME_MULTILINE_COMMENT=85 +RENAME_WS=86 +ON=87 +WITH=88 +ENRICH_POLICY_NAME=89 +ENRICH_LINE_COMMENT=90 +ENRICH_MULTILINE_COMMENT=91 +ENRICH_WS=92 +ENRICH_FIELD_LINE_COMMENT=93 +ENRICH_FIELD_MULTILINE_COMMENT=94 +ENRICH_FIELD_WS=95 +LOOKUP_LINE_COMMENT=96 +LOOKUP_MULTILINE_COMMENT=97 +LOOKUP_WS=98 +LOOKUP_FIELD_LINE_COMMENT=99 +LOOKUP_FIELD_MULTILINE_COMMENT=100 +LOOKUP_FIELD_WS=101 +MVEXPAND_LINE_COMMENT=102 +MVEXPAND_MULTILINE_COMMENT=103 +MVEXPAND_WS=104 +INFO=105 +SHOW_LINE_COMMENT=106 +SHOW_MULTILINE_COMMENT=107 +SHOW_WS=108 +FUNCTIONS=109 +META_LINE_COMMENT=110 +META_MULTILINE_COMMENT=111 +META_WS=112 +COLON=113 +SETTING=114 +SETTING_LINE_COMMENT=115 +SETTTING_MULTILINE_COMMENT=116 +SETTING_WS=117 +METRICS_LINE_COMMENT=118 +METRICS_MULTILINE_COMMENT=119 +METRICS_WS=120 +CLOSING_METRICS_LINE_COMMENT=121 +CLOSING_METRICS_MULTILINE_COMMENT=122 +CLOSING_METRICS_WS=123 'dissect'=1 'drop'=2 'enrich'=3 @@ -124,56 +131,57 @@ CLOSING_METRICS_WS=116 'inlinestats'=8 'keep'=9 'limit'=10 -'meta'=11 -'metrics'=12 -'mv_expand'=13 -'rename'=14 -'row'=15 -'show'=16 -'sort'=17 -'stats'=18 -'where'=19 -'|'=28 -'by'=32 -'and'=33 -'asc'=34 -'='=35 -'::'=36 -','=37 -'desc'=38 -'.'=39 -'false'=40 -'first'=41 -'last'=42 -'('=43 -'in'=44 -'is'=45 -'like'=46 -'not'=47 -'null'=48 -'nulls'=49 -'or'=50 -'?'=51 -'rlike'=52 -')'=53 -'true'=54 -'=='=55 -'=~'=56 -'!='=57 -'<'=58 -'<='=59 -'>'=60 -'>='=61 -'+'=62 -'-'=63 -'*'=64 -'/'=65 -'%'=66 -']'=68 -'metadata'=74 -'as'=82 -'on'=86 -'with'=87 -'info'=98 -'functions'=102 -':'=106 +'lookup'=11 +'meta'=12 +'metrics'=13 +'mv_expand'=14 +'rename'=15 +'row'=16 +'show'=17 +'sort'=18 +'stats'=19 +'where'=20 +'|'=29 +'by'=33 +'and'=34 +'asc'=35 +'='=36 +'::'=37 +','=38 +'desc'=39 +'.'=40 +'false'=41 +'first'=42 +'last'=43 +'('=44 +'in'=45 +'is'=46 +'like'=47 +'not'=48 +'null'=49 +'nulls'=50 +'or'=51 +'?'=52 +'rlike'=53 +')'=54 +'true'=55 +'=='=56 +'=~'=57 +'!='=58 +'<'=59 +'<='=60 +'>'=61 +'>='=62 +'+'=63 +'-'=64 +'*'=65 +'/'=66 +'%'=67 +']'=69 +'metadata'=75 +'as'=83 +'on'=87 +'with'=88 +'info'=105 +'functions'=109 +':'=113 diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts index abd594fb6b564..4dd20eceeb217 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -23,112 +23,119 @@ export default class esql_lexer extends Lexer { public static readonly INLINESTATS = 8; public static readonly KEEP = 9; public static readonly LIMIT = 10; - public static readonly META = 11; - public static readonly METRICS = 12; - public static readonly MV_EXPAND = 13; - public static readonly RENAME = 14; - public static readonly ROW = 15; - public static readonly SHOW = 16; - public static readonly SORT = 17; - public static readonly STATS = 18; - public static readonly WHERE = 19; - public static readonly UNKNOWN_CMD = 20; - public static readonly LINE_COMMENT = 21; - public static readonly MULTILINE_COMMENT = 22; - public static readonly WS = 23; - public static readonly INDEX_UNQUOTED_IDENTIFIER = 24; - public static readonly EXPLAIN_WS = 25; - public static readonly EXPLAIN_LINE_COMMENT = 26; - public static readonly EXPLAIN_MULTILINE_COMMENT = 27; - public static readonly PIPE = 28; - public static readonly QUOTED_STRING = 29; - public static readonly INTEGER_LITERAL = 30; - public static readonly DECIMAL_LITERAL = 31; - public static readonly BY = 32; - public static readonly AND = 33; - public static readonly ASC = 34; - public static readonly ASSIGN = 35; - public static readonly CAST_OP = 36; - public static readonly COMMA = 37; - public static readonly DESC = 38; - public static readonly DOT = 39; - public static readonly FALSE = 40; - public static readonly FIRST = 41; - public static readonly LAST = 42; - public static readonly LP = 43; - public static readonly IN = 44; - public static readonly IS = 45; - public static readonly LIKE = 46; - public static readonly NOT = 47; - public static readonly NULL = 48; - public static readonly NULLS = 49; - public static readonly OR = 50; - public static readonly PARAM = 51; - public static readonly RLIKE = 52; - public static readonly RP = 53; - public static readonly TRUE = 54; - public static readonly EQ = 55; - public static readonly CIEQ = 56; - public static readonly NEQ = 57; - public static readonly LT = 58; - public static readonly LTE = 59; - public static readonly GT = 60; - public static readonly GTE = 61; - public static readonly PLUS = 62; - public static readonly MINUS = 63; - public static readonly ASTERISK = 64; - public static readonly SLASH = 65; - public static readonly PERCENT = 66; - public static readonly OPENING_BRACKET = 67; - public static readonly CLOSING_BRACKET = 68; - public static readonly UNQUOTED_IDENTIFIER = 69; - public static readonly QUOTED_IDENTIFIER = 70; - public static readonly EXPR_LINE_COMMENT = 71; - public static readonly EXPR_MULTILINE_COMMENT = 72; - public static readonly EXPR_WS = 73; - public static readonly METADATA = 74; - public static readonly FROM_LINE_COMMENT = 75; - public static readonly FROM_MULTILINE_COMMENT = 76; - public static readonly FROM_WS = 77; - public static readonly ID_PATTERN = 78; - public static readonly PROJECT_LINE_COMMENT = 79; - public static readonly PROJECT_MULTILINE_COMMENT = 80; - public static readonly PROJECT_WS = 81; - public static readonly AS = 82; - public static readonly RENAME_LINE_COMMENT = 83; - public static readonly RENAME_MULTILINE_COMMENT = 84; - public static readonly RENAME_WS = 85; - public static readonly ON = 86; - public static readonly WITH = 87; - public static readonly ENRICH_POLICY_NAME = 88; - public static readonly ENRICH_LINE_COMMENT = 89; - public static readonly ENRICH_MULTILINE_COMMENT = 90; - public static readonly ENRICH_WS = 91; - public static readonly ENRICH_FIELD_LINE_COMMENT = 92; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 93; - public static readonly ENRICH_FIELD_WS = 94; - public static readonly MVEXPAND_LINE_COMMENT = 95; - public static readonly MVEXPAND_MULTILINE_COMMENT = 96; - public static readonly MVEXPAND_WS = 97; - public static readonly INFO = 98; - public static readonly SHOW_LINE_COMMENT = 99; - public static readonly SHOW_MULTILINE_COMMENT = 100; - public static readonly SHOW_WS = 101; - public static readonly FUNCTIONS = 102; - public static readonly META_LINE_COMMENT = 103; - public static readonly META_MULTILINE_COMMENT = 104; - public static readonly META_WS = 105; - public static readonly COLON = 106; - public static readonly SETTING = 107; - public static readonly SETTING_LINE_COMMENT = 108; - public static readonly SETTTING_MULTILINE_COMMENT = 109; - public static readonly SETTING_WS = 110; - public static readonly METRICS_LINE_COMMENT = 111; - public static readonly METRICS_MULTILINE_COMMENT = 112; - public static readonly METRICS_WS = 113; - public static readonly CLOSING_METRICS_LINE_COMMENT = 114; - public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 115; - public static readonly CLOSING_METRICS_WS = 116; + public static readonly LOOKUP = 11; + public static readonly META = 12; + public static readonly METRICS = 13; + public static readonly MV_EXPAND = 14; + public static readonly RENAME = 15; + public static readonly ROW = 16; + public static readonly SHOW = 17; + public static readonly SORT = 18; + public static readonly STATS = 19; + public static readonly WHERE = 20; + public static readonly UNKNOWN_CMD = 21; + public static readonly LINE_COMMENT = 22; + public static readonly MULTILINE_COMMENT = 23; + public static readonly WS = 24; + public static readonly INDEX_UNQUOTED_IDENTIFIER = 25; + public static readonly EXPLAIN_WS = 26; + public static readonly EXPLAIN_LINE_COMMENT = 27; + public static readonly EXPLAIN_MULTILINE_COMMENT = 28; + public static readonly PIPE = 29; + public static readonly QUOTED_STRING = 30; + public static readonly INTEGER_LITERAL = 31; + public static readonly DECIMAL_LITERAL = 32; + public static readonly BY = 33; + public static readonly AND = 34; + public static readonly ASC = 35; + public static readonly ASSIGN = 36; + public static readonly CAST_OP = 37; + public static readonly COMMA = 38; + public static readonly DESC = 39; + public static readonly DOT = 40; + public static readonly FALSE = 41; + public static readonly FIRST = 42; + public static readonly LAST = 43; + public static readonly LP = 44; + public static readonly IN = 45; + public static readonly IS = 46; + public static readonly LIKE = 47; + public static readonly NOT = 48; + public static readonly NULL = 49; + public static readonly NULLS = 50; + public static readonly OR = 51; + public static readonly PARAM = 52; + public static readonly RLIKE = 53; + public static readonly RP = 54; + public static readonly TRUE = 55; + public static readonly EQ = 56; + public static readonly CIEQ = 57; + public static readonly NEQ = 58; + public static readonly LT = 59; + public static readonly LTE = 60; + public static readonly GT = 61; + public static readonly GTE = 62; + public static readonly PLUS = 63; + public static readonly MINUS = 64; + public static readonly ASTERISK = 65; + public static readonly SLASH = 66; + public static readonly PERCENT = 67; + public static readonly OPENING_BRACKET = 68; + public static readonly CLOSING_BRACKET = 69; + public static readonly UNQUOTED_IDENTIFIER = 70; + public static readonly QUOTED_IDENTIFIER = 71; + public static readonly EXPR_LINE_COMMENT = 72; + public static readonly EXPR_MULTILINE_COMMENT = 73; + public static readonly EXPR_WS = 74; + public static readonly METADATA = 75; + public static readonly FROM_LINE_COMMENT = 76; + public static readonly FROM_MULTILINE_COMMENT = 77; + public static readonly FROM_WS = 78; + public static readonly ID_PATTERN = 79; + public static readonly PROJECT_LINE_COMMENT = 80; + public static readonly PROJECT_MULTILINE_COMMENT = 81; + public static readonly PROJECT_WS = 82; + public static readonly AS = 83; + public static readonly RENAME_LINE_COMMENT = 84; + public static readonly RENAME_MULTILINE_COMMENT = 85; + public static readonly RENAME_WS = 86; + public static readonly ON = 87; + public static readonly WITH = 88; + public static readonly ENRICH_POLICY_NAME = 89; + public static readonly ENRICH_LINE_COMMENT = 90; + public static readonly ENRICH_MULTILINE_COMMENT = 91; + public static readonly ENRICH_WS = 92; + public static readonly ENRICH_FIELD_LINE_COMMENT = 93; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 94; + public static readonly ENRICH_FIELD_WS = 95; + public static readonly LOOKUP_LINE_COMMENT = 96; + public static readonly LOOKUP_MULTILINE_COMMENT = 97; + public static readonly LOOKUP_WS = 98; + public static readonly LOOKUP_FIELD_LINE_COMMENT = 99; + public static readonly LOOKUP_FIELD_MULTILINE_COMMENT = 100; + public static readonly LOOKUP_FIELD_WS = 101; + public static readonly MVEXPAND_LINE_COMMENT = 102; + public static readonly MVEXPAND_MULTILINE_COMMENT = 103; + public static readonly MVEXPAND_WS = 104; + public static readonly INFO = 105; + public static readonly SHOW_LINE_COMMENT = 106; + public static readonly SHOW_MULTILINE_COMMENT = 107; + public static readonly SHOW_WS = 108; + public static readonly FUNCTIONS = 109; + public static readonly META_LINE_COMMENT = 110; + public static readonly META_MULTILINE_COMMENT = 111; + public static readonly META_WS = 112; + public static readonly COLON = 113; + public static readonly SETTING = 114; + public static readonly SETTING_LINE_COMMENT = 115; + public static readonly SETTTING_MULTILINE_COMMENT = 116; + public static readonly SETTING_WS = 117; + public static readonly METRICS_LINE_COMMENT = 118; + public static readonly METRICS_MULTILINE_COMMENT = 119; + public static readonly METRICS_WS = 120; + public static readonly CLOSING_METRICS_LINE_COMMENT = 121; + public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 122; + public static readonly CLOSING_METRICS_WS = 123; public static readonly EOF = Token.EOF; public static readonly EXPLAIN_MODE = 1; public static readonly EXPRESSION_MODE = 2; @@ -137,12 +144,14 @@ export default class esql_lexer extends Lexer { public static readonly RENAME_MODE = 5; public static readonly ENRICH_MODE = 6; public static readonly ENRICH_FIELD_MODE = 7; - public static readonly MVEXPAND_MODE = 8; - public static readonly SHOW_MODE = 9; - public static readonly META_MODE = 10; - public static readonly SETTING_MODE = 11; - public static readonly METRICS_MODE = 12; - public static readonly CLOSING_METRICS_MODE = 13; + public static readonly LOOKUP_MODE = 8; + public static readonly LOOKUP_FIELD_MODE = 9; + public static readonly MVEXPAND_MODE = 10; + public static readonly SHOW_MODE = 11; + public static readonly META_MODE = 12; + public static readonly SETTING_MODE = 13; + public static readonly METRICS_MODE = 14; + public static readonly CLOSING_METRICS_MODE = 15; public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", @@ -151,6 +160,7 @@ export default class esql_lexer extends Lexer { "'from'", "'grok'", "'inlinestats'", "'keep'", "'limit'", + "'lookup'", "'meta'", "'metrics'", "'mv_expand'", "'rename'", @@ -195,6 +205,9 @@ export default class esql_lexer extends Lexer { null, null, null, null, null, null, + null, null, + null, null, + null, null, null, "'info'", null, null, null, "'functions'", @@ -206,7 +219,8 @@ export default class esql_lexer extends Lexer { "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", - "META", "METRICS", + "LOOKUP", "META", + "METRICS", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", @@ -265,6 +279,12 @@ export default class esql_lexer extends Lexer { "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", + "LOOKUP_LINE_COMMENT", + "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", + "LOOKUP_FIELD_LINE_COMMENT", + "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", @@ -289,14 +309,15 @@ export default class esql_lexer extends Lexer { "EXPRESSION_MODE", "FROM_MODE", "PROJECT_MODE", "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", + "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", "META_MODE", "SETTING_MODE", "METRICS_MODE", "CLOSING_METRICS_MODE", ]; public static readonly ruleNames: string[] = [ "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", - "KEEP", "LIMIT", "META", "METRICS", "MV_EXPAND", "RENAME", "ROW", "SHOW", - "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", + "KEEP", "LIMIT", "LOOKUP", "META", "METRICS", "MV_EXPAND", "RENAME", "ROW", + "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "INDEX_UNQUOTED_IDENTIFIER_PART", "INDEX_UNQUOTED_IDENTIFIER", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", @@ -319,7 +340,11 @@ export default class esql_lexer extends Lexer { "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_PIPE", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "LOOKUP_PIPE", "LOOKUP_COMMA", + "LOOKUP_DOT", "LOOKUP_ON", "LOOKUP_INDEX_UNQUOTED_IDENTIFIER", "LOOKUP_LINE_COMMENT", + "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", + "LOOKUP_FIELD_DOT", "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", + "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", @@ -350,447 +375,486 @@ export default class esql_lexer extends Lexer { public get modeNames(): string[] { return esql_lexer.modeNames; } - public static readonly _serializedATN: number[] = [4,0,116,1297,6,-1,6, - -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0,7,0, - 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, - 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, - 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, - 7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7, - 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, - 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, - 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53, - 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7, - 60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,2,66,7,66,2,67,7,67, - 2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74,7,74,2, - 75,7,75,2,76,7,76,2,77,7,77,2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82, - 7,82,2,83,7,83,2,84,7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7, - 89,2,90,7,90,2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96, - 2,97,7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, - 7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108,2,109, - 7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114,7,114,2,115, - 7,115,2,116,7,116,2,117,7,117,2,118,7,118,2,119,7,119,2,120,7,120,2,121, - 7,121,2,122,7,122,2,123,7,123,2,124,7,124,2,125,7,125,2,126,7,126,2,127, - 7,127,2,128,7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133, - 7,133,2,134,7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139, - 7,139,2,140,7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145, - 7,145,2,146,7,146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151, - 7,151,2,152,7,152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157, - 7,157,2,158,7,158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162,2,163, - 7,163,2,164,7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,2,169, - 7,169,2,170,7,170,2,171,7,171,2,172,7,172,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1, - 2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, - 5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1, - 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1, - 9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1, - 12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, - 1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18, - 1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,4,19,522,8,19,11,19,12,19,523,1, - 19,1,19,1,20,1,20,1,20,1,20,5,20,532,8,20,10,20,12,20,535,9,20,1,20,3,20, - 538,8,20,1,20,3,20,541,8,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,5,21,550, - 8,21,10,21,12,21,553,9,21,1,21,1,21,1,21,1,21,1,21,1,22,4,22,561,8,22,11, - 22,12,22,562,1,22,1,22,1,23,1,23,1,23,3,23,570,8,23,1,24,4,24,573,8,24, - 11,24,12,24,574,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,27, - 1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1, - 30,1,31,1,31,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,35,1,35,3,35,614,8,35, - 1,35,4,35,617,8,35,11,35,12,35,618,1,36,1,36,1,37,1,37,1,38,1,38,1,38,3, - 38,628,8,38,1,39,1,39,1,40,1,40,1,40,3,40,635,8,40,1,41,1,41,1,41,5,41, - 640,8,41,10,41,12,41,643,9,41,1,41,1,41,1,41,1,41,1,41,1,41,5,41,651,8, - 41,10,41,12,41,654,9,41,1,41,1,41,1,41,1,41,1,41,3,41,661,8,41,1,41,3,41, - 664,8,41,3,41,666,8,41,1,42,4,42,669,8,42,11,42,12,42,670,1,43,4,43,674, - 8,43,11,43,12,43,675,1,43,1,43,5,43,680,8,43,10,43,12,43,683,9,43,1,43, - 1,43,4,43,687,8,43,11,43,12,43,688,1,43,4,43,692,8,43,11,43,12,43,693,1, - 43,1,43,5,43,698,8,43,10,43,12,43,701,9,43,3,43,703,8,43,1,43,1,43,1,43, - 1,43,4,43,709,8,43,11,43,12,43,710,1,43,1,43,3,43,715,8,43,1,44,1,44,1, - 44,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,48,1,48,1,48,1,49, - 1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1, - 53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,56,1,56, - 1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,60,1, - 60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,63,1,63, - 1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,67,1, - 67,1,67,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,71,1,71,1,71,1,72,1,72, - 1,73,1,73,1,73,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78,1,78,1,79,1, - 79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,81,1,81,5,81,846,8,81,10,81, - 12,81,849,9,81,1,81,1,81,3,81,853,8,81,1,81,4,81,856,8,81,11,81,12,81,857, - 3,81,860,8,81,1,82,1,82,4,82,864,8,82,11,82,12,82,865,1,82,1,82,1,83,1, - 83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1,87, - 1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1, - 90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93, - 1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1, - 96,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,100, - 1,100,1,100,1,100,1,101,1,101,1,101,1,101,3,101,951,8,101,1,102,1,102,3, - 102,955,8,102,1,102,5,102,958,8,102,10,102,12,102,961,9,102,1,102,1,102, - 3,102,965,8,102,1,102,4,102,968,8,102,11,102,12,102,969,3,102,972,8,102, - 1,103,1,103,4,103,976,8,103,11,103,12,103,977,1,104,1,104,1,104,1,104,1, - 105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1, - 107,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1, - 110,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1, - 114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1, - 116,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1, - 119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,121,4,121,1053,8,121,11, - 121,12,121,1054,1,121,1,121,3,121,1059,8,121,1,121,4,121,1062,8,121,11, - 121,12,121,1063,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,124,1, - 124,1,124,1,124,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,127,1, - 127,1,127,1,127,1,127,1,127,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1, - 129,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1, - 132,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1, - 135,1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,137,1,138,1,138,1, - 138,1,138,1,139,1,139,1,139,1,139,1,140,1,140,1,140,1,140,1,141,1,141,1, - 141,1,141,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144,1, - 144,1,144,1,144,1,145,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1, - 147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1, - 149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,151,1, - 151,1,151,1,151,1,152,1,152,1,152,1,152,1,153,1,153,1,153,1,153,1,154,1, - 154,1,154,1,154,1,154,1,155,1,155,1,156,1,156,1,156,1,156,1,156,4,156,1218, - 8,156,11,156,12,156,1219,1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158, - 1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,160,1,161,1,161,1,161, - 1,161,1,161,1,161,1,162,1,162,1,162,1,162,1,163,1,163,1,163,1,163,1,164, - 1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,165,1,165,1,166,1,166,1,166, - 1,166,1,167,1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,169,1,169,1,169, - 1,169,1,169,1,169,1,170,1,170,1,170,1,170,1,170,1,170,1,171,1,171,1,171, - 1,171,1,171,1,171,1,172,1,172,1,172,1,172,1,172,2,551,652,0,173,14,1,16, - 2,18,3,20,4,22,5,24,6,26,7,28,8,30,9,32,10,34,11,36,12,38,13,40,14,42,15, - 44,16,46,17,48,18,50,19,52,20,54,21,56,22,58,23,60,0,62,24,64,0,66,0,68, - 25,70,26,72,27,74,28,76,0,78,0,80,0,82,0,84,0,86,0,88,0,90,0,92,0,94,0, - 96,29,98,30,100,31,102,32,104,33,106,34,108,35,110,36,112,37,114,38,116, - 39,118,40,120,41,122,42,124,43,126,44,128,45,130,46,132,47,134,48,136,49, - 138,50,140,51,142,52,144,53,146,54,148,55,150,56,152,57,154,58,156,59,158, - 60,160,61,162,62,164,63,166,64,168,65,170,66,172,67,174,68,176,69,178,0, - 180,70,182,71,184,72,186,73,188,0,190,0,192,0,194,0,196,0,198,0,200,74, - 202,0,204,75,206,76,208,77,210,0,212,0,214,0,216,0,218,0,220,78,222,79, - 224,80,226,81,228,0,230,0,232,0,234,0,236,82,238,0,240,83,242,84,244,85, - 246,0,248,0,250,86,252,87,254,0,256,88,258,0,260,0,262,89,264,90,266,91, - 268,0,270,0,272,0,274,0,276,0,278,0,280,0,282,92,284,93,286,94,288,0,290, - 0,292,0,294,0,296,95,298,96,300,97,302,0,304,98,306,99,308,100,310,101, - 312,0,314,102,316,103,318,104,320,105,322,0,324,106,326,107,328,108,330, - 109,332,110,334,0,336,0,338,111,340,112,342,113,344,0,346,114,348,115,350, - 116,352,0,354,0,356,0,358,0,14,0,1,2,3,4,5,6,7,8,9,10,11,12,13,35,2,0,68, - 68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2,0,69,69,101,101,2,0,67, - 67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0,79,79,111,111,2,0,80,80, - 112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0,86,86,118,118,2,0,65,65, - 97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70,70,102,102,2,0,77,77,109, - 109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,87,87,119,119,6,0,9,10,13,13, - 32,32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,10,0,9,10, - 13,13,32,32,44,44,47,47,61,61,91,91,93,93,96,96,124,124,2,0,42,42,47,47, - 1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114, - 114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66, - 66,98,98,2,0,89,89,121,121,2,0,85,85,117,117,11,0,9,10,13,13,32,32,34,35, - 44,44,47,47,58,58,60,60,62,63,92,92,124,124,1322,0,14,1,0,0,0,0,16,1,0, - 0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0, - 28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0, - 0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0, - 50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,62,1,0, - 0,0,1,64,1,0,0,0,1,66,1,0,0,0,1,68,1,0,0,0,1,70,1,0,0,0,1,72,1,0,0,0,2, - 74,1,0,0,0,2,96,1,0,0,0,2,98,1,0,0,0,2,100,1,0,0,0,2,102,1,0,0,0,2,104, - 1,0,0,0,2,106,1,0,0,0,2,108,1,0,0,0,2,110,1,0,0,0,2,112,1,0,0,0,2,114,1, - 0,0,0,2,116,1,0,0,0,2,118,1,0,0,0,2,120,1,0,0,0,2,122,1,0,0,0,2,124,1,0, - 0,0,2,126,1,0,0,0,2,128,1,0,0,0,2,130,1,0,0,0,2,132,1,0,0,0,2,134,1,0,0, - 0,2,136,1,0,0,0,2,138,1,0,0,0,2,140,1,0,0,0,2,142,1,0,0,0,2,144,1,0,0,0, - 2,146,1,0,0,0,2,148,1,0,0,0,2,150,1,0,0,0,2,152,1,0,0,0,2,154,1,0,0,0,2, - 156,1,0,0,0,2,158,1,0,0,0,2,160,1,0,0,0,2,162,1,0,0,0,2,164,1,0,0,0,2,166, - 1,0,0,0,2,168,1,0,0,0,2,170,1,0,0,0,2,172,1,0,0,0,2,174,1,0,0,0,2,176,1, - 0,0,0,2,180,1,0,0,0,2,182,1,0,0,0,2,184,1,0,0,0,2,186,1,0,0,0,3,188,1,0, - 0,0,3,190,1,0,0,0,3,192,1,0,0,0,3,194,1,0,0,0,3,196,1,0,0,0,3,198,1,0,0, - 0,3,200,1,0,0,0,3,202,1,0,0,0,3,204,1,0,0,0,3,206,1,0,0,0,3,208,1,0,0,0, - 4,210,1,0,0,0,4,212,1,0,0,0,4,214,1,0,0,0,4,220,1,0,0,0,4,222,1,0,0,0,4, - 224,1,0,0,0,4,226,1,0,0,0,5,228,1,0,0,0,5,230,1,0,0,0,5,232,1,0,0,0,5,234, - 1,0,0,0,5,236,1,0,0,0,5,238,1,0,0,0,5,240,1,0,0,0,5,242,1,0,0,0,5,244,1, - 0,0,0,6,246,1,0,0,0,6,248,1,0,0,0,6,250,1,0,0,0,6,252,1,0,0,0,6,256,1,0, - 0,0,6,258,1,0,0,0,6,260,1,0,0,0,6,262,1,0,0,0,6,264,1,0,0,0,6,266,1,0,0, - 0,7,268,1,0,0,0,7,270,1,0,0,0,7,272,1,0,0,0,7,274,1,0,0,0,7,276,1,0,0,0, - 7,278,1,0,0,0,7,280,1,0,0,0,7,282,1,0,0,0,7,284,1,0,0,0,7,286,1,0,0,0,8, - 288,1,0,0,0,8,290,1,0,0,0,8,292,1,0,0,0,8,294,1,0,0,0,8,296,1,0,0,0,8,298, - 1,0,0,0,8,300,1,0,0,0,9,302,1,0,0,0,9,304,1,0,0,0,9,306,1,0,0,0,9,308,1, - 0,0,0,9,310,1,0,0,0,10,312,1,0,0,0,10,314,1,0,0,0,10,316,1,0,0,0,10,318, - 1,0,0,0,10,320,1,0,0,0,11,322,1,0,0,0,11,324,1,0,0,0,11,326,1,0,0,0,11, - 328,1,0,0,0,11,330,1,0,0,0,11,332,1,0,0,0,12,334,1,0,0,0,12,336,1,0,0,0, - 12,338,1,0,0,0,12,340,1,0,0,0,12,342,1,0,0,0,13,344,1,0,0,0,13,346,1,0, - 0,0,13,348,1,0,0,0,13,350,1,0,0,0,13,352,1,0,0,0,13,354,1,0,0,0,13,356, - 1,0,0,0,13,358,1,0,0,0,14,360,1,0,0,0,16,370,1,0,0,0,18,377,1,0,0,0,20, - 386,1,0,0,0,22,393,1,0,0,0,24,403,1,0,0,0,26,410,1,0,0,0,28,417,1,0,0,0, - 30,431,1,0,0,0,32,438,1,0,0,0,34,446,1,0,0,0,36,453,1,0,0,0,38,463,1,0, - 0,0,40,475,1,0,0,0,42,484,1,0,0,0,44,490,1,0,0,0,46,497,1,0,0,0,48,504, - 1,0,0,0,50,512,1,0,0,0,52,521,1,0,0,0,54,527,1,0,0,0,56,544,1,0,0,0,58, - 560,1,0,0,0,60,569,1,0,0,0,62,572,1,0,0,0,64,576,1,0,0,0,66,581,1,0,0,0, - 68,586,1,0,0,0,70,590,1,0,0,0,72,594,1,0,0,0,74,598,1,0,0,0,76,602,1,0, - 0,0,78,604,1,0,0,0,80,606,1,0,0,0,82,609,1,0,0,0,84,611,1,0,0,0,86,620, - 1,0,0,0,88,622,1,0,0,0,90,627,1,0,0,0,92,629,1,0,0,0,94,634,1,0,0,0,96, - 665,1,0,0,0,98,668,1,0,0,0,100,714,1,0,0,0,102,716,1,0,0,0,104,719,1,0, - 0,0,106,723,1,0,0,0,108,727,1,0,0,0,110,729,1,0,0,0,112,732,1,0,0,0,114, - 734,1,0,0,0,116,739,1,0,0,0,118,741,1,0,0,0,120,747,1,0,0,0,122,753,1,0, - 0,0,124,758,1,0,0,0,126,760,1,0,0,0,128,763,1,0,0,0,130,766,1,0,0,0,132, - 771,1,0,0,0,134,775,1,0,0,0,136,780,1,0,0,0,138,786,1,0,0,0,140,789,1,0, - 0,0,142,791,1,0,0,0,144,797,1,0,0,0,146,799,1,0,0,0,148,804,1,0,0,0,150, - 807,1,0,0,0,152,810,1,0,0,0,154,813,1,0,0,0,156,815,1,0,0,0,158,818,1,0, - 0,0,160,820,1,0,0,0,162,823,1,0,0,0,164,825,1,0,0,0,166,827,1,0,0,0,168, - 829,1,0,0,0,170,831,1,0,0,0,172,833,1,0,0,0,174,838,1,0,0,0,176,859,1,0, - 0,0,178,861,1,0,0,0,180,869,1,0,0,0,182,871,1,0,0,0,184,875,1,0,0,0,186, - 879,1,0,0,0,188,883,1,0,0,0,190,888,1,0,0,0,192,892,1,0,0,0,194,896,1,0, - 0,0,196,900,1,0,0,0,198,904,1,0,0,0,200,908,1,0,0,0,202,917,1,0,0,0,204, - 921,1,0,0,0,206,925,1,0,0,0,208,929,1,0,0,0,210,933,1,0,0,0,212,938,1,0, - 0,0,214,942,1,0,0,0,216,950,1,0,0,0,218,971,1,0,0,0,220,975,1,0,0,0,222, - 979,1,0,0,0,224,983,1,0,0,0,226,987,1,0,0,0,228,991,1,0,0,0,230,996,1,0, - 0,0,232,1000,1,0,0,0,234,1004,1,0,0,0,236,1008,1,0,0,0,238,1011,1,0,0,0, - 240,1015,1,0,0,0,242,1019,1,0,0,0,244,1023,1,0,0,0,246,1027,1,0,0,0,248, - 1032,1,0,0,0,250,1037,1,0,0,0,252,1042,1,0,0,0,254,1049,1,0,0,0,256,1058, - 1,0,0,0,258,1065,1,0,0,0,260,1069,1,0,0,0,262,1073,1,0,0,0,264,1077,1,0, - 0,0,266,1081,1,0,0,0,268,1085,1,0,0,0,270,1091,1,0,0,0,272,1095,1,0,0,0, - 274,1099,1,0,0,0,276,1103,1,0,0,0,278,1107,1,0,0,0,280,1111,1,0,0,0,282, - 1115,1,0,0,0,284,1119,1,0,0,0,286,1123,1,0,0,0,288,1127,1,0,0,0,290,1132, - 1,0,0,0,292,1136,1,0,0,0,294,1140,1,0,0,0,296,1144,1,0,0,0,298,1148,1,0, - 0,0,300,1152,1,0,0,0,302,1156,1,0,0,0,304,1161,1,0,0,0,306,1166,1,0,0,0, - 308,1170,1,0,0,0,310,1174,1,0,0,0,312,1178,1,0,0,0,314,1183,1,0,0,0,316, - 1193,1,0,0,0,318,1197,1,0,0,0,320,1201,1,0,0,0,322,1205,1,0,0,0,324,1210, - 1,0,0,0,326,1217,1,0,0,0,328,1221,1,0,0,0,330,1225,1,0,0,0,332,1229,1,0, - 0,0,334,1233,1,0,0,0,336,1238,1,0,0,0,338,1244,1,0,0,0,340,1248,1,0,0,0, - 342,1252,1,0,0,0,344,1256,1,0,0,0,346,1262,1,0,0,0,348,1266,1,0,0,0,350, - 1270,1,0,0,0,352,1274,1,0,0,0,354,1280,1,0,0,0,356,1286,1,0,0,0,358,1292, - 1,0,0,0,360,361,7,0,0,0,361,362,7,1,0,0,362,363,7,2,0,0,363,364,7,2,0,0, - 364,365,7,3,0,0,365,366,7,4,0,0,366,367,7,5,0,0,367,368,1,0,0,0,368,369, - 6,0,0,0,369,15,1,0,0,0,370,371,7,0,0,0,371,372,7,6,0,0,372,373,7,7,0,0, - 373,374,7,8,0,0,374,375,1,0,0,0,375,376,6,1,1,0,376,17,1,0,0,0,377,378, - 7,3,0,0,378,379,7,9,0,0,379,380,7,6,0,0,380,381,7,1,0,0,381,382,7,4,0,0, - 382,383,7,10,0,0,383,384,1,0,0,0,384,385,6,2,2,0,385,19,1,0,0,0,386,387, - 7,3,0,0,387,388,7,11,0,0,388,389,7,12,0,0,389,390,7,13,0,0,390,391,1,0, - 0,0,391,392,6,3,0,0,392,21,1,0,0,0,393,394,7,3,0,0,394,395,7,14,0,0,395, - 396,7,8,0,0,396,397,7,13,0,0,397,398,7,12,0,0,398,399,7,1,0,0,399,400,7, - 9,0,0,400,401,1,0,0,0,401,402,6,4,3,0,402,23,1,0,0,0,403,404,7,15,0,0,404, - 405,7,6,0,0,405,406,7,7,0,0,406,407,7,16,0,0,407,408,1,0,0,0,408,409,6, - 5,4,0,409,25,1,0,0,0,410,411,7,17,0,0,411,412,7,6,0,0,412,413,7,7,0,0,413, - 414,7,18,0,0,414,415,1,0,0,0,415,416,6,6,0,0,416,27,1,0,0,0,417,418,7,1, - 0,0,418,419,7,9,0,0,419,420,7,13,0,0,420,421,7,1,0,0,421,422,7,9,0,0,422, - 423,7,3,0,0,423,424,7,2,0,0,424,425,7,5,0,0,425,426,7,12,0,0,426,427,7, - 5,0,0,427,428,7,2,0,0,428,429,1,0,0,0,429,430,6,7,0,0,430,29,1,0,0,0,431, - 432,7,18,0,0,432,433,7,3,0,0,433,434,7,3,0,0,434,435,7,8,0,0,435,436,1, - 0,0,0,436,437,6,8,1,0,437,31,1,0,0,0,438,439,7,13,0,0,439,440,7,1,0,0,440, - 441,7,16,0,0,441,442,7,1,0,0,442,443,7,5,0,0,443,444,1,0,0,0,444,445,6, - 9,0,0,445,33,1,0,0,0,446,447,7,16,0,0,447,448,7,3,0,0,448,449,7,5,0,0,449, - 450,7,12,0,0,450,451,1,0,0,0,451,452,6,10,5,0,452,35,1,0,0,0,453,454,7, - 16,0,0,454,455,7,3,0,0,455,456,7,5,0,0,456,457,7,6,0,0,457,458,7,1,0,0, - 458,459,7,4,0,0,459,460,7,2,0,0,460,461,1,0,0,0,461,462,6,11,6,0,462,37, - 1,0,0,0,463,464,7,16,0,0,464,465,7,11,0,0,465,466,5,95,0,0,466,467,7,3, - 0,0,467,468,7,14,0,0,468,469,7,8,0,0,469,470,7,12,0,0,470,471,7,9,0,0,471, - 472,7,0,0,0,472,473,1,0,0,0,473,474,6,12,7,0,474,39,1,0,0,0,475,476,7,6, - 0,0,476,477,7,3,0,0,477,478,7,9,0,0,478,479,7,12,0,0,479,480,7,16,0,0,480, - 481,7,3,0,0,481,482,1,0,0,0,482,483,6,13,8,0,483,41,1,0,0,0,484,485,7,6, - 0,0,485,486,7,7,0,0,486,487,7,19,0,0,487,488,1,0,0,0,488,489,6,14,0,0,489, - 43,1,0,0,0,490,491,7,2,0,0,491,492,7,10,0,0,492,493,7,7,0,0,493,494,7,19, - 0,0,494,495,1,0,0,0,495,496,6,15,9,0,496,45,1,0,0,0,497,498,7,2,0,0,498, - 499,7,7,0,0,499,500,7,6,0,0,500,501,7,5,0,0,501,502,1,0,0,0,502,503,6,16, - 0,0,503,47,1,0,0,0,504,505,7,2,0,0,505,506,7,5,0,0,506,507,7,12,0,0,507, - 508,7,5,0,0,508,509,7,2,0,0,509,510,1,0,0,0,510,511,6,17,0,0,511,49,1,0, - 0,0,512,513,7,19,0,0,513,514,7,10,0,0,514,515,7,3,0,0,515,516,7,6,0,0,516, - 517,7,3,0,0,517,518,1,0,0,0,518,519,6,18,0,0,519,51,1,0,0,0,520,522,8,20, - 0,0,521,520,1,0,0,0,522,523,1,0,0,0,523,521,1,0,0,0,523,524,1,0,0,0,524, - 525,1,0,0,0,525,526,6,19,0,0,526,53,1,0,0,0,527,528,5,47,0,0,528,529,5, - 47,0,0,529,533,1,0,0,0,530,532,8,21,0,0,531,530,1,0,0,0,532,535,1,0,0,0, - 533,531,1,0,0,0,533,534,1,0,0,0,534,537,1,0,0,0,535,533,1,0,0,0,536,538, - 5,13,0,0,537,536,1,0,0,0,537,538,1,0,0,0,538,540,1,0,0,0,539,541,5,10,0, - 0,540,539,1,0,0,0,540,541,1,0,0,0,541,542,1,0,0,0,542,543,6,20,10,0,543, - 55,1,0,0,0,544,545,5,47,0,0,545,546,5,42,0,0,546,551,1,0,0,0,547,550,3, - 56,21,0,548,550,9,0,0,0,549,547,1,0,0,0,549,548,1,0,0,0,550,553,1,0,0,0, - 551,552,1,0,0,0,551,549,1,0,0,0,552,554,1,0,0,0,553,551,1,0,0,0,554,555, - 5,42,0,0,555,556,5,47,0,0,556,557,1,0,0,0,557,558,6,21,10,0,558,57,1,0, - 0,0,559,561,7,22,0,0,560,559,1,0,0,0,561,562,1,0,0,0,562,560,1,0,0,0,562, - 563,1,0,0,0,563,564,1,0,0,0,564,565,6,22,10,0,565,59,1,0,0,0,566,570,8, - 23,0,0,567,568,5,47,0,0,568,570,8,24,0,0,569,566,1,0,0,0,569,567,1,0,0, - 0,570,61,1,0,0,0,571,573,3,60,23,0,572,571,1,0,0,0,573,574,1,0,0,0,574, - 572,1,0,0,0,574,575,1,0,0,0,575,63,1,0,0,0,576,577,3,172,79,0,577,578,1, - 0,0,0,578,579,6,25,11,0,579,580,6,25,12,0,580,65,1,0,0,0,581,582,3,74,30, - 0,582,583,1,0,0,0,583,584,6,26,13,0,584,585,6,26,14,0,585,67,1,0,0,0,586, - 587,3,58,22,0,587,588,1,0,0,0,588,589,6,27,10,0,589,69,1,0,0,0,590,591, - 3,54,20,0,591,592,1,0,0,0,592,593,6,28,10,0,593,71,1,0,0,0,594,595,3,56, - 21,0,595,596,1,0,0,0,596,597,6,29,10,0,597,73,1,0,0,0,598,599,5,124,0,0, - 599,600,1,0,0,0,600,601,6,30,14,0,601,75,1,0,0,0,602,603,7,25,0,0,603,77, - 1,0,0,0,604,605,7,26,0,0,605,79,1,0,0,0,606,607,5,92,0,0,607,608,7,27,0, - 0,608,81,1,0,0,0,609,610,8,28,0,0,610,83,1,0,0,0,611,613,7,3,0,0,612,614, - 7,29,0,0,613,612,1,0,0,0,613,614,1,0,0,0,614,616,1,0,0,0,615,617,3,76,31, - 0,616,615,1,0,0,0,617,618,1,0,0,0,618,616,1,0,0,0,618,619,1,0,0,0,619,85, - 1,0,0,0,620,621,5,64,0,0,621,87,1,0,0,0,622,623,5,96,0,0,623,89,1,0,0,0, - 624,628,8,30,0,0,625,626,5,96,0,0,626,628,5,96,0,0,627,624,1,0,0,0,627, - 625,1,0,0,0,628,91,1,0,0,0,629,630,5,95,0,0,630,93,1,0,0,0,631,635,3,78, - 32,0,632,635,3,76,31,0,633,635,3,92,39,0,634,631,1,0,0,0,634,632,1,0,0, - 0,634,633,1,0,0,0,635,95,1,0,0,0,636,641,5,34,0,0,637,640,3,80,33,0,638, - 640,3,82,34,0,639,637,1,0,0,0,639,638,1,0,0,0,640,643,1,0,0,0,641,639,1, - 0,0,0,641,642,1,0,0,0,642,644,1,0,0,0,643,641,1,0,0,0,644,666,5,34,0,0, - 645,646,5,34,0,0,646,647,5,34,0,0,647,648,5,34,0,0,648,652,1,0,0,0,649, - 651,8,21,0,0,650,649,1,0,0,0,651,654,1,0,0,0,652,653,1,0,0,0,652,650,1, - 0,0,0,653,655,1,0,0,0,654,652,1,0,0,0,655,656,5,34,0,0,656,657,5,34,0,0, - 657,658,5,34,0,0,658,660,1,0,0,0,659,661,5,34,0,0,660,659,1,0,0,0,660,661, - 1,0,0,0,661,663,1,0,0,0,662,664,5,34,0,0,663,662,1,0,0,0,663,664,1,0,0, - 0,664,666,1,0,0,0,665,636,1,0,0,0,665,645,1,0,0,0,666,97,1,0,0,0,667,669, - 3,76,31,0,668,667,1,0,0,0,669,670,1,0,0,0,670,668,1,0,0,0,670,671,1,0,0, - 0,671,99,1,0,0,0,672,674,3,76,31,0,673,672,1,0,0,0,674,675,1,0,0,0,675, - 673,1,0,0,0,675,676,1,0,0,0,676,677,1,0,0,0,677,681,3,116,51,0,678,680, - 3,76,31,0,679,678,1,0,0,0,680,683,1,0,0,0,681,679,1,0,0,0,681,682,1,0,0, - 0,682,715,1,0,0,0,683,681,1,0,0,0,684,686,3,116,51,0,685,687,3,76,31,0, - 686,685,1,0,0,0,687,688,1,0,0,0,688,686,1,0,0,0,688,689,1,0,0,0,689,715, - 1,0,0,0,690,692,3,76,31,0,691,690,1,0,0,0,692,693,1,0,0,0,693,691,1,0,0, - 0,693,694,1,0,0,0,694,702,1,0,0,0,695,699,3,116,51,0,696,698,3,76,31,0, - 697,696,1,0,0,0,698,701,1,0,0,0,699,697,1,0,0,0,699,700,1,0,0,0,700,703, - 1,0,0,0,701,699,1,0,0,0,702,695,1,0,0,0,702,703,1,0,0,0,703,704,1,0,0,0, - 704,705,3,84,35,0,705,715,1,0,0,0,706,708,3,116,51,0,707,709,3,76,31,0, - 708,707,1,0,0,0,709,710,1,0,0,0,710,708,1,0,0,0,710,711,1,0,0,0,711,712, - 1,0,0,0,712,713,3,84,35,0,713,715,1,0,0,0,714,673,1,0,0,0,714,684,1,0,0, - 0,714,691,1,0,0,0,714,706,1,0,0,0,715,101,1,0,0,0,716,717,7,31,0,0,717, - 718,7,32,0,0,718,103,1,0,0,0,719,720,7,12,0,0,720,721,7,9,0,0,721,722,7, - 0,0,0,722,105,1,0,0,0,723,724,7,12,0,0,724,725,7,2,0,0,725,726,7,4,0,0, - 726,107,1,0,0,0,727,728,5,61,0,0,728,109,1,0,0,0,729,730,5,58,0,0,730,731, - 5,58,0,0,731,111,1,0,0,0,732,733,5,44,0,0,733,113,1,0,0,0,734,735,7,0,0, - 0,735,736,7,3,0,0,736,737,7,2,0,0,737,738,7,4,0,0,738,115,1,0,0,0,739,740, - 5,46,0,0,740,117,1,0,0,0,741,742,7,15,0,0,742,743,7,12,0,0,743,744,7,13, - 0,0,744,745,7,2,0,0,745,746,7,3,0,0,746,119,1,0,0,0,747,748,7,15,0,0,748, - 749,7,1,0,0,749,750,7,6,0,0,750,751,7,2,0,0,751,752,7,5,0,0,752,121,1,0, - 0,0,753,754,7,13,0,0,754,755,7,12,0,0,755,756,7,2,0,0,756,757,7,5,0,0,757, - 123,1,0,0,0,758,759,5,40,0,0,759,125,1,0,0,0,760,761,7,1,0,0,761,762,7, - 9,0,0,762,127,1,0,0,0,763,764,7,1,0,0,764,765,7,2,0,0,765,129,1,0,0,0,766, - 767,7,13,0,0,767,768,7,1,0,0,768,769,7,18,0,0,769,770,7,3,0,0,770,131,1, - 0,0,0,771,772,7,9,0,0,772,773,7,7,0,0,773,774,7,5,0,0,774,133,1,0,0,0,775, - 776,7,9,0,0,776,777,7,33,0,0,777,778,7,13,0,0,778,779,7,13,0,0,779,135, - 1,0,0,0,780,781,7,9,0,0,781,782,7,33,0,0,782,783,7,13,0,0,783,784,7,13, - 0,0,784,785,7,2,0,0,785,137,1,0,0,0,786,787,7,7,0,0,787,788,7,6,0,0,788, - 139,1,0,0,0,789,790,5,63,0,0,790,141,1,0,0,0,791,792,7,6,0,0,792,793,7, - 13,0,0,793,794,7,1,0,0,794,795,7,18,0,0,795,796,7,3,0,0,796,143,1,0,0,0, - 797,798,5,41,0,0,798,145,1,0,0,0,799,800,7,5,0,0,800,801,7,6,0,0,801,802, - 7,33,0,0,802,803,7,3,0,0,803,147,1,0,0,0,804,805,5,61,0,0,805,806,5,61, - 0,0,806,149,1,0,0,0,807,808,5,61,0,0,808,809,5,126,0,0,809,151,1,0,0,0, - 810,811,5,33,0,0,811,812,5,61,0,0,812,153,1,0,0,0,813,814,5,60,0,0,814, - 155,1,0,0,0,815,816,5,60,0,0,816,817,5,61,0,0,817,157,1,0,0,0,818,819,5, - 62,0,0,819,159,1,0,0,0,820,821,5,62,0,0,821,822,5,61,0,0,822,161,1,0,0, - 0,823,824,5,43,0,0,824,163,1,0,0,0,825,826,5,45,0,0,826,165,1,0,0,0,827, - 828,5,42,0,0,828,167,1,0,0,0,829,830,5,47,0,0,830,169,1,0,0,0,831,832,5, - 37,0,0,832,171,1,0,0,0,833,834,5,91,0,0,834,835,1,0,0,0,835,836,6,79,0, - 0,836,837,6,79,0,0,837,173,1,0,0,0,838,839,5,93,0,0,839,840,1,0,0,0,840, - 841,6,80,14,0,841,842,6,80,14,0,842,175,1,0,0,0,843,847,3,78,32,0,844,846, - 3,94,40,0,845,844,1,0,0,0,846,849,1,0,0,0,847,845,1,0,0,0,847,848,1,0,0, - 0,848,860,1,0,0,0,849,847,1,0,0,0,850,853,3,92,39,0,851,853,3,86,36,0,852, - 850,1,0,0,0,852,851,1,0,0,0,853,855,1,0,0,0,854,856,3,94,40,0,855,854,1, - 0,0,0,856,857,1,0,0,0,857,855,1,0,0,0,857,858,1,0,0,0,858,860,1,0,0,0,859, - 843,1,0,0,0,859,852,1,0,0,0,860,177,1,0,0,0,861,863,3,88,37,0,862,864,3, - 90,38,0,863,862,1,0,0,0,864,865,1,0,0,0,865,863,1,0,0,0,865,866,1,0,0,0, - 866,867,1,0,0,0,867,868,3,88,37,0,868,179,1,0,0,0,869,870,3,178,82,0,870, - 181,1,0,0,0,871,872,3,54,20,0,872,873,1,0,0,0,873,874,6,84,10,0,874,183, - 1,0,0,0,875,876,3,56,21,0,876,877,1,0,0,0,877,878,6,85,10,0,878,185,1,0, - 0,0,879,880,3,58,22,0,880,881,1,0,0,0,881,882,6,86,10,0,882,187,1,0,0,0, - 883,884,3,74,30,0,884,885,1,0,0,0,885,886,6,87,13,0,886,887,6,87,14,0,887, - 189,1,0,0,0,888,889,3,172,79,0,889,890,1,0,0,0,890,891,6,88,11,0,891,191, - 1,0,0,0,892,893,3,174,80,0,893,894,1,0,0,0,894,895,6,89,15,0,895,193,1, - 0,0,0,896,897,3,112,49,0,897,898,1,0,0,0,898,899,6,90,16,0,899,195,1,0, - 0,0,900,901,3,108,47,0,901,902,1,0,0,0,902,903,6,91,17,0,903,197,1,0,0, - 0,904,905,3,96,41,0,905,906,1,0,0,0,906,907,6,92,18,0,907,199,1,0,0,0,908, - 909,7,16,0,0,909,910,7,3,0,0,910,911,7,5,0,0,911,912,7,12,0,0,912,913,7, - 0,0,0,913,914,7,12,0,0,914,915,7,5,0,0,915,916,7,12,0,0,916,201,1,0,0,0, - 917,918,3,62,24,0,918,919,1,0,0,0,919,920,6,94,19,0,920,203,1,0,0,0,921, - 922,3,54,20,0,922,923,1,0,0,0,923,924,6,95,10,0,924,205,1,0,0,0,925,926, - 3,56,21,0,926,927,1,0,0,0,927,928,6,96,10,0,928,207,1,0,0,0,929,930,3,58, - 22,0,930,931,1,0,0,0,931,932,6,97,10,0,932,209,1,0,0,0,933,934,3,74,30, - 0,934,935,1,0,0,0,935,936,6,98,13,0,936,937,6,98,14,0,937,211,1,0,0,0,938, - 939,3,116,51,0,939,940,1,0,0,0,940,941,6,99,20,0,941,213,1,0,0,0,942,943, - 3,112,49,0,943,944,1,0,0,0,944,945,6,100,16,0,945,215,1,0,0,0,946,951,3, - 78,32,0,947,951,3,76,31,0,948,951,3,92,39,0,949,951,3,166,76,0,950,946, - 1,0,0,0,950,947,1,0,0,0,950,948,1,0,0,0,950,949,1,0,0,0,951,217,1,0,0,0, - 952,955,3,78,32,0,953,955,3,166,76,0,954,952,1,0,0,0,954,953,1,0,0,0,955, - 959,1,0,0,0,956,958,3,216,101,0,957,956,1,0,0,0,958,961,1,0,0,0,959,957, - 1,0,0,0,959,960,1,0,0,0,960,972,1,0,0,0,961,959,1,0,0,0,962,965,3,92,39, - 0,963,965,3,86,36,0,964,962,1,0,0,0,964,963,1,0,0,0,965,967,1,0,0,0,966, - 968,3,216,101,0,967,966,1,0,0,0,968,969,1,0,0,0,969,967,1,0,0,0,969,970, - 1,0,0,0,970,972,1,0,0,0,971,954,1,0,0,0,971,964,1,0,0,0,972,219,1,0,0,0, - 973,976,3,218,102,0,974,976,3,178,82,0,975,973,1,0,0,0,975,974,1,0,0,0, - 976,977,1,0,0,0,977,975,1,0,0,0,977,978,1,0,0,0,978,221,1,0,0,0,979,980, - 3,54,20,0,980,981,1,0,0,0,981,982,6,104,10,0,982,223,1,0,0,0,983,984,3, - 56,21,0,984,985,1,0,0,0,985,986,6,105,10,0,986,225,1,0,0,0,987,988,3,58, - 22,0,988,989,1,0,0,0,989,990,6,106,10,0,990,227,1,0,0,0,991,992,3,74,30, - 0,992,993,1,0,0,0,993,994,6,107,13,0,994,995,6,107,14,0,995,229,1,0,0,0, - 996,997,3,108,47,0,997,998,1,0,0,0,998,999,6,108,17,0,999,231,1,0,0,0,1000, - 1001,3,112,49,0,1001,1002,1,0,0,0,1002,1003,6,109,16,0,1003,233,1,0,0,0, - 1004,1005,3,116,51,0,1005,1006,1,0,0,0,1006,1007,6,110,20,0,1007,235,1, - 0,0,0,1008,1009,7,12,0,0,1009,1010,7,2,0,0,1010,237,1,0,0,0,1011,1012,3, - 220,103,0,1012,1013,1,0,0,0,1013,1014,6,112,21,0,1014,239,1,0,0,0,1015, - 1016,3,54,20,0,1016,1017,1,0,0,0,1017,1018,6,113,10,0,1018,241,1,0,0,0, - 1019,1020,3,56,21,0,1020,1021,1,0,0,0,1021,1022,6,114,10,0,1022,243,1,0, - 0,0,1023,1024,3,58,22,0,1024,1025,1,0,0,0,1025,1026,6,115,10,0,1026,245, - 1,0,0,0,1027,1028,3,74,30,0,1028,1029,1,0,0,0,1029,1030,6,116,13,0,1030, - 1031,6,116,14,0,1031,247,1,0,0,0,1032,1033,3,172,79,0,1033,1034,1,0,0,0, - 1034,1035,6,117,11,0,1035,1036,6,117,22,0,1036,249,1,0,0,0,1037,1038,7, - 7,0,0,1038,1039,7,9,0,0,1039,1040,1,0,0,0,1040,1041,6,118,23,0,1041,251, - 1,0,0,0,1042,1043,7,19,0,0,1043,1044,7,1,0,0,1044,1045,7,5,0,0,1045,1046, - 7,10,0,0,1046,1047,1,0,0,0,1047,1048,6,119,23,0,1048,253,1,0,0,0,1049,1050, - 8,34,0,0,1050,255,1,0,0,0,1051,1053,3,254,120,0,1052,1051,1,0,0,0,1053, - 1054,1,0,0,0,1054,1052,1,0,0,0,1054,1055,1,0,0,0,1055,1056,1,0,0,0,1056, - 1057,3,324,155,0,1057,1059,1,0,0,0,1058,1052,1,0,0,0,1058,1059,1,0,0,0, - 1059,1061,1,0,0,0,1060,1062,3,254,120,0,1061,1060,1,0,0,0,1062,1063,1,0, - 0,0,1063,1061,1,0,0,0,1063,1064,1,0,0,0,1064,257,1,0,0,0,1065,1066,3,180, - 83,0,1066,1067,1,0,0,0,1067,1068,6,122,24,0,1068,259,1,0,0,0,1069,1070, - 3,256,121,0,1070,1071,1,0,0,0,1071,1072,6,123,25,0,1072,261,1,0,0,0,1073, - 1074,3,54,20,0,1074,1075,1,0,0,0,1075,1076,6,124,10,0,1076,263,1,0,0,0, - 1077,1078,3,56,21,0,1078,1079,1,0,0,0,1079,1080,6,125,10,0,1080,265,1,0, - 0,0,1081,1082,3,58,22,0,1082,1083,1,0,0,0,1083,1084,6,126,10,0,1084,267, - 1,0,0,0,1085,1086,3,74,30,0,1086,1087,1,0,0,0,1087,1088,6,127,13,0,1088, - 1089,6,127,14,0,1089,1090,6,127,14,0,1090,269,1,0,0,0,1091,1092,3,108,47, - 0,1092,1093,1,0,0,0,1093,1094,6,128,17,0,1094,271,1,0,0,0,1095,1096,3,112, - 49,0,1096,1097,1,0,0,0,1097,1098,6,129,16,0,1098,273,1,0,0,0,1099,1100, - 3,116,51,0,1100,1101,1,0,0,0,1101,1102,6,130,20,0,1102,275,1,0,0,0,1103, - 1104,3,252,119,0,1104,1105,1,0,0,0,1105,1106,6,131,26,0,1106,277,1,0,0, - 0,1107,1108,3,220,103,0,1108,1109,1,0,0,0,1109,1110,6,132,21,0,1110,279, - 1,0,0,0,1111,1112,3,180,83,0,1112,1113,1,0,0,0,1113,1114,6,133,24,0,1114, - 281,1,0,0,0,1115,1116,3,54,20,0,1116,1117,1,0,0,0,1117,1118,6,134,10,0, - 1118,283,1,0,0,0,1119,1120,3,56,21,0,1120,1121,1,0,0,0,1121,1122,6,135, - 10,0,1122,285,1,0,0,0,1123,1124,3,58,22,0,1124,1125,1,0,0,0,1125,1126,6, - 136,10,0,1126,287,1,0,0,0,1127,1128,3,74,30,0,1128,1129,1,0,0,0,1129,1130, - 6,137,13,0,1130,1131,6,137,14,0,1131,289,1,0,0,0,1132,1133,3,116,51,0,1133, - 1134,1,0,0,0,1134,1135,6,138,20,0,1135,291,1,0,0,0,1136,1137,3,180,83,0, - 1137,1138,1,0,0,0,1138,1139,6,139,24,0,1139,293,1,0,0,0,1140,1141,3,176, - 81,0,1141,1142,1,0,0,0,1142,1143,6,140,27,0,1143,295,1,0,0,0,1144,1145, - 3,54,20,0,1145,1146,1,0,0,0,1146,1147,6,141,10,0,1147,297,1,0,0,0,1148, - 1149,3,56,21,0,1149,1150,1,0,0,0,1150,1151,6,142,10,0,1151,299,1,0,0,0, - 1152,1153,3,58,22,0,1153,1154,1,0,0,0,1154,1155,6,143,10,0,1155,301,1,0, - 0,0,1156,1157,3,74,30,0,1157,1158,1,0,0,0,1158,1159,6,144,13,0,1159,1160, - 6,144,14,0,1160,303,1,0,0,0,1161,1162,7,1,0,0,1162,1163,7,9,0,0,1163,1164, - 7,15,0,0,1164,1165,7,7,0,0,1165,305,1,0,0,0,1166,1167,3,54,20,0,1167,1168, - 1,0,0,0,1168,1169,6,146,10,0,1169,307,1,0,0,0,1170,1171,3,56,21,0,1171, - 1172,1,0,0,0,1172,1173,6,147,10,0,1173,309,1,0,0,0,1174,1175,3,58,22,0, - 1175,1176,1,0,0,0,1176,1177,6,148,10,0,1177,311,1,0,0,0,1178,1179,3,74, - 30,0,1179,1180,1,0,0,0,1180,1181,6,149,13,0,1181,1182,6,149,14,0,1182,313, - 1,0,0,0,1183,1184,7,15,0,0,1184,1185,7,33,0,0,1185,1186,7,9,0,0,1186,1187, - 7,4,0,0,1187,1188,7,5,0,0,1188,1189,7,1,0,0,1189,1190,7,7,0,0,1190,1191, - 7,9,0,0,1191,1192,7,2,0,0,1192,315,1,0,0,0,1193,1194,3,54,20,0,1194,1195, - 1,0,0,0,1195,1196,6,151,10,0,1196,317,1,0,0,0,1197,1198,3,56,21,0,1198, - 1199,1,0,0,0,1199,1200,6,152,10,0,1200,319,1,0,0,0,1201,1202,3,58,22,0, - 1202,1203,1,0,0,0,1203,1204,6,153,10,0,1204,321,1,0,0,0,1205,1206,3,174, - 80,0,1206,1207,1,0,0,0,1207,1208,6,154,15,0,1208,1209,6,154,14,0,1209,323, - 1,0,0,0,1210,1211,5,58,0,0,1211,325,1,0,0,0,1212,1218,3,86,36,0,1213,1218, - 3,76,31,0,1214,1218,3,116,51,0,1215,1218,3,78,32,0,1216,1218,3,92,39,0, - 1217,1212,1,0,0,0,1217,1213,1,0,0,0,1217,1214,1,0,0,0,1217,1215,1,0,0,0, - 1217,1216,1,0,0,0,1218,1219,1,0,0,0,1219,1217,1,0,0,0,1219,1220,1,0,0,0, - 1220,327,1,0,0,0,1221,1222,3,54,20,0,1222,1223,1,0,0,0,1223,1224,6,157, - 10,0,1224,329,1,0,0,0,1225,1226,3,56,21,0,1226,1227,1,0,0,0,1227,1228,6, - 158,10,0,1228,331,1,0,0,0,1229,1230,3,58,22,0,1230,1231,1,0,0,0,1231,1232, - 6,159,10,0,1232,333,1,0,0,0,1233,1234,3,74,30,0,1234,1235,1,0,0,0,1235, - 1236,6,160,13,0,1236,1237,6,160,14,0,1237,335,1,0,0,0,1238,1239,3,62,24, - 0,1239,1240,1,0,0,0,1240,1241,6,161,19,0,1241,1242,6,161,14,0,1242,1243, - 6,161,28,0,1243,337,1,0,0,0,1244,1245,3,54,20,0,1245,1246,1,0,0,0,1246, - 1247,6,162,10,0,1247,339,1,0,0,0,1248,1249,3,56,21,0,1249,1250,1,0,0,0, - 1250,1251,6,163,10,0,1251,341,1,0,0,0,1252,1253,3,58,22,0,1253,1254,1,0, - 0,0,1254,1255,6,164,10,0,1255,343,1,0,0,0,1256,1257,3,112,49,0,1257,1258, - 1,0,0,0,1258,1259,6,165,16,0,1259,1260,6,165,14,0,1260,1261,6,165,6,0,1261, - 345,1,0,0,0,1262,1263,3,54,20,0,1263,1264,1,0,0,0,1264,1265,6,166,10,0, - 1265,347,1,0,0,0,1266,1267,3,56,21,0,1267,1268,1,0,0,0,1268,1269,6,167, - 10,0,1269,349,1,0,0,0,1270,1271,3,58,22,0,1271,1272,1,0,0,0,1272,1273,6, - 168,10,0,1273,351,1,0,0,0,1274,1275,3,180,83,0,1275,1276,1,0,0,0,1276,1277, - 6,169,14,0,1277,1278,6,169,0,0,1278,1279,6,169,24,0,1279,353,1,0,0,0,1280, - 1281,3,176,81,0,1281,1282,1,0,0,0,1282,1283,6,170,14,0,1283,1284,6,170, - 0,0,1284,1285,6,170,27,0,1285,355,1,0,0,0,1286,1287,3,102,44,0,1287,1288, - 1,0,0,0,1288,1289,6,171,14,0,1289,1290,6,171,0,0,1290,1291,6,171,29,0,1291, - 357,1,0,0,0,1292,1293,3,74,30,0,1293,1294,1,0,0,0,1294,1295,6,172,13,0, - 1295,1296,6,172,14,0,1296,359,1,0,0,0,60,0,1,2,3,4,5,6,7,8,9,10,11,12,13, - 523,533,537,540,549,551,562,569,574,613,618,627,634,639,641,652,660,663, - 665,670,675,681,688,693,699,702,710,714,847,852,857,859,865,950,954,959, - 964,969,971,975,977,1054,1058,1063,1217,1219,30,5,2,0,5,4,0,5,6,0,5,1,0, - 5,3,0,5,10,0,5,12,0,5,8,0,5,5,0,5,9,0,0,1,0,7,67,0,5,0,0,7,28,0,4,0,0,7, - 68,0,7,37,0,7,35,0,7,29,0,7,24,0,7,39,0,7,78,0,5,11,0,5,7,0,7,70,0,7,88, - 0,7,87,0,7,69,0,5,13,0,7,32,0]; + public static readonly _serializedATN: number[] = [4,0,123,1404,6,-1,6, + -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1, + 2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8, + 2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16, + 7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7, + 23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30, + 2,31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2, + 38,7,38,2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45, + 7,45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7, + 52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59, + 2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,2,66,7,66,2, + 67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74, + 7,74,2,75,7,75,2,76,7,76,2,77,7,77,2,78,7,78,2,79,7,79,2,80,7,80,2,81,7, + 81,2,82,7,82,2,83,7,83,2,84,7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88, + 2,89,7,89,2,90,7,90,2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2, + 96,7,96,2,97,7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102, + 2,103,7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108, + 2,109,7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114,7,114, + 2,115,7,115,2,116,7,116,2,117,7,117,2,118,7,118,2,119,7,119,2,120,7,120, + 2,121,7,121,2,122,7,122,2,123,7,123,2,124,7,124,2,125,7,125,2,126,7,126, + 2,127,7,127,2,128,7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132, + 2,133,7,133,2,134,7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138, + 2,139,7,139,2,140,7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144, + 2,145,7,145,2,146,7,146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150, + 2,151,7,151,2,152,7,152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156, + 2,157,7,157,2,158,7,158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162, + 2,163,7,163,2,164,7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168, + 2,169,7,169,2,170,7,170,2,171,7,171,2,172,7,172,2,173,7,173,2,174,7,174, + 2,175,7,175,2,176,7,176,2,177,7,177,2,178,7,178,2,179,7,179,2,180,7,180, + 2,181,7,181,2,182,7,182,2,183,7,183,2,184,7,184,2,185,7,185,2,186,7,186, + 2,187,7,187,2,188,7,188,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3, + 1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9, + 1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11, + 1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,4,20,565, + 8,20,11,20,12,20,566,1,20,1,20,1,21,1,21,1,21,1,21,5,21,575,8,21,10,21, + 12,21,578,9,21,1,21,3,21,581,8,21,1,21,3,21,584,8,21,1,21,1,21,1,22,1,22, + 1,22,1,22,1,22,5,22,593,8,22,10,22,12,22,596,9,22,1,22,1,22,1,22,1,22,1, + 22,1,23,4,23,604,8,23,11,23,12,23,605,1,23,1,23,1,24,1,24,1,24,3,24,613, + 8,24,1,25,4,25,616,8,25,11,25,12,25,617,1,26,1,26,1,26,1,26,1,26,1,27,1, + 27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30, + 1,30,1,31,1,31,1,31,1,31,1,32,1,32,1,33,1,33,1,34,1,34,1,34,1,35,1,35,1, + 36,1,36,3,36,657,8,36,1,36,4,36,660,8,36,11,36,12,36,661,1,37,1,37,1,38, + 1,38,1,39,1,39,1,39,3,39,671,8,39,1,40,1,40,1,41,1,41,1,41,3,41,678,8,41, + 1,42,1,42,1,42,5,42,683,8,42,10,42,12,42,686,9,42,1,42,1,42,1,42,1,42,1, + 42,1,42,5,42,694,8,42,10,42,12,42,697,9,42,1,42,1,42,1,42,1,42,1,42,3,42, + 704,8,42,1,42,3,42,707,8,42,3,42,709,8,42,1,43,4,43,712,8,43,11,43,12,43, + 713,1,44,4,44,717,8,44,11,44,12,44,718,1,44,1,44,5,44,723,8,44,10,44,12, + 44,726,9,44,1,44,1,44,4,44,730,8,44,11,44,12,44,731,1,44,4,44,735,8,44, + 11,44,12,44,736,1,44,1,44,5,44,741,8,44,10,44,12,44,744,9,44,3,44,746,8, + 44,1,44,1,44,1,44,1,44,4,44,752,8,44,11,44,12,44,753,1,44,1,44,3,44,758, + 8,44,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48,1,48,1, + 49,1,49,1,49,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,53,1,53,1,53, + 1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1, + 56,1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60, + 1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1, + 63,1,63,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,67,1,67,1,67, + 1,67,1,67,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,70,1,71,1,71,1,72,1, + 72,1,72,1,73,1,73,1,74,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78,1,78, + 1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,5, + 82,889,8,82,10,82,12,82,892,9,82,1,82,1,82,3,82,896,8,82,1,82,4,82,899, + 8,82,11,82,12,82,900,3,82,903,8,82,1,83,1,83,4,83,907,8,83,11,83,12,83, + 908,1,83,1,83,1,84,1,84,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1, + 87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90, + 1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1, + 94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96, + 1,96,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1, + 100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,3, + 102,994,8,102,1,103,1,103,3,103,998,8,103,1,103,5,103,1001,8,103,10,103, + 12,103,1004,9,103,1,103,1,103,3,103,1008,8,103,1,103,4,103,1011,8,103,11, + 103,12,103,1012,3,103,1015,8,103,1,104,1,104,4,104,1019,8,104,11,104,12, + 104,1020,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1, + 107,1,107,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,110,1, + 110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,113,1,113,1, + 113,1,113,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,116,1,116,1, + 116,1,116,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1, + 119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1, + 121,1,121,1,122,4,122,1096,8,122,11,122,12,122,1097,1,122,1,122,3,122,1102, + 8,122,1,122,4,122,1105,8,122,11,122,12,122,1106,1,123,1,123,1,123,1,123, + 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126, + 1,127,1,127,1,127,1,127,1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129, + 1,129,1,129,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,132,1,132, + 1,132,1,132,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,135,1,135, + 1,135,1,135,1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,138,1,138, + 1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,140,1,140,1,140,1,140,1,141, + 1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143, + 1,144,1,144,1,144,1,144,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146, + 1,146,1,146,1,147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,149,1,149, + 1,149,1,149,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151,1,152,1,152, + 1,152,1,152,1,153,1,153,1,153,1,153,1,153,1,154,1,154,1,154,1,154,1,155, + 1,155,1,155,1,155,1,156,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,158, + 1,158,1,158,1,158,1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,160, + 1,161,1,161,1,161,1,161,1,161,1,162,1,162,1,162,1,162,1,163,1,163,1,163, + 1,163,1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,165,1,166,1,166, + 1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,166,1,167,1,167,1,167,1,167, + 1,168,1,168,1,168,1,168,1,169,1,169,1,169,1,169,1,170,1,170,1,170,1,170, + 1,170,1,171,1,171,1,172,1,172,1,172,1,172,1,172,4,172,1325,8,172,11,172, + 12,172,1326,1,173,1,173,1,173,1,173,1,174,1,174,1,174,1,174,1,175,1,175, + 1,175,1,175,1,176,1,176,1,176,1,176,1,176,1,177,1,177,1,177,1,177,1,177, + 1,177,1,178,1,178,1,178,1,178,1,179,1,179,1,179,1,179,1,180,1,180,1,180, + 1,180,1,181,1,181,1,181,1,181,1,181,1,181,1,182,1,182,1,182,1,182,1,183, + 1,183,1,183,1,183,1,184,1,184,1,184,1,184,1,185,1,185,1,185,1,185,1,185, + 1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,187,1,187,1,187,1,187,1,187, + 1,187,1,188,1,188,1,188,1,188,1,188,2,594,695,0,189,16,1,18,2,20,3,22,4, + 24,5,26,6,28,7,30,8,32,9,34,10,36,11,38,12,40,13,42,14,44,15,46,16,48,17, + 50,18,52,19,54,20,56,21,58,22,60,23,62,24,64,0,66,25,68,0,70,0,72,26,74, + 27,76,28,78,29,80,0,82,0,84,0,86,0,88,0,90,0,92,0,94,0,96,0,98,0,100,30, + 102,31,104,32,106,33,108,34,110,35,112,36,114,37,116,38,118,39,120,40,122, + 41,124,42,126,43,128,44,130,45,132,46,134,47,136,48,138,49,140,50,142,51, + 144,52,146,53,148,54,150,55,152,56,154,57,156,58,158,59,160,60,162,61,164, + 62,166,63,168,64,170,65,172,66,174,67,176,68,178,69,180,70,182,0,184,71, + 186,72,188,73,190,74,192,0,194,0,196,0,198,0,200,0,202,0,204,75,206,0,208, + 76,210,77,212,78,214,0,216,0,218,0,220,0,222,0,224,79,226,80,228,81,230, + 82,232,0,234,0,236,0,238,0,240,83,242,0,244,84,246,85,248,86,250,0,252, + 0,254,87,256,88,258,0,260,89,262,0,264,0,266,90,268,91,270,92,272,0,274, + 0,276,0,278,0,280,0,282,0,284,0,286,93,288,94,290,95,292,0,294,0,296,0, + 298,0,300,0,302,96,304,97,306,98,308,0,310,0,312,0,314,0,316,99,318,100, + 320,101,322,0,324,0,326,0,328,0,330,102,332,103,334,104,336,0,338,105,340, + 106,342,107,344,108,346,0,348,109,350,110,352,111,354,112,356,0,358,113, + 360,114,362,115,364,116,366,117,368,0,370,0,372,118,374,119,376,120,378, + 0,380,121,382,122,384,123,386,0,388,0,390,0,392,0,16,0,1,2,3,4,5,6,7,8, + 9,10,11,12,13,14,15,35,2,0,68,68,100,100,2,0,73,73,105,105,2,0,83,83,115, + 115,2,0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116,2,0,82,82,114,114, + 2,0,79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110,2,0,72,72,104,104, + 2,0,86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2,0,88,88,120,120,2, + 0,70,70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2,0,75,75,107,107,2, + 0,85,85,117,117,2,0,87,87,119,119,6,0,9,10,13,13,32,32,47,47,91,91,93,93, + 2,0,10,10,13,13,3,0,9,10,13,13,32,32,10,0,9,10,13,13,32,32,44,44,47,47, + 61,61,91,91,93,93,96,96,124,124,2,0,42,42,47,47,1,0,48,57,2,0,65,90,97, + 122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114,114,116,116,4,0,10,10, + 13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66,66,98,98,2,0,89,89,121, + 121,11,0,9,10,13,13,32,32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124, + 124,1427,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0, + 0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36, + 1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0, + 0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58, + 1,0,0,0,0,60,1,0,0,0,0,62,1,0,0,0,0,66,1,0,0,0,1,68,1,0,0,0,1,70,1,0,0, + 0,1,72,1,0,0,0,1,74,1,0,0,0,1,76,1,0,0,0,2,78,1,0,0,0,2,100,1,0,0,0,2,102, + 1,0,0,0,2,104,1,0,0,0,2,106,1,0,0,0,2,108,1,0,0,0,2,110,1,0,0,0,2,112,1, + 0,0,0,2,114,1,0,0,0,2,116,1,0,0,0,2,118,1,0,0,0,2,120,1,0,0,0,2,122,1,0, + 0,0,2,124,1,0,0,0,2,126,1,0,0,0,2,128,1,0,0,0,2,130,1,0,0,0,2,132,1,0,0, + 0,2,134,1,0,0,0,2,136,1,0,0,0,2,138,1,0,0,0,2,140,1,0,0,0,2,142,1,0,0,0, + 2,144,1,0,0,0,2,146,1,0,0,0,2,148,1,0,0,0,2,150,1,0,0,0,2,152,1,0,0,0,2, + 154,1,0,0,0,2,156,1,0,0,0,2,158,1,0,0,0,2,160,1,0,0,0,2,162,1,0,0,0,2,164, + 1,0,0,0,2,166,1,0,0,0,2,168,1,0,0,0,2,170,1,0,0,0,2,172,1,0,0,0,2,174,1, + 0,0,0,2,176,1,0,0,0,2,178,1,0,0,0,2,180,1,0,0,0,2,184,1,0,0,0,2,186,1,0, + 0,0,2,188,1,0,0,0,2,190,1,0,0,0,3,192,1,0,0,0,3,194,1,0,0,0,3,196,1,0,0, + 0,3,198,1,0,0,0,3,200,1,0,0,0,3,202,1,0,0,0,3,204,1,0,0,0,3,206,1,0,0,0, + 3,208,1,0,0,0,3,210,1,0,0,0,3,212,1,0,0,0,4,214,1,0,0,0,4,216,1,0,0,0,4, + 218,1,0,0,0,4,224,1,0,0,0,4,226,1,0,0,0,4,228,1,0,0,0,4,230,1,0,0,0,5,232, + 1,0,0,0,5,234,1,0,0,0,5,236,1,0,0,0,5,238,1,0,0,0,5,240,1,0,0,0,5,242,1, + 0,0,0,5,244,1,0,0,0,5,246,1,0,0,0,5,248,1,0,0,0,6,250,1,0,0,0,6,252,1,0, + 0,0,6,254,1,0,0,0,6,256,1,0,0,0,6,260,1,0,0,0,6,262,1,0,0,0,6,264,1,0,0, + 0,6,266,1,0,0,0,6,268,1,0,0,0,6,270,1,0,0,0,7,272,1,0,0,0,7,274,1,0,0,0, + 7,276,1,0,0,0,7,278,1,0,0,0,7,280,1,0,0,0,7,282,1,0,0,0,7,284,1,0,0,0,7, + 286,1,0,0,0,7,288,1,0,0,0,7,290,1,0,0,0,8,292,1,0,0,0,8,294,1,0,0,0,8,296, + 1,0,0,0,8,298,1,0,0,0,8,300,1,0,0,0,8,302,1,0,0,0,8,304,1,0,0,0,8,306,1, + 0,0,0,9,308,1,0,0,0,9,310,1,0,0,0,9,312,1,0,0,0,9,314,1,0,0,0,9,316,1,0, + 0,0,9,318,1,0,0,0,9,320,1,0,0,0,10,322,1,0,0,0,10,324,1,0,0,0,10,326,1, + 0,0,0,10,328,1,0,0,0,10,330,1,0,0,0,10,332,1,0,0,0,10,334,1,0,0,0,11,336, + 1,0,0,0,11,338,1,0,0,0,11,340,1,0,0,0,11,342,1,0,0,0,11,344,1,0,0,0,12, + 346,1,0,0,0,12,348,1,0,0,0,12,350,1,0,0,0,12,352,1,0,0,0,12,354,1,0,0,0, + 13,356,1,0,0,0,13,358,1,0,0,0,13,360,1,0,0,0,13,362,1,0,0,0,13,364,1,0, + 0,0,13,366,1,0,0,0,14,368,1,0,0,0,14,370,1,0,0,0,14,372,1,0,0,0,14,374, + 1,0,0,0,14,376,1,0,0,0,15,378,1,0,0,0,15,380,1,0,0,0,15,382,1,0,0,0,15, + 384,1,0,0,0,15,386,1,0,0,0,15,388,1,0,0,0,15,390,1,0,0,0,15,392,1,0,0,0, + 16,394,1,0,0,0,18,404,1,0,0,0,20,411,1,0,0,0,22,420,1,0,0,0,24,427,1,0, + 0,0,26,437,1,0,0,0,28,444,1,0,0,0,30,451,1,0,0,0,32,465,1,0,0,0,34,472, + 1,0,0,0,36,480,1,0,0,0,38,489,1,0,0,0,40,496,1,0,0,0,42,506,1,0,0,0,44, + 518,1,0,0,0,46,527,1,0,0,0,48,533,1,0,0,0,50,540,1,0,0,0,52,547,1,0,0,0, + 54,555,1,0,0,0,56,564,1,0,0,0,58,570,1,0,0,0,60,587,1,0,0,0,62,603,1,0, + 0,0,64,612,1,0,0,0,66,615,1,0,0,0,68,619,1,0,0,0,70,624,1,0,0,0,72,629, + 1,0,0,0,74,633,1,0,0,0,76,637,1,0,0,0,78,641,1,0,0,0,80,645,1,0,0,0,82, + 647,1,0,0,0,84,649,1,0,0,0,86,652,1,0,0,0,88,654,1,0,0,0,90,663,1,0,0,0, + 92,665,1,0,0,0,94,670,1,0,0,0,96,672,1,0,0,0,98,677,1,0,0,0,100,708,1,0, + 0,0,102,711,1,0,0,0,104,757,1,0,0,0,106,759,1,0,0,0,108,762,1,0,0,0,110, + 766,1,0,0,0,112,770,1,0,0,0,114,772,1,0,0,0,116,775,1,0,0,0,118,777,1,0, + 0,0,120,782,1,0,0,0,122,784,1,0,0,0,124,790,1,0,0,0,126,796,1,0,0,0,128, + 801,1,0,0,0,130,803,1,0,0,0,132,806,1,0,0,0,134,809,1,0,0,0,136,814,1,0, + 0,0,138,818,1,0,0,0,140,823,1,0,0,0,142,829,1,0,0,0,144,832,1,0,0,0,146, + 834,1,0,0,0,148,840,1,0,0,0,150,842,1,0,0,0,152,847,1,0,0,0,154,850,1,0, + 0,0,156,853,1,0,0,0,158,856,1,0,0,0,160,858,1,0,0,0,162,861,1,0,0,0,164, + 863,1,0,0,0,166,866,1,0,0,0,168,868,1,0,0,0,170,870,1,0,0,0,172,872,1,0, + 0,0,174,874,1,0,0,0,176,876,1,0,0,0,178,881,1,0,0,0,180,902,1,0,0,0,182, + 904,1,0,0,0,184,912,1,0,0,0,186,914,1,0,0,0,188,918,1,0,0,0,190,922,1,0, + 0,0,192,926,1,0,0,0,194,931,1,0,0,0,196,935,1,0,0,0,198,939,1,0,0,0,200, + 943,1,0,0,0,202,947,1,0,0,0,204,951,1,0,0,0,206,960,1,0,0,0,208,964,1,0, + 0,0,210,968,1,0,0,0,212,972,1,0,0,0,214,976,1,0,0,0,216,981,1,0,0,0,218, + 985,1,0,0,0,220,993,1,0,0,0,222,1014,1,0,0,0,224,1018,1,0,0,0,226,1022, + 1,0,0,0,228,1026,1,0,0,0,230,1030,1,0,0,0,232,1034,1,0,0,0,234,1039,1,0, + 0,0,236,1043,1,0,0,0,238,1047,1,0,0,0,240,1051,1,0,0,0,242,1054,1,0,0,0, + 244,1058,1,0,0,0,246,1062,1,0,0,0,248,1066,1,0,0,0,250,1070,1,0,0,0,252, + 1075,1,0,0,0,254,1080,1,0,0,0,256,1085,1,0,0,0,258,1092,1,0,0,0,260,1101, + 1,0,0,0,262,1108,1,0,0,0,264,1112,1,0,0,0,266,1116,1,0,0,0,268,1120,1,0, + 0,0,270,1124,1,0,0,0,272,1128,1,0,0,0,274,1134,1,0,0,0,276,1138,1,0,0,0, + 278,1142,1,0,0,0,280,1146,1,0,0,0,282,1150,1,0,0,0,284,1154,1,0,0,0,286, + 1158,1,0,0,0,288,1162,1,0,0,0,290,1166,1,0,0,0,292,1170,1,0,0,0,294,1175, + 1,0,0,0,296,1179,1,0,0,0,298,1183,1,0,0,0,300,1188,1,0,0,0,302,1192,1,0, + 0,0,304,1196,1,0,0,0,306,1200,1,0,0,0,308,1204,1,0,0,0,310,1210,1,0,0,0, + 312,1214,1,0,0,0,314,1218,1,0,0,0,316,1222,1,0,0,0,318,1226,1,0,0,0,320, + 1230,1,0,0,0,322,1234,1,0,0,0,324,1239,1,0,0,0,326,1243,1,0,0,0,328,1247, + 1,0,0,0,330,1251,1,0,0,0,332,1255,1,0,0,0,334,1259,1,0,0,0,336,1263,1,0, + 0,0,338,1268,1,0,0,0,340,1273,1,0,0,0,342,1277,1,0,0,0,344,1281,1,0,0,0, + 346,1285,1,0,0,0,348,1290,1,0,0,0,350,1300,1,0,0,0,352,1304,1,0,0,0,354, + 1308,1,0,0,0,356,1312,1,0,0,0,358,1317,1,0,0,0,360,1324,1,0,0,0,362,1328, + 1,0,0,0,364,1332,1,0,0,0,366,1336,1,0,0,0,368,1340,1,0,0,0,370,1345,1,0, + 0,0,372,1351,1,0,0,0,374,1355,1,0,0,0,376,1359,1,0,0,0,378,1363,1,0,0,0, + 380,1369,1,0,0,0,382,1373,1,0,0,0,384,1377,1,0,0,0,386,1381,1,0,0,0,388, + 1387,1,0,0,0,390,1393,1,0,0,0,392,1399,1,0,0,0,394,395,7,0,0,0,395,396, + 7,1,0,0,396,397,7,2,0,0,397,398,7,2,0,0,398,399,7,3,0,0,399,400,7,4,0,0, + 400,401,7,5,0,0,401,402,1,0,0,0,402,403,6,0,0,0,403,17,1,0,0,0,404,405, + 7,0,0,0,405,406,7,6,0,0,406,407,7,7,0,0,407,408,7,8,0,0,408,409,1,0,0,0, + 409,410,6,1,1,0,410,19,1,0,0,0,411,412,7,3,0,0,412,413,7,9,0,0,413,414, + 7,6,0,0,414,415,7,1,0,0,415,416,7,4,0,0,416,417,7,10,0,0,417,418,1,0,0, + 0,418,419,6,2,2,0,419,21,1,0,0,0,420,421,7,3,0,0,421,422,7,11,0,0,422,423, + 7,12,0,0,423,424,7,13,0,0,424,425,1,0,0,0,425,426,6,3,0,0,426,23,1,0,0, + 0,427,428,7,3,0,0,428,429,7,14,0,0,429,430,7,8,0,0,430,431,7,13,0,0,431, + 432,7,12,0,0,432,433,7,1,0,0,433,434,7,9,0,0,434,435,1,0,0,0,435,436,6, + 4,3,0,436,25,1,0,0,0,437,438,7,15,0,0,438,439,7,6,0,0,439,440,7,7,0,0,440, + 441,7,16,0,0,441,442,1,0,0,0,442,443,6,5,4,0,443,27,1,0,0,0,444,445,7,17, + 0,0,445,446,7,6,0,0,446,447,7,7,0,0,447,448,7,18,0,0,448,449,1,0,0,0,449, + 450,6,6,0,0,450,29,1,0,0,0,451,452,7,1,0,0,452,453,7,9,0,0,453,454,7,13, + 0,0,454,455,7,1,0,0,455,456,7,9,0,0,456,457,7,3,0,0,457,458,7,2,0,0,458, + 459,7,5,0,0,459,460,7,12,0,0,460,461,7,5,0,0,461,462,7,2,0,0,462,463,1, + 0,0,0,463,464,6,7,0,0,464,31,1,0,0,0,465,466,7,18,0,0,466,467,7,3,0,0,467, + 468,7,3,0,0,468,469,7,8,0,0,469,470,1,0,0,0,470,471,6,8,1,0,471,33,1,0, + 0,0,472,473,7,13,0,0,473,474,7,1,0,0,474,475,7,16,0,0,475,476,7,1,0,0,476, + 477,7,5,0,0,477,478,1,0,0,0,478,479,6,9,0,0,479,35,1,0,0,0,480,481,7,13, + 0,0,481,482,7,7,0,0,482,483,7,7,0,0,483,484,7,18,0,0,484,485,7,19,0,0,485, + 486,7,8,0,0,486,487,1,0,0,0,487,488,6,10,5,0,488,37,1,0,0,0,489,490,7,16, + 0,0,490,491,7,3,0,0,491,492,7,5,0,0,492,493,7,12,0,0,493,494,1,0,0,0,494, + 495,6,11,6,0,495,39,1,0,0,0,496,497,7,16,0,0,497,498,7,3,0,0,498,499,7, + 5,0,0,499,500,7,6,0,0,500,501,7,1,0,0,501,502,7,4,0,0,502,503,7,2,0,0,503, + 504,1,0,0,0,504,505,6,12,7,0,505,41,1,0,0,0,506,507,7,16,0,0,507,508,7, + 11,0,0,508,509,5,95,0,0,509,510,7,3,0,0,510,511,7,14,0,0,511,512,7,8,0, + 0,512,513,7,12,0,0,513,514,7,9,0,0,514,515,7,0,0,0,515,516,1,0,0,0,516, + 517,6,13,8,0,517,43,1,0,0,0,518,519,7,6,0,0,519,520,7,3,0,0,520,521,7,9, + 0,0,521,522,7,12,0,0,522,523,7,16,0,0,523,524,7,3,0,0,524,525,1,0,0,0,525, + 526,6,14,9,0,526,45,1,0,0,0,527,528,7,6,0,0,528,529,7,7,0,0,529,530,7,20, + 0,0,530,531,1,0,0,0,531,532,6,15,0,0,532,47,1,0,0,0,533,534,7,2,0,0,534, + 535,7,10,0,0,535,536,7,7,0,0,536,537,7,20,0,0,537,538,1,0,0,0,538,539,6, + 16,10,0,539,49,1,0,0,0,540,541,7,2,0,0,541,542,7,7,0,0,542,543,7,6,0,0, + 543,544,7,5,0,0,544,545,1,0,0,0,545,546,6,17,0,0,546,51,1,0,0,0,547,548, + 7,2,0,0,548,549,7,5,0,0,549,550,7,12,0,0,550,551,7,5,0,0,551,552,7,2,0, + 0,552,553,1,0,0,0,553,554,6,18,0,0,554,53,1,0,0,0,555,556,7,20,0,0,556, + 557,7,10,0,0,557,558,7,3,0,0,558,559,7,6,0,0,559,560,7,3,0,0,560,561,1, + 0,0,0,561,562,6,19,0,0,562,55,1,0,0,0,563,565,8,21,0,0,564,563,1,0,0,0, + 565,566,1,0,0,0,566,564,1,0,0,0,566,567,1,0,0,0,567,568,1,0,0,0,568,569, + 6,20,0,0,569,57,1,0,0,0,570,571,5,47,0,0,571,572,5,47,0,0,572,576,1,0,0, + 0,573,575,8,22,0,0,574,573,1,0,0,0,575,578,1,0,0,0,576,574,1,0,0,0,576, + 577,1,0,0,0,577,580,1,0,0,0,578,576,1,0,0,0,579,581,5,13,0,0,580,579,1, + 0,0,0,580,581,1,0,0,0,581,583,1,0,0,0,582,584,5,10,0,0,583,582,1,0,0,0, + 583,584,1,0,0,0,584,585,1,0,0,0,585,586,6,21,11,0,586,59,1,0,0,0,587,588, + 5,47,0,0,588,589,5,42,0,0,589,594,1,0,0,0,590,593,3,60,22,0,591,593,9,0, + 0,0,592,590,1,0,0,0,592,591,1,0,0,0,593,596,1,0,0,0,594,595,1,0,0,0,594, + 592,1,0,0,0,595,597,1,0,0,0,596,594,1,0,0,0,597,598,5,42,0,0,598,599,5, + 47,0,0,599,600,1,0,0,0,600,601,6,22,11,0,601,61,1,0,0,0,602,604,7,23,0, + 0,603,602,1,0,0,0,604,605,1,0,0,0,605,603,1,0,0,0,605,606,1,0,0,0,606,607, + 1,0,0,0,607,608,6,23,11,0,608,63,1,0,0,0,609,613,8,24,0,0,610,611,5,47, + 0,0,611,613,8,25,0,0,612,609,1,0,0,0,612,610,1,0,0,0,613,65,1,0,0,0,614, + 616,3,64,24,0,615,614,1,0,0,0,616,617,1,0,0,0,617,615,1,0,0,0,617,618,1, + 0,0,0,618,67,1,0,0,0,619,620,3,176,80,0,620,621,1,0,0,0,621,622,6,26,12, + 0,622,623,6,26,13,0,623,69,1,0,0,0,624,625,3,78,31,0,625,626,1,0,0,0,626, + 627,6,27,14,0,627,628,6,27,15,0,628,71,1,0,0,0,629,630,3,62,23,0,630,631, + 1,0,0,0,631,632,6,28,11,0,632,73,1,0,0,0,633,634,3,58,21,0,634,635,1,0, + 0,0,635,636,6,29,11,0,636,75,1,0,0,0,637,638,3,60,22,0,638,639,1,0,0,0, + 639,640,6,30,11,0,640,77,1,0,0,0,641,642,5,124,0,0,642,643,1,0,0,0,643, + 644,6,31,15,0,644,79,1,0,0,0,645,646,7,26,0,0,646,81,1,0,0,0,647,648,7, + 27,0,0,648,83,1,0,0,0,649,650,5,92,0,0,650,651,7,28,0,0,651,85,1,0,0,0, + 652,653,8,29,0,0,653,87,1,0,0,0,654,656,7,3,0,0,655,657,7,30,0,0,656,655, + 1,0,0,0,656,657,1,0,0,0,657,659,1,0,0,0,658,660,3,80,32,0,659,658,1,0,0, + 0,660,661,1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662,89,1,0,0,0,663,664, + 5,64,0,0,664,91,1,0,0,0,665,666,5,96,0,0,666,93,1,0,0,0,667,671,8,31,0, + 0,668,669,5,96,0,0,669,671,5,96,0,0,670,667,1,0,0,0,670,668,1,0,0,0,671, + 95,1,0,0,0,672,673,5,95,0,0,673,97,1,0,0,0,674,678,3,82,33,0,675,678,3, + 80,32,0,676,678,3,96,40,0,677,674,1,0,0,0,677,675,1,0,0,0,677,676,1,0,0, + 0,678,99,1,0,0,0,679,684,5,34,0,0,680,683,3,84,34,0,681,683,3,86,35,0,682, + 680,1,0,0,0,682,681,1,0,0,0,683,686,1,0,0,0,684,682,1,0,0,0,684,685,1,0, + 0,0,685,687,1,0,0,0,686,684,1,0,0,0,687,709,5,34,0,0,688,689,5,34,0,0,689, + 690,5,34,0,0,690,691,5,34,0,0,691,695,1,0,0,0,692,694,8,22,0,0,693,692, + 1,0,0,0,694,697,1,0,0,0,695,696,1,0,0,0,695,693,1,0,0,0,696,698,1,0,0,0, + 697,695,1,0,0,0,698,699,5,34,0,0,699,700,5,34,0,0,700,701,5,34,0,0,701, + 703,1,0,0,0,702,704,5,34,0,0,703,702,1,0,0,0,703,704,1,0,0,0,704,706,1, + 0,0,0,705,707,5,34,0,0,706,705,1,0,0,0,706,707,1,0,0,0,707,709,1,0,0,0, + 708,679,1,0,0,0,708,688,1,0,0,0,709,101,1,0,0,0,710,712,3,80,32,0,711,710, + 1,0,0,0,712,713,1,0,0,0,713,711,1,0,0,0,713,714,1,0,0,0,714,103,1,0,0,0, + 715,717,3,80,32,0,716,715,1,0,0,0,717,718,1,0,0,0,718,716,1,0,0,0,718,719, + 1,0,0,0,719,720,1,0,0,0,720,724,3,120,52,0,721,723,3,80,32,0,722,721,1, + 0,0,0,723,726,1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,758,1,0,0,0,726, + 724,1,0,0,0,727,729,3,120,52,0,728,730,3,80,32,0,729,728,1,0,0,0,730,731, + 1,0,0,0,731,729,1,0,0,0,731,732,1,0,0,0,732,758,1,0,0,0,733,735,3,80,32, + 0,734,733,1,0,0,0,735,736,1,0,0,0,736,734,1,0,0,0,736,737,1,0,0,0,737,745, + 1,0,0,0,738,742,3,120,52,0,739,741,3,80,32,0,740,739,1,0,0,0,741,744,1, + 0,0,0,742,740,1,0,0,0,742,743,1,0,0,0,743,746,1,0,0,0,744,742,1,0,0,0,745, + 738,1,0,0,0,745,746,1,0,0,0,746,747,1,0,0,0,747,748,3,88,36,0,748,758,1, + 0,0,0,749,751,3,120,52,0,750,752,3,80,32,0,751,750,1,0,0,0,752,753,1,0, + 0,0,753,751,1,0,0,0,753,754,1,0,0,0,754,755,1,0,0,0,755,756,3,88,36,0,756, + 758,1,0,0,0,757,716,1,0,0,0,757,727,1,0,0,0,757,734,1,0,0,0,757,749,1,0, + 0,0,758,105,1,0,0,0,759,760,7,32,0,0,760,761,7,33,0,0,761,107,1,0,0,0,762, + 763,7,12,0,0,763,764,7,9,0,0,764,765,7,0,0,0,765,109,1,0,0,0,766,767,7, + 12,0,0,767,768,7,2,0,0,768,769,7,4,0,0,769,111,1,0,0,0,770,771,5,61,0,0, + 771,113,1,0,0,0,772,773,5,58,0,0,773,774,5,58,0,0,774,115,1,0,0,0,775,776, + 5,44,0,0,776,117,1,0,0,0,777,778,7,0,0,0,778,779,7,3,0,0,779,780,7,2,0, + 0,780,781,7,4,0,0,781,119,1,0,0,0,782,783,5,46,0,0,783,121,1,0,0,0,784, + 785,7,15,0,0,785,786,7,12,0,0,786,787,7,13,0,0,787,788,7,2,0,0,788,789, + 7,3,0,0,789,123,1,0,0,0,790,791,7,15,0,0,791,792,7,1,0,0,792,793,7,6,0, + 0,793,794,7,2,0,0,794,795,7,5,0,0,795,125,1,0,0,0,796,797,7,13,0,0,797, + 798,7,12,0,0,798,799,7,2,0,0,799,800,7,5,0,0,800,127,1,0,0,0,801,802,5, + 40,0,0,802,129,1,0,0,0,803,804,7,1,0,0,804,805,7,9,0,0,805,131,1,0,0,0, + 806,807,7,1,0,0,807,808,7,2,0,0,808,133,1,0,0,0,809,810,7,13,0,0,810,811, + 7,1,0,0,811,812,7,18,0,0,812,813,7,3,0,0,813,135,1,0,0,0,814,815,7,9,0, + 0,815,816,7,7,0,0,816,817,7,5,0,0,817,137,1,0,0,0,818,819,7,9,0,0,819,820, + 7,19,0,0,820,821,7,13,0,0,821,822,7,13,0,0,822,139,1,0,0,0,823,824,7,9, + 0,0,824,825,7,19,0,0,825,826,7,13,0,0,826,827,7,13,0,0,827,828,7,2,0,0, + 828,141,1,0,0,0,829,830,7,7,0,0,830,831,7,6,0,0,831,143,1,0,0,0,832,833, + 5,63,0,0,833,145,1,0,0,0,834,835,7,6,0,0,835,836,7,13,0,0,836,837,7,1,0, + 0,837,838,7,18,0,0,838,839,7,3,0,0,839,147,1,0,0,0,840,841,5,41,0,0,841, + 149,1,0,0,0,842,843,7,5,0,0,843,844,7,6,0,0,844,845,7,19,0,0,845,846,7, + 3,0,0,846,151,1,0,0,0,847,848,5,61,0,0,848,849,5,61,0,0,849,153,1,0,0,0, + 850,851,5,61,0,0,851,852,5,126,0,0,852,155,1,0,0,0,853,854,5,33,0,0,854, + 855,5,61,0,0,855,157,1,0,0,0,856,857,5,60,0,0,857,159,1,0,0,0,858,859,5, + 60,0,0,859,860,5,61,0,0,860,161,1,0,0,0,861,862,5,62,0,0,862,163,1,0,0, + 0,863,864,5,62,0,0,864,865,5,61,0,0,865,165,1,0,0,0,866,867,5,43,0,0,867, + 167,1,0,0,0,868,869,5,45,0,0,869,169,1,0,0,0,870,871,5,42,0,0,871,171,1, + 0,0,0,872,873,5,47,0,0,873,173,1,0,0,0,874,875,5,37,0,0,875,175,1,0,0,0, + 876,877,5,91,0,0,877,878,1,0,0,0,878,879,6,80,0,0,879,880,6,80,0,0,880, + 177,1,0,0,0,881,882,5,93,0,0,882,883,1,0,0,0,883,884,6,81,15,0,884,885, + 6,81,15,0,885,179,1,0,0,0,886,890,3,82,33,0,887,889,3,98,41,0,888,887,1, + 0,0,0,889,892,1,0,0,0,890,888,1,0,0,0,890,891,1,0,0,0,891,903,1,0,0,0,892, + 890,1,0,0,0,893,896,3,96,40,0,894,896,3,90,37,0,895,893,1,0,0,0,895,894, + 1,0,0,0,896,898,1,0,0,0,897,899,3,98,41,0,898,897,1,0,0,0,899,900,1,0,0, + 0,900,898,1,0,0,0,900,901,1,0,0,0,901,903,1,0,0,0,902,886,1,0,0,0,902,895, + 1,0,0,0,903,181,1,0,0,0,904,906,3,92,38,0,905,907,3,94,39,0,906,905,1,0, + 0,0,907,908,1,0,0,0,908,906,1,0,0,0,908,909,1,0,0,0,909,910,1,0,0,0,910, + 911,3,92,38,0,911,183,1,0,0,0,912,913,3,182,83,0,913,185,1,0,0,0,914,915, + 3,58,21,0,915,916,1,0,0,0,916,917,6,85,11,0,917,187,1,0,0,0,918,919,3,60, + 22,0,919,920,1,0,0,0,920,921,6,86,11,0,921,189,1,0,0,0,922,923,3,62,23, + 0,923,924,1,0,0,0,924,925,6,87,11,0,925,191,1,0,0,0,926,927,3,78,31,0,927, + 928,1,0,0,0,928,929,6,88,14,0,929,930,6,88,15,0,930,193,1,0,0,0,931,932, + 3,176,80,0,932,933,1,0,0,0,933,934,6,89,12,0,934,195,1,0,0,0,935,936,3, + 178,81,0,936,937,1,0,0,0,937,938,6,90,16,0,938,197,1,0,0,0,939,940,3,116, + 50,0,940,941,1,0,0,0,941,942,6,91,17,0,942,199,1,0,0,0,943,944,3,112,48, + 0,944,945,1,0,0,0,945,946,6,92,18,0,946,201,1,0,0,0,947,948,3,100,42,0, + 948,949,1,0,0,0,949,950,6,93,19,0,950,203,1,0,0,0,951,952,7,16,0,0,952, + 953,7,3,0,0,953,954,7,5,0,0,954,955,7,12,0,0,955,956,7,0,0,0,956,957,7, + 12,0,0,957,958,7,5,0,0,958,959,7,12,0,0,959,205,1,0,0,0,960,961,3,66,25, + 0,961,962,1,0,0,0,962,963,6,95,20,0,963,207,1,0,0,0,964,965,3,58,21,0,965, + 966,1,0,0,0,966,967,6,96,11,0,967,209,1,0,0,0,968,969,3,60,22,0,969,970, + 1,0,0,0,970,971,6,97,11,0,971,211,1,0,0,0,972,973,3,62,23,0,973,974,1,0, + 0,0,974,975,6,98,11,0,975,213,1,0,0,0,976,977,3,78,31,0,977,978,1,0,0,0, + 978,979,6,99,14,0,979,980,6,99,15,0,980,215,1,0,0,0,981,982,3,120,52,0, + 982,983,1,0,0,0,983,984,6,100,21,0,984,217,1,0,0,0,985,986,3,116,50,0,986, + 987,1,0,0,0,987,988,6,101,17,0,988,219,1,0,0,0,989,994,3,82,33,0,990,994, + 3,80,32,0,991,994,3,96,40,0,992,994,3,170,77,0,993,989,1,0,0,0,993,990, + 1,0,0,0,993,991,1,0,0,0,993,992,1,0,0,0,994,221,1,0,0,0,995,998,3,82,33, + 0,996,998,3,170,77,0,997,995,1,0,0,0,997,996,1,0,0,0,998,1002,1,0,0,0,999, + 1001,3,220,102,0,1000,999,1,0,0,0,1001,1004,1,0,0,0,1002,1000,1,0,0,0,1002, + 1003,1,0,0,0,1003,1015,1,0,0,0,1004,1002,1,0,0,0,1005,1008,3,96,40,0,1006, + 1008,3,90,37,0,1007,1005,1,0,0,0,1007,1006,1,0,0,0,1008,1010,1,0,0,0,1009, + 1011,3,220,102,0,1010,1009,1,0,0,0,1011,1012,1,0,0,0,1012,1010,1,0,0,0, + 1012,1013,1,0,0,0,1013,1015,1,0,0,0,1014,997,1,0,0,0,1014,1007,1,0,0,0, + 1015,223,1,0,0,0,1016,1019,3,222,103,0,1017,1019,3,182,83,0,1018,1016,1, + 0,0,0,1018,1017,1,0,0,0,1019,1020,1,0,0,0,1020,1018,1,0,0,0,1020,1021,1, + 0,0,0,1021,225,1,0,0,0,1022,1023,3,58,21,0,1023,1024,1,0,0,0,1024,1025, + 6,105,11,0,1025,227,1,0,0,0,1026,1027,3,60,22,0,1027,1028,1,0,0,0,1028, + 1029,6,106,11,0,1029,229,1,0,0,0,1030,1031,3,62,23,0,1031,1032,1,0,0,0, + 1032,1033,6,107,11,0,1033,231,1,0,0,0,1034,1035,3,78,31,0,1035,1036,1,0, + 0,0,1036,1037,6,108,14,0,1037,1038,6,108,15,0,1038,233,1,0,0,0,1039,1040, + 3,112,48,0,1040,1041,1,0,0,0,1041,1042,6,109,18,0,1042,235,1,0,0,0,1043, + 1044,3,116,50,0,1044,1045,1,0,0,0,1045,1046,6,110,17,0,1046,237,1,0,0,0, + 1047,1048,3,120,52,0,1048,1049,1,0,0,0,1049,1050,6,111,21,0,1050,239,1, + 0,0,0,1051,1052,7,12,0,0,1052,1053,7,2,0,0,1053,241,1,0,0,0,1054,1055,3, + 224,104,0,1055,1056,1,0,0,0,1056,1057,6,113,22,0,1057,243,1,0,0,0,1058, + 1059,3,58,21,0,1059,1060,1,0,0,0,1060,1061,6,114,11,0,1061,245,1,0,0,0, + 1062,1063,3,60,22,0,1063,1064,1,0,0,0,1064,1065,6,115,11,0,1065,247,1,0, + 0,0,1066,1067,3,62,23,0,1067,1068,1,0,0,0,1068,1069,6,116,11,0,1069,249, + 1,0,0,0,1070,1071,3,78,31,0,1071,1072,1,0,0,0,1072,1073,6,117,14,0,1073, + 1074,6,117,15,0,1074,251,1,0,0,0,1075,1076,3,176,80,0,1076,1077,1,0,0,0, + 1077,1078,6,118,12,0,1078,1079,6,118,23,0,1079,253,1,0,0,0,1080,1081,7, + 7,0,0,1081,1082,7,9,0,0,1082,1083,1,0,0,0,1083,1084,6,119,24,0,1084,255, + 1,0,0,0,1085,1086,7,20,0,0,1086,1087,7,1,0,0,1087,1088,7,5,0,0,1088,1089, + 7,10,0,0,1089,1090,1,0,0,0,1090,1091,6,120,24,0,1091,257,1,0,0,0,1092,1093, + 8,34,0,0,1093,259,1,0,0,0,1094,1096,3,258,121,0,1095,1094,1,0,0,0,1096, + 1097,1,0,0,0,1097,1095,1,0,0,0,1097,1098,1,0,0,0,1098,1099,1,0,0,0,1099, + 1100,3,358,171,0,1100,1102,1,0,0,0,1101,1095,1,0,0,0,1101,1102,1,0,0,0, + 1102,1104,1,0,0,0,1103,1105,3,258,121,0,1104,1103,1,0,0,0,1105,1106,1,0, + 0,0,1106,1104,1,0,0,0,1106,1107,1,0,0,0,1107,261,1,0,0,0,1108,1109,3,184, + 84,0,1109,1110,1,0,0,0,1110,1111,6,123,25,0,1111,263,1,0,0,0,1112,1113, + 3,260,122,0,1113,1114,1,0,0,0,1114,1115,6,124,26,0,1115,265,1,0,0,0,1116, + 1117,3,58,21,0,1117,1118,1,0,0,0,1118,1119,6,125,11,0,1119,267,1,0,0,0, + 1120,1121,3,60,22,0,1121,1122,1,0,0,0,1122,1123,6,126,11,0,1123,269,1,0, + 0,0,1124,1125,3,62,23,0,1125,1126,1,0,0,0,1126,1127,6,127,11,0,1127,271, + 1,0,0,0,1128,1129,3,78,31,0,1129,1130,1,0,0,0,1130,1131,6,128,14,0,1131, + 1132,6,128,15,0,1132,1133,6,128,15,0,1133,273,1,0,0,0,1134,1135,3,112,48, + 0,1135,1136,1,0,0,0,1136,1137,6,129,18,0,1137,275,1,0,0,0,1138,1139,3,116, + 50,0,1139,1140,1,0,0,0,1140,1141,6,130,17,0,1141,277,1,0,0,0,1142,1143, + 3,120,52,0,1143,1144,1,0,0,0,1144,1145,6,131,21,0,1145,279,1,0,0,0,1146, + 1147,3,256,120,0,1147,1148,1,0,0,0,1148,1149,6,132,27,0,1149,281,1,0,0, + 0,1150,1151,3,224,104,0,1151,1152,1,0,0,0,1152,1153,6,133,22,0,1153,283, + 1,0,0,0,1154,1155,3,184,84,0,1155,1156,1,0,0,0,1156,1157,6,134,25,0,1157, + 285,1,0,0,0,1158,1159,3,58,21,0,1159,1160,1,0,0,0,1160,1161,6,135,11,0, + 1161,287,1,0,0,0,1162,1163,3,60,22,0,1163,1164,1,0,0,0,1164,1165,6,136, + 11,0,1165,289,1,0,0,0,1166,1167,3,62,23,0,1167,1168,1,0,0,0,1168,1169,6, + 137,11,0,1169,291,1,0,0,0,1170,1171,3,78,31,0,1171,1172,1,0,0,0,1172,1173, + 6,138,14,0,1173,1174,6,138,15,0,1174,293,1,0,0,0,1175,1176,3,116,50,0,1176, + 1177,1,0,0,0,1177,1178,6,139,17,0,1178,295,1,0,0,0,1179,1180,3,120,52,0, + 1180,1181,1,0,0,0,1181,1182,6,140,21,0,1182,297,1,0,0,0,1183,1184,3,254, + 119,0,1184,1185,1,0,0,0,1185,1186,6,141,28,0,1186,1187,6,141,29,0,1187, + 299,1,0,0,0,1188,1189,3,66,25,0,1189,1190,1,0,0,0,1190,1191,6,142,20,0, + 1191,301,1,0,0,0,1192,1193,3,58,21,0,1193,1194,1,0,0,0,1194,1195,6,143, + 11,0,1195,303,1,0,0,0,1196,1197,3,60,22,0,1197,1198,1,0,0,0,1198,1199,6, + 144,11,0,1199,305,1,0,0,0,1200,1201,3,62,23,0,1201,1202,1,0,0,0,1202,1203, + 6,145,11,0,1203,307,1,0,0,0,1204,1205,3,78,31,0,1205,1206,1,0,0,0,1206, + 1207,6,146,14,0,1207,1208,6,146,15,0,1208,1209,6,146,15,0,1209,309,1,0, + 0,0,1210,1211,3,116,50,0,1211,1212,1,0,0,0,1212,1213,6,147,17,0,1213,311, + 1,0,0,0,1214,1215,3,120,52,0,1215,1216,1,0,0,0,1216,1217,6,148,21,0,1217, + 313,1,0,0,0,1218,1219,3,224,104,0,1219,1220,1,0,0,0,1220,1221,6,149,22, + 0,1221,315,1,0,0,0,1222,1223,3,58,21,0,1223,1224,1,0,0,0,1224,1225,6,150, + 11,0,1225,317,1,0,0,0,1226,1227,3,60,22,0,1227,1228,1,0,0,0,1228,1229,6, + 151,11,0,1229,319,1,0,0,0,1230,1231,3,62,23,0,1231,1232,1,0,0,0,1232,1233, + 6,152,11,0,1233,321,1,0,0,0,1234,1235,3,78,31,0,1235,1236,1,0,0,0,1236, + 1237,6,153,14,0,1237,1238,6,153,15,0,1238,323,1,0,0,0,1239,1240,3,120,52, + 0,1240,1241,1,0,0,0,1241,1242,6,154,21,0,1242,325,1,0,0,0,1243,1244,3,184, + 84,0,1244,1245,1,0,0,0,1245,1246,6,155,25,0,1246,327,1,0,0,0,1247,1248, + 3,180,82,0,1248,1249,1,0,0,0,1249,1250,6,156,30,0,1250,329,1,0,0,0,1251, + 1252,3,58,21,0,1252,1253,1,0,0,0,1253,1254,6,157,11,0,1254,331,1,0,0,0, + 1255,1256,3,60,22,0,1256,1257,1,0,0,0,1257,1258,6,158,11,0,1258,333,1,0, + 0,0,1259,1260,3,62,23,0,1260,1261,1,0,0,0,1261,1262,6,159,11,0,1262,335, + 1,0,0,0,1263,1264,3,78,31,0,1264,1265,1,0,0,0,1265,1266,6,160,14,0,1266, + 1267,6,160,15,0,1267,337,1,0,0,0,1268,1269,7,1,0,0,1269,1270,7,9,0,0,1270, + 1271,7,15,0,0,1271,1272,7,7,0,0,1272,339,1,0,0,0,1273,1274,3,58,21,0,1274, + 1275,1,0,0,0,1275,1276,6,162,11,0,1276,341,1,0,0,0,1277,1278,3,60,22,0, + 1278,1279,1,0,0,0,1279,1280,6,163,11,0,1280,343,1,0,0,0,1281,1282,3,62, + 23,0,1282,1283,1,0,0,0,1283,1284,6,164,11,0,1284,345,1,0,0,0,1285,1286, + 3,78,31,0,1286,1287,1,0,0,0,1287,1288,6,165,14,0,1288,1289,6,165,15,0,1289, + 347,1,0,0,0,1290,1291,7,15,0,0,1291,1292,7,19,0,0,1292,1293,7,9,0,0,1293, + 1294,7,4,0,0,1294,1295,7,5,0,0,1295,1296,7,1,0,0,1296,1297,7,7,0,0,1297, + 1298,7,9,0,0,1298,1299,7,2,0,0,1299,349,1,0,0,0,1300,1301,3,58,21,0,1301, + 1302,1,0,0,0,1302,1303,6,167,11,0,1303,351,1,0,0,0,1304,1305,3,60,22,0, + 1305,1306,1,0,0,0,1306,1307,6,168,11,0,1307,353,1,0,0,0,1308,1309,3,62, + 23,0,1309,1310,1,0,0,0,1310,1311,6,169,11,0,1311,355,1,0,0,0,1312,1313, + 3,178,81,0,1313,1314,1,0,0,0,1314,1315,6,170,16,0,1315,1316,6,170,15,0, + 1316,357,1,0,0,0,1317,1318,5,58,0,0,1318,359,1,0,0,0,1319,1325,3,90,37, + 0,1320,1325,3,80,32,0,1321,1325,3,120,52,0,1322,1325,3,82,33,0,1323,1325, + 3,96,40,0,1324,1319,1,0,0,0,1324,1320,1,0,0,0,1324,1321,1,0,0,0,1324,1322, + 1,0,0,0,1324,1323,1,0,0,0,1325,1326,1,0,0,0,1326,1324,1,0,0,0,1326,1327, + 1,0,0,0,1327,361,1,0,0,0,1328,1329,3,58,21,0,1329,1330,1,0,0,0,1330,1331, + 6,173,11,0,1331,363,1,0,0,0,1332,1333,3,60,22,0,1333,1334,1,0,0,0,1334, + 1335,6,174,11,0,1335,365,1,0,0,0,1336,1337,3,62,23,0,1337,1338,1,0,0,0, + 1338,1339,6,175,11,0,1339,367,1,0,0,0,1340,1341,3,78,31,0,1341,1342,1,0, + 0,0,1342,1343,6,176,14,0,1343,1344,6,176,15,0,1344,369,1,0,0,0,1345,1346, + 3,66,25,0,1346,1347,1,0,0,0,1347,1348,6,177,20,0,1348,1349,6,177,15,0,1349, + 1350,6,177,31,0,1350,371,1,0,0,0,1351,1352,3,58,21,0,1352,1353,1,0,0,0, + 1353,1354,6,178,11,0,1354,373,1,0,0,0,1355,1356,3,60,22,0,1356,1357,1,0, + 0,0,1357,1358,6,179,11,0,1358,375,1,0,0,0,1359,1360,3,62,23,0,1360,1361, + 1,0,0,0,1361,1362,6,180,11,0,1362,377,1,0,0,0,1363,1364,3,116,50,0,1364, + 1365,1,0,0,0,1365,1366,6,181,17,0,1366,1367,6,181,15,0,1367,1368,6,181, + 7,0,1368,379,1,0,0,0,1369,1370,3,58,21,0,1370,1371,1,0,0,0,1371,1372,6, + 182,11,0,1372,381,1,0,0,0,1373,1374,3,60,22,0,1374,1375,1,0,0,0,1375,1376, + 6,183,11,0,1376,383,1,0,0,0,1377,1378,3,62,23,0,1378,1379,1,0,0,0,1379, + 1380,6,184,11,0,1380,385,1,0,0,0,1381,1382,3,184,84,0,1382,1383,1,0,0,0, + 1383,1384,6,185,15,0,1384,1385,6,185,0,0,1385,1386,6,185,25,0,1386,387, + 1,0,0,0,1387,1388,3,180,82,0,1388,1389,1,0,0,0,1389,1390,6,186,15,0,1390, + 1391,6,186,0,0,1391,1392,6,186,30,0,1392,389,1,0,0,0,1393,1394,3,106,45, + 0,1394,1395,1,0,0,0,1395,1396,6,187,15,0,1396,1397,6,187,0,0,1397,1398, + 6,187,32,0,1398,391,1,0,0,0,1399,1400,3,78,31,0,1400,1401,1,0,0,0,1401, + 1402,6,188,14,0,1402,1403,6,188,15,0,1403,393,1,0,0,0,62,0,1,2,3,4,5,6, + 7,8,9,10,11,12,13,14,15,566,576,580,583,592,594,605,612,617,656,661,670, + 677,682,684,695,703,706,708,713,718,724,731,736,742,745,753,757,890,895, + 900,902,908,993,997,1002,1007,1012,1014,1018,1020,1097,1101,1106,1324,1326, + 33,5,2,0,5,4,0,5,6,0,5,1,0,5,3,0,5,8,0,5,12,0,5,14,0,5,10,0,5,5,0,5,11, + 0,0,1,0,7,68,0,5,0,0,7,29,0,4,0,0,7,69,0,7,38,0,7,36,0,7,30,0,7,25,0,7, + 40,0,7,79,0,5,13,0,5,7,0,7,71,0,7,89,0,7,88,0,7,87,0,5,9,0,7,70,0,5,15, + 0,7,33,0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 index 9e9b64b006e36..d4f9de9dccd9e 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 @@ -41,6 +41,7 @@ processingCommand : evalCommand | inlinestatsCommand | limitCommand + | lookupCommand | keepCommand | sortCommand | statsCommand @@ -159,6 +160,10 @@ qualifiedNamePattern : identifierPattern (DOT identifierPattern)* ; +qualifiedNamePatterns + : qualifiedNamePattern (COMMA qualifiedNamePattern)* + ; + identifier : UNQUOTED_IDENTIFIER | QUOTED_IDENTIFIER @@ -194,11 +199,11 @@ orderExpression ; keepCommand - : KEEP qualifiedNamePattern (COMMA qualifiedNamePattern)* + : KEEP qualifiedNamePatterns ; dropCommand - : DROP qualifiedNamePattern (COMMA qualifiedNamePattern)* + : DROP qualifiedNamePatterns ; renameCommand @@ -276,4 +281,8 @@ enrichCommand enrichWithClause : (newName=qualifiedNamePattern ASSIGN)? enrichField=qualifiedNamePattern + ; + +lookupCommand + : LOOKUP tableName=INDEX_UNQUOTED_IDENTIFIER ON matchFields=qualifiedNamePatterns ; \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp index d6f90975aefac..76663717c5624 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.interp @@ -10,6 +10,7 @@ null 'inlinestats' 'keep' 'limit' +'lookup' 'meta' 'metrics' 'mv_expand' @@ -97,6 +98,12 @@ null null null null +null +null +null +null +null +null 'info' null null @@ -129,6 +136,7 @@ GROK INLINESTATS KEEP LIMIT +LOOKUP META METRICS MV_EXPAND @@ -213,6 +221,12 @@ ENRICH_WS ENRICH_FIELD_LINE_COMMENT ENRICH_FIELD_MULTILINE_COMMENT ENRICH_FIELD_WS +LOOKUP_LINE_COMMENT +LOOKUP_MULTILINE_COMMENT +LOOKUP_WS +LOOKUP_FIELD_LINE_COMMENT +LOOKUP_FIELD_MULTILINE_COMMENT +LOOKUP_FIELD_WS MVEXPAND_LINE_COMMENT MVEXPAND_MULTILINE_COMMENT MVEXPAND_WS @@ -263,6 +277,7 @@ statsCommand inlinestatsCommand qualifiedName qualifiedNamePattern +qualifiedNamePatterns identifier identifierPattern constant @@ -290,7 +305,8 @@ showCommand metaCommand enrichCommand enrichWithClause +lookupCommand atn: -[4, 1, 116, 542, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 116, 8, 1, 10, 1, 12, 1, 119, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 127, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 142, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 154, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 161, 8, 5, 10, 5, 12, 5, 164, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 171, 8, 5, 1, 5, 1, 5, 3, 5, 175, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 183, 8, 5, 10, 5, 12, 5, 186, 9, 5, 1, 6, 1, 6, 3, 6, 190, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 197, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 202, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 209, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 215, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 223, 8, 8, 10, 8, 12, 8, 226, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 236, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 241, 8, 9, 10, 9, 12, 9, 244, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 3, 10, 257, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 269, 8, 13, 10, 13, 12, 13, 272, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 279, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 285, 8, 15, 10, 15, 12, 15, 288, 9, 15, 1, 15, 3, 15, 291, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 297, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 303, 8, 18, 10, 18, 12, 18, 306, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 316, 8, 20, 10, 20, 12, 20, 319, 9, 20, 1, 20, 3, 20, 322, 8, 20, 1, 20, 1, 20, 3, 20, 326, 8, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 333, 8, 22, 1, 22, 1, 22, 3, 22, 337, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 343, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 348, 8, 24, 10, 24, 12, 24, 351, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 356, 8, 25, 10, 25, 12, 25, 359, 9, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 378, 8, 28, 10, 28, 12, 28, 381, 9, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 389, 8, 28, 10, 28, 12, 28, 392, 9, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 400, 8, 28, 10, 28, 12, 28, 403, 9, 28, 1, 28, 1, 28, 3, 28, 407, 8, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 416, 8, 30, 10, 30, 12, 30, 419, 9, 30, 1, 31, 1, 31, 3, 31, 423, 8, 31, 1, 31, 1, 31, 3, 31, 427, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 433, 8, 32, 10, 32, 12, 32, 436, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 442, 8, 33, 10, 33, 12, 33, 445, 9, 33, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 451, 8, 34, 10, 34, 12, 34, 454, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 464, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 5, 39, 476, 8, 39, 10, 39, 12, 39, 479, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 489, 8, 42, 1, 43, 3, 43, 492, 8, 43, 1, 43, 1, 43, 1, 44, 3, 44, 497, 8, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 522, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 528, 8, 51, 10, 51, 12, 51, 531, 9, 51, 3, 51, 533, 8, 51, 1, 52, 1, 52, 1, 52, 3, 52, 538, 8, 52, 1, 52, 1, 52, 1, 52, 0, 4, 2, 10, 16, 18, 53, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 0, 7, 1, 0, 62, 63, 1, 0, 64, 66, 1, 0, 69, 70, 2, 0, 34, 34, 38, 38, 1, 0, 41, 42, 2, 0, 40, 40, 54, 54, 2, 0, 55, 55, 57, 61, 570, 0, 106, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 4, 126, 1, 0, 0, 0, 6, 141, 1, 0, 0, 0, 8, 143, 1, 0, 0, 0, 10, 174, 1, 0, 0, 0, 12, 201, 1, 0, 0, 0, 14, 208, 1, 0, 0, 0, 16, 214, 1, 0, 0, 0, 18, 235, 1, 0, 0, 0, 20, 245, 1, 0, 0, 0, 22, 260, 1, 0, 0, 0, 24, 262, 1, 0, 0, 0, 26, 265, 1, 0, 0, 0, 28, 278, 1, 0, 0, 0, 30, 280, 1, 0, 0, 0, 32, 292, 1, 0, 0, 0, 34, 296, 1, 0, 0, 0, 36, 298, 1, 0, 0, 0, 38, 307, 1, 0, 0, 0, 40, 311, 1, 0, 0, 0, 42, 327, 1, 0, 0, 0, 44, 330, 1, 0, 0, 0, 46, 338, 1, 0, 0, 0, 48, 344, 1, 0, 0, 0, 50, 352, 1, 0, 0, 0, 52, 360, 1, 0, 0, 0, 54, 362, 1, 0, 0, 0, 56, 406, 1, 0, 0, 0, 58, 408, 1, 0, 0, 0, 60, 411, 1, 0, 0, 0, 62, 420, 1, 0, 0, 0, 64, 428, 1, 0, 0, 0, 66, 437, 1, 0, 0, 0, 68, 446, 1, 0, 0, 0, 70, 455, 1, 0, 0, 0, 72, 459, 1, 0, 0, 0, 74, 465, 1, 0, 0, 0, 76, 469, 1, 0, 0, 0, 78, 472, 1, 0, 0, 0, 80, 480, 1, 0, 0, 0, 82, 484, 1, 0, 0, 0, 84, 488, 1, 0, 0, 0, 86, 491, 1, 0, 0, 0, 88, 496, 1, 0, 0, 0, 90, 500, 1, 0, 0, 0, 92, 502, 1, 0, 0, 0, 94, 504, 1, 0, 0, 0, 96, 507, 1, 0, 0, 0, 98, 511, 1, 0, 0, 0, 100, 514, 1, 0, 0, 0, 102, 517, 1, 0, 0, 0, 104, 537, 1, 0, 0, 0, 106, 107, 3, 2, 1, 0, 107, 108, 5, 0, 0, 1, 108, 1, 1, 0, 0, 0, 109, 110, 6, 1, -1, 0, 110, 111, 3, 4, 2, 0, 111, 117, 1, 0, 0, 0, 112, 113, 10, 1, 0, 0, 113, 114, 5, 28, 0, 0, 114, 116, 3, 6, 3, 0, 115, 112, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 3, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 127, 3, 94, 47, 0, 121, 127, 3, 30, 15, 0, 122, 127, 3, 24, 12, 0, 123, 127, 3, 40, 20, 0, 124, 127, 3, 98, 49, 0, 125, 127, 3, 100, 50, 0, 126, 120, 1, 0, 0, 0, 126, 121, 1, 0, 0, 0, 126, 122, 1, 0, 0, 0, 126, 123, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 125, 1, 0, 0, 0, 127, 5, 1, 0, 0, 0, 128, 142, 3, 42, 21, 0, 129, 142, 3, 46, 23, 0, 130, 142, 3, 58, 29, 0, 131, 142, 3, 64, 32, 0, 132, 142, 3, 60, 30, 0, 133, 142, 3, 44, 22, 0, 134, 142, 3, 8, 4, 0, 135, 142, 3, 66, 33, 0, 136, 142, 3, 68, 34, 0, 137, 142, 3, 72, 36, 0, 138, 142, 3, 74, 37, 0, 139, 142, 3, 102, 51, 0, 140, 142, 3, 76, 38, 0, 141, 128, 1, 0, 0, 0, 141, 129, 1, 0, 0, 0, 141, 130, 1, 0, 0, 0, 141, 131, 1, 0, 0, 0, 141, 132, 1, 0, 0, 0, 141, 133, 1, 0, 0, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 141, 140, 1, 0, 0, 0, 142, 7, 1, 0, 0, 0, 143, 144, 5, 19, 0, 0, 144, 145, 3, 10, 5, 0, 145, 9, 1, 0, 0, 0, 146, 147, 6, 5, -1, 0, 147, 148, 5, 47, 0, 0, 148, 175, 3, 10, 5, 7, 149, 175, 3, 14, 7, 0, 150, 175, 3, 12, 6, 0, 151, 153, 3, 14, 7, 0, 152, 154, 5, 47, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 156, 5, 44, 0, 0, 156, 157, 5, 43, 0, 0, 157, 162, 3, 14, 7, 0, 158, 159, 5, 37, 0, 0, 159, 161, 3, 14, 7, 0, 160, 158, 1, 0, 0, 0, 161, 164, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 165, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 165, 166, 5, 53, 0, 0, 166, 175, 1, 0, 0, 0, 167, 168, 3, 14, 7, 0, 168, 170, 5, 45, 0, 0, 169, 171, 5, 47, 0, 0, 170, 169, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 5, 48, 0, 0, 173, 175, 1, 0, 0, 0, 174, 146, 1, 0, 0, 0, 174, 149, 1, 0, 0, 0, 174, 150, 1, 0, 0, 0, 174, 151, 1, 0, 0, 0, 174, 167, 1, 0, 0, 0, 175, 184, 1, 0, 0, 0, 176, 177, 10, 4, 0, 0, 177, 178, 5, 33, 0, 0, 178, 183, 3, 10, 5, 5, 179, 180, 10, 3, 0, 0, 180, 181, 5, 50, 0, 0, 181, 183, 3, 10, 5, 4, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 186, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 11, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 187, 189, 3, 14, 7, 0, 188, 190, 5, 47, 0, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 5, 46, 0, 0, 192, 193, 3, 90, 45, 0, 193, 202, 1, 0, 0, 0, 194, 196, 3, 14, 7, 0, 195, 197, 5, 47, 0, 0, 196, 195, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 5, 52, 0, 0, 199, 200, 3, 90, 45, 0, 200, 202, 1, 0, 0, 0, 201, 187, 1, 0, 0, 0, 201, 194, 1, 0, 0, 0, 202, 13, 1, 0, 0, 0, 203, 209, 3, 16, 8, 0, 204, 205, 3, 16, 8, 0, 205, 206, 3, 92, 46, 0, 206, 207, 3, 16, 8, 0, 207, 209, 1, 0, 0, 0, 208, 203, 1, 0, 0, 0, 208, 204, 1, 0, 0, 0, 209, 15, 1, 0, 0, 0, 210, 211, 6, 8, -1, 0, 211, 215, 3, 18, 9, 0, 212, 213, 7, 0, 0, 0, 213, 215, 3, 16, 8, 3, 214, 210, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 224, 1, 0, 0, 0, 216, 217, 10, 2, 0, 0, 217, 218, 7, 1, 0, 0, 218, 223, 3, 16, 8, 3, 219, 220, 10, 1, 0, 0, 220, 221, 7, 0, 0, 0, 221, 223, 3, 16, 8, 2, 222, 216, 1, 0, 0, 0, 222, 219, 1, 0, 0, 0, 223, 226, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 227, 228, 6, 9, -1, 0, 228, 236, 3, 56, 28, 0, 229, 236, 3, 48, 24, 0, 230, 236, 3, 20, 10, 0, 231, 232, 5, 43, 0, 0, 232, 233, 3, 10, 5, 0, 233, 234, 5, 53, 0, 0, 234, 236, 1, 0, 0, 0, 235, 227, 1, 0, 0, 0, 235, 229, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 235, 231, 1, 0, 0, 0, 236, 242, 1, 0, 0, 0, 237, 238, 10, 1, 0, 0, 238, 239, 5, 36, 0, 0, 239, 241, 3, 22, 11, 0, 240, 237, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 19, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 245, 246, 3, 52, 26, 0, 246, 256, 5, 43, 0, 0, 247, 257, 5, 64, 0, 0, 248, 253, 3, 10, 5, 0, 249, 250, 5, 37, 0, 0, 250, 252, 3, 10, 5, 0, 251, 249, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 257, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 247, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 5, 53, 0, 0, 259, 21, 1, 0, 0, 0, 260, 261, 3, 52, 26, 0, 261, 23, 1, 0, 0, 0, 262, 263, 5, 15, 0, 0, 263, 264, 3, 26, 13, 0, 264, 25, 1, 0, 0, 0, 265, 270, 3, 28, 14, 0, 266, 267, 5, 37, 0, 0, 267, 269, 3, 28, 14, 0, 268, 266, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 27, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 279, 3, 10, 5, 0, 274, 275, 3, 48, 24, 0, 275, 276, 5, 35, 0, 0, 276, 277, 3, 10, 5, 0, 277, 279, 1, 0, 0, 0, 278, 273, 1, 0, 0, 0, 278, 274, 1, 0, 0, 0, 279, 29, 1, 0, 0, 0, 280, 281, 5, 6, 0, 0, 281, 286, 3, 32, 16, 0, 282, 283, 5, 37, 0, 0, 283, 285, 3, 32, 16, 0, 284, 282, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 289, 291, 3, 34, 17, 0, 290, 289, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 31, 1, 0, 0, 0, 292, 293, 5, 24, 0, 0, 293, 33, 1, 0, 0, 0, 294, 297, 3, 36, 18, 0, 295, 297, 3, 38, 19, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 35, 1, 0, 0, 0, 298, 299, 5, 74, 0, 0, 299, 304, 3, 32, 16, 0, 300, 301, 5, 37, 0, 0, 301, 303, 3, 32, 16, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 37, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 67, 0, 0, 308, 309, 3, 36, 18, 0, 309, 310, 5, 68, 0, 0, 310, 39, 1, 0, 0, 0, 311, 312, 5, 12, 0, 0, 312, 317, 3, 32, 16, 0, 313, 314, 5, 37, 0, 0, 314, 316, 3, 32, 16, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 322, 3, 26, 13, 0, 321, 320, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 324, 5, 32, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 41, 1, 0, 0, 0, 327, 328, 5, 4, 0, 0, 328, 329, 3, 26, 13, 0, 329, 43, 1, 0, 0, 0, 330, 332, 5, 18, 0, 0, 331, 333, 3, 26, 13, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 336, 1, 0, 0, 0, 334, 335, 5, 32, 0, 0, 335, 337, 3, 26, 13, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 45, 1, 0, 0, 0, 338, 339, 5, 8, 0, 0, 339, 342, 3, 26, 13, 0, 340, 341, 5, 32, 0, 0, 341, 343, 3, 26, 13, 0, 342, 340, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 47, 1, 0, 0, 0, 344, 349, 3, 52, 26, 0, 345, 346, 5, 39, 0, 0, 346, 348, 3, 52, 26, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 49, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 357, 3, 54, 27, 0, 353, 354, 5, 39, 0, 0, 354, 356, 3, 54, 27, 0, 355, 353, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 51, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 360, 361, 7, 2, 0, 0, 361, 53, 1, 0, 0, 0, 362, 363, 5, 78, 0, 0, 363, 55, 1, 0, 0, 0, 364, 407, 5, 48, 0, 0, 365, 366, 3, 88, 44, 0, 366, 367, 5, 69, 0, 0, 367, 407, 1, 0, 0, 0, 368, 407, 3, 86, 43, 0, 369, 407, 3, 88, 44, 0, 370, 407, 3, 82, 41, 0, 371, 407, 5, 51, 0, 0, 372, 407, 3, 90, 45, 0, 373, 374, 5, 67, 0, 0, 374, 379, 3, 84, 42, 0, 375, 376, 5, 37, 0, 0, 376, 378, 3, 84, 42, 0, 377, 375, 1, 0, 0, 0, 378, 381, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 382, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 382, 383, 5, 68, 0, 0, 383, 407, 1, 0, 0, 0, 384, 385, 5, 67, 0, 0, 385, 390, 3, 82, 41, 0, 386, 387, 5, 37, 0, 0, 387, 389, 3, 82, 41, 0, 388, 386, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 393, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 394, 5, 68, 0, 0, 394, 407, 1, 0, 0, 0, 395, 396, 5, 67, 0, 0, 396, 401, 3, 90, 45, 0, 397, 398, 5, 37, 0, 0, 398, 400, 3, 90, 45, 0, 399, 397, 1, 0, 0, 0, 400, 403, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 404, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 404, 405, 5, 68, 0, 0, 405, 407, 1, 0, 0, 0, 406, 364, 1, 0, 0, 0, 406, 365, 1, 0, 0, 0, 406, 368, 1, 0, 0, 0, 406, 369, 1, 0, 0, 0, 406, 370, 1, 0, 0, 0, 406, 371, 1, 0, 0, 0, 406, 372, 1, 0, 0, 0, 406, 373, 1, 0, 0, 0, 406, 384, 1, 0, 0, 0, 406, 395, 1, 0, 0, 0, 407, 57, 1, 0, 0, 0, 408, 409, 5, 10, 0, 0, 409, 410, 5, 30, 0, 0, 410, 59, 1, 0, 0, 0, 411, 412, 5, 17, 0, 0, 412, 417, 3, 62, 31, 0, 413, 414, 5, 37, 0, 0, 414, 416, 3, 62, 31, 0, 415, 413, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 61, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 420, 422, 3, 10, 5, 0, 421, 423, 7, 3, 0, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 425, 5, 49, 0, 0, 425, 427, 7, 4, 0, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 63, 1, 0, 0, 0, 428, 429, 5, 9, 0, 0, 429, 434, 3, 50, 25, 0, 430, 431, 5, 37, 0, 0, 431, 433, 3, 50, 25, 0, 432, 430, 1, 0, 0, 0, 433, 436, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 65, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 437, 438, 5, 2, 0, 0, 438, 443, 3, 50, 25, 0, 439, 440, 5, 37, 0, 0, 440, 442, 3, 50, 25, 0, 441, 439, 1, 0, 0, 0, 442, 445, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 67, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 446, 447, 5, 14, 0, 0, 447, 452, 3, 70, 35, 0, 448, 449, 5, 37, 0, 0, 449, 451, 3, 70, 35, 0, 450, 448, 1, 0, 0, 0, 451, 454, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 69, 1, 0, 0, 0, 454, 452, 1, 0, 0, 0, 455, 456, 3, 50, 25, 0, 456, 457, 5, 82, 0, 0, 457, 458, 3, 50, 25, 0, 458, 71, 1, 0, 0, 0, 459, 460, 5, 1, 0, 0, 460, 461, 3, 18, 9, 0, 461, 463, 3, 90, 45, 0, 462, 464, 3, 78, 39, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 73, 1, 0, 0, 0, 465, 466, 5, 7, 0, 0, 466, 467, 3, 18, 9, 0, 467, 468, 3, 90, 45, 0, 468, 75, 1, 0, 0, 0, 469, 470, 5, 13, 0, 0, 470, 471, 3, 48, 24, 0, 471, 77, 1, 0, 0, 0, 472, 477, 3, 80, 40, 0, 473, 474, 5, 37, 0, 0, 474, 476, 3, 80, 40, 0, 475, 473, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 79, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 481, 3, 52, 26, 0, 481, 482, 5, 35, 0, 0, 482, 483, 3, 56, 28, 0, 483, 81, 1, 0, 0, 0, 484, 485, 7, 5, 0, 0, 485, 83, 1, 0, 0, 0, 486, 489, 3, 86, 43, 0, 487, 489, 3, 88, 44, 0, 488, 486, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 85, 1, 0, 0, 0, 490, 492, 7, 0, 0, 0, 491, 490, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 5, 31, 0, 0, 494, 87, 1, 0, 0, 0, 495, 497, 7, 0, 0, 0, 496, 495, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 5, 30, 0, 0, 499, 89, 1, 0, 0, 0, 500, 501, 5, 29, 0, 0, 501, 91, 1, 0, 0, 0, 502, 503, 7, 6, 0, 0, 503, 93, 1, 0, 0, 0, 504, 505, 5, 5, 0, 0, 505, 506, 3, 96, 48, 0, 506, 95, 1, 0, 0, 0, 507, 508, 5, 67, 0, 0, 508, 509, 3, 2, 1, 0, 509, 510, 5, 68, 0, 0, 510, 97, 1, 0, 0, 0, 511, 512, 5, 16, 0, 0, 512, 513, 5, 98, 0, 0, 513, 99, 1, 0, 0, 0, 514, 515, 5, 11, 0, 0, 515, 516, 5, 102, 0, 0, 516, 101, 1, 0, 0, 0, 517, 518, 5, 3, 0, 0, 518, 521, 5, 88, 0, 0, 519, 520, 5, 86, 0, 0, 520, 522, 3, 50, 25, 0, 521, 519, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 532, 1, 0, 0, 0, 523, 524, 5, 87, 0, 0, 524, 529, 3, 104, 52, 0, 525, 526, 5, 37, 0, 0, 526, 528, 3, 104, 52, 0, 527, 525, 1, 0, 0, 0, 528, 531, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 533, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 532, 523, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 103, 1, 0, 0, 0, 534, 535, 3, 50, 25, 0, 535, 536, 5, 35, 0, 0, 536, 538, 1, 0, 0, 0, 537, 534, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 50, 25, 0, 540, 105, 1, 0, 0, 0, 53, 117, 126, 141, 153, 162, 170, 174, 182, 184, 189, 196, 201, 208, 214, 222, 224, 235, 242, 253, 256, 270, 278, 286, 290, 296, 304, 317, 321, 325, 332, 336, 342, 349, 357, 379, 390, 401, 406, 417, 422, 426, 434, 443, 452, 463, 477, 488, 491, 496, 521, 529, 532, 537] \ No newline at end of file +[4, 1, 123, 548, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 120, 8, 1, 10, 1, 12, 1, 123, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 131, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 147, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 159, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 166, 8, 5, 10, 5, 12, 5, 169, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 176, 8, 5, 1, 5, 1, 5, 3, 5, 180, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 188, 8, 5, 10, 5, 12, 5, 191, 9, 5, 1, 6, 1, 6, 3, 6, 195, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 202, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 207, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 214, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 220, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 228, 8, 8, 10, 8, 12, 8, 231, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 241, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 246, 8, 9, 10, 9, 12, 9, 249, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 257, 8, 10, 10, 10, 12, 10, 260, 9, 10, 3, 10, 262, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 274, 8, 13, 10, 13, 12, 13, 277, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 284, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 290, 8, 15, 10, 15, 12, 15, 293, 9, 15, 1, 15, 3, 15, 296, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 302, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 308, 8, 18, 10, 18, 12, 18, 311, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 321, 8, 20, 10, 20, 12, 20, 324, 9, 20, 1, 20, 3, 20, 327, 8, 20, 1, 20, 1, 20, 3, 20, 331, 8, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 338, 8, 22, 1, 22, 1, 22, 3, 22, 342, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 348, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 353, 8, 24, 10, 24, 12, 24, 356, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 361, 8, 25, 10, 25, 12, 25, 364, 9, 25, 1, 26, 1, 26, 1, 26, 5, 26, 369, 8, 26, 10, 26, 12, 26, 372, 9, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 391, 8, 29, 10, 29, 12, 29, 394, 9, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 402, 8, 29, 10, 29, 12, 29, 405, 9, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 413, 8, 29, 10, 29, 12, 29, 416, 9, 29, 1, 29, 1, 29, 3, 29, 420, 8, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 429, 8, 31, 10, 31, 12, 31, 432, 9, 31, 1, 32, 1, 32, 3, 32, 436, 8, 32, 1, 32, 1, 32, 3, 32, 440, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 452, 8, 35, 10, 35, 12, 35, 455, 9, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 465, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 5, 40, 477, 8, 40, 10, 40, 12, 40, 480, 9, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 3, 43, 490, 8, 43, 1, 44, 3, 44, 493, 8, 44, 1, 44, 1, 44, 1, 45, 3, 45, 498, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 523, 8, 52, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 529, 8, 52, 10, 52, 12, 52, 532, 9, 52, 3, 52, 534, 8, 52, 1, 53, 1, 53, 1, 53, 3, 53, 539, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 0, 4, 2, 10, 16, 18, 55, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 0, 7, 1, 0, 63, 64, 1, 0, 65, 67, 1, 0, 70, 71, 2, 0, 35, 35, 39, 39, 1, 0, 42, 43, 2, 0, 41, 41, 55, 55, 2, 0, 56, 56, 58, 62, 574, 0, 110, 1, 0, 0, 0, 2, 113, 1, 0, 0, 0, 4, 130, 1, 0, 0, 0, 6, 146, 1, 0, 0, 0, 8, 148, 1, 0, 0, 0, 10, 179, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 219, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 250, 1, 0, 0, 0, 22, 265, 1, 0, 0, 0, 24, 267, 1, 0, 0, 0, 26, 270, 1, 0, 0, 0, 28, 283, 1, 0, 0, 0, 30, 285, 1, 0, 0, 0, 32, 297, 1, 0, 0, 0, 34, 301, 1, 0, 0, 0, 36, 303, 1, 0, 0, 0, 38, 312, 1, 0, 0, 0, 40, 316, 1, 0, 0, 0, 42, 332, 1, 0, 0, 0, 44, 335, 1, 0, 0, 0, 46, 343, 1, 0, 0, 0, 48, 349, 1, 0, 0, 0, 50, 357, 1, 0, 0, 0, 52, 365, 1, 0, 0, 0, 54, 373, 1, 0, 0, 0, 56, 375, 1, 0, 0, 0, 58, 419, 1, 0, 0, 0, 60, 421, 1, 0, 0, 0, 62, 424, 1, 0, 0, 0, 64, 433, 1, 0, 0, 0, 66, 441, 1, 0, 0, 0, 68, 444, 1, 0, 0, 0, 70, 447, 1, 0, 0, 0, 72, 456, 1, 0, 0, 0, 74, 460, 1, 0, 0, 0, 76, 466, 1, 0, 0, 0, 78, 470, 1, 0, 0, 0, 80, 473, 1, 0, 0, 0, 82, 481, 1, 0, 0, 0, 84, 485, 1, 0, 0, 0, 86, 489, 1, 0, 0, 0, 88, 492, 1, 0, 0, 0, 90, 497, 1, 0, 0, 0, 92, 501, 1, 0, 0, 0, 94, 503, 1, 0, 0, 0, 96, 505, 1, 0, 0, 0, 98, 508, 1, 0, 0, 0, 100, 512, 1, 0, 0, 0, 102, 515, 1, 0, 0, 0, 104, 518, 1, 0, 0, 0, 106, 538, 1, 0, 0, 0, 108, 542, 1, 0, 0, 0, 110, 111, 3, 2, 1, 0, 111, 112, 5, 0, 0, 1, 112, 1, 1, 0, 0, 0, 113, 114, 6, 1, -1, 0, 114, 115, 3, 4, 2, 0, 115, 121, 1, 0, 0, 0, 116, 117, 10, 1, 0, 0, 117, 118, 5, 29, 0, 0, 118, 120, 3, 6, 3, 0, 119, 116, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 3, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 131, 3, 96, 48, 0, 125, 131, 3, 30, 15, 0, 126, 131, 3, 24, 12, 0, 127, 131, 3, 40, 20, 0, 128, 131, 3, 100, 50, 0, 129, 131, 3, 102, 51, 0, 130, 124, 1, 0, 0, 0, 130, 125, 1, 0, 0, 0, 130, 126, 1, 0, 0, 0, 130, 127, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 130, 129, 1, 0, 0, 0, 131, 5, 1, 0, 0, 0, 132, 147, 3, 42, 21, 0, 133, 147, 3, 46, 23, 0, 134, 147, 3, 60, 30, 0, 135, 147, 3, 108, 54, 0, 136, 147, 3, 66, 33, 0, 137, 147, 3, 62, 31, 0, 138, 147, 3, 44, 22, 0, 139, 147, 3, 8, 4, 0, 140, 147, 3, 68, 34, 0, 141, 147, 3, 70, 35, 0, 142, 147, 3, 74, 37, 0, 143, 147, 3, 76, 38, 0, 144, 147, 3, 104, 52, 0, 145, 147, 3, 78, 39, 0, 146, 132, 1, 0, 0, 0, 146, 133, 1, 0, 0, 0, 146, 134, 1, 0, 0, 0, 146, 135, 1, 0, 0, 0, 146, 136, 1, 0, 0, 0, 146, 137, 1, 0, 0, 0, 146, 138, 1, 0, 0, 0, 146, 139, 1, 0, 0, 0, 146, 140, 1, 0, 0, 0, 146, 141, 1, 0, 0, 0, 146, 142, 1, 0, 0, 0, 146, 143, 1, 0, 0, 0, 146, 144, 1, 0, 0, 0, 146, 145, 1, 0, 0, 0, 147, 7, 1, 0, 0, 0, 148, 149, 5, 20, 0, 0, 149, 150, 3, 10, 5, 0, 150, 9, 1, 0, 0, 0, 151, 152, 6, 5, -1, 0, 152, 153, 5, 48, 0, 0, 153, 180, 3, 10, 5, 7, 154, 180, 3, 14, 7, 0, 155, 180, 3, 12, 6, 0, 156, 158, 3, 14, 7, 0, 157, 159, 5, 48, 0, 0, 158, 157, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 161, 5, 45, 0, 0, 161, 162, 5, 44, 0, 0, 162, 167, 3, 14, 7, 0, 163, 164, 5, 38, 0, 0, 164, 166, 3, 14, 7, 0, 165, 163, 1, 0, 0, 0, 166, 169, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 170, 171, 5, 54, 0, 0, 171, 180, 1, 0, 0, 0, 172, 173, 3, 14, 7, 0, 173, 175, 5, 46, 0, 0, 174, 176, 5, 48, 0, 0, 175, 174, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 178, 5, 49, 0, 0, 178, 180, 1, 0, 0, 0, 179, 151, 1, 0, 0, 0, 179, 154, 1, 0, 0, 0, 179, 155, 1, 0, 0, 0, 179, 156, 1, 0, 0, 0, 179, 172, 1, 0, 0, 0, 180, 189, 1, 0, 0, 0, 181, 182, 10, 4, 0, 0, 182, 183, 5, 34, 0, 0, 183, 188, 3, 10, 5, 5, 184, 185, 10, 3, 0, 0, 185, 186, 5, 51, 0, 0, 186, 188, 3, 10, 5, 4, 187, 181, 1, 0, 0, 0, 187, 184, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 11, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 194, 3, 14, 7, 0, 193, 195, 5, 48, 0, 0, 194, 193, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 197, 5, 47, 0, 0, 197, 198, 3, 92, 46, 0, 198, 207, 1, 0, 0, 0, 199, 201, 3, 14, 7, 0, 200, 202, 5, 48, 0, 0, 201, 200, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 204, 5, 53, 0, 0, 204, 205, 3, 92, 46, 0, 205, 207, 1, 0, 0, 0, 206, 192, 1, 0, 0, 0, 206, 199, 1, 0, 0, 0, 207, 13, 1, 0, 0, 0, 208, 214, 3, 16, 8, 0, 209, 210, 3, 16, 8, 0, 210, 211, 3, 94, 47, 0, 211, 212, 3, 16, 8, 0, 212, 214, 1, 0, 0, 0, 213, 208, 1, 0, 0, 0, 213, 209, 1, 0, 0, 0, 214, 15, 1, 0, 0, 0, 215, 216, 6, 8, -1, 0, 216, 220, 3, 18, 9, 0, 217, 218, 7, 0, 0, 0, 218, 220, 3, 16, 8, 3, 219, 215, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 220, 229, 1, 0, 0, 0, 221, 222, 10, 2, 0, 0, 222, 223, 7, 1, 0, 0, 223, 228, 3, 16, 8, 3, 224, 225, 10, 1, 0, 0, 225, 226, 7, 0, 0, 0, 226, 228, 3, 16, 8, 2, 227, 221, 1, 0, 0, 0, 227, 224, 1, 0, 0, 0, 228, 231, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 17, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 232, 233, 6, 9, -1, 0, 233, 241, 3, 58, 29, 0, 234, 241, 3, 48, 24, 0, 235, 241, 3, 20, 10, 0, 236, 237, 5, 44, 0, 0, 237, 238, 3, 10, 5, 0, 238, 239, 5, 54, 0, 0, 239, 241, 1, 0, 0, 0, 240, 232, 1, 0, 0, 0, 240, 234, 1, 0, 0, 0, 240, 235, 1, 0, 0, 0, 240, 236, 1, 0, 0, 0, 241, 247, 1, 0, 0, 0, 242, 243, 10, 1, 0, 0, 243, 244, 5, 37, 0, 0, 244, 246, 3, 22, 11, 0, 245, 242, 1, 0, 0, 0, 246, 249, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 19, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 250, 251, 3, 54, 27, 0, 251, 261, 5, 44, 0, 0, 252, 262, 5, 65, 0, 0, 253, 258, 3, 10, 5, 0, 254, 255, 5, 38, 0, 0, 255, 257, 3, 10, 5, 0, 256, 254, 1, 0, 0, 0, 257, 260, 1, 0, 0, 0, 258, 256, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 262, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 261, 252, 1, 0, 0, 0, 261, 253, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 264, 5, 54, 0, 0, 264, 21, 1, 0, 0, 0, 265, 266, 3, 54, 27, 0, 266, 23, 1, 0, 0, 0, 267, 268, 5, 16, 0, 0, 268, 269, 3, 26, 13, 0, 269, 25, 1, 0, 0, 0, 270, 275, 3, 28, 14, 0, 271, 272, 5, 38, 0, 0, 272, 274, 3, 28, 14, 0, 273, 271, 1, 0, 0, 0, 274, 277, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 27, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 278, 284, 3, 10, 5, 0, 279, 280, 3, 48, 24, 0, 280, 281, 5, 36, 0, 0, 281, 282, 3, 10, 5, 0, 282, 284, 1, 0, 0, 0, 283, 278, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 284, 29, 1, 0, 0, 0, 285, 286, 5, 6, 0, 0, 286, 291, 3, 32, 16, 0, 287, 288, 5, 38, 0, 0, 288, 290, 3, 32, 16, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 31, 1, 0, 0, 0, 297, 298, 5, 25, 0, 0, 298, 33, 1, 0, 0, 0, 299, 302, 3, 36, 18, 0, 300, 302, 3, 38, 19, 0, 301, 299, 1, 0, 0, 0, 301, 300, 1, 0, 0, 0, 302, 35, 1, 0, 0, 0, 303, 304, 5, 75, 0, 0, 304, 309, 3, 32, 16, 0, 305, 306, 5, 38, 0, 0, 306, 308, 3, 32, 16, 0, 307, 305, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 37, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 312, 313, 5, 68, 0, 0, 313, 314, 3, 36, 18, 0, 314, 315, 5, 69, 0, 0, 315, 39, 1, 0, 0, 0, 316, 317, 5, 13, 0, 0, 317, 322, 3, 32, 16, 0, 318, 319, 5, 38, 0, 0, 319, 321, 3, 32, 16, 0, 320, 318, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 327, 3, 26, 13, 0, 326, 325, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 330, 1, 0, 0, 0, 328, 329, 5, 33, 0, 0, 329, 331, 3, 26, 13, 0, 330, 328, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 41, 1, 0, 0, 0, 332, 333, 5, 4, 0, 0, 333, 334, 3, 26, 13, 0, 334, 43, 1, 0, 0, 0, 335, 337, 5, 19, 0, 0, 336, 338, 3, 26, 13, 0, 337, 336, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 341, 1, 0, 0, 0, 339, 340, 5, 33, 0, 0, 340, 342, 3, 26, 13, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 45, 1, 0, 0, 0, 343, 344, 5, 8, 0, 0, 344, 347, 3, 26, 13, 0, 345, 346, 5, 33, 0, 0, 346, 348, 3, 26, 13, 0, 347, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 47, 1, 0, 0, 0, 349, 354, 3, 54, 27, 0, 350, 351, 5, 40, 0, 0, 351, 353, 3, 54, 27, 0, 352, 350, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 49, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 362, 3, 56, 28, 0, 358, 359, 5, 40, 0, 0, 359, 361, 3, 56, 28, 0, 360, 358, 1, 0, 0, 0, 361, 364, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 51, 1, 0, 0, 0, 364, 362, 1, 0, 0, 0, 365, 370, 3, 50, 25, 0, 366, 367, 5, 38, 0, 0, 367, 369, 3, 50, 25, 0, 368, 366, 1, 0, 0, 0, 369, 372, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 53, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 373, 374, 7, 2, 0, 0, 374, 55, 1, 0, 0, 0, 375, 376, 5, 79, 0, 0, 376, 57, 1, 0, 0, 0, 377, 420, 5, 49, 0, 0, 378, 379, 3, 90, 45, 0, 379, 380, 5, 70, 0, 0, 380, 420, 1, 0, 0, 0, 381, 420, 3, 88, 44, 0, 382, 420, 3, 90, 45, 0, 383, 420, 3, 84, 42, 0, 384, 420, 5, 52, 0, 0, 385, 420, 3, 92, 46, 0, 386, 387, 5, 68, 0, 0, 387, 392, 3, 86, 43, 0, 388, 389, 5, 38, 0, 0, 389, 391, 3, 86, 43, 0, 390, 388, 1, 0, 0, 0, 391, 394, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 395, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 395, 396, 5, 69, 0, 0, 396, 420, 1, 0, 0, 0, 397, 398, 5, 68, 0, 0, 398, 403, 3, 84, 42, 0, 399, 400, 5, 38, 0, 0, 400, 402, 3, 84, 42, 0, 401, 399, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 406, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 407, 5, 69, 0, 0, 407, 420, 1, 0, 0, 0, 408, 409, 5, 68, 0, 0, 409, 414, 3, 92, 46, 0, 410, 411, 5, 38, 0, 0, 411, 413, 3, 92, 46, 0, 412, 410, 1, 0, 0, 0, 413, 416, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 417, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 417, 418, 5, 69, 0, 0, 418, 420, 1, 0, 0, 0, 419, 377, 1, 0, 0, 0, 419, 378, 1, 0, 0, 0, 419, 381, 1, 0, 0, 0, 419, 382, 1, 0, 0, 0, 419, 383, 1, 0, 0, 0, 419, 384, 1, 0, 0, 0, 419, 385, 1, 0, 0, 0, 419, 386, 1, 0, 0, 0, 419, 397, 1, 0, 0, 0, 419, 408, 1, 0, 0, 0, 420, 59, 1, 0, 0, 0, 421, 422, 5, 10, 0, 0, 422, 423, 5, 31, 0, 0, 423, 61, 1, 0, 0, 0, 424, 425, 5, 18, 0, 0, 425, 430, 3, 64, 32, 0, 426, 427, 5, 38, 0, 0, 427, 429, 3, 64, 32, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 63, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 435, 3, 10, 5, 0, 434, 436, 7, 3, 0, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 439, 1, 0, 0, 0, 437, 438, 5, 50, 0, 0, 438, 440, 7, 4, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 65, 1, 0, 0, 0, 441, 442, 5, 9, 0, 0, 442, 443, 3, 52, 26, 0, 443, 67, 1, 0, 0, 0, 444, 445, 5, 2, 0, 0, 445, 446, 3, 52, 26, 0, 446, 69, 1, 0, 0, 0, 447, 448, 5, 15, 0, 0, 448, 453, 3, 72, 36, 0, 449, 450, 5, 38, 0, 0, 450, 452, 3, 72, 36, 0, 451, 449, 1, 0, 0, 0, 452, 455, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 71, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 456, 457, 3, 50, 25, 0, 457, 458, 5, 83, 0, 0, 458, 459, 3, 50, 25, 0, 459, 73, 1, 0, 0, 0, 460, 461, 5, 1, 0, 0, 461, 462, 3, 18, 9, 0, 462, 464, 3, 92, 46, 0, 463, 465, 3, 80, 40, 0, 464, 463, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 75, 1, 0, 0, 0, 466, 467, 5, 7, 0, 0, 467, 468, 3, 18, 9, 0, 468, 469, 3, 92, 46, 0, 469, 77, 1, 0, 0, 0, 470, 471, 5, 14, 0, 0, 471, 472, 3, 48, 24, 0, 472, 79, 1, 0, 0, 0, 473, 478, 3, 82, 41, 0, 474, 475, 5, 38, 0, 0, 475, 477, 3, 82, 41, 0, 476, 474, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 81, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 482, 3, 54, 27, 0, 482, 483, 5, 36, 0, 0, 483, 484, 3, 58, 29, 0, 484, 83, 1, 0, 0, 0, 485, 486, 7, 5, 0, 0, 486, 85, 1, 0, 0, 0, 487, 490, 3, 88, 44, 0, 488, 490, 3, 90, 45, 0, 489, 487, 1, 0, 0, 0, 489, 488, 1, 0, 0, 0, 490, 87, 1, 0, 0, 0, 491, 493, 7, 0, 0, 0, 492, 491, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 5, 32, 0, 0, 495, 89, 1, 0, 0, 0, 496, 498, 7, 0, 0, 0, 497, 496, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 5, 31, 0, 0, 500, 91, 1, 0, 0, 0, 501, 502, 5, 30, 0, 0, 502, 93, 1, 0, 0, 0, 503, 504, 7, 6, 0, 0, 504, 95, 1, 0, 0, 0, 505, 506, 5, 5, 0, 0, 506, 507, 3, 98, 49, 0, 507, 97, 1, 0, 0, 0, 508, 509, 5, 68, 0, 0, 509, 510, 3, 2, 1, 0, 510, 511, 5, 69, 0, 0, 511, 99, 1, 0, 0, 0, 512, 513, 5, 17, 0, 0, 513, 514, 5, 105, 0, 0, 514, 101, 1, 0, 0, 0, 515, 516, 5, 12, 0, 0, 516, 517, 5, 109, 0, 0, 517, 103, 1, 0, 0, 0, 518, 519, 5, 3, 0, 0, 519, 522, 5, 89, 0, 0, 520, 521, 5, 87, 0, 0, 521, 523, 3, 50, 25, 0, 522, 520, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 533, 1, 0, 0, 0, 524, 525, 5, 88, 0, 0, 525, 530, 3, 106, 53, 0, 526, 527, 5, 38, 0, 0, 527, 529, 3, 106, 53, 0, 528, 526, 1, 0, 0, 0, 529, 532, 1, 0, 0, 0, 530, 528, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 534, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 533, 524, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 105, 1, 0, 0, 0, 535, 536, 3, 50, 25, 0, 536, 537, 5, 36, 0, 0, 537, 539, 1, 0, 0, 0, 538, 535, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 3, 50, 25, 0, 541, 107, 1, 0, 0, 0, 542, 543, 5, 11, 0, 0, 543, 544, 5, 25, 0, 0, 544, 545, 5, 87, 0, 0, 545, 546, 3, 52, 26, 0, 546, 109, 1, 0, 0, 0, 52, 121, 130, 146, 158, 167, 175, 179, 187, 189, 194, 201, 206, 213, 219, 227, 229, 240, 247, 258, 261, 275, 283, 291, 295, 301, 309, 322, 326, 330, 337, 341, 347, 354, 362, 370, 392, 403, 414, 419, 430, 435, 439, 453, 464, 478, 489, 492, 497, 522, 530, 533, 538] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens index 0e2d796eda847..30ce0d5eea55b 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens @@ -8,112 +8,119 @@ GROK=7 INLINESTATS=8 KEEP=9 LIMIT=10 -META=11 -METRICS=12 -MV_EXPAND=13 -RENAME=14 -ROW=15 -SHOW=16 -SORT=17 -STATS=18 -WHERE=19 -UNKNOWN_CMD=20 -LINE_COMMENT=21 -MULTILINE_COMMENT=22 -WS=23 -INDEX_UNQUOTED_IDENTIFIER=24 -EXPLAIN_WS=25 -EXPLAIN_LINE_COMMENT=26 -EXPLAIN_MULTILINE_COMMENT=27 -PIPE=28 -QUOTED_STRING=29 -INTEGER_LITERAL=30 -DECIMAL_LITERAL=31 -BY=32 -AND=33 -ASC=34 -ASSIGN=35 -CAST_OP=36 -COMMA=37 -DESC=38 -DOT=39 -FALSE=40 -FIRST=41 -LAST=42 -LP=43 -IN=44 -IS=45 -LIKE=46 -NOT=47 -NULL=48 -NULLS=49 -OR=50 -PARAM=51 -RLIKE=52 -RP=53 -TRUE=54 -EQ=55 -CIEQ=56 -NEQ=57 -LT=58 -LTE=59 -GT=60 -GTE=61 -PLUS=62 -MINUS=63 -ASTERISK=64 -SLASH=65 -PERCENT=66 -OPENING_BRACKET=67 -CLOSING_BRACKET=68 -UNQUOTED_IDENTIFIER=69 -QUOTED_IDENTIFIER=70 -EXPR_LINE_COMMENT=71 -EXPR_MULTILINE_COMMENT=72 -EXPR_WS=73 -METADATA=74 -FROM_LINE_COMMENT=75 -FROM_MULTILINE_COMMENT=76 -FROM_WS=77 -ID_PATTERN=78 -PROJECT_LINE_COMMENT=79 -PROJECT_MULTILINE_COMMENT=80 -PROJECT_WS=81 -AS=82 -RENAME_LINE_COMMENT=83 -RENAME_MULTILINE_COMMENT=84 -RENAME_WS=85 -ON=86 -WITH=87 -ENRICH_POLICY_NAME=88 -ENRICH_LINE_COMMENT=89 -ENRICH_MULTILINE_COMMENT=90 -ENRICH_WS=91 -ENRICH_FIELD_LINE_COMMENT=92 -ENRICH_FIELD_MULTILINE_COMMENT=93 -ENRICH_FIELD_WS=94 -MVEXPAND_LINE_COMMENT=95 -MVEXPAND_MULTILINE_COMMENT=96 -MVEXPAND_WS=97 -INFO=98 -SHOW_LINE_COMMENT=99 -SHOW_MULTILINE_COMMENT=100 -SHOW_WS=101 -FUNCTIONS=102 -META_LINE_COMMENT=103 -META_MULTILINE_COMMENT=104 -META_WS=105 -COLON=106 -SETTING=107 -SETTING_LINE_COMMENT=108 -SETTTING_MULTILINE_COMMENT=109 -SETTING_WS=110 -METRICS_LINE_COMMENT=111 -METRICS_MULTILINE_COMMENT=112 -METRICS_WS=113 -CLOSING_METRICS_LINE_COMMENT=114 -CLOSING_METRICS_MULTILINE_COMMENT=115 -CLOSING_METRICS_WS=116 +LOOKUP=11 +META=12 +METRICS=13 +MV_EXPAND=14 +RENAME=15 +ROW=16 +SHOW=17 +SORT=18 +STATS=19 +WHERE=20 +UNKNOWN_CMD=21 +LINE_COMMENT=22 +MULTILINE_COMMENT=23 +WS=24 +INDEX_UNQUOTED_IDENTIFIER=25 +EXPLAIN_WS=26 +EXPLAIN_LINE_COMMENT=27 +EXPLAIN_MULTILINE_COMMENT=28 +PIPE=29 +QUOTED_STRING=30 +INTEGER_LITERAL=31 +DECIMAL_LITERAL=32 +BY=33 +AND=34 +ASC=35 +ASSIGN=36 +CAST_OP=37 +COMMA=38 +DESC=39 +DOT=40 +FALSE=41 +FIRST=42 +LAST=43 +LP=44 +IN=45 +IS=46 +LIKE=47 +NOT=48 +NULL=49 +NULLS=50 +OR=51 +PARAM=52 +RLIKE=53 +RP=54 +TRUE=55 +EQ=56 +CIEQ=57 +NEQ=58 +LT=59 +LTE=60 +GT=61 +GTE=62 +PLUS=63 +MINUS=64 +ASTERISK=65 +SLASH=66 +PERCENT=67 +OPENING_BRACKET=68 +CLOSING_BRACKET=69 +UNQUOTED_IDENTIFIER=70 +QUOTED_IDENTIFIER=71 +EXPR_LINE_COMMENT=72 +EXPR_MULTILINE_COMMENT=73 +EXPR_WS=74 +METADATA=75 +FROM_LINE_COMMENT=76 +FROM_MULTILINE_COMMENT=77 +FROM_WS=78 +ID_PATTERN=79 +PROJECT_LINE_COMMENT=80 +PROJECT_MULTILINE_COMMENT=81 +PROJECT_WS=82 +AS=83 +RENAME_LINE_COMMENT=84 +RENAME_MULTILINE_COMMENT=85 +RENAME_WS=86 +ON=87 +WITH=88 +ENRICH_POLICY_NAME=89 +ENRICH_LINE_COMMENT=90 +ENRICH_MULTILINE_COMMENT=91 +ENRICH_WS=92 +ENRICH_FIELD_LINE_COMMENT=93 +ENRICH_FIELD_MULTILINE_COMMENT=94 +ENRICH_FIELD_WS=95 +LOOKUP_LINE_COMMENT=96 +LOOKUP_MULTILINE_COMMENT=97 +LOOKUP_WS=98 +LOOKUP_FIELD_LINE_COMMENT=99 +LOOKUP_FIELD_MULTILINE_COMMENT=100 +LOOKUP_FIELD_WS=101 +MVEXPAND_LINE_COMMENT=102 +MVEXPAND_MULTILINE_COMMENT=103 +MVEXPAND_WS=104 +INFO=105 +SHOW_LINE_COMMENT=106 +SHOW_MULTILINE_COMMENT=107 +SHOW_WS=108 +FUNCTIONS=109 +META_LINE_COMMENT=110 +META_MULTILINE_COMMENT=111 +META_WS=112 +COLON=113 +SETTING=114 +SETTING_LINE_COMMENT=115 +SETTTING_MULTILINE_COMMENT=116 +SETTING_WS=117 +METRICS_LINE_COMMENT=118 +METRICS_MULTILINE_COMMENT=119 +METRICS_WS=120 +CLOSING_METRICS_LINE_COMMENT=121 +CLOSING_METRICS_MULTILINE_COMMENT=122 +CLOSING_METRICS_WS=123 'dissect'=1 'drop'=2 'enrich'=3 @@ -124,56 +131,57 @@ CLOSING_METRICS_WS=116 'inlinestats'=8 'keep'=9 'limit'=10 -'meta'=11 -'metrics'=12 -'mv_expand'=13 -'rename'=14 -'row'=15 -'show'=16 -'sort'=17 -'stats'=18 -'where'=19 -'|'=28 -'by'=32 -'and'=33 -'asc'=34 -'='=35 -'::'=36 -','=37 -'desc'=38 -'.'=39 -'false'=40 -'first'=41 -'last'=42 -'('=43 -'in'=44 -'is'=45 -'like'=46 -'not'=47 -'null'=48 -'nulls'=49 -'or'=50 -'?'=51 -'rlike'=52 -')'=53 -'true'=54 -'=='=55 -'=~'=56 -'!='=57 -'<'=58 -'<='=59 -'>'=60 -'>='=61 -'+'=62 -'-'=63 -'*'=64 -'/'=65 -'%'=66 -']'=68 -'metadata'=74 -'as'=82 -'on'=86 -'with'=87 -'info'=98 -'functions'=102 -':'=106 +'lookup'=11 +'meta'=12 +'metrics'=13 +'mv_expand'=14 +'rename'=15 +'row'=16 +'show'=17 +'sort'=18 +'stats'=19 +'where'=20 +'|'=29 +'by'=33 +'and'=34 +'asc'=35 +'='=36 +'::'=37 +','=38 +'desc'=39 +'.'=40 +'false'=41 +'first'=42 +'last'=43 +'('=44 +'in'=45 +'is'=46 +'like'=47 +'not'=48 +'null'=49 +'nulls'=50 +'or'=51 +'?'=52 +'rlike'=53 +')'=54 +'true'=55 +'=='=56 +'=~'=57 +'!='=58 +'<'=59 +'<='=60 +'>'=61 +'>='=62 +'+'=63 +'-'=64 +'*'=65 +'/'=66 +'%'=67 +']'=69 +'metadata'=75 +'as'=83 +'on'=87 +'with'=88 +'info'=105 +'functions'=109 +':'=113 diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts index 7b755516a0475..7b132ef4a3358 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.ts @@ -28,112 +28,119 @@ export default class esql_parser extends Parser { public static readonly INLINESTATS = 8; public static readonly KEEP = 9; public static readonly LIMIT = 10; - public static readonly META = 11; - public static readonly METRICS = 12; - public static readonly MV_EXPAND = 13; - public static readonly RENAME = 14; - public static readonly ROW = 15; - public static readonly SHOW = 16; - public static readonly SORT = 17; - public static readonly STATS = 18; - public static readonly WHERE = 19; - public static readonly UNKNOWN_CMD = 20; - public static readonly LINE_COMMENT = 21; - public static readonly MULTILINE_COMMENT = 22; - public static readonly WS = 23; - public static readonly INDEX_UNQUOTED_IDENTIFIER = 24; - public static readonly EXPLAIN_WS = 25; - public static readonly EXPLAIN_LINE_COMMENT = 26; - public static readonly EXPLAIN_MULTILINE_COMMENT = 27; - public static readonly PIPE = 28; - public static readonly QUOTED_STRING = 29; - public static readonly INTEGER_LITERAL = 30; - public static readonly DECIMAL_LITERAL = 31; - public static readonly BY = 32; - public static readonly AND = 33; - public static readonly ASC = 34; - public static readonly ASSIGN = 35; - public static readonly CAST_OP = 36; - public static readonly COMMA = 37; - public static readonly DESC = 38; - public static readonly DOT = 39; - public static readonly FALSE = 40; - public static readonly FIRST = 41; - public static readonly LAST = 42; - public static readonly LP = 43; - public static readonly IN = 44; - public static readonly IS = 45; - public static readonly LIKE = 46; - public static readonly NOT = 47; - public static readonly NULL = 48; - public static readonly NULLS = 49; - public static readonly OR = 50; - public static readonly PARAM = 51; - public static readonly RLIKE = 52; - public static readonly RP = 53; - public static readonly TRUE = 54; - public static readonly EQ = 55; - public static readonly CIEQ = 56; - public static readonly NEQ = 57; - public static readonly LT = 58; - public static readonly LTE = 59; - public static readonly GT = 60; - public static readonly GTE = 61; - public static readonly PLUS = 62; - public static readonly MINUS = 63; - public static readonly ASTERISK = 64; - public static readonly SLASH = 65; - public static readonly PERCENT = 66; - public static readonly OPENING_BRACKET = 67; - public static readonly CLOSING_BRACKET = 68; - public static readonly UNQUOTED_IDENTIFIER = 69; - public static readonly QUOTED_IDENTIFIER = 70; - public static readonly EXPR_LINE_COMMENT = 71; - public static readonly EXPR_MULTILINE_COMMENT = 72; - public static readonly EXPR_WS = 73; - public static readonly METADATA = 74; - public static readonly FROM_LINE_COMMENT = 75; - public static readonly FROM_MULTILINE_COMMENT = 76; - public static readonly FROM_WS = 77; - public static readonly ID_PATTERN = 78; - public static readonly PROJECT_LINE_COMMENT = 79; - public static readonly PROJECT_MULTILINE_COMMENT = 80; - public static readonly PROJECT_WS = 81; - public static readonly AS = 82; - public static readonly RENAME_LINE_COMMENT = 83; - public static readonly RENAME_MULTILINE_COMMENT = 84; - public static readonly RENAME_WS = 85; - public static readonly ON = 86; - public static readonly WITH = 87; - public static readonly ENRICH_POLICY_NAME = 88; - public static readonly ENRICH_LINE_COMMENT = 89; - public static readonly ENRICH_MULTILINE_COMMENT = 90; - public static readonly ENRICH_WS = 91; - public static readonly ENRICH_FIELD_LINE_COMMENT = 92; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 93; - public static readonly ENRICH_FIELD_WS = 94; - public static readonly MVEXPAND_LINE_COMMENT = 95; - public static readonly MVEXPAND_MULTILINE_COMMENT = 96; - public static readonly MVEXPAND_WS = 97; - public static readonly INFO = 98; - public static readonly SHOW_LINE_COMMENT = 99; - public static readonly SHOW_MULTILINE_COMMENT = 100; - public static readonly SHOW_WS = 101; - public static readonly FUNCTIONS = 102; - public static readonly META_LINE_COMMENT = 103; - public static readonly META_MULTILINE_COMMENT = 104; - public static readonly META_WS = 105; - public static readonly COLON = 106; - public static readonly SETTING = 107; - public static readonly SETTING_LINE_COMMENT = 108; - public static readonly SETTTING_MULTILINE_COMMENT = 109; - public static readonly SETTING_WS = 110; - public static readonly METRICS_LINE_COMMENT = 111; - public static readonly METRICS_MULTILINE_COMMENT = 112; - public static readonly METRICS_WS = 113; - public static readonly CLOSING_METRICS_LINE_COMMENT = 114; - public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 115; - public static readonly CLOSING_METRICS_WS = 116; + public static readonly LOOKUP = 11; + public static readonly META = 12; + public static readonly METRICS = 13; + public static readonly MV_EXPAND = 14; + public static readonly RENAME = 15; + public static readonly ROW = 16; + public static readonly SHOW = 17; + public static readonly SORT = 18; + public static readonly STATS = 19; + public static readonly WHERE = 20; + public static readonly UNKNOWN_CMD = 21; + public static readonly LINE_COMMENT = 22; + public static readonly MULTILINE_COMMENT = 23; + public static readonly WS = 24; + public static readonly INDEX_UNQUOTED_IDENTIFIER = 25; + public static readonly EXPLAIN_WS = 26; + public static readonly EXPLAIN_LINE_COMMENT = 27; + public static readonly EXPLAIN_MULTILINE_COMMENT = 28; + public static readonly PIPE = 29; + public static readonly QUOTED_STRING = 30; + public static readonly INTEGER_LITERAL = 31; + public static readonly DECIMAL_LITERAL = 32; + public static readonly BY = 33; + public static readonly AND = 34; + public static readonly ASC = 35; + public static readonly ASSIGN = 36; + public static readonly CAST_OP = 37; + public static readonly COMMA = 38; + public static readonly DESC = 39; + public static readonly DOT = 40; + public static readonly FALSE = 41; + public static readonly FIRST = 42; + public static readonly LAST = 43; + public static readonly LP = 44; + public static readonly IN = 45; + public static readonly IS = 46; + public static readonly LIKE = 47; + public static readonly NOT = 48; + public static readonly NULL = 49; + public static readonly NULLS = 50; + public static readonly OR = 51; + public static readonly PARAM = 52; + public static readonly RLIKE = 53; + public static readonly RP = 54; + public static readonly TRUE = 55; + public static readonly EQ = 56; + public static readonly CIEQ = 57; + public static readonly NEQ = 58; + public static readonly LT = 59; + public static readonly LTE = 60; + public static readonly GT = 61; + public static readonly GTE = 62; + public static readonly PLUS = 63; + public static readonly MINUS = 64; + public static readonly ASTERISK = 65; + public static readonly SLASH = 66; + public static readonly PERCENT = 67; + public static readonly OPENING_BRACKET = 68; + public static readonly CLOSING_BRACKET = 69; + public static readonly UNQUOTED_IDENTIFIER = 70; + public static readonly QUOTED_IDENTIFIER = 71; + public static readonly EXPR_LINE_COMMENT = 72; + public static readonly EXPR_MULTILINE_COMMENT = 73; + public static readonly EXPR_WS = 74; + public static readonly METADATA = 75; + public static readonly FROM_LINE_COMMENT = 76; + public static readonly FROM_MULTILINE_COMMENT = 77; + public static readonly FROM_WS = 78; + public static readonly ID_PATTERN = 79; + public static readonly PROJECT_LINE_COMMENT = 80; + public static readonly PROJECT_MULTILINE_COMMENT = 81; + public static readonly PROJECT_WS = 82; + public static readonly AS = 83; + public static readonly RENAME_LINE_COMMENT = 84; + public static readonly RENAME_MULTILINE_COMMENT = 85; + public static readonly RENAME_WS = 86; + public static readonly ON = 87; + public static readonly WITH = 88; + public static readonly ENRICH_POLICY_NAME = 89; + public static readonly ENRICH_LINE_COMMENT = 90; + public static readonly ENRICH_MULTILINE_COMMENT = 91; + public static readonly ENRICH_WS = 92; + public static readonly ENRICH_FIELD_LINE_COMMENT = 93; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 94; + public static readonly ENRICH_FIELD_WS = 95; + public static readonly LOOKUP_LINE_COMMENT = 96; + public static readonly LOOKUP_MULTILINE_COMMENT = 97; + public static readonly LOOKUP_WS = 98; + public static readonly LOOKUP_FIELD_LINE_COMMENT = 99; + public static readonly LOOKUP_FIELD_MULTILINE_COMMENT = 100; + public static readonly LOOKUP_FIELD_WS = 101; + public static readonly MVEXPAND_LINE_COMMENT = 102; + public static readonly MVEXPAND_MULTILINE_COMMENT = 103; + public static readonly MVEXPAND_WS = 104; + public static readonly INFO = 105; + public static readonly SHOW_LINE_COMMENT = 106; + public static readonly SHOW_MULTILINE_COMMENT = 107; + public static readonly SHOW_WS = 108; + public static readonly FUNCTIONS = 109; + public static readonly META_LINE_COMMENT = 110; + public static readonly META_MULTILINE_COMMENT = 111; + public static readonly META_WS = 112; + public static readonly COLON = 113; + public static readonly SETTING = 114; + public static readonly SETTING_LINE_COMMENT = 115; + public static readonly SETTTING_MULTILINE_COMMENT = 116; + public static readonly SETTING_WS = 117; + public static readonly METRICS_LINE_COMMENT = 118; + public static readonly METRICS_MULTILINE_COMMENT = 119; + public static readonly METRICS_WS = 120; + public static readonly CLOSING_METRICS_LINE_COMMENT = 121; + public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 122; + public static readonly CLOSING_METRICS_WS = 123; public static readonly EOF = Token.EOF; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; @@ -161,39 +168,42 @@ export default class esql_parser extends Parser { public static readonly RULE_inlinestatsCommand = 23; public static readonly RULE_qualifiedName = 24; public static readonly RULE_qualifiedNamePattern = 25; - public static readonly RULE_identifier = 26; - public static readonly RULE_identifierPattern = 27; - public static readonly RULE_constant = 28; - public static readonly RULE_limitCommand = 29; - public static readonly RULE_sortCommand = 30; - public static readonly RULE_orderExpression = 31; - public static readonly RULE_keepCommand = 32; - public static readonly RULE_dropCommand = 33; - public static readonly RULE_renameCommand = 34; - public static readonly RULE_renameClause = 35; - public static readonly RULE_dissectCommand = 36; - public static readonly RULE_grokCommand = 37; - public static readonly RULE_mvExpandCommand = 38; - public static readonly RULE_commandOptions = 39; - public static readonly RULE_commandOption = 40; - public static readonly RULE_booleanValue = 41; - public static readonly RULE_numericValue = 42; - public static readonly RULE_decimalValue = 43; - public static readonly RULE_integerValue = 44; - public static readonly RULE_string = 45; - public static readonly RULE_comparisonOperator = 46; - public static readonly RULE_explainCommand = 47; - public static readonly RULE_subqueryExpression = 48; - public static readonly RULE_showCommand = 49; - public static readonly RULE_metaCommand = 50; - public static readonly RULE_enrichCommand = 51; - public static readonly RULE_enrichWithClause = 52; + public static readonly RULE_qualifiedNamePatterns = 26; + public static readonly RULE_identifier = 27; + public static readonly RULE_identifierPattern = 28; + public static readonly RULE_constant = 29; + public static readonly RULE_limitCommand = 30; + public static readonly RULE_sortCommand = 31; + public static readonly RULE_orderExpression = 32; + public static readonly RULE_keepCommand = 33; + public static readonly RULE_dropCommand = 34; + public static readonly RULE_renameCommand = 35; + public static readonly RULE_renameClause = 36; + public static readonly RULE_dissectCommand = 37; + public static readonly RULE_grokCommand = 38; + public static readonly RULE_mvExpandCommand = 39; + public static readonly RULE_commandOptions = 40; + public static readonly RULE_commandOption = 41; + public static readonly RULE_booleanValue = 42; + public static readonly RULE_numericValue = 43; + public static readonly RULE_decimalValue = 44; + public static readonly RULE_integerValue = 45; + public static readonly RULE_string = 46; + public static readonly RULE_comparisonOperator = 47; + public static readonly RULE_explainCommand = 48; + public static readonly RULE_subqueryExpression = 49; + public static readonly RULE_showCommand = 50; + public static readonly RULE_metaCommand = 51; + public static readonly RULE_enrichCommand = 52; + public static readonly RULE_enrichWithClause = 53; + public static readonly RULE_lookupCommand = 54; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", "'grok'", "'inlinestats'", "'keep'", "'limit'", + "'lookup'", "'meta'", "'metrics'", "'mv_expand'", "'rename'", @@ -238,6 +248,9 @@ export default class esql_parser extends Parser { null, null, null, null, null, null, + null, null, + null, null, + null, null, null, "'info'", null, null, null, "'functions'", @@ -249,7 +262,8 @@ export default class esql_parser extends Parser { "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", - "META", "METRICS", + "LOOKUP", "META", + "METRICS", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", @@ -308,6 +322,12 @@ export default class esql_parser extends Parser { "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", + "LOOKUP_LINE_COMMENT", + "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", + "LOOKUP_FIELD_LINE_COMMENT", + "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", @@ -335,13 +355,13 @@ export default class esql_parser extends Parser { "primaryExpression", "functionExpression", "dataType", "rowCommand", "fields", "field", "fromCommand", "indexIdentifier", "metadata", "metadataOption", "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", - "inlinestatsCommand", "qualifiedName", "qualifiedNamePattern", "identifier", - "identifierPattern", "constant", "limitCommand", "sortCommand", "orderExpression", - "keepCommand", "dropCommand", "renameCommand", "renameClause", "dissectCommand", - "grokCommand", "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "explainCommand", "subqueryExpression", "showCommand", "metaCommand", - "enrichCommand", "enrichWithClause", + "inlinestatsCommand", "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", + "identifier", "identifierPattern", "constant", "limitCommand", "sortCommand", + "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", + "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", + "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", + "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", "metaCommand", "enrichCommand", "enrichWithClause", "lookupCommand", ]; public get grammarFileName(): string { return "esql_parser.g4"; } public get literalNames(): (string | null)[] { return esql_parser.literalNames; } @@ -364,9 +384,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 106; + this.state = 110; this.query(0); - this.state = 107; + this.state = 111; this.match(esql_parser.EOF); } } @@ -408,11 +428,11 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 110; + this.state = 114; this.sourceCommand(); } this._ctx.stop = this._input.LT(-1); - this.state = 117; + this.state = 121; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -425,18 +445,18 @@ export default class esql_parser extends Parser { { localctx = new CompositeQueryContext(this, new QueryContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_query); - this.state = 112; + this.state = 116; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 113; + this.state = 117; this.match(esql_parser.PIPE); - this.state = 114; + this.state = 118; this.processingCommand(); } } } - this.state = 119; + this.state = 123; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); } @@ -461,48 +481,48 @@ export default class esql_parser extends Parser { let localctx: SourceCommandContext = new SourceCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 126; + this.state = 130; this._errHandler.sync(this); switch (this._input.LA(1)) { case 5: this.enterOuterAlt(localctx, 1); { - this.state = 120; + this.state = 124; this.explainCommand(); } break; case 6: this.enterOuterAlt(localctx, 2); { - this.state = 121; + this.state = 125; this.fromCommand(); } break; - case 15: + case 16: this.enterOuterAlt(localctx, 3); { - this.state = 122; + this.state = 126; this.rowCommand(); } break; - case 12: + case 13: this.enterOuterAlt(localctx, 4); { - this.state = 123; + this.state = 127; this.metricsCommand(); } break; - case 16: + case 17: this.enterOuterAlt(localctx, 5); { - this.state = 124; + this.state = 128; this.showCommand(); } break; - case 11: + case 12: this.enterOuterAlt(localctx, 6); { - this.state = 125; + this.state = 129; this.metaCommand(); } break; @@ -529,97 +549,104 @@ export default class esql_parser extends Parser { let localctx: ProcessingCommandContext = new ProcessingCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 141; + this.state = 146; this._errHandler.sync(this); switch (this._input.LA(1)) { case 4: this.enterOuterAlt(localctx, 1); { - this.state = 128; + this.state = 132; this.evalCommand(); } break; case 8: this.enterOuterAlt(localctx, 2); { - this.state = 129; + this.state = 133; this.inlinestatsCommand(); } break; case 10: this.enterOuterAlt(localctx, 3); { - this.state = 130; + this.state = 134; this.limitCommand(); } break; - case 9: + case 11: this.enterOuterAlt(localctx, 4); { - this.state = 131; - this.keepCommand(); + this.state = 135; + this.lookupCommand(); } break; - case 17: + case 9: this.enterOuterAlt(localctx, 5); { - this.state = 132; - this.sortCommand(); + this.state = 136; + this.keepCommand(); } break; case 18: this.enterOuterAlt(localctx, 6); { - this.state = 133; - this.statsCommand(); + this.state = 137; + this.sortCommand(); } break; case 19: this.enterOuterAlt(localctx, 7); { - this.state = 134; + this.state = 138; + this.statsCommand(); + } + break; + case 20: + this.enterOuterAlt(localctx, 8); + { + this.state = 139; this.whereCommand(); } break; case 2: - this.enterOuterAlt(localctx, 8); + this.enterOuterAlt(localctx, 9); { - this.state = 135; + this.state = 140; this.dropCommand(); } break; - case 14: - this.enterOuterAlt(localctx, 9); + case 15: + this.enterOuterAlt(localctx, 10); { - this.state = 136; + this.state = 141; this.renameCommand(); } break; case 1: - this.enterOuterAlt(localctx, 10); + this.enterOuterAlt(localctx, 11); { - this.state = 137; + this.state = 142; this.dissectCommand(); } break; case 7: - this.enterOuterAlt(localctx, 11); + this.enterOuterAlt(localctx, 12); { - this.state = 138; + this.state = 143; this.grokCommand(); } break; case 3: - this.enterOuterAlt(localctx, 12); + this.enterOuterAlt(localctx, 13); { - this.state = 139; + this.state = 144; this.enrichCommand(); } break; - case 13: - this.enterOuterAlt(localctx, 13); + case 14: + this.enterOuterAlt(localctx, 14); { - this.state = 140; + this.state = 145; this.mvExpandCommand(); } break; @@ -648,9 +675,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 143; + this.state = 148; this.match(esql_parser.WHERE); - this.state = 144; + this.state = 149; this.booleanExpression(0); } } @@ -688,7 +715,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 174; + this.state = 179; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -697,9 +724,9 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 147; + this.state = 152; this.match(esql_parser.NOT); - this.state = 148; + this.state = 153; this.booleanExpression(7); } break; @@ -708,7 +735,7 @@ export default class esql_parser extends Parser { localctx = new BooleanDefaultContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 149; + this.state = 154; this.valueExpression(); } break; @@ -717,7 +744,7 @@ export default class esql_parser extends Parser { localctx = new RegexExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 150; + this.state = 155; this.regexBooleanExpression(); } break; @@ -726,41 +753,41 @@ export default class esql_parser extends Parser { localctx = new LogicalInContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 151; + this.state = 156; this.valueExpression(); - this.state = 153; + this.state = 158; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===47) { + if (_la===48) { { - this.state = 152; + this.state = 157; this.match(esql_parser.NOT); } } - this.state = 155; + this.state = 160; this.match(esql_parser.IN); - this.state = 156; + this.state = 161; this.match(esql_parser.LP); - this.state = 157; - this.valueExpression(); this.state = 162; + this.valueExpression(); + this.state = 167; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===37) { + while (_la===38) { { { - this.state = 158; + this.state = 163; this.match(esql_parser.COMMA); - this.state = 159; + this.state = 164; this.valueExpression(); } } - this.state = 164; + this.state = 169; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 165; + this.state = 170; this.match(esql_parser.RP); } break; @@ -769,27 +796,27 @@ export default class esql_parser extends Parser { localctx = new IsNullContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 167; + this.state = 172; this.valueExpression(); - this.state = 168; + this.state = 173; this.match(esql_parser.IS); - this.state = 170; + this.state = 175; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===47) { + if (_la===48) { { - this.state = 169; + this.state = 174; this.match(esql_parser.NOT); } } - this.state = 172; + this.state = 177; this.match(esql_parser.NULL); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 184; + this.state = 189; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -799,7 +826,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 182; + this.state = 187; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -807,13 +834,13 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 176; + this.state = 181; if (!(this.precpred(this._ctx, 4))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 4)"); } - this.state = 177; + this.state = 182; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); - this.state = 178; + this.state = 183; (localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; @@ -822,20 +849,20 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 179; + this.state = 184; if (!(this.precpred(this._ctx, 3))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 3)"); } - this.state = 180; + this.state = 185; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); - this.state = 181; + this.state = 186; (localctx as LogicalBinaryContext)._right = this.booleanExpression(4); } break; } } } - this.state = 186; + this.state = 191; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); } @@ -861,48 +888,48 @@ export default class esql_parser extends Parser { this.enterRule(localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 201; + this.state = 206; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 187; + this.state = 192; this.valueExpression(); - this.state = 189; + this.state = 194; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===47) { + if (_la===48) { { - this.state = 188; + this.state = 193; this.match(esql_parser.NOT); } } - this.state = 191; + this.state = 196; localctx._kind = this.match(esql_parser.LIKE); - this.state = 192; + this.state = 197; localctx._pattern = this.string_(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 194; + this.state = 199; this.valueExpression(); - this.state = 196; + this.state = 201; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===47) { + if (_la===48) { { - this.state = 195; + this.state = 200; this.match(esql_parser.NOT); } } - this.state = 198; + this.state = 203; localctx._kind = this.match(esql_parser.RLIKE); - this.state = 199; + this.state = 204; localctx._pattern = this.string_(); } break; @@ -927,14 +954,14 @@ export default class esql_parser extends Parser { let localctx: ValueExpressionContext = new ValueExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 14, esql_parser.RULE_valueExpression); try { - this.state = 208; + this.state = 213; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: localctx = new ValueExpressionDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 203; + this.state = 208; this.operatorExpression(0); } break; @@ -942,11 +969,11 @@ export default class esql_parser extends Parser { localctx = new ComparisonContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 204; + this.state = 209; (localctx as ComparisonContext)._left = this.operatorExpression(0); - this.state = 205; + this.state = 210; this.comparisonOperator(); - this.state = 206; + this.state = 211; (localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -986,7 +1013,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 214; + this.state = 219; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -995,7 +1022,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 211; + this.state = 216; this.primaryExpression(0); } break; @@ -1004,23 +1031,23 @@ export default class esql_parser extends Parser { localctx = new ArithmeticUnaryContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 212; + this.state = 217; (localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===62 || _la===63)) { + if(!(_la===63 || _la===64)) { (localctx as ArithmeticUnaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 213; + this.state = 218; this.operatorExpression(3); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 224; + this.state = 229; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1030,7 +1057,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 222; + this.state = 227; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -1038,21 +1065,21 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 216; + this.state = 221; if (!(this.precpred(this._ctx, 2))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 2)"); } - this.state = 217; + this.state = 222; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(((((_la - 64)) & ~0x1F) === 0 && ((1 << (_la - 64)) & 7) !== 0))) { + if(!(((((_la - 65)) & ~0x1F) === 0 && ((1 << (_la - 65)) & 7) !== 0))) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 218; + this.state = 223; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -1061,28 +1088,28 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 219; + this.state = 224; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 220; + this.state = 225; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===62 || _la===63)) { + if(!(_la===63 || _la===64)) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 221; + this.state = 226; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 226; + this.state = 231; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); } @@ -1121,7 +1148,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 235; + this.state = 240; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: @@ -1130,7 +1157,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 228; + this.state = 233; this.constant(); } break; @@ -1139,7 +1166,7 @@ export default class esql_parser extends Parser { localctx = new DereferenceContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 229; + this.state = 234; this.qualifiedName(); } break; @@ -1148,7 +1175,7 @@ export default class esql_parser extends Parser { localctx = new FunctionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 230; + this.state = 235; this.functionExpression(); } break; @@ -1157,17 +1184,17 @@ export default class esql_parser extends Parser { localctx = new ParenthesizedExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 231; + this.state = 236; this.match(esql_parser.LP); - this.state = 232; + this.state = 237; this.booleanExpression(0); - this.state = 233; + this.state = 238; this.match(esql_parser.RP); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 242; + this.state = 247; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1180,18 +1207,18 @@ export default class esql_parser extends Parser { { localctx = new InlineCastContext(this, new PrimaryExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_primaryExpression); - this.state = 237; + this.state = 242; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 238; + this.state = 243; this.match(esql_parser.CAST_OP); - this.state = 239; + this.state = 244; this.dataType(); } } } - this.state = 244; + this.state = 249; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); } @@ -1219,62 +1246,62 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 245; + this.state = 250; this.identifier(); - this.state = 246; + this.state = 251; this.match(esql_parser.LP); - this.state = 256; + this.state = 261; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 64: + case 65: { - this.state = 247; + this.state = 252; this.match(esql_parser.ASTERISK); } break; - case 29: case 30: case 31: - case 40: - case 43: - case 47: + case 32: + case 41: + case 44: case 48: - case 51: - case 54: - case 62: + case 49: + case 52: + case 55: case 63: - case 67: - case 69: + case 64: + case 68: case 70: + case 71: { { - this.state = 248; - this.booleanExpression(0); this.state = 253; + this.booleanExpression(0); + this.state = 258; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===37) { + while (_la===38) { { { - this.state = 249; + this.state = 254; this.match(esql_parser.COMMA); - this.state = 250; + this.state = 255; this.booleanExpression(0); } } - this.state = 255; + this.state = 260; this._errHandler.sync(this); _la = this._input.LA(1); } } } break; - case 53: + case 54: break; default: break; } - this.state = 258; + this.state = 263; this.match(esql_parser.RP); } } @@ -1300,7 +1327,7 @@ export default class esql_parser extends Parser { localctx = new ToDataTypeContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 260; + this.state = 265; this.identifier(); } } @@ -1325,9 +1352,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 262; + this.state = 267; this.match(esql_parser.ROW); - this.state = 263; + this.state = 268; this.fields(); } } @@ -1353,23 +1380,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 265; - this.field(); this.state = 270; + this.field(); + this.state = 275; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 266; + this.state = 271; this.match(esql_parser.COMMA); - this.state = 267; + this.state = 272; this.field(); } } } - this.state = 272; + this.state = 277; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); } @@ -1394,24 +1421,24 @@ export default class esql_parser extends Parser { let localctx: FieldContext = new FieldContext(this, this._ctx, this.state); this.enterRule(localctx, 28, esql_parser.RULE_field); try { - this.state = 278; + this.state = 283; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 273; + this.state = 278; this.booleanExpression(0); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 274; + this.state = 279; this.qualifiedName(); - this.state = 275; + this.state = 280; this.match(esql_parser.ASSIGN); - this.state = 276; + this.state = 281; this.booleanExpression(0); } break; @@ -1439,34 +1466,34 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 280; + this.state = 285; this.match(esql_parser.FROM); - this.state = 281; - this.indexIdentifier(); this.state = 286; + this.indexIdentifier(); + this.state = 291; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 282; + this.state = 287; this.match(esql_parser.COMMA); - this.state = 283; + this.state = 288; this.indexIdentifier(); } } } - this.state = 288; + this.state = 293; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); } - this.state = 290; + this.state = 295; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 23, this._ctx) ) { case 1: { - this.state = 289; + this.state = 294; this.metadata(); } break; @@ -1494,7 +1521,7 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 292; + this.state = 297; this.match(esql_parser.INDEX_UNQUOTED_IDENTIFIER); } } @@ -1517,20 +1544,20 @@ export default class esql_parser extends Parser { let localctx: MetadataContext = new MetadataContext(this, this._ctx, this.state); this.enterRule(localctx, 34, esql_parser.RULE_metadata); try { - this.state = 296; + this.state = 301; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 74: + case 75: this.enterOuterAlt(localctx, 1); { - this.state = 294; + this.state = 299; this.metadataOption(); } break; - case 67: + case 68: this.enterOuterAlt(localctx, 2); { - this.state = 295; + this.state = 300; this.deprecated_metadata(); } break; @@ -1560,25 +1587,25 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 298; + this.state = 303; this.match(esql_parser.METADATA); - this.state = 299; - this.indexIdentifier(); this.state = 304; + this.indexIdentifier(); + this.state = 309; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 25, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 300; + this.state = 305; this.match(esql_parser.COMMA); - this.state = 301; + this.state = 306; this.indexIdentifier(); } } } - this.state = 306; + this.state = 311; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 25, this._ctx); } @@ -1605,11 +1632,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 307; + this.state = 312; this.match(esql_parser.OPENING_BRACKET); - this.state = 308; + this.state = 313; this.metadataOption(); - this.state = 309; + this.state = 314; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1635,46 +1662,46 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 311; + this.state = 316; this.match(esql_parser.METRICS); - this.state = 312; - this.indexIdentifier(); this.state = 317; + this.indexIdentifier(); + this.state = 322; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 313; + this.state = 318; this.match(esql_parser.COMMA); - this.state = 314; + this.state = 319; this.indexIdentifier(); } } } - this.state = 319; + this.state = 324; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); } - this.state = 321; + this.state = 326; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { case 1: { - this.state = 320; + this.state = 325; localctx._aggregates = this.fields(); } break; } - this.state = 325; + this.state = 330; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { case 1: { - this.state = 323; + this.state = 328; this.match(esql_parser.BY); - this.state = 324; + this.state = 329; localctx._grouping = this.fields(); } break; @@ -1702,9 +1729,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 327; + this.state = 332; this.match(esql_parser.EVAL); - this.state = 328; + this.state = 333; this.fields(); } } @@ -1729,26 +1756,26 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 330; + this.state = 335; this.match(esql_parser.STATS); - this.state = 332; + this.state = 337; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { case 1: { - this.state = 331; + this.state = 336; localctx._stats = this.fields(); } break; } - this.state = 336; + this.state = 341; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { case 1: { - this.state = 334; + this.state = 339; this.match(esql_parser.BY); - this.state = 335; + this.state = 340; localctx._grouping = this.fields(); } break; @@ -1776,18 +1803,18 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 338; + this.state = 343; this.match(esql_parser.INLINESTATS); - this.state = 339; + this.state = 344; localctx._stats = this.fields(); - this.state = 342; + this.state = 347; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { case 1: { - this.state = 340; + this.state = 345; this.match(esql_parser.BY); - this.state = 341; + this.state = 346; localctx._grouping = this.fields(); } break; @@ -1816,23 +1843,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 344; - this.identifier(); this.state = 349; + this.identifier(); + this.state = 354; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 345; + this.state = 350; this.match(esql_parser.DOT); - this.state = 346; + this.state = 351; this.identifier(); } } } - this.state = 351; + this.state = 356; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); } @@ -1860,23 +1887,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 352; - this.identifierPattern(); this.state = 357; + this.identifierPattern(); + this.state = 362; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 353; + this.state = 358; this.match(esql_parser.DOT); - this.state = 354; + this.state = 359; this.identifierPattern(); } } } - this.state = 359; + this.state = 364; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); } @@ -1897,16 +1924,60 @@ export default class esql_parser extends Parser { return localctx; } // @RuleVersion(0) + public qualifiedNamePatterns(): QualifiedNamePatternsContext { + let localctx: QualifiedNamePatternsContext = new QualifiedNamePatternsContext(this, this._ctx, this.state); + this.enterRule(localctx, 52, esql_parser.RULE_qualifiedNamePatterns); + try { + let _alt: number; + this.enterOuterAlt(localctx, 1); + { + this.state = 365; + this.qualifiedNamePattern(); + this.state = 370; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + { + { + this.state = 366; + this.match(esql_parser.COMMA); + this.state = 367; + this.qualifiedNamePattern(); + } + } + } + this.state = 372; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) public identifier(): IdentifierContext { let localctx: IdentifierContext = new IdentifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 52, esql_parser.RULE_identifier); + this.enterRule(localctx, 54, esql_parser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 360; + this.state = 373; _la = this._input.LA(1); - if(!(_la===69 || _la===70)) { + if(!(_la===70 || _la===71)) { this._errHandler.recoverInline(this); } else { @@ -1932,11 +2003,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public identifierPattern(): IdentifierPatternContext { let localctx: IdentifierPatternContext = new IdentifierPatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 54, esql_parser.RULE_identifierPattern); + this.enterRule(localctx, 56, esql_parser.RULE_identifierPattern); try { this.enterOuterAlt(localctx, 1); { - this.state = 362; + this.state = 375; this.match(esql_parser.ID_PATTERN); } } @@ -1957,17 +2028,17 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public constant(): ConstantContext { let localctx: ConstantContext = new ConstantContext(this, this._ctx, this.state); - this.enterRule(localctx, 56, esql_parser.RULE_constant); + this.enterRule(localctx, 58, esql_parser.RULE_constant); let _la: number; try { - this.state = 406; + this.state = 419; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 37, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 38, this._ctx) ) { case 1: localctx = new NullLiteralContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 364; + this.state = 377; this.match(esql_parser.NULL); } break; @@ -1975,9 +2046,9 @@ export default class esql_parser extends Parser { localctx = new QualifiedIntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 365; + this.state = 378; this.integerValue(); - this.state = 366; + this.state = 379; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -1985,7 +2056,7 @@ export default class esql_parser extends Parser { localctx = new DecimalLiteralContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 368; + this.state = 381; this.decimalValue(); } break; @@ -1993,7 +2064,7 @@ export default class esql_parser extends Parser { localctx = new IntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 369; + this.state = 382; this.integerValue(); } break; @@ -2001,7 +2072,7 @@ export default class esql_parser extends Parser { localctx = new BooleanLiteralContext(this, localctx); this.enterOuterAlt(localctx, 5); { - this.state = 370; + this.state = 383; this.booleanValue(); } break; @@ -2009,7 +2080,7 @@ export default class esql_parser extends Parser { localctx = new InputParamContext(this, localctx); this.enterOuterAlt(localctx, 6); { - this.state = 371; + this.state = 384; this.match(esql_parser.PARAM); } break; @@ -2017,7 +2088,7 @@ export default class esql_parser extends Parser { localctx = new StringLiteralContext(this, localctx); this.enterOuterAlt(localctx, 7); { - this.state = 372; + this.state = 385; this.string_(); } break; @@ -2025,27 +2096,27 @@ export default class esql_parser extends Parser { localctx = new NumericArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 8); { - this.state = 373; + this.state = 386; this.match(esql_parser.OPENING_BRACKET); - this.state = 374; + this.state = 387; this.numericValue(); - this.state = 379; + this.state = 392; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===37) { + while (_la===38) { { { - this.state = 375; + this.state = 388; this.match(esql_parser.COMMA); - this.state = 376; + this.state = 389; this.numericValue(); } } - this.state = 381; + this.state = 394; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 382; + this.state = 395; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2053,27 +2124,27 @@ export default class esql_parser extends Parser { localctx = new BooleanArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 9); { - this.state = 384; + this.state = 397; this.match(esql_parser.OPENING_BRACKET); - this.state = 385; + this.state = 398; this.booleanValue(); - this.state = 390; + this.state = 403; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===37) { + while (_la===38) { { { - this.state = 386; + this.state = 399; this.match(esql_parser.COMMA); - this.state = 387; + this.state = 400; this.booleanValue(); } } - this.state = 392; + this.state = 405; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 393; + this.state = 406; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2081,27 +2152,27 @@ export default class esql_parser extends Parser { localctx = new StringArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 10); { - this.state = 395; + this.state = 408; this.match(esql_parser.OPENING_BRACKET); - this.state = 396; + this.state = 409; this.string_(); - this.state = 401; + this.state = 414; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===37) { + while (_la===38) { { { - this.state = 397; + this.state = 410; this.match(esql_parser.COMMA); - this.state = 398; + this.state = 411; this.string_(); } } - this.state = 403; + this.state = 416; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 404; + this.state = 417; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2124,13 +2195,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let localctx: LimitCommandContext = new LimitCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 58, esql_parser.RULE_limitCommand); + this.enterRule(localctx, 60, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 408; + this.state = 421; this.match(esql_parser.LIMIT); - this.state = 409; + this.state = 422; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2151,32 +2222,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public sortCommand(): SortCommandContext { let localctx: SortCommandContext = new SortCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 60, esql_parser.RULE_sortCommand); + this.enterRule(localctx, 62, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 411; + this.state = 424; this.match(esql_parser.SORT); - this.state = 412; + this.state = 425; this.orderExpression(); - this.state = 417; + this.state = 430; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 39, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 413; + this.state = 426; this.match(esql_parser.COMMA); - this.state = 414; + this.state = 427; this.orderExpression(); } } } - this.state = 419; + this.state = 432; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 39, this._ctx); } } } @@ -2197,22 +2268,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let localctx: OrderExpressionContext = new OrderExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 62, esql_parser.RULE_orderExpression); + this.enterRule(localctx, 64, esql_parser.RULE_orderExpression); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 420; + this.state = 433; this.booleanExpression(0); - this.state = 422; + this.state = 435; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 39, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { - this.state = 421; + this.state = 434; localctx._ordering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===34 || _la===38)) { + if(!(_la===35 || _la===39)) { localctx._ordering = this._errHandler.recoverInline(this); } else { @@ -2222,17 +2293,17 @@ export default class esql_parser extends Parser { } break; } - this.state = 426; + this.state = 439; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 40, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 41, this._ctx) ) { case 1: { - this.state = 424; + this.state = 437; this.match(esql_parser.NULLS); - this.state = 425; + this.state = 438; localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===41 || _la===42)) { + if(!(_la===42 || _la===43)) { localctx._nullOrdering = this._errHandler.recoverInline(this); } else { @@ -2261,33 +2332,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let localctx: KeepCommandContext = new KeepCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 64, esql_parser.RULE_keepCommand); + this.enterRule(localctx, 66, esql_parser.RULE_keepCommand); try { - let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 428; + this.state = 441; this.match(esql_parser.KEEP); - this.state = 429; - this.qualifiedNamePattern(); - this.state = 434; - this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); - while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { - if (_alt === 1) { - { - { - this.state = 430; - this.match(esql_parser.COMMA); - this.state = 431; - this.qualifiedNamePattern(); - } - } - } - this.state = 436; - this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); - } + this.state = 442; + this.qualifiedNamePatterns(); } } catch (re) { @@ -2307,33 +2359,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dropCommand(): DropCommandContext { let localctx: DropCommandContext = new DropCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 66, esql_parser.RULE_dropCommand); + this.enterRule(localctx, 68, esql_parser.RULE_dropCommand); try { - let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 437; + this.state = 444; this.match(esql_parser.DROP); - this.state = 438; - this.qualifiedNamePattern(); - this.state = 443; - this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); - while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { - if (_alt === 1) { - { - { - this.state = 439; - this.match(esql_parser.COMMA); - this.state = 440; - this.qualifiedNamePattern(); - } - } - } - this.state = 445; - this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); - } + this.state = 445; + this.qualifiedNamePatterns(); } } catch (re) { @@ -2353,32 +2386,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let localctx: RenameCommandContext = new RenameCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 68, esql_parser.RULE_renameCommand); + this.enterRule(localctx, 70, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 446; - this.match(esql_parser.RENAME); this.state = 447; + this.match(esql_parser.RENAME); + this.state = 448; this.renameClause(); - this.state = 452; + this.state = 453; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 43, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 448; - this.match(esql_parser.COMMA); this.state = 449; + this.match(esql_parser.COMMA); + this.state = 450; this.renameClause(); } } } - this.state = 454; + this.state = 455; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 43, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); } } } @@ -2399,15 +2432,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameClause(): RenameClauseContext { let localctx: RenameClauseContext = new RenameClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 70, esql_parser.RULE_renameClause); + this.enterRule(localctx, 72, esql_parser.RULE_renameClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 455; - localctx._oldName = this.qualifiedNamePattern(); this.state = 456; - this.match(esql_parser.AS); + localctx._oldName = this.qualifiedNamePattern(); this.state = 457; + this.match(esql_parser.AS); + this.state = 458; localctx._newName = this.qualifiedNamePattern(); } } @@ -2428,22 +2461,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let localctx: DissectCommandContext = new DissectCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 72, esql_parser.RULE_dissectCommand); + this.enterRule(localctx, 74, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 459; - this.match(esql_parser.DISSECT); this.state = 460; - this.primaryExpression(0); + this.match(esql_parser.DISSECT); this.state = 461; + this.primaryExpression(0); + this.state = 462; this.string_(); - this.state = 463; + this.state = 464; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 44, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { - this.state = 462; + this.state = 463; this.commandOptions(); } break; @@ -2467,15 +2500,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let localctx: GrokCommandContext = new GrokCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 74, esql_parser.RULE_grokCommand); + this.enterRule(localctx, 76, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 465; - this.match(esql_parser.GROK); this.state = 466; - this.primaryExpression(0); + this.match(esql_parser.GROK); this.state = 467; + this.primaryExpression(0); + this.state = 468; this.string_(); } } @@ -2496,13 +2529,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public mvExpandCommand(): MvExpandCommandContext { let localctx: MvExpandCommandContext = new MvExpandCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 76, esql_parser.RULE_mvExpandCommand); + this.enterRule(localctx, 78, esql_parser.RULE_mvExpandCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 469; - this.match(esql_parser.MV_EXPAND); this.state = 470; + this.match(esql_parser.MV_EXPAND); + this.state = 471; this.qualifiedName(); } } @@ -2523,30 +2556,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let localctx: CommandOptionsContext = new CommandOptionsContext(this, this._ctx, this.state); - this.enterRule(localctx, 78, esql_parser.RULE_commandOptions); + this.enterRule(localctx, 80, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 472; + this.state = 473; this.commandOption(); - this.state = 477; + this.state = 478; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 473; - this.match(esql_parser.COMMA); this.state = 474; + this.match(esql_parser.COMMA); + this.state = 475; this.commandOption(); } } } - this.state = 479; + this.state = 480; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); } } } @@ -2567,15 +2600,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOption(): CommandOptionContext { let localctx: CommandOptionContext = new CommandOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 80, esql_parser.RULE_commandOption); + this.enterRule(localctx, 82, esql_parser.RULE_commandOption); try { this.enterOuterAlt(localctx, 1); { - this.state = 480; - this.identifier(); this.state = 481; - this.match(esql_parser.ASSIGN); + this.identifier(); this.state = 482; + this.match(esql_parser.ASSIGN); + this.state = 483; this.constant(); } } @@ -2596,14 +2629,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let localctx: BooleanValueContext = new BooleanValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 82, esql_parser.RULE_booleanValue); + this.enterRule(localctx, 84, esql_parser.RULE_booleanValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 484; + this.state = 485; _la = this._input.LA(1); - if(!(_la===40 || _la===54)) { + if(!(_la===41 || _la===55)) { this._errHandler.recoverInline(this); } else { @@ -2629,22 +2662,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public numericValue(): NumericValueContext { let localctx: NumericValueContext = new NumericValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 84, esql_parser.RULE_numericValue); + this.enterRule(localctx, 86, esql_parser.RULE_numericValue); try { - this.state = 488; + this.state = 489; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 45, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 486; + this.state = 487; this.decimalValue(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 487; + this.state = 488; this.integerValue(); } break; @@ -2667,19 +2700,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let localctx: DecimalValueContext = new DecimalValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 86, esql_parser.RULE_decimalValue); + this.enterRule(localctx, 88, esql_parser.RULE_decimalValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 491; + this.state = 492; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===62 || _la===63) { + if (_la===63 || _la===64) { { - this.state = 490; + this.state = 491; _la = this._input.LA(1); - if(!(_la===62 || _la===63)) { + if(!(_la===63 || _la===64)) { this._errHandler.recoverInline(this); } else { @@ -2689,7 +2722,7 @@ export default class esql_parser extends Parser { } } - this.state = 493; + this.state = 494; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2710,19 +2743,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public integerValue(): IntegerValueContext { let localctx: IntegerValueContext = new IntegerValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 88, esql_parser.RULE_integerValue); + this.enterRule(localctx, 90, esql_parser.RULE_integerValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 496; + this.state = 497; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===62 || _la===63) { + if (_la===63 || _la===64) { { - this.state = 495; + this.state = 496; _la = this._input.LA(1); - if(!(_la===62 || _la===63)) { + if(!(_la===63 || _la===64)) { this._errHandler.recoverInline(this); } else { @@ -2732,7 +2765,7 @@ export default class esql_parser extends Parser { } } - this.state = 498; + this.state = 499; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2753,11 +2786,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public string_(): StringContext { let localctx: StringContext = new StringContext(this, this._ctx, this.state); - this.enterRule(localctx, 90, esql_parser.RULE_string); + this.enterRule(localctx, 92, esql_parser.RULE_string); try { this.enterOuterAlt(localctx, 1); { - this.state = 500; + this.state = 501; this.match(esql_parser.QUOTED_STRING); } } @@ -2778,14 +2811,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this, this._ctx, this.state); - this.enterRule(localctx, 92, esql_parser.RULE_comparisonOperator); + this.enterRule(localctx, 94, esql_parser.RULE_comparisonOperator); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 502; + this.state = 503; _la = this._input.LA(1); - if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 125) !== 0))) { + if(!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 125) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -2811,13 +2844,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public explainCommand(): ExplainCommandContext { let localctx: ExplainCommandContext = new ExplainCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 94, esql_parser.RULE_explainCommand); + this.enterRule(localctx, 96, esql_parser.RULE_explainCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 504; - this.match(esql_parser.EXPLAIN); this.state = 505; + this.match(esql_parser.EXPLAIN); + this.state = 506; this.subqueryExpression(); } } @@ -2838,15 +2871,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public subqueryExpression(): SubqueryExpressionContext { let localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 96, esql_parser.RULE_subqueryExpression); + this.enterRule(localctx, 98, esql_parser.RULE_subqueryExpression); try { this.enterOuterAlt(localctx, 1); { - this.state = 507; - this.match(esql_parser.OPENING_BRACKET); this.state = 508; - this.query(0); + this.match(esql_parser.OPENING_BRACKET); this.state = 509; + this.query(0); + this.state = 510; this.match(esql_parser.CLOSING_BRACKET); } } @@ -2867,14 +2900,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public showCommand(): ShowCommandContext { let localctx: ShowCommandContext = new ShowCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 98, esql_parser.RULE_showCommand); + this.enterRule(localctx, 100, esql_parser.RULE_showCommand); try { localctx = new ShowInfoContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 511; - this.match(esql_parser.SHOW); this.state = 512; + this.match(esql_parser.SHOW); + this.state = 513; this.match(esql_parser.INFO); } } @@ -2895,14 +2928,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public metaCommand(): MetaCommandContext { let localctx: MetaCommandContext = new MetaCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 100, esql_parser.RULE_metaCommand); + this.enterRule(localctx, 102, esql_parser.RULE_metaCommand); try { localctx = new MetaFunctionsContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 514; - this.match(esql_parser.META); this.state = 515; + this.match(esql_parser.META); + this.state = 516; this.match(esql_parser.FUNCTIONS); } } @@ -2923,53 +2956,53 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public enrichCommand(): EnrichCommandContext { let localctx: EnrichCommandContext = new EnrichCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 102, esql_parser.RULE_enrichCommand); + this.enterRule(localctx, 104, esql_parser.RULE_enrichCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 517; - this.match(esql_parser.ENRICH); this.state = 518; + this.match(esql_parser.ENRICH); + this.state = 519; localctx._policyName = this.match(esql_parser.ENRICH_POLICY_NAME); - this.state = 521; + this.state = 522; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 49, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 48, this._ctx) ) { case 1: { - this.state = 519; - this.match(esql_parser.ON); this.state = 520; + this.match(esql_parser.ON); + this.state = 521; localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 532; + this.state = 533; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 51, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 50, this._ctx) ) { case 1: { - this.state = 523; - this.match(esql_parser.WITH); this.state = 524; + this.match(esql_parser.WITH); + this.state = 525; this.enrichWithClause(); - this.state = 529; + this.state = 530; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 525; - this.match(esql_parser.COMMA); this.state = 526; + this.match(esql_parser.COMMA); + this.state = 527; this.enrichWithClause(); } } } - this.state = 531; + this.state = 532; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 49, this._ctx); } } break; @@ -2993,23 +3026,23 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public enrichWithClause(): EnrichWithClauseContext { let localctx: EnrichWithClauseContext = new EnrichWithClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 104, esql_parser.RULE_enrichWithClause); + this.enterRule(localctx, 106, esql_parser.RULE_enrichWithClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 537; + this.state = 538; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 52, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 51, this._ctx) ) { case 1: { - this.state = 534; - localctx._newName = this.qualifiedNamePattern(); this.state = 535; + localctx._newName = this.qualifiedNamePattern(); + this.state = 536; this.match(esql_parser.ASSIGN); } break; } - this.state = 539; + this.state = 540; localctx._enrichField = this.qualifiedNamePattern(); } } @@ -3027,6 +3060,37 @@ export default class esql_parser extends Parser { } return localctx; } + // @RuleVersion(0) + public lookupCommand(): LookupCommandContext { + let localctx: LookupCommandContext = new LookupCommandContext(this, this._ctx, this.state); + this.enterRule(localctx, 108, esql_parser.RULE_lookupCommand); + try { + this.enterOuterAlt(localctx, 1); + { + this.state = 542; + this.match(esql_parser.LOOKUP); + this.state = 543; + localctx._tableName = this.match(esql_parser.INDEX_UNQUOTED_IDENTIFIER); + this.state = 544; + this.match(esql_parser.ON); + this.state = 545; + localctx._matchFields = this.qualifiedNamePatterns(); + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } public sempred(localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { @@ -3074,183 +3138,185 @@ export default class esql_parser extends Parser { return true; } - public static readonly _serializedATN: number[] = [4,1,116,542,2,0,7,0, + public static readonly _serializedATN: number[] = [4,1,123,548,2,0,7,0, 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, 7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7, 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, - 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,1,0, - 1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,5,1,116,8,1,10,1,12,1,119,9,1,1,2,1,2,1, - 2,1,2,1,2,1,2,3,2,127,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,1,3,3,3,142,8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,154,8,5,1, - 5,1,5,1,5,1,5,1,5,5,5,161,8,5,10,5,12,5,164,9,5,1,5,1,5,1,5,1,5,1,5,3,5, - 171,8,5,1,5,1,5,3,5,175,8,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,183,8,5,10,5,12, - 5,186,9,5,1,6,1,6,3,6,190,8,6,1,6,1,6,1,6,1,6,1,6,3,6,197,8,6,1,6,1,6,1, - 6,3,6,202,8,6,1,7,1,7,1,7,1,7,1,7,3,7,209,8,7,1,8,1,8,1,8,1,8,3,8,215,8, - 8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,223,8,8,10,8,12,8,226,9,8,1,9,1,9,1,9,1,9, - 1,9,1,9,1,9,1,9,3,9,236,8,9,1,9,1,9,1,9,5,9,241,8,9,10,9,12,9,244,9,9,1, - 10,1,10,1,10,1,10,1,10,1,10,5,10,252,8,10,10,10,12,10,255,9,10,3,10,257, - 8,10,1,10,1,10,1,11,1,11,1,12,1,12,1,12,1,13,1,13,1,13,5,13,269,8,13,10, - 13,12,13,272,9,13,1,14,1,14,1,14,1,14,1,14,3,14,279,8,14,1,15,1,15,1,15, - 1,15,5,15,285,8,15,10,15,12,15,288,9,15,1,15,3,15,291,8,15,1,16,1,16,1, - 17,1,17,3,17,297,8,17,1,18,1,18,1,18,1,18,5,18,303,8,18,10,18,12,18,306, - 9,18,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,5,20,316,8,20,10,20,12,20, - 319,9,20,1,20,3,20,322,8,20,1,20,1,20,3,20,326,8,20,1,21,1,21,1,21,1,22, - 1,22,3,22,333,8,22,1,22,1,22,3,22,337,8,22,1,23,1,23,1,23,1,23,3,23,343, - 8,23,1,24,1,24,1,24,5,24,348,8,24,10,24,12,24,351,9,24,1,25,1,25,1,25,5, - 25,356,8,25,10,25,12,25,359,9,25,1,26,1,26,1,27,1,27,1,28,1,28,1,28,1,28, - 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,378,8,28,10,28,12,28, - 381,9,28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,389,8,28,10,28,12,28,392,9, - 28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,400,8,28,10,28,12,28,403,9,28,1,28, - 1,28,3,28,407,8,28,1,29,1,29,1,29,1,30,1,30,1,30,1,30,5,30,416,8,30,10, - 30,12,30,419,9,30,1,31,1,31,3,31,423,8,31,1,31,1,31,3,31,427,8,31,1,32, - 1,32,1,32,1,32,5,32,433,8,32,10,32,12,32,436,9,32,1,33,1,33,1,33,1,33,5, - 33,442,8,33,10,33,12,33,445,9,33,1,34,1,34,1,34,1,34,5,34,451,8,34,10,34, - 12,34,454,9,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,464,8,36,1, - 37,1,37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,5,39,476,8,39,10,39,12, - 39,479,9,39,1,40,1,40,1,40,1,40,1,41,1,41,1,42,1,42,3,42,489,8,42,1,43, - 3,43,492,8,43,1,43,1,43,1,44,3,44,497,8,44,1,44,1,44,1,45,1,45,1,46,1,46, - 1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,51,1, - 51,1,51,1,51,3,51,522,8,51,1,51,1,51,1,51,1,51,5,51,528,8,51,10,51,12,51, - 531,9,51,3,51,533,8,51,1,52,1,52,1,52,3,52,538,8,52,1,52,1,52,1,52,0,4, - 2,10,16,18,53,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40, - 42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88, - 90,92,94,96,98,100,102,104,0,7,1,0,62,63,1,0,64,66,1,0,69,70,2,0,34,34, - 38,38,1,0,41,42,2,0,40,40,54,54,2,0,55,55,57,61,570,0,106,1,0,0,0,2,109, - 1,0,0,0,4,126,1,0,0,0,6,141,1,0,0,0,8,143,1,0,0,0,10,174,1,0,0,0,12,201, - 1,0,0,0,14,208,1,0,0,0,16,214,1,0,0,0,18,235,1,0,0,0,20,245,1,0,0,0,22, - 260,1,0,0,0,24,262,1,0,0,0,26,265,1,0,0,0,28,278,1,0,0,0,30,280,1,0,0,0, - 32,292,1,0,0,0,34,296,1,0,0,0,36,298,1,0,0,0,38,307,1,0,0,0,40,311,1,0, - 0,0,42,327,1,0,0,0,44,330,1,0,0,0,46,338,1,0,0,0,48,344,1,0,0,0,50,352, - 1,0,0,0,52,360,1,0,0,0,54,362,1,0,0,0,56,406,1,0,0,0,58,408,1,0,0,0,60, - 411,1,0,0,0,62,420,1,0,0,0,64,428,1,0,0,0,66,437,1,0,0,0,68,446,1,0,0,0, - 70,455,1,0,0,0,72,459,1,0,0,0,74,465,1,0,0,0,76,469,1,0,0,0,78,472,1,0, - 0,0,80,480,1,0,0,0,82,484,1,0,0,0,84,488,1,0,0,0,86,491,1,0,0,0,88,496, - 1,0,0,0,90,500,1,0,0,0,92,502,1,0,0,0,94,504,1,0,0,0,96,507,1,0,0,0,98, - 511,1,0,0,0,100,514,1,0,0,0,102,517,1,0,0,0,104,537,1,0,0,0,106,107,3,2, - 1,0,107,108,5,0,0,1,108,1,1,0,0,0,109,110,6,1,-1,0,110,111,3,4,2,0,111, - 117,1,0,0,0,112,113,10,1,0,0,113,114,5,28,0,0,114,116,3,6,3,0,115,112,1, - 0,0,0,116,119,1,0,0,0,117,115,1,0,0,0,117,118,1,0,0,0,118,3,1,0,0,0,119, - 117,1,0,0,0,120,127,3,94,47,0,121,127,3,30,15,0,122,127,3,24,12,0,123,127, - 3,40,20,0,124,127,3,98,49,0,125,127,3,100,50,0,126,120,1,0,0,0,126,121, - 1,0,0,0,126,122,1,0,0,0,126,123,1,0,0,0,126,124,1,0,0,0,126,125,1,0,0,0, - 127,5,1,0,0,0,128,142,3,42,21,0,129,142,3,46,23,0,130,142,3,58,29,0,131, - 142,3,64,32,0,132,142,3,60,30,0,133,142,3,44,22,0,134,142,3,8,4,0,135,142, - 3,66,33,0,136,142,3,68,34,0,137,142,3,72,36,0,138,142,3,74,37,0,139,142, - 3,102,51,0,140,142,3,76,38,0,141,128,1,0,0,0,141,129,1,0,0,0,141,130,1, - 0,0,0,141,131,1,0,0,0,141,132,1,0,0,0,141,133,1,0,0,0,141,134,1,0,0,0,141, - 135,1,0,0,0,141,136,1,0,0,0,141,137,1,0,0,0,141,138,1,0,0,0,141,139,1,0, - 0,0,141,140,1,0,0,0,142,7,1,0,0,0,143,144,5,19,0,0,144,145,3,10,5,0,145, - 9,1,0,0,0,146,147,6,5,-1,0,147,148,5,47,0,0,148,175,3,10,5,7,149,175,3, - 14,7,0,150,175,3,12,6,0,151,153,3,14,7,0,152,154,5,47,0,0,153,152,1,0,0, - 0,153,154,1,0,0,0,154,155,1,0,0,0,155,156,5,44,0,0,156,157,5,43,0,0,157, - 162,3,14,7,0,158,159,5,37,0,0,159,161,3,14,7,0,160,158,1,0,0,0,161,164, - 1,0,0,0,162,160,1,0,0,0,162,163,1,0,0,0,163,165,1,0,0,0,164,162,1,0,0,0, - 165,166,5,53,0,0,166,175,1,0,0,0,167,168,3,14,7,0,168,170,5,45,0,0,169, - 171,5,47,0,0,170,169,1,0,0,0,170,171,1,0,0,0,171,172,1,0,0,0,172,173,5, - 48,0,0,173,175,1,0,0,0,174,146,1,0,0,0,174,149,1,0,0,0,174,150,1,0,0,0, - 174,151,1,0,0,0,174,167,1,0,0,0,175,184,1,0,0,0,176,177,10,4,0,0,177,178, - 5,33,0,0,178,183,3,10,5,5,179,180,10,3,0,0,180,181,5,50,0,0,181,183,3,10, - 5,4,182,176,1,0,0,0,182,179,1,0,0,0,183,186,1,0,0,0,184,182,1,0,0,0,184, - 185,1,0,0,0,185,11,1,0,0,0,186,184,1,0,0,0,187,189,3,14,7,0,188,190,5,47, - 0,0,189,188,1,0,0,0,189,190,1,0,0,0,190,191,1,0,0,0,191,192,5,46,0,0,192, - 193,3,90,45,0,193,202,1,0,0,0,194,196,3,14,7,0,195,197,5,47,0,0,196,195, - 1,0,0,0,196,197,1,0,0,0,197,198,1,0,0,0,198,199,5,52,0,0,199,200,3,90,45, - 0,200,202,1,0,0,0,201,187,1,0,0,0,201,194,1,0,0,0,202,13,1,0,0,0,203,209, - 3,16,8,0,204,205,3,16,8,0,205,206,3,92,46,0,206,207,3,16,8,0,207,209,1, - 0,0,0,208,203,1,0,0,0,208,204,1,0,0,0,209,15,1,0,0,0,210,211,6,8,-1,0,211, - 215,3,18,9,0,212,213,7,0,0,0,213,215,3,16,8,3,214,210,1,0,0,0,214,212,1, - 0,0,0,215,224,1,0,0,0,216,217,10,2,0,0,217,218,7,1,0,0,218,223,3,16,8,3, - 219,220,10,1,0,0,220,221,7,0,0,0,221,223,3,16,8,2,222,216,1,0,0,0,222,219, - 1,0,0,0,223,226,1,0,0,0,224,222,1,0,0,0,224,225,1,0,0,0,225,17,1,0,0,0, - 226,224,1,0,0,0,227,228,6,9,-1,0,228,236,3,56,28,0,229,236,3,48,24,0,230, - 236,3,20,10,0,231,232,5,43,0,0,232,233,3,10,5,0,233,234,5,53,0,0,234,236, - 1,0,0,0,235,227,1,0,0,0,235,229,1,0,0,0,235,230,1,0,0,0,235,231,1,0,0,0, - 236,242,1,0,0,0,237,238,10,1,0,0,238,239,5,36,0,0,239,241,3,22,11,0,240, - 237,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,242,243,1,0,0,0,243,19,1,0, - 0,0,244,242,1,0,0,0,245,246,3,52,26,0,246,256,5,43,0,0,247,257,5,64,0,0, - 248,253,3,10,5,0,249,250,5,37,0,0,250,252,3,10,5,0,251,249,1,0,0,0,252, - 255,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0,0,254,257,1,0,0,0,255,253,1,0, - 0,0,256,247,1,0,0,0,256,248,1,0,0,0,256,257,1,0,0,0,257,258,1,0,0,0,258, - 259,5,53,0,0,259,21,1,0,0,0,260,261,3,52,26,0,261,23,1,0,0,0,262,263,5, - 15,0,0,263,264,3,26,13,0,264,25,1,0,0,0,265,270,3,28,14,0,266,267,5,37, - 0,0,267,269,3,28,14,0,268,266,1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270, - 271,1,0,0,0,271,27,1,0,0,0,272,270,1,0,0,0,273,279,3,10,5,0,274,275,3,48, - 24,0,275,276,5,35,0,0,276,277,3,10,5,0,277,279,1,0,0,0,278,273,1,0,0,0, - 278,274,1,0,0,0,279,29,1,0,0,0,280,281,5,6,0,0,281,286,3,32,16,0,282,283, - 5,37,0,0,283,285,3,32,16,0,284,282,1,0,0,0,285,288,1,0,0,0,286,284,1,0, - 0,0,286,287,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,289,291,3,34,17,0,290, - 289,1,0,0,0,290,291,1,0,0,0,291,31,1,0,0,0,292,293,5,24,0,0,293,33,1,0, - 0,0,294,297,3,36,18,0,295,297,3,38,19,0,296,294,1,0,0,0,296,295,1,0,0,0, - 297,35,1,0,0,0,298,299,5,74,0,0,299,304,3,32,16,0,300,301,5,37,0,0,301, - 303,3,32,16,0,302,300,1,0,0,0,303,306,1,0,0,0,304,302,1,0,0,0,304,305,1, - 0,0,0,305,37,1,0,0,0,306,304,1,0,0,0,307,308,5,67,0,0,308,309,3,36,18,0, - 309,310,5,68,0,0,310,39,1,0,0,0,311,312,5,12,0,0,312,317,3,32,16,0,313, - 314,5,37,0,0,314,316,3,32,16,0,315,313,1,0,0,0,316,319,1,0,0,0,317,315, - 1,0,0,0,317,318,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,320,322,3,26,13, - 0,321,320,1,0,0,0,321,322,1,0,0,0,322,325,1,0,0,0,323,324,5,32,0,0,324, - 326,3,26,13,0,325,323,1,0,0,0,325,326,1,0,0,0,326,41,1,0,0,0,327,328,5, - 4,0,0,328,329,3,26,13,0,329,43,1,0,0,0,330,332,5,18,0,0,331,333,3,26,13, - 0,332,331,1,0,0,0,332,333,1,0,0,0,333,336,1,0,0,0,334,335,5,32,0,0,335, - 337,3,26,13,0,336,334,1,0,0,0,336,337,1,0,0,0,337,45,1,0,0,0,338,339,5, - 8,0,0,339,342,3,26,13,0,340,341,5,32,0,0,341,343,3,26,13,0,342,340,1,0, - 0,0,342,343,1,0,0,0,343,47,1,0,0,0,344,349,3,52,26,0,345,346,5,39,0,0,346, - 348,3,52,26,0,347,345,1,0,0,0,348,351,1,0,0,0,349,347,1,0,0,0,349,350,1, - 0,0,0,350,49,1,0,0,0,351,349,1,0,0,0,352,357,3,54,27,0,353,354,5,39,0,0, - 354,356,3,54,27,0,355,353,1,0,0,0,356,359,1,0,0,0,357,355,1,0,0,0,357,358, - 1,0,0,0,358,51,1,0,0,0,359,357,1,0,0,0,360,361,7,2,0,0,361,53,1,0,0,0,362, - 363,5,78,0,0,363,55,1,0,0,0,364,407,5,48,0,0,365,366,3,88,44,0,366,367, - 5,69,0,0,367,407,1,0,0,0,368,407,3,86,43,0,369,407,3,88,44,0,370,407,3, - 82,41,0,371,407,5,51,0,0,372,407,3,90,45,0,373,374,5,67,0,0,374,379,3,84, - 42,0,375,376,5,37,0,0,376,378,3,84,42,0,377,375,1,0,0,0,378,381,1,0,0,0, - 379,377,1,0,0,0,379,380,1,0,0,0,380,382,1,0,0,0,381,379,1,0,0,0,382,383, - 5,68,0,0,383,407,1,0,0,0,384,385,5,67,0,0,385,390,3,82,41,0,386,387,5,37, - 0,0,387,389,3,82,41,0,388,386,1,0,0,0,389,392,1,0,0,0,390,388,1,0,0,0,390, - 391,1,0,0,0,391,393,1,0,0,0,392,390,1,0,0,0,393,394,5,68,0,0,394,407,1, - 0,0,0,395,396,5,67,0,0,396,401,3,90,45,0,397,398,5,37,0,0,398,400,3,90, - 45,0,399,397,1,0,0,0,400,403,1,0,0,0,401,399,1,0,0,0,401,402,1,0,0,0,402, - 404,1,0,0,0,403,401,1,0,0,0,404,405,5,68,0,0,405,407,1,0,0,0,406,364,1, - 0,0,0,406,365,1,0,0,0,406,368,1,0,0,0,406,369,1,0,0,0,406,370,1,0,0,0,406, - 371,1,0,0,0,406,372,1,0,0,0,406,373,1,0,0,0,406,384,1,0,0,0,406,395,1,0, - 0,0,407,57,1,0,0,0,408,409,5,10,0,0,409,410,5,30,0,0,410,59,1,0,0,0,411, - 412,5,17,0,0,412,417,3,62,31,0,413,414,5,37,0,0,414,416,3,62,31,0,415,413, - 1,0,0,0,416,419,1,0,0,0,417,415,1,0,0,0,417,418,1,0,0,0,418,61,1,0,0,0, - 419,417,1,0,0,0,420,422,3,10,5,0,421,423,7,3,0,0,422,421,1,0,0,0,422,423, - 1,0,0,0,423,426,1,0,0,0,424,425,5,49,0,0,425,427,7,4,0,0,426,424,1,0,0, - 0,426,427,1,0,0,0,427,63,1,0,0,0,428,429,5,9,0,0,429,434,3,50,25,0,430, - 431,5,37,0,0,431,433,3,50,25,0,432,430,1,0,0,0,433,436,1,0,0,0,434,432, - 1,0,0,0,434,435,1,0,0,0,435,65,1,0,0,0,436,434,1,0,0,0,437,438,5,2,0,0, - 438,443,3,50,25,0,439,440,5,37,0,0,440,442,3,50,25,0,441,439,1,0,0,0,442, - 445,1,0,0,0,443,441,1,0,0,0,443,444,1,0,0,0,444,67,1,0,0,0,445,443,1,0, - 0,0,446,447,5,14,0,0,447,452,3,70,35,0,448,449,5,37,0,0,449,451,3,70,35, - 0,450,448,1,0,0,0,451,454,1,0,0,0,452,450,1,0,0,0,452,453,1,0,0,0,453,69, - 1,0,0,0,454,452,1,0,0,0,455,456,3,50,25,0,456,457,5,82,0,0,457,458,3,50, - 25,0,458,71,1,0,0,0,459,460,5,1,0,0,460,461,3,18,9,0,461,463,3,90,45,0, - 462,464,3,78,39,0,463,462,1,0,0,0,463,464,1,0,0,0,464,73,1,0,0,0,465,466, - 5,7,0,0,466,467,3,18,9,0,467,468,3,90,45,0,468,75,1,0,0,0,469,470,5,13, - 0,0,470,471,3,48,24,0,471,77,1,0,0,0,472,477,3,80,40,0,473,474,5,37,0,0, - 474,476,3,80,40,0,475,473,1,0,0,0,476,479,1,0,0,0,477,475,1,0,0,0,477,478, - 1,0,0,0,478,79,1,0,0,0,479,477,1,0,0,0,480,481,3,52,26,0,481,482,5,35,0, - 0,482,483,3,56,28,0,483,81,1,0,0,0,484,485,7,5,0,0,485,83,1,0,0,0,486,489, - 3,86,43,0,487,489,3,88,44,0,488,486,1,0,0,0,488,487,1,0,0,0,489,85,1,0, - 0,0,490,492,7,0,0,0,491,490,1,0,0,0,491,492,1,0,0,0,492,493,1,0,0,0,493, - 494,5,31,0,0,494,87,1,0,0,0,495,497,7,0,0,0,496,495,1,0,0,0,496,497,1,0, - 0,0,497,498,1,0,0,0,498,499,5,30,0,0,499,89,1,0,0,0,500,501,5,29,0,0,501, - 91,1,0,0,0,502,503,7,6,0,0,503,93,1,0,0,0,504,505,5,5,0,0,505,506,3,96, - 48,0,506,95,1,0,0,0,507,508,5,67,0,0,508,509,3,2,1,0,509,510,5,68,0,0,510, - 97,1,0,0,0,511,512,5,16,0,0,512,513,5,98,0,0,513,99,1,0,0,0,514,515,5,11, - 0,0,515,516,5,102,0,0,516,101,1,0,0,0,517,518,5,3,0,0,518,521,5,88,0,0, - 519,520,5,86,0,0,520,522,3,50,25,0,521,519,1,0,0,0,521,522,1,0,0,0,522, - 532,1,0,0,0,523,524,5,87,0,0,524,529,3,104,52,0,525,526,5,37,0,0,526,528, - 3,104,52,0,527,525,1,0,0,0,528,531,1,0,0,0,529,527,1,0,0,0,529,530,1,0, - 0,0,530,533,1,0,0,0,531,529,1,0,0,0,532,523,1,0,0,0,532,533,1,0,0,0,533, - 103,1,0,0,0,534,535,3,50,25,0,535,536,5,35,0,0,536,538,1,0,0,0,537,534, - 1,0,0,0,537,538,1,0,0,0,538,539,1,0,0,0,539,540,3,50,25,0,540,105,1,0,0, - 0,53,117,126,141,153,162,170,174,182,184,189,196,201,208,214,222,224,235, - 242,253,256,270,278,286,290,296,304,317,321,325,332,336,342,349,357,379, - 390,401,406,417,422,426,434,443,452,463,477,488,491,496,521,529,532,537]; + 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53, + 7,53,2,54,7,54,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,5,1,120,8,1,10,1,12, + 1,123,9,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,131,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,147,8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1, + 5,1,5,1,5,3,5,159,8,5,1,5,1,5,1,5,1,5,1,5,5,5,166,8,5,10,5,12,5,169,9,5, + 1,5,1,5,1,5,1,5,1,5,3,5,176,8,5,1,5,1,5,3,5,180,8,5,1,5,1,5,1,5,1,5,1,5, + 1,5,5,5,188,8,5,10,5,12,5,191,9,5,1,6,1,6,3,6,195,8,6,1,6,1,6,1,6,1,6,1, + 6,3,6,202,8,6,1,6,1,6,1,6,3,6,207,8,6,1,7,1,7,1,7,1,7,1,7,3,7,214,8,7,1, + 8,1,8,1,8,1,8,3,8,220,8,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,228,8,8,10,8,12,8, + 231,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,241,8,9,1,9,1,9,1,9,5,9,246, + 8,9,10,9,12,9,249,9,9,1,10,1,10,1,10,1,10,1,10,1,10,5,10,257,8,10,10,10, + 12,10,260,9,10,3,10,262,8,10,1,10,1,10,1,11,1,11,1,12,1,12,1,12,1,13,1, + 13,1,13,5,13,274,8,13,10,13,12,13,277,9,13,1,14,1,14,1,14,1,14,1,14,3,14, + 284,8,14,1,15,1,15,1,15,1,15,5,15,290,8,15,10,15,12,15,293,9,15,1,15,3, + 15,296,8,15,1,16,1,16,1,17,1,17,3,17,302,8,17,1,18,1,18,1,18,1,18,5,18, + 308,8,18,10,18,12,18,311,9,18,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,5, + 20,321,8,20,10,20,12,20,324,9,20,1,20,3,20,327,8,20,1,20,1,20,3,20,331, + 8,20,1,21,1,21,1,21,1,22,1,22,3,22,338,8,22,1,22,1,22,3,22,342,8,22,1,23, + 1,23,1,23,1,23,3,23,348,8,23,1,24,1,24,1,24,5,24,353,8,24,10,24,12,24,356, + 9,24,1,25,1,25,1,25,5,25,361,8,25,10,25,12,25,364,9,25,1,26,1,26,1,26,5, + 26,369,8,26,10,26,12,26,372,9,26,1,27,1,27,1,28,1,28,1,29,1,29,1,29,1,29, + 1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,391,8,29,10,29,12,29, + 394,9,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,402,8,29,10,29,12,29,405,9, + 29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,413,8,29,10,29,12,29,416,9,29,1,29, + 1,29,3,29,420,8,29,1,30,1,30,1,30,1,31,1,31,1,31,1,31,5,31,429,8,31,10, + 31,12,31,432,9,31,1,32,1,32,3,32,436,8,32,1,32,1,32,3,32,440,8,32,1,33, + 1,33,1,33,1,34,1,34,1,34,1,35,1,35,1,35,1,35,5,35,452,8,35,10,35,12,35, + 455,9,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,3,37,465,8,37,1,38,1,38, + 1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,40,5,40,477,8,40,10,40,12,40,480,9, + 40,1,41,1,41,1,41,1,41,1,42,1,42,1,43,1,43,3,43,490,8,43,1,44,3,44,493, + 8,44,1,44,1,44,1,45,3,45,498,8,45,1,45,1,45,1,46,1,46,1,47,1,47,1,48,1, + 48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,51,1,51,1,51,1,52,1,52,1,52, + 1,52,3,52,523,8,52,1,52,1,52,1,52,1,52,5,52,529,8,52,10,52,12,52,532,9, + 52,3,52,534,8,52,1,53,1,53,1,53,3,53,539,8,53,1,53,1,53,1,54,1,54,1,54, + 1,54,1,54,1,54,0,4,2,10,16,18,55,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28, + 30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76, + 78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,0,7,1,0,63,64,1,0, + 65,67,1,0,70,71,2,0,35,35,39,39,1,0,42,43,2,0,41,41,55,55,2,0,56,56,58, + 62,574,0,110,1,0,0,0,2,113,1,0,0,0,4,130,1,0,0,0,6,146,1,0,0,0,8,148,1, + 0,0,0,10,179,1,0,0,0,12,206,1,0,0,0,14,213,1,0,0,0,16,219,1,0,0,0,18,240, + 1,0,0,0,20,250,1,0,0,0,22,265,1,0,0,0,24,267,1,0,0,0,26,270,1,0,0,0,28, + 283,1,0,0,0,30,285,1,0,0,0,32,297,1,0,0,0,34,301,1,0,0,0,36,303,1,0,0,0, + 38,312,1,0,0,0,40,316,1,0,0,0,42,332,1,0,0,0,44,335,1,0,0,0,46,343,1,0, + 0,0,48,349,1,0,0,0,50,357,1,0,0,0,52,365,1,0,0,0,54,373,1,0,0,0,56,375, + 1,0,0,0,58,419,1,0,0,0,60,421,1,0,0,0,62,424,1,0,0,0,64,433,1,0,0,0,66, + 441,1,0,0,0,68,444,1,0,0,0,70,447,1,0,0,0,72,456,1,0,0,0,74,460,1,0,0,0, + 76,466,1,0,0,0,78,470,1,0,0,0,80,473,1,0,0,0,82,481,1,0,0,0,84,485,1,0, + 0,0,86,489,1,0,0,0,88,492,1,0,0,0,90,497,1,0,0,0,92,501,1,0,0,0,94,503, + 1,0,0,0,96,505,1,0,0,0,98,508,1,0,0,0,100,512,1,0,0,0,102,515,1,0,0,0,104, + 518,1,0,0,0,106,538,1,0,0,0,108,542,1,0,0,0,110,111,3,2,1,0,111,112,5,0, + 0,1,112,1,1,0,0,0,113,114,6,1,-1,0,114,115,3,4,2,0,115,121,1,0,0,0,116, + 117,10,1,0,0,117,118,5,29,0,0,118,120,3,6,3,0,119,116,1,0,0,0,120,123,1, + 0,0,0,121,119,1,0,0,0,121,122,1,0,0,0,122,3,1,0,0,0,123,121,1,0,0,0,124, + 131,3,96,48,0,125,131,3,30,15,0,126,131,3,24,12,0,127,131,3,40,20,0,128, + 131,3,100,50,0,129,131,3,102,51,0,130,124,1,0,0,0,130,125,1,0,0,0,130,126, + 1,0,0,0,130,127,1,0,0,0,130,128,1,0,0,0,130,129,1,0,0,0,131,5,1,0,0,0,132, + 147,3,42,21,0,133,147,3,46,23,0,134,147,3,60,30,0,135,147,3,108,54,0,136, + 147,3,66,33,0,137,147,3,62,31,0,138,147,3,44,22,0,139,147,3,8,4,0,140,147, + 3,68,34,0,141,147,3,70,35,0,142,147,3,74,37,0,143,147,3,76,38,0,144,147, + 3,104,52,0,145,147,3,78,39,0,146,132,1,0,0,0,146,133,1,0,0,0,146,134,1, + 0,0,0,146,135,1,0,0,0,146,136,1,0,0,0,146,137,1,0,0,0,146,138,1,0,0,0,146, + 139,1,0,0,0,146,140,1,0,0,0,146,141,1,0,0,0,146,142,1,0,0,0,146,143,1,0, + 0,0,146,144,1,0,0,0,146,145,1,0,0,0,147,7,1,0,0,0,148,149,5,20,0,0,149, + 150,3,10,5,0,150,9,1,0,0,0,151,152,6,5,-1,0,152,153,5,48,0,0,153,180,3, + 10,5,7,154,180,3,14,7,0,155,180,3,12,6,0,156,158,3,14,7,0,157,159,5,48, + 0,0,158,157,1,0,0,0,158,159,1,0,0,0,159,160,1,0,0,0,160,161,5,45,0,0,161, + 162,5,44,0,0,162,167,3,14,7,0,163,164,5,38,0,0,164,166,3,14,7,0,165,163, + 1,0,0,0,166,169,1,0,0,0,167,165,1,0,0,0,167,168,1,0,0,0,168,170,1,0,0,0, + 169,167,1,0,0,0,170,171,5,54,0,0,171,180,1,0,0,0,172,173,3,14,7,0,173,175, + 5,46,0,0,174,176,5,48,0,0,175,174,1,0,0,0,175,176,1,0,0,0,176,177,1,0,0, + 0,177,178,5,49,0,0,178,180,1,0,0,0,179,151,1,0,0,0,179,154,1,0,0,0,179, + 155,1,0,0,0,179,156,1,0,0,0,179,172,1,0,0,0,180,189,1,0,0,0,181,182,10, + 4,0,0,182,183,5,34,0,0,183,188,3,10,5,5,184,185,10,3,0,0,185,186,5,51,0, + 0,186,188,3,10,5,4,187,181,1,0,0,0,187,184,1,0,0,0,188,191,1,0,0,0,189, + 187,1,0,0,0,189,190,1,0,0,0,190,11,1,0,0,0,191,189,1,0,0,0,192,194,3,14, + 7,0,193,195,5,48,0,0,194,193,1,0,0,0,194,195,1,0,0,0,195,196,1,0,0,0,196, + 197,5,47,0,0,197,198,3,92,46,0,198,207,1,0,0,0,199,201,3,14,7,0,200,202, + 5,48,0,0,201,200,1,0,0,0,201,202,1,0,0,0,202,203,1,0,0,0,203,204,5,53,0, + 0,204,205,3,92,46,0,205,207,1,0,0,0,206,192,1,0,0,0,206,199,1,0,0,0,207, + 13,1,0,0,0,208,214,3,16,8,0,209,210,3,16,8,0,210,211,3,94,47,0,211,212, + 3,16,8,0,212,214,1,0,0,0,213,208,1,0,0,0,213,209,1,0,0,0,214,15,1,0,0,0, + 215,216,6,8,-1,0,216,220,3,18,9,0,217,218,7,0,0,0,218,220,3,16,8,3,219, + 215,1,0,0,0,219,217,1,0,0,0,220,229,1,0,0,0,221,222,10,2,0,0,222,223,7, + 1,0,0,223,228,3,16,8,3,224,225,10,1,0,0,225,226,7,0,0,0,226,228,3,16,8, + 2,227,221,1,0,0,0,227,224,1,0,0,0,228,231,1,0,0,0,229,227,1,0,0,0,229,230, + 1,0,0,0,230,17,1,0,0,0,231,229,1,0,0,0,232,233,6,9,-1,0,233,241,3,58,29, + 0,234,241,3,48,24,0,235,241,3,20,10,0,236,237,5,44,0,0,237,238,3,10,5,0, + 238,239,5,54,0,0,239,241,1,0,0,0,240,232,1,0,0,0,240,234,1,0,0,0,240,235, + 1,0,0,0,240,236,1,0,0,0,241,247,1,0,0,0,242,243,10,1,0,0,243,244,5,37,0, + 0,244,246,3,22,11,0,245,242,1,0,0,0,246,249,1,0,0,0,247,245,1,0,0,0,247, + 248,1,0,0,0,248,19,1,0,0,0,249,247,1,0,0,0,250,251,3,54,27,0,251,261,5, + 44,0,0,252,262,5,65,0,0,253,258,3,10,5,0,254,255,5,38,0,0,255,257,3,10, + 5,0,256,254,1,0,0,0,257,260,1,0,0,0,258,256,1,0,0,0,258,259,1,0,0,0,259, + 262,1,0,0,0,260,258,1,0,0,0,261,252,1,0,0,0,261,253,1,0,0,0,261,262,1,0, + 0,0,262,263,1,0,0,0,263,264,5,54,0,0,264,21,1,0,0,0,265,266,3,54,27,0,266, + 23,1,0,0,0,267,268,5,16,0,0,268,269,3,26,13,0,269,25,1,0,0,0,270,275,3, + 28,14,0,271,272,5,38,0,0,272,274,3,28,14,0,273,271,1,0,0,0,274,277,1,0, + 0,0,275,273,1,0,0,0,275,276,1,0,0,0,276,27,1,0,0,0,277,275,1,0,0,0,278, + 284,3,10,5,0,279,280,3,48,24,0,280,281,5,36,0,0,281,282,3,10,5,0,282,284, + 1,0,0,0,283,278,1,0,0,0,283,279,1,0,0,0,284,29,1,0,0,0,285,286,5,6,0,0, + 286,291,3,32,16,0,287,288,5,38,0,0,288,290,3,32,16,0,289,287,1,0,0,0,290, + 293,1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,295,1,0,0,0,293,291,1,0, + 0,0,294,296,3,34,17,0,295,294,1,0,0,0,295,296,1,0,0,0,296,31,1,0,0,0,297, + 298,5,25,0,0,298,33,1,0,0,0,299,302,3,36,18,0,300,302,3,38,19,0,301,299, + 1,0,0,0,301,300,1,0,0,0,302,35,1,0,0,0,303,304,5,75,0,0,304,309,3,32,16, + 0,305,306,5,38,0,0,306,308,3,32,16,0,307,305,1,0,0,0,308,311,1,0,0,0,309, + 307,1,0,0,0,309,310,1,0,0,0,310,37,1,0,0,0,311,309,1,0,0,0,312,313,5,68, + 0,0,313,314,3,36,18,0,314,315,5,69,0,0,315,39,1,0,0,0,316,317,5,13,0,0, + 317,322,3,32,16,0,318,319,5,38,0,0,319,321,3,32,16,0,320,318,1,0,0,0,321, + 324,1,0,0,0,322,320,1,0,0,0,322,323,1,0,0,0,323,326,1,0,0,0,324,322,1,0, + 0,0,325,327,3,26,13,0,326,325,1,0,0,0,326,327,1,0,0,0,327,330,1,0,0,0,328, + 329,5,33,0,0,329,331,3,26,13,0,330,328,1,0,0,0,330,331,1,0,0,0,331,41,1, + 0,0,0,332,333,5,4,0,0,333,334,3,26,13,0,334,43,1,0,0,0,335,337,5,19,0,0, + 336,338,3,26,13,0,337,336,1,0,0,0,337,338,1,0,0,0,338,341,1,0,0,0,339,340, + 5,33,0,0,340,342,3,26,13,0,341,339,1,0,0,0,341,342,1,0,0,0,342,45,1,0,0, + 0,343,344,5,8,0,0,344,347,3,26,13,0,345,346,5,33,0,0,346,348,3,26,13,0, + 347,345,1,0,0,0,347,348,1,0,0,0,348,47,1,0,0,0,349,354,3,54,27,0,350,351, + 5,40,0,0,351,353,3,54,27,0,352,350,1,0,0,0,353,356,1,0,0,0,354,352,1,0, + 0,0,354,355,1,0,0,0,355,49,1,0,0,0,356,354,1,0,0,0,357,362,3,56,28,0,358, + 359,5,40,0,0,359,361,3,56,28,0,360,358,1,0,0,0,361,364,1,0,0,0,362,360, + 1,0,0,0,362,363,1,0,0,0,363,51,1,0,0,0,364,362,1,0,0,0,365,370,3,50,25, + 0,366,367,5,38,0,0,367,369,3,50,25,0,368,366,1,0,0,0,369,372,1,0,0,0,370, + 368,1,0,0,0,370,371,1,0,0,0,371,53,1,0,0,0,372,370,1,0,0,0,373,374,7,2, + 0,0,374,55,1,0,0,0,375,376,5,79,0,0,376,57,1,0,0,0,377,420,5,49,0,0,378, + 379,3,90,45,0,379,380,5,70,0,0,380,420,1,0,0,0,381,420,3,88,44,0,382,420, + 3,90,45,0,383,420,3,84,42,0,384,420,5,52,0,0,385,420,3,92,46,0,386,387, + 5,68,0,0,387,392,3,86,43,0,388,389,5,38,0,0,389,391,3,86,43,0,390,388,1, + 0,0,0,391,394,1,0,0,0,392,390,1,0,0,0,392,393,1,0,0,0,393,395,1,0,0,0,394, + 392,1,0,0,0,395,396,5,69,0,0,396,420,1,0,0,0,397,398,5,68,0,0,398,403,3, + 84,42,0,399,400,5,38,0,0,400,402,3,84,42,0,401,399,1,0,0,0,402,405,1,0, + 0,0,403,401,1,0,0,0,403,404,1,0,0,0,404,406,1,0,0,0,405,403,1,0,0,0,406, + 407,5,69,0,0,407,420,1,0,0,0,408,409,5,68,0,0,409,414,3,92,46,0,410,411, + 5,38,0,0,411,413,3,92,46,0,412,410,1,0,0,0,413,416,1,0,0,0,414,412,1,0, + 0,0,414,415,1,0,0,0,415,417,1,0,0,0,416,414,1,0,0,0,417,418,5,69,0,0,418, + 420,1,0,0,0,419,377,1,0,0,0,419,378,1,0,0,0,419,381,1,0,0,0,419,382,1,0, + 0,0,419,383,1,0,0,0,419,384,1,0,0,0,419,385,1,0,0,0,419,386,1,0,0,0,419, + 397,1,0,0,0,419,408,1,0,0,0,420,59,1,0,0,0,421,422,5,10,0,0,422,423,5,31, + 0,0,423,61,1,0,0,0,424,425,5,18,0,0,425,430,3,64,32,0,426,427,5,38,0,0, + 427,429,3,64,32,0,428,426,1,0,0,0,429,432,1,0,0,0,430,428,1,0,0,0,430,431, + 1,0,0,0,431,63,1,0,0,0,432,430,1,0,0,0,433,435,3,10,5,0,434,436,7,3,0,0, + 435,434,1,0,0,0,435,436,1,0,0,0,436,439,1,0,0,0,437,438,5,50,0,0,438,440, + 7,4,0,0,439,437,1,0,0,0,439,440,1,0,0,0,440,65,1,0,0,0,441,442,5,9,0,0, + 442,443,3,52,26,0,443,67,1,0,0,0,444,445,5,2,0,0,445,446,3,52,26,0,446, + 69,1,0,0,0,447,448,5,15,0,0,448,453,3,72,36,0,449,450,5,38,0,0,450,452, + 3,72,36,0,451,449,1,0,0,0,452,455,1,0,0,0,453,451,1,0,0,0,453,454,1,0,0, + 0,454,71,1,0,0,0,455,453,1,0,0,0,456,457,3,50,25,0,457,458,5,83,0,0,458, + 459,3,50,25,0,459,73,1,0,0,0,460,461,5,1,0,0,461,462,3,18,9,0,462,464,3, + 92,46,0,463,465,3,80,40,0,464,463,1,0,0,0,464,465,1,0,0,0,465,75,1,0,0, + 0,466,467,5,7,0,0,467,468,3,18,9,0,468,469,3,92,46,0,469,77,1,0,0,0,470, + 471,5,14,0,0,471,472,3,48,24,0,472,79,1,0,0,0,473,478,3,82,41,0,474,475, + 5,38,0,0,475,477,3,82,41,0,476,474,1,0,0,0,477,480,1,0,0,0,478,476,1,0, + 0,0,478,479,1,0,0,0,479,81,1,0,0,0,480,478,1,0,0,0,481,482,3,54,27,0,482, + 483,5,36,0,0,483,484,3,58,29,0,484,83,1,0,0,0,485,486,7,5,0,0,486,85,1, + 0,0,0,487,490,3,88,44,0,488,490,3,90,45,0,489,487,1,0,0,0,489,488,1,0,0, + 0,490,87,1,0,0,0,491,493,7,0,0,0,492,491,1,0,0,0,492,493,1,0,0,0,493,494, + 1,0,0,0,494,495,5,32,0,0,495,89,1,0,0,0,496,498,7,0,0,0,497,496,1,0,0,0, + 497,498,1,0,0,0,498,499,1,0,0,0,499,500,5,31,0,0,500,91,1,0,0,0,501,502, + 5,30,0,0,502,93,1,0,0,0,503,504,7,6,0,0,504,95,1,0,0,0,505,506,5,5,0,0, + 506,507,3,98,49,0,507,97,1,0,0,0,508,509,5,68,0,0,509,510,3,2,1,0,510,511, + 5,69,0,0,511,99,1,0,0,0,512,513,5,17,0,0,513,514,5,105,0,0,514,101,1,0, + 0,0,515,516,5,12,0,0,516,517,5,109,0,0,517,103,1,0,0,0,518,519,5,3,0,0, + 519,522,5,89,0,0,520,521,5,87,0,0,521,523,3,50,25,0,522,520,1,0,0,0,522, + 523,1,0,0,0,523,533,1,0,0,0,524,525,5,88,0,0,525,530,3,106,53,0,526,527, + 5,38,0,0,527,529,3,106,53,0,528,526,1,0,0,0,529,532,1,0,0,0,530,528,1,0, + 0,0,530,531,1,0,0,0,531,534,1,0,0,0,532,530,1,0,0,0,533,524,1,0,0,0,533, + 534,1,0,0,0,534,105,1,0,0,0,535,536,3,50,25,0,536,537,5,36,0,0,537,539, + 1,0,0,0,538,535,1,0,0,0,538,539,1,0,0,0,539,540,1,0,0,0,540,541,3,50,25, + 0,541,107,1,0,0,0,542,543,5,11,0,0,543,544,5,25,0,0,544,545,5,87,0,0,545, + 546,3,52,26,0,546,109,1,0,0,0,52,121,130,146,158,167,175,179,187,189,194, + 201,206,213,219,227,229,240,247,258,261,275,283,291,295,301,309,322,326, + 330,337,341,347,354,362,370,392,403,414,419,430,435,439,453,464,478,489, + 492,497,522,530,533,538]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -3404,6 +3470,9 @@ export class ProcessingCommandContext extends ParserRuleContext { public limitCommand(): LimitCommandContext { return this.getTypedRuleContext(LimitCommandContext, 0) as LimitCommandContext; } + public lookupCommand(): LookupCommandContext { + return this.getTypedRuleContext(LookupCommandContext, 0) as LookupCommandContext; + } public keepCommand(): KeepCommandContext { return this.getTypedRuleContext(KeepCommandContext, 0) as KeepCommandContext; } @@ -4502,6 +4571,39 @@ export class QualifiedNamePatternContext extends ParserRuleContext { } +export class QualifiedNamePatternsContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public qualifiedNamePattern_list(): QualifiedNamePatternContext[] { + return this.getTypedRuleContexts(QualifiedNamePatternContext) as QualifiedNamePatternContext[]; + } + public qualifiedNamePattern(i: number): QualifiedNamePatternContext { + return this.getTypedRuleContext(QualifiedNamePatternContext, i) as QualifiedNamePatternContext; + } + public COMMA_list(): TerminalNode[] { + return this.getTokens(esql_parser.COMMA); + } + public COMMA(i: number): TerminalNode { + return this.getToken(esql_parser.COMMA, i); + } + public get ruleIndex(): number { + return esql_parser.RULE_qualifiedNamePatterns; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterQualifiedNamePatterns) { + listener.enterQualifiedNamePatterns(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitQualifiedNamePatterns) { + listener.exitQualifiedNamePatterns(this); + } + } +} + + export class IdentifierContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -4917,17 +5019,8 @@ export class KeepCommandContext extends ParserRuleContext { public KEEP(): TerminalNode { return this.getToken(esql_parser.KEEP, 0); } - public qualifiedNamePattern_list(): QualifiedNamePatternContext[] { - return this.getTypedRuleContexts(QualifiedNamePatternContext) as QualifiedNamePatternContext[]; - } - public qualifiedNamePattern(i: number): QualifiedNamePatternContext { - return this.getTypedRuleContext(QualifiedNamePatternContext, i) as QualifiedNamePatternContext; - } - public COMMA_list(): TerminalNode[] { - return this.getTokens(esql_parser.COMMA); - } - public COMMA(i: number): TerminalNode { - return this.getToken(esql_parser.COMMA, i); + public qualifiedNamePatterns(): QualifiedNamePatternsContext { + return this.getTypedRuleContext(QualifiedNamePatternsContext, 0) as QualifiedNamePatternsContext; } public get ruleIndex(): number { return esql_parser.RULE_keepCommand; @@ -4953,17 +5046,8 @@ export class DropCommandContext extends ParserRuleContext { public DROP(): TerminalNode { return this.getToken(esql_parser.DROP, 0); } - public qualifiedNamePattern_list(): QualifiedNamePatternContext[] { - return this.getTypedRuleContexts(QualifiedNamePatternContext) as QualifiedNamePatternContext[]; - } - public qualifiedNamePattern(i: number): QualifiedNamePatternContext { - return this.getTypedRuleContext(QualifiedNamePatternContext, i) as QualifiedNamePatternContext; - } - public COMMA_list(): TerminalNode[] { - return this.getTokens(esql_parser.COMMA); - } - public COMMA(i: number): TerminalNode { - return this.getToken(esql_parser.COMMA, i); + public qualifiedNamePatterns(): QualifiedNamePatternsContext { + return this.getTypedRuleContext(QualifiedNamePatternsContext, 0) as QualifiedNamePatternsContext; } public get ruleIndex(): number { return esql_parser.RULE_dropCommand; @@ -5588,3 +5672,38 @@ export class EnrichWithClauseContext extends ParserRuleContext { } } } + + +export class LookupCommandContext extends ParserRuleContext { + public _tableName!: Token; + public _matchFields!: QualifiedNamePatternsContext; + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public LOOKUP(): TerminalNode { + return this.getToken(esql_parser.LOOKUP, 0); + } + public ON(): TerminalNode { + return this.getToken(esql_parser.ON, 0); + } + public INDEX_UNQUOTED_IDENTIFIER(): TerminalNode { + return this.getToken(esql_parser.INDEX_UNQUOTED_IDENTIFIER, 0); + } + public qualifiedNamePatterns(): QualifiedNamePatternsContext { + return this.getTypedRuleContext(QualifiedNamePatternsContext, 0) as QualifiedNamePatternsContext; + } + public get ruleIndex(): number { + return esql_parser.RULE_lookupCommand; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterLookupCommand) { + listener.enterLookupCommand(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitLookupCommand) { + listener.exitLookupCommand(this); + } + } +} diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts index 47dad0671ae79..3b98e746de9b3 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts @@ -43,6 +43,7 @@ import { StatsCommandContext } from "./esql_parser"; import { InlinestatsCommandContext } from "./esql_parser"; import { QualifiedNameContext } from "./esql_parser"; import { QualifiedNamePatternContext } from "./esql_parser"; +import { QualifiedNamePatternsContext } from "./esql_parser"; import { IdentifierContext } from "./esql_parser"; import { IdentifierPatternContext } from "./esql_parser"; import { NullLiteralContext } from "./esql_parser"; @@ -79,6 +80,7 @@ import { ShowInfoContext } from "./esql_parser"; import { MetaFunctionsContext } from "./esql_parser"; import { EnrichCommandContext } from "./esql_parser"; import { EnrichWithClauseContext } from "./esql_parser"; +import { LookupCommandContext } from "./esql_parser"; /** @@ -514,6 +516,16 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitQualifiedNamePattern?: (ctx: QualifiedNamePatternContext) => void; + /** + * Enter a parse tree produced by `esql_parser.qualifiedNamePatterns`. + * @param ctx the parse tree + */ + enterQualifiedNamePatterns?: (ctx: QualifiedNamePatternsContext) => void; + /** + * Exit a parse tree produced by `esql_parser.qualifiedNamePatterns`. + * @param ctx the parse tree + */ + exitQualifiedNamePatterns?: (ctx: QualifiedNamePatternsContext) => void; /** * Enter a parse tree produced by `esql_parser.identifier`. * @param ctx the parse tree @@ -898,5 +910,15 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitEnrichWithClause?: (ctx: EnrichWithClauseContext) => void; + /** + * Enter a parse tree produced by `esql_parser.lookupCommand`. + * @param ctx the parse tree + */ + enterLookupCommand?: (ctx: LookupCommandContext) => void; + /** + * Exit a parse tree produced by `esql_parser.lookupCommand`. + * @param ctx the parse tree + */ + exitLookupCommand?: (ctx: LookupCommandContext) => void; } diff --git a/packages/kbn-esql-ast/src/ast_walker.ts b/packages/kbn-esql-ast/src/ast_walker.ts index e2b92a2fbf9d6..064b1b7d3126e 100644 --- a/packages/kbn-esql-ast/src/ast_walker.ts +++ b/packages/kbn-esql-ast/src/ast_walker.ts @@ -101,7 +101,7 @@ function extractIdentifiers( if (ctx instanceof MvExpandCommandContext) { return wrapIdentifierAsArray(ctx.qualifiedName()); } - return wrapIdentifierAsArray(ctx.qualifiedNamePattern_list()); + return wrapIdentifierAsArray(ctx.qualifiedNamePatterns().qualifiedNamePattern_list()); } function makeColumnsOutOfIdentifiers(identifiers: ParserRuleContext[]) { diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index a18a65138b10d..08fcd159d2be5 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -2404,6 +2404,11 @@ "error": [], "warning": [] }, + { + "query": "ROW a=1::LONG | LOOKUP t ON a", + "error": [], + "warning": [] + }, { "query": "from index | keep ", "error": [ @@ -2453,28 +2458,28 @@ { "query": "from index | project ", "error": [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" ], "warning": [] }, { "query": "from index | project stringField, numberField, dateField", "error": [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" ], "warning": [] }, { "query": "from index | PROJECT stringField, numberField, dateField", "error": [ - "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" ], "warning": [] }, { "query": "from index | project missingField, numberField, dateField", "error": [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" ], "warning": [] }, diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index d4807d35d4e09..2ec3e2b5bbb6f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -607,6 +607,10 @@ describe('validation logic', () => { testErrorsAndWarnings('from index | limit 4', []); }); + describe('lookup', () => { + testErrorsAndWarnings('ROW a=1::LONG | LOOKUP t ON a', []); + }); + describe('keep', () => { testErrorsAndWarnings('from index | keep ', ["SyntaxError: missing ID_PATTERN at ''"]); testErrorsAndWarnings('from index | keep stringField, numberField, dateField', []); @@ -623,16 +627,16 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from index | keep `any#Char$Field`', []); testErrorsAndWarnings('from index | project ', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | project stringField, numberField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | PROJECT stringField, numberField, dateField', [ - "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | project missingField, numberField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | keep s*', []); testErrorsAndWarnings('from index | keep *Field', []); From f689c1dd3e9dbc7bb37b40b7db7e177e100c71bc Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Tue, 4 Jun 2024 07:42:17 +0100 Subject: [PATCH 29/82] [Observability Onboarding] Expose getAgentPolicyInputs in the package service (#184519) Resolves #184330 ## Summary This PR exposes new method `getAgentPolicyInputs` in the package service. This method is the equivalent of the existing Inputs REST API: ```text GET /api/fleet/epm/templates/{name}/{version}/inputs?format=json ``` This PR also updates the Onboarding Flow to utilise this method when generating the config file for standalone agent. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/fleet/common/index.ts | 1 + .../fleet/common/types/models/agent_policy.ts | 2 + .../services/epm/package_service.mock.ts | 1 + .../server/services/epm/package_service.ts | 42 +++++++++++++++- .../epm/packages/get_template_inputs.ts | 22 +++++++-- x-pack/plugins/fleet/server/types/index.tsx | 1 + .../server/routes/flow/route.ts | 49 ++++++++++--------- 7 files changed, 92 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index fed73a5653313..f572273a486a9 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -130,6 +130,7 @@ export type { FullAgentPolicyOutput, FullAgentPolicyOutputPermissions, FullAgentPolicyInputStream, + TemplateAgentPolicyInput, DryRunPackagePolicy, AgentPolicy, Installation, diff --git a/x-pack/plugins/fleet/common/types/models/agent_policy.ts b/x-pack/plugins/fleet/common/types/models/agent_policy.ts index eabe321d62604..c697edae904b3 100644 --- a/x-pack/plugins/fleet/common/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/agent_policy.ts @@ -91,6 +91,8 @@ export interface FullAgentPolicyInput { [key: string]: any; } +export type TemplateAgentPolicyInput = Pick; + export interface FullAgentPolicyAddFields { add_fields: { target: string; diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts b/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts index f05fb94f38180..f3bb2b06f2b03 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts @@ -14,6 +14,7 @@ const createClientMock = (): jest.Mocked => ({ installCustomIntegration: jest.fn(), fetchFindLatestPackage: jest.fn(), readBundledPackage: jest.fn(), + getAgentPolicyInputs: jest.fn(), getPackage: jest.fn(), getPackages: jest.fn(), reinstallEsAssets: jest.fn(), diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.ts b/x-pack/plugins/fleet/server/services/epm/package_service.ts index 1c97cd10cc7f0..b2212f2e7f6c0 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.ts @@ -28,6 +28,7 @@ import type { InstallablePackage, Installation, RegistryPackage, + TemplateAgentPolicyInput, } from '../../types'; import type { FleetAuthzRouteConfig } from '../security/types'; @@ -46,7 +47,13 @@ import * as Registry from './registry'; import { fetchFindLatestPackageOrThrow, getPackage } from './registry'; import { installTransforms, isTransform } from './elasticsearch/transform/install'; -import { ensureInstalledPackage, getInstallation, getPackages, installPackage } from './packages'; +import { + ensureInstalledPackage, + getInstallation, + getPackages, + installPackage, + getTemplateInputs, +} from './packages'; import { generatePackageInfoFromArchiveBuffer } from './archive'; import { getEsPackage } from './archive/storage'; @@ -102,6 +109,13 @@ export interface PackageClient { prerelease?: false; }): Promise; + getAgentPolicyInputs( + pkgName: string, + pkgVersion?: string, + prerelease?: false, + ignoreUnverified?: boolean + ): Promise; + reinstallEsAssets( packageInfo: InstallablePackage, assetPaths: string[] @@ -263,6 +277,32 @@ class PackageClientImpl implements PackageClient { return generatePackageInfoFromArchiveBuffer(archiveBuffer, 'application/zip'); } + public async getAgentPolicyInputs( + pkgName: string, + pkgVersion?: string, + prerelease?: false, + ignoreUnverified?: boolean + ) { + await this.#runPreflight(READ_PACKAGE_INFO_AUTHZ); + + // If pkgVersion isn't specified, find the latest package version + if (!pkgVersion) { + const pkg = await Registry.fetchFindLatestPackageOrThrow(pkgName, { prerelease }); + pkgVersion = pkg.version; + } + + const { inputs } = await getTemplateInputs( + this.internalSoClient, + pkgName, + pkgVersion, + 'json', + prerelease, + ignoreUnverified + ); + + return inputs; + } + public async getPackage( packageName: string, packageVersion: string, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts index a0038a5fb4fa3..e4a68ad7bc0aa 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts @@ -16,7 +16,7 @@ import type { PackageInfo, NewPackagePolicy, PackagePolicyInput, - FullAgentPolicyInputStream, + TemplateAgentPolicyInput, } from '../../../../common/types'; import { _sortYamlKeys } from '../../../../common/services/full_agent_policy_to_yaml'; @@ -30,8 +30,8 @@ type Format = 'yml' | 'json'; // Function based off storedPackagePolicyToAgentInputs, it only creates the `streams` section instead of the FullAgentPolicyInput export const templatePackagePolicyToFullInputStreams = ( packagePolicyInputs: PackagePolicyInput[] -): FullAgentPolicyInputStream[] => { - const fullInputsStreams: FullAgentPolicyInputStream[] = []; +): TemplateAgentPolicyInput[] => { + const fullInputsStreams: TemplateAgentPolicyInput[] = []; if (!packagePolicyInputs || packagePolicyInputs.length === 0) return fullInputsStreams; @@ -57,6 +57,22 @@ export const templatePackagePolicyToFullInputStreams = ( return fullInputsStreams; }; +export async function getTemplateInputs( + soClient: SavedObjectsClientContract, + pkgName: string, + pkgVersion: string, + format: 'yml', + prerelease?: boolean, + ignoreUnverified?: boolean +): Promise; +export async function getTemplateInputs( + soClient: SavedObjectsClientContract, + pkgName: string, + pkgVersion: string, + format: 'json', + prerelease?: boolean, + ignoreUnverified?: boolean +): Promise<{ inputs: TemplateAgentPolicyInput[] }>; export async function getTemplateInputs( soClient: SavedObjectsClientContract, pkgName: string, diff --git a/x-pack/plugins/fleet/server/types/index.tsx b/x-pack/plugins/fleet/server/types/index.tsx index da4d793989e8b..fed63a422f065 100644 --- a/x-pack/plugins/fleet/server/types/index.tsx +++ b/x-pack/plugins/fleet/server/types/index.tsx @@ -99,6 +99,7 @@ export type { AssetsMap, InstallResultStatus, InstallLatestExecutedState, + TemplateAgentPolicyInput, } from '../../common/types'; export { ElasticsearchAssetType, KibanaAssetType, KibanaSavedObjectType } from '../../common/types'; export { dataTypes } from '../../common/constants'; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts index ea7203ca86bcb..e759cb0a16953 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts @@ -12,7 +12,7 @@ import { FleetUnauthorizedError, type PackageClient, } from '@kbn/fleet-plugin/server'; -import { v4 as uuidv4 } from 'uuid'; +import type { TemplateAgentPolicyInput } from '@kbn/fleet-plugin/common'; import { dump } from 'js-yaml'; import { getObservabilityOnboardingFlow, saveObservabilityOnboardingFlow } from '../../lib/state'; import { @@ -21,7 +21,6 @@ import { } from '../../saved_objects/observability_onboarding_status'; import { createObservabilityOnboardingServerRoute } from '../create_observability_onboarding_server_route'; import { getHasLogs } from './get_has_logs'; -import { getSystemLogsInputs } from '../../../common/elastic_agent_logs'; import { getFallbackESUrl } from '../../lib/get_fallback_urls'; @@ -248,9 +247,9 @@ const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ } as ObservabilityOnboardingFlow, }); - let agentInputs: unknown[]; + let agentPolicyInputs: TemplateAgentPolicyInput[] = []; try { - agentInputs = await ensureInstalledIntegrations(integrationsToInstall, packageClient); + agentPolicyInputs = await ensureInstalledIntegrations(integrationsToInstall, packageClient); } catch (error) { if (error instanceof FleetUnauthorizedError) { return response.forbidden({ @@ -272,7 +271,7 @@ const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ }, body: generateAgentConfig({ esHost: elasticsearchUrl, - inputs: agentInputs, + inputs: agentPolicyInputs, }), }); }, @@ -293,23 +292,22 @@ async function ensureInstalledIntegrations( integrationsToInstall: Integration[], packageClient: PackageClient ) { - const agentInputs: unknown[] = []; + const agentPolicyInputs: TemplateAgentPolicyInput[] = []; for (const integration of integrationsToInstall) { const { pkgName, installSource } = integration; if (installSource === 'registry') { - await packageClient.ensureInstalledPackage({ pkgName }); - agentInputs.push(...getSystemLogsInputs(uuidv4())); + const pkg = await packageClient.ensureInstalledPackage({ pkgName }); + const inputs = await packageClient.getAgentPolicyInputs(pkg.name, pkg.version); + agentPolicyInputs.push(...inputs.filter((input) => input.type !== 'httpjson')); } else if (installSource === 'custom') { - const input = { - id: `custom-logs-${uuidv4()}`, - type: 'logfile', - data_stream: { - namespace: 'default', - }, + const input: TemplateAgentPolicyInput = { + id: `filestream-${pkgName}`, + type: 'filestream', streams: [ { - id: `logs-onboarding-${pkgName}`, + id: `filestream-${pkgName}`, data_stream: { + type: 'logs', dataset: pkgName, }, paths: integration.logFilePaths, @@ -321,18 +319,18 @@ async function ensureInstalledIntegrations( pkgName, datasets: [{ name: pkgName, type: 'logs' }], }); - agentInputs.push(input); + agentPolicyInputs.push(input); } catch (error) { // If the error is a naming collision, we can assume the integration is already installed and treat this step as successful if (error instanceof NamingCollisionError) { - agentInputs.push(input); + agentPolicyInputs.push(input); } else { throw error; } } } } - return agentInputs; + return agentPolicyInputs; } /** @@ -356,11 +354,12 @@ function parseIntegrationsTSV(tsv: string) { .split('\n') .map((line) => line.split('\t', 3)) .reduce>((acc, [pkgName, installSource, logFilePath]) => { + const key = `${pkgName}-${installSource}`; if (installSource === 'registry') { if (logFilePath) { throw new Error(`Integration '${pkgName}' does not support a file path`); } - acc[pkgName] = { + acc[key] = { pkgName, installSource, }; @@ -370,12 +369,12 @@ function parseIntegrationsTSV(tsv: string) { throw new Error(`Missing file path for integration: ${pkgName}`); } // Append file path if integration is already in the list - const existing = acc[pkgName]; + const existing = acc[key]; if (existing && existing.installSource === 'custom') { existing.logFilePaths.push(logFilePath); return acc; } - acc[pkgName] = { + acc[key] = { pkgName, installSource, logFilePaths: [logFilePath], @@ -387,7 +386,13 @@ function parseIntegrationsTSV(tsv: string) { ); } -const generateAgentConfig = ({ esHost, inputs = [] }: { esHost: string[]; inputs: unknown[] }) => { +const generateAgentConfig = ({ + esHost, + inputs = [], +}: { + esHost: string[]; + inputs: TemplateAgentPolicyInput[]; +}) => { return dump({ outputs: { default: { From a8b2eef2041eaaefbb5501053146c5874b7bcd33 Mon Sep 17 00:00:00 2001 From: Umberto Pepato Date: Tue, 4 Jun 2024 09:18:02 +0200 Subject: [PATCH 30/82] [ResponseOps][Alerts] Update stack alerts page feature labels and filters (#184305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Updates the alerts table feature cell renderers and feature filters according to #183615. ## To verify 1. Create some Stack, Stack Monitoring, and ML rules that fire alerts 2. Navigate to `Stack Management` > `Alerts` 3. Verify that the feature quick filter (found in the image menu of the KQL bar) respects the changes outlined in points 1 and 2 of #183615 4. Verify that the alerts from Stack rules show a `Stack` label in the table 6. Verify that the alerts from Stack Monitoring rules show a `Stack Monitoring` label in the table 7. Verify that filtering by `Stack rule types` shows only Stack and ML alerts in the table 8. Verify that filtering by `Observability rule types` doesn't show Stack Monitoring alerts 9. Verify that filtering by `Stack Monitoring rule types` only shows Stack Monitoring alerts --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../translations/translations/fr-FR.json | 2 +- .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- .../use_rule_type_ids_by_feature_id.test.ts | 21 ++++++------------- .../hooks/use_rule_type_ids_by_feature_id.ts | 14 ++++++++----- .../sections/alerts_table/constants.ts | 8 ++++--- .../application/sections/translations.ts | 8 +++---- .../apps/triggers_actions_ui/index.ts | 2 +- .../{alerts_page.ts => stack_alerts_page.ts} | 2 +- 9 files changed, 29 insertions(+), 32 deletions(-) rename x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/{alerts_page.ts => stack_alerts_page.ts} (99%) diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 31c1af10f51b9..c5705e66fa7fb 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -42282,7 +42282,7 @@ "xpack.triggersActionsUI.sections.alertsTable.observability": "Observabilité", "xpack.triggersActionsUI.sections.alertsTable.security": "Sécurité", "xpack.triggersActionsUI.sections.alertsTable.slos": "SLO", - "xpack.triggersActionsUI.sections.alertsTable.stackManagement": "Gestion de la Suite", + "xpack.triggersActionsUI.sections.alertsTable.stack": "Gestion de la Suite", "xpack.triggersActionsUI.sections.alertsTable.stackMonitoring": "Monitoring de la Suite", "xpack.triggersActionsUI.sections.alertsTable.title": "Tableau d’alertes", "xpack.triggersActionsUI.sections.alertsTable.uptime": "Uptime", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c63d94591fe7b..61f627ceea468 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -42252,7 +42252,7 @@ "xpack.triggersActionsUI.sections.alertsTable.observability": "Observability", "xpack.triggersActionsUI.sections.alertsTable.security": "セキュリティ", "xpack.triggersActionsUI.sections.alertsTable.slos": "SLO", - "xpack.triggersActionsUI.sections.alertsTable.stackManagement": "スタック管理", + "xpack.triggersActionsUI.sections.alertsTable.stack": "スタック管理", "xpack.triggersActionsUI.sections.alertsTable.stackMonitoring": "スタック監視", "xpack.triggersActionsUI.sections.alertsTable.title": "アラートテーブル", "xpack.triggersActionsUI.sections.alertsTable.uptime": "アップタイム", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4b7fcc5ca9c60..1af015aa40bd2 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -42300,7 +42300,7 @@ "xpack.triggersActionsUI.sections.alertsTable.observability": "Observability", "xpack.triggersActionsUI.sections.alertsTable.security": "安全", "xpack.triggersActionsUI.sections.alertsTable.slos": "SLO", - "xpack.triggersActionsUI.sections.alertsTable.stackManagement": "Stack Management", + "xpack.triggersActionsUI.sections.alertsTable.stack": "Stack Management", "xpack.triggersActionsUI.sections.alertsTable.stackMonitoring": "堆栈监测", "xpack.triggersActionsUI.sections.alertsTable.title": "告警表", "xpack.triggersActionsUI.sections.alertsTable.uptime": "运行时间", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.test.ts index 5040bcb4a37c2..3fd8ec70d9ff8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.test.ts @@ -14,7 +14,12 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; describe('useRuleTypeIdsByFeatureId', () => { it('should correctly reverse the rule types index', () => { const { result } = renderHook(() => useRuleTypeIdsByFeatureId(ruleTypesIndex)); - expect(Object.keys(result.current)).toEqual(['stackAlerts', 'observability', 'ml', 'siem']); + expect(Object.keys(result.current)).toEqual([ + 'stackAlerts', + 'observability', + 'monitoring', + 'siem', + ]); Object.values(result.current).forEach((ruleTypes) => { expect(ruleTypes).not.toHaveLength(0); }); @@ -35,20 +40,6 @@ describe('useRuleTypeIdsByFeatureId', () => { 'metrics.alert.inventory.threshold', 'observability.rules.custom_threshold', 'logs.alert.document.count', - 'monitoring_alert_license_expiration', - 'monitoring_alert_cluster_health', - 'monitoring_alert_cpu_usage', - 'monitoring_alert_disk_usage', - 'monitoring_alert_nodes_changed', - 'monitoring_alert_elasticsearch_version_mismatch', - 'monitoring_alert_kibana_version_mismatch', - 'monitoring_alert_logstash_version_mismatch', - 'monitoring_alert_jvm_memory_usage', - 'monitoring_alert_missing_monitoring_data', - 'monitoring_alert_thread_pool_search_rejections', - 'monitoring_alert_thread_pool_write_rejections', - 'monitoring_ccr_read_exceptions', - 'monitoring_shard_size', 'apm.error_rate', 'apm.transaction_error_rate', 'apm.transaction_duration', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.ts index eb1492e51f282..c8c5eedc3054f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_page/hooks/use_rule_type_ids_by_feature_id.ts @@ -8,7 +8,7 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { useMemo } from 'react'; import { mapValues } from 'lodash'; -import { observabilityFeatureIds } from '../../alerts_table/constants'; +import { observabilityFeatureIds, stackFeatureIds } from '../../alerts_table/constants'; import { MULTI_CONSUMER_RULE_TYPE_IDS } from '../../../constants'; import { RuleTypeIndex } from '../../../../types'; @@ -33,10 +33,14 @@ export const useRuleTypeIdsByFeatureId = (ruleTypesIndex: RuleTypeIndex) => const map = Array.from(ruleTypesIndex.entries()).reduce>>( (types, [key, value]) => { let producer = value.producer as keyof RuleTypeIdsByFeatureId; - // All o11y apps are listed under 'observability' to create a grouped filter - producer = observabilityFeatureIds.includes(producer) - ? AlertConsumers.OBSERVABILITY - : producer; + // Some o11y apps are listed under 'observability' to create a grouped filter + if (observabilityFeatureIds.includes(producer)) { + producer = AlertConsumers.OBSERVABILITY; + } + // Stack includes ML in this context + if (stackFeatureIds.includes(producer)) { + producer = AlertConsumers.STACK_ALERTS; + } // Multi consumer rule type ids should be listed both in Observability and Stack alerts if (MULTI_CONSUMER_RULE_TYPE_IDS.includes(value.id)) { (types[AlertConsumers.OBSERVABILITY] = diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/constants.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/constants.ts index 2b91a15045520..9605abb085232 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/constants.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/constants.ts @@ -15,7 +15,7 @@ import { OBSERVABILITY_DISPLAY_NAME, SECURITY_DISPLAY_NAME, SLO_DISPLAY_NAME, - STACK_MANAGEMENT_DISPLAY_NAME, + STACK_DISPLAY_NAME, STACK_MONITORING_DISPLAY_NAME, UPTIME_DISPLAY_NAME, } from '../translations'; @@ -33,9 +33,10 @@ export const observabilityFeatureIds: AlertConsumers[] = [ AlertConsumers.LOGS, AlertConsumers.SLO, AlertConsumers.UPTIME, - AlertConsumers.MONITORING, ]; +export const stackFeatureIds: AlertConsumers[] = [AlertConsumers.STACK_ALERTS, AlertConsumers.ML]; + export const [_, ...observabilityApps] = observabilityFeatureIds; export const alertProducersData: Record = { @@ -77,8 +78,9 @@ export const alertProducersData: Record = { icon: 'logoSecurity', }, [AlertConsumers.STACK_ALERTS]: { - displayName: STACK_MANAGEMENT_DISPLAY_NAME, + displayName: STACK_DISPLAY_NAME, icon: 'managementApp', + subFeatureIds: stackFeatureIds, }, [AlertConsumers.EXAMPLE]: { displayName: 'Example', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/translations.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/translations.ts index d8bb751f2daf6..a4776b58f442f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/translations.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/translations.ts @@ -32,17 +32,17 @@ export const SECURITY_DISPLAY_NAME = i18n.translate( } ); -export const STACK_MANAGEMENT_DISPLAY_NAME = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsTable.stackManagement', +export const STACK_DISPLAY_NAME = i18n.translate( + 'xpack.triggersActionsUI.sections.alertsTable.stack', { - defaultMessage: 'Stack management', + defaultMessage: 'Stack', } ); export const STACK_MONITORING_DISPLAY_NAME = i18n.translate( 'xpack.triggersActionsUI.sections.alertsTable.stackMonitoring', { - defaultMessage: 'Stack monitoring', + defaultMessage: 'Stack Monitoring', } ); diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/index.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/index.ts index 877e678a2f71d..e500dc0277af5 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/index.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/index.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ loadTestFile }: FtrProviderContext) => { describe('Actions and Triggers app', function () { - loadTestFile(require.resolve('./alerts_page')); loadTestFile(require.resolve('./home_page')); loadTestFile(require.resolve('./rules_list')); loadTestFile(require.resolve('./alert_create_flyout')); @@ -17,6 +16,7 @@ export default ({ loadTestFile }: FtrProviderContext) => { loadTestFile(require.resolve('./connectors')); loadTestFile(require.resolve('./logs_list')); loadTestFile(require.resolve('./rules_settings')); + loadTestFile(require.resolve('./stack_alerts_page')); loadTestFile(require.resolve('./maintenance_windows')); }); }; diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_page.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts similarity index 99% rename from x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_page.ts rename to x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts index 6fd04fdaa23c9..26bee6fc4a5cf 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_page.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts @@ -64,7 +64,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const quickFilters = await pageObjects.triggersActionsUI.getAlertsPageQuickFilters(); const solutionFilters = getSolutionNamesFromFilters(quickFilters); expect(solutionFilters).to.have.length(2); - expect(solutionFilters[0]).to.equal('Stack management'); + expect(solutionFilters[0]).to.equal('Stack'); // Observability is included because of multi-consumer rules expect(solutionFilters[1]).to.equal('Observability'); }); From fabe0998c7edc865bf0bfb8254b55fb203422ccc Mon Sep 17 00:00:00 2001 From: Almudena Sanz Date: Tue, 4 Jun 2024 09:35:02 +0200 Subject: [PATCH 31/82] [Obs AI Assistant] Evaluation framework log scores per scenario (#184221) ## Summary This PR introduces the logging of the evaluation scores per [scenario](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios) (e.g. ESQL, alerts, apm...), this can help identify which tasks/features each model performs better or worse at. The result can be seen in the terminal or logged to a file (in this case I only run alerts and apm, but when run fully it will also include ESQL, elasticsearch and kb scenarios): Screenshot 2024-05-24 at 16 48 35 Relates to: https://github.com/elastic/obs-ai-assistant-team/issues/150 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../scripts/evaluation/evaluation.ts | 42 ++++++++++++++++++- .../scripts/evaluation/kibana_client.ts | 3 ++ .../scripts/evaluation/types.ts | 1 + 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts index 98fe6903ba620..500189c94e726 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts @@ -263,7 +263,7 @@ function runEvaluations() { resolve(); }); }).finally(() => { - const score = results + const modelScore = results .flatMap((result) => result.scores) .reduce( (prev, result) => { @@ -275,7 +275,45 @@ function runEvaluations() { ); log.write('-------------------------------------------'); - log.write(`Scored ${score.score} out of ${score.total}`); + log.write( + `Model ${connector.id} scored ${modelScore.score} out of ${modelScore.total}` + ); + log.write('-------------------------------------------'); + + const scoresByCategory: { + [key: string]: { + score: number; + total: number; + }; + } = results.reduce( + ( + acc: { + [key: string]: { + score: number; + total: number; + }; + }, + result + ) => { + const category = result.category; + if (!acc[category]) { + acc[category] = { score: 0, total: 0 }; + } + result.scores.forEach((score) => { + acc[category].score += score.score; + acc[category].total += 1; + }); + return acc; + }, + {} + ); + + log.write('-------------------------------------------'); + log.write(`Model ${connector.id} Scores per Category`); + Object.entries(scoresByCategory).forEach(([category, { score, total }]) => { + log.write('-------------------------'); + log.write(`Category: ${category} - Scored ${score} out of ${total}`); + }); log.write('-------------------------------------------'); }); }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts index 0de3d3cebabe3..9d136224b299a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts @@ -199,6 +199,7 @@ export class KibanaClient { } let currentTitle: string = ''; + let firstSuiteName: string = ''; suite.beforeEach(function () { const currentTest: Mocha.Test = this.currentTest; @@ -210,6 +211,7 @@ export class KibanaClient { parent = parent.parent; } currentTitle = titles.reverse().join(' '); + firstSuiteName = titles.filter((item) => item !== '')[0]; }); suite.afterEach(function () { @@ -506,6 +508,7 @@ export class KibanaClient { const result: EvaluationResult = { name: currentTitle, + category: firstSuiteName, conversationId, messages, passed: scoredCriteria.every(({ score }) => score >= 1), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts index 2e9545550840f..5a82159510b6e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts @@ -19,6 +19,7 @@ export interface ScenarioOptions { export interface EvaluationResult { name: string; + category: string; conversationId?: string; messages: Array; passed: boolean; From 01a29261a1138b0678296504e81c8ad1294731be Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Tue, 4 Jun 2024 09:58:23 +0200 Subject: [PATCH 32/82] [Observability] Set observable initial value to prevent rerender (#184652) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Adding an initial value to the `useObservable` call prevents its value from flapping and rendering twice the whole child application. This issue is similar to what was reported in #181968 and also its solution lies on a similar error. I added a functional test for both stateful/serverless environments to assert this behaviour doesn't break anymore. --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../page_template/lazy_page_template.tsx | 2 +- .../apps/observability_logs_explorer/index.ts | 1 + .../observability_logs_explorer/navigation.ts | 126 +++++++++++++++++ .../observability_logs_explorer/index.ts | 1 + .../observability_logs_explorer/navigation.ts | 127 ++++++++++++++++++ 5 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 x-pack/test/functional/apps/observability_logs_explorer/navigation.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/lazy_page_template.tsx b/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/lazy_page_template.tsx index e720ed3c57f22..eaeb44fb791cc 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/lazy_page_template.tsx +++ b/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/lazy_page_template.tsx @@ -22,7 +22,7 @@ export function createLazyObservabilityPageTemplate({ ...injectedDeps }: ObservabilityPageTemplateDependencies) { return (pageTemplateProps: LazyObservabilityPageTemplateProps) => { - const isSidebarEnabled = useObservable(isSidebarEnabled$); + const isSidebarEnabled = useObservable(isSidebarEnabled$, isSidebarEnabled$.getValue()); const { showSolutionNav: showSolutionNavProp, ...props } = pageTemplateProps; const showSolutionNav = Boolean(!!showSolutionNavProp || isSidebarEnabled); diff --git a/x-pack/test/functional/apps/observability_logs_explorer/index.ts b/x-pack/test/functional/apps/observability_logs_explorer/index.ts index 6683fb8d7d26d..28d1ececb2802 100644 --- a/x-pack/test/functional/apps/observability_logs_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/index.ts @@ -18,5 +18,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./filter_controls')); loadTestFile(require.resolve('./flyout')); loadTestFile(require.resolve('./header_menu')); + loadTestFile(require.resolve('./navigation')); }); } diff --git a/x-pack/test/functional/apps/observability_logs_explorer/navigation.ts b/x-pack/test/functional/apps/observability_logs_explorer/navigation.ts new file mode 100644 index 0000000000000..7e991d4485c4a --- /dev/null +++ b/x-pack/test/functional/apps/observability_logs_explorer/navigation.ts @@ -0,0 +1,126 @@ +/* + * 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 expect from '@kbn/expect'; +import moment from 'moment/moment'; +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; +import { FtrProviderContext } from './config'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer']); + const synthtrace = getService('logSynthtraceEsClient'); + const kibanaServer = getService('kibanaServer'); + const from = '2023-12-27T10:24:14.035Z'; + const to = '2023-12-27T10:25:14.091Z'; + + const navigateToLogsExplorer = () => + PageObjects.observabilityLogsExplorer.navigateTo({ + pageState: { + time: { + from, + to, + mode: 'absolute', + }, + }, + }); + + describe('Navigation', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await synthtrace.index(generateLogsData({ to })); + await navigateToLogsExplorer(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await synthtrace.clean(); + }); + + it('should correctly restore the previous selection and data when navigating back from another page', async () => { + await PageObjects.observabilityLogsExplorer.openDataSourceSelector(); + await PageObjects.observabilityLogsExplorer + .getUncategorizedTab() + .then((tab: WebElementWrapper) => tab.click()); + + await retry.try(async () => { + const menuEntries = await PageObjects.observabilityLogsExplorer + .getUncategorizedContextMenu() + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) + ); + + expect(await menuEntries[0].getVisibleText()).to.be('synth'); + menuEntries[0].click(); + }); + + // Assert selection is loaded correctly + const rows = await PageObjects.discover.getDocTableRows(); + expect(rows.length).to.equal(1); + + // Navigate to Discover + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); + await discoverLink.click(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + // Navigate back to Logs Explorer using browser navigation + await browser.goBack(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + // Assert selection data is restored correctly + const restoredRows = await PageObjects.discover.getDocTableRows(); + expect(restoredRows.length).to.equal(1); + + // Change selection to all logs to assert its data are loaded + await PageObjects.observabilityLogsExplorer.openDataSourceSelector(); + const allLogsButton = await PageObjects.observabilityLogsExplorer.getAllLogsButton(); + await allLogsButton.click(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + // Assert new selection data is loaded correctly + const allLogsRows = await PageObjects.discover.getDocTableRows(); + expect(allLogsRows.length).to.equal(2); + }); + }); +} + +function generateLogsData({ to, count = 1 }: { to: string; count?: number }) { + const logsSynth = timerange(moment(to).subtract(1, 'second'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => + Array(count) + .fill(0) + .map(() => { + return log + .create() + .message('A sample log') + .logLevel('info') + .timestamp(timestamp) + .defaults({ 'service.name': 'synth-service' }); + }) + ); + + const logsSystem = timerange(moment(to).subtract(2, 'second'), moment(to).subtract(1, 'second')) + .interval('1m') + .rate(1) + .generator((timestamp) => + Array(count) + .fill(0) + .map(() => { + return log + .create() + .dataset('system') + .message('A sample log') + .timestamp(timestamp) + .defaults({ 'service.name': 'system-service' }); + }) + ); + + return [logsSynth, logsSystem]; +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts index 1f49779be0f27..a2b0d4302c737 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts @@ -18,5 +18,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./filter_controls')); loadTestFile(require.resolve('./flyout')); loadTestFile(require.resolve('./header_menu')); + loadTestFile(require.resolve('./navigation')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts new file mode 100644 index 0000000000000..88852f1f7b5b7 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts @@ -0,0 +1,127 @@ +/* + * 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 expect from '@kbn/expect'; +import moment from 'moment/moment'; +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer', 'svlCommonPage']); + const synthtrace = getService('svlLogsSynthtraceClient'); + const kibanaServer = getService('kibanaServer'); + const from = '2023-12-27T10:24:14.035Z'; + const to = '2023-12-27T10:25:14.091Z'; + + const navigateToLogsExplorer = () => + PageObjects.observabilityLogsExplorer.navigateTo({ + pageState: { + time: { + from, + to, + mode: 'absolute', + }, + }, + }); + + describe('Navigation', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await synthtrace.index(generateLogsData({ to })); + await PageObjects.svlCommonPage.login(); + await navigateToLogsExplorer(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await synthtrace.clean(); + }); + + it('should correctly restore the previous selection and data when navigating back from another page', async () => { + await PageObjects.observabilityLogsExplorer.openDataSourceSelector(); + await PageObjects.observabilityLogsExplorer + .getUncategorizedTab() + .then((tab: WebElementWrapper) => tab.click()); + + await retry.try(async () => { + const menuEntries = await PageObjects.observabilityLogsExplorer + .getUncategorizedContextMenu() + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) + ); + + expect(await menuEntries[0].getVisibleText()).to.be('synth'); + menuEntries[0].click(); + }); + + // Assert selection is loaded correctly + const rows = await PageObjects.discover.getDocTableRows(); + expect(rows.length).to.equal(1); + + // Navigate to Discover + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); + await discoverLink.click(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + // Navigate back to Logs Explorer using browser navigation + await browser.goBack(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + // Assert selection data is restored correctly + const restoredRows = await PageObjects.discover.getDocTableRows(); + expect(restoredRows.length).to.equal(1); + + // Change selection to all logs to assert its data are loaded + await PageObjects.observabilityLogsExplorer.openDataSourceSelector(); + const allLogsButton = await PageObjects.observabilityLogsExplorer.getAllLogsButton(); + await allLogsButton.click(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + // Assert new selection data is loaded correctly + const allLogsRows = await PageObjects.discover.getDocTableRows(); + expect(allLogsRows.length).to.equal(2); + }); + }); +} + +function generateLogsData({ to, count = 1 }: { to: string; count?: number }) { + const logsSynth = timerange(moment(to).subtract(1, 'second'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => + Array(count) + .fill(0) + .map(() => { + return log + .create() + .message('A sample log') + .logLevel('info') + .timestamp(timestamp) + .defaults({ 'service.name': 'synth-service' }); + }) + ); + + const logsSystem = timerange(moment(to).subtract(2, 'second'), moment(to).subtract(1, 'second')) + .interval('1m') + .rate(1) + .generator((timestamp) => + Array(count) + .fill(0) + .map(() => { + return log + .create() + .dataset('system') + .message('A sample log') + .timestamp(timestamp) + .defaults({ 'service.name': 'system-service' }); + }) + ); + + return [logsSynth, logsSystem]; +} From e3ca2c59b0afc056d5f8ed77af1732961c2b190b Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 4 Jun 2024 11:49:38 +0300 Subject: [PATCH 33/82] fix: [Obs Infrastructure > Inventory][KEYBOARD]: Kubernetes Pods Create Inventory Rule modal has tooltip that does not take keyboard focus (#184407) Closes: https://github.com/elastic/observability-dev/issues/3416 ## Description The Obs Applications > Infrastructure > Kubernetes Pods view a tooltip in the Create Inventory Rule modal that does not take keyboard focus. This needs to be adjusted so keyboard users get the benefit of the tooltip information. Screenshot attached below. ### Steps to recreate 1. Open the [Obs Inventory](https://issue-serverless-bdwqw-pr183659-f2d99b.kb.eu-west-1.aws.qa.elastic.cloud/app/metrics/inventory) view 2. Click the first dropdown and switch from `Hosts` to `Kubernetes Pods` 3. Click on a pod to open the Kubernetes pod popover 4. Click "Create Inventory Rule" button (has the bell icon) 5. Press `Tab` to move through the Create Inventory Rule modal 6. Verify the tooltip next to "Alert me if there is no data" never opens ### What was changed?: 1. EuiToolTip was replaced with EuiIconTip as a more accessible component. 2. The fix was applied to similar duplicate places. --- .../inventory/components/expression.tsx | 11 +++++------ .../components/expression.tsx | 19 +++++++++---------- .../custom_threshold_rule_expression.tsx | 11 +++++------ 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/expression.tsx index b3b62cabcb9ed..514663cc45ae5 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/expression.tsx @@ -12,11 +12,10 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, + EuiIconTip, EuiHealth, - EuiIcon, EuiSpacer, EuiText, - EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; @@ -360,14 +359,14 @@ export const Expressions: React.FC = (props) => { {i18n.translate('xpack.infra.metrics.alertFlyout.alertOnNoData', { defaultMessage: "Alert me if there's no data", })}{' '} - - - + /> } checked={ruleParams.alertOnNoData} diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/expression.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/expression.tsx index c6afc61ebf881..191c6ed8cd847 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/expression.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/expression.tsx @@ -11,12 +11,11 @@ import { EuiCheckbox, EuiFieldSearch, EuiFormRow, - EuiIcon, + EuiIconTip, EuiLink, EuiPanel, EuiSpacer, EuiText, - EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -370,7 +369,9 @@ export const Expressions: React.FC = (props) => { {i18n.translate('xpack.infra.metrics.alertFlyout.alertOnNoData', { defaultMessage: "Alert me if there's no data", })}{' '} - = (props) => { 'Enable this to trigger the action if the metric(s) do not report any data over the expected time period, or if the alert fails to query Elasticsearch', }) } - > - - + /> } checked={ruleParams.alertOnNoData} @@ -471,7 +470,9 @@ export const Expressions: React.FC = (props) => { {i18n.translate('xpack.infra.metrics.alertFlyout.alertOnGroupDisappear', { defaultMessage: 'Alert me if a group stops reporting data', })}{' '} - = (props) => { 'Enable this to trigger the action if a previously detected group begins to report no results. This is not recommended for dynamically scaling infrastructures that may rapidly start and stop nodes automatically.', }) } - > - - + /> } disabled={!hasGroupBy} diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx index f3aff841233cf..fab9568b080a9 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx @@ -15,13 +15,12 @@ import { EuiFormErrorText, EuiFormRow, EuiHorizontalRule, - EuiIcon, + EuiIconTip, EuiLink, EuiLoadingSpinner, EuiSpacer, EuiText, EuiTitle, - EuiToolTip, } from '@elastic/eui'; import { ISearchSource, Query } from '@kbn/data-plugin/common'; import { DataView } from '@kbn/data-views-plugin/common'; @@ -603,7 +602,9 @@ export default function Expressions(props: Props) { defaultMessage: 'Alert me if a group stops reporting data', } )}{' '} - - - + /> } disabled={!hasGroupBy} From 3e5852cb894eeb8d07ff9b3878263282eda12af4 Mon Sep 17 00:00:00 2001 From: Jill Guyonnet Date: Tue, 4 Jun 2024 10:13:52 +0100 Subject: [PATCH 34/82] [Fleet] Update README and local setup dev docs (#184629) ## Summary Closes https://github.com/elastic/ingest-dev/issues/3354 This is a docs only change. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- docs/developer/plugin-list.asciidoc | 2 +- x-pack/plugins/fleet/README.md | 229 +++++++---------- .../developing_kibana_and_fleet_server.md | 106 +------- .../developing_kibana_in_serverless.md | 0 .../dev_docs/local_setup/enrolling_agents.md | 237 ++++++++++++++++++ .../run_dockerized_elastic_agent.sh | 88 +++++++ .../local_setup/sample_kibana_dev_yml.md | 87 +++++++ .../screenshots/docker_add_agent_1.png | Bin 0 -> 383468 bytes .../screenshots/docker_add_agent_2.png | Bin 0 -> 539466 bytes .../screenshots/docker_fleet_server.png | Bin 0 -> 278309 bytes .../screenshots/docker_fleet_settings.png | Bin 0 -> 399716 bytes .../screenshots/no_fleet_server.png | Bin 0 -> 214279 bytes .../screenshots/vm_add_agent_1.png | Bin 0 -> 399526 bytes .../screenshots/vm_add_agent_2.png | Bin 0 -> 514717 bytes .../screenshots/vm_fleet_server_1.png | Bin 0 -> 424188 bytes .../screenshots/vm_fleet_server_2.png | Bin 0 -> 323068 bytes .../screenshots/vm_fleet_server_3.png | Bin 0 -> 584290 bytes .../screenshots/vm_fleet_settings.png | Bin 0 -> 333137 bytes 18 files changed, 511 insertions(+), 238 deletions(-) rename x-pack/plugins/fleet/dev_docs/{ => local_setup}/developing_kibana_and_fleet_server.md (76%) rename x-pack/plugins/fleet/dev_docs/{ => local_setup}/developing_kibana_in_serverless.md (100%) create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/enrolling_agents.md create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/run_dockerized_elastic_agent.sh create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/sample_kibana_dev_yml.md create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_add_agent_1.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_add_agent_2.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_fleet_server.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_fleet_settings.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/no_fleet_server.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_add_agent_1.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_add_agent_2.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_1.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_2.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_3.png create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_settings.png diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 178aa842fb2a8..874f3f3136190 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -587,7 +587,7 @@ activities. |{kib-repo}blob/{branch}/x-pack/plugins/fleet/README.md[fleet] -|Fleet needs to have Elasticsearch API keys enabled. +|Fleet provides a web-based UI in Kibana for centrally managing Elastic Agents and their policies. |{kib-repo}blob/{branch}/x-pack/plugins/global_search/README.md[globalSearch] diff --git a/x-pack/plugins/fleet/README.md b/x-pack/plugins/fleet/README.md index b0a1eb2fa2618..fe61ca1d7cc51 100644 --- a/x-pack/plugins/fleet/README.md +++ b/x-pack/plugins/fleet/README.md @@ -1,162 +1,126 @@ # Fleet -## Plugin +Fleet provides a web-based UI in Kibana for centrally managing Elastic Agents and their policies. -- The plugin is enabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/main/x-pack/plugins/fleet/common/types/index.ts#L9-L27) -- Adding `xpack.fleet.enabled=false` will disable the plugin including the EPM and Fleet features. It will also remove the `PACKAGE_POLICY_API_ROUTES` and `AGENT_POLICY_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) -- Adding `--xpack.fleet.agents.enabled=false` will disable the Fleet API & UI - - [code for adding the routes](https://github.com/elastic/kibana/blob/1f27d349533b1c2865c10c45b2cf705d7416fb36/x-pack/plugins/ingest_manager/server/plugin.ts#L115-L133) - - [Integration tests](server/integration_tests/router.test.ts) -- Both EPM and Fleet require `ingestManager` be enabled. They are not standalone features. -- For Enterprise license, a custom package registry URL can be used by setting `xpack.fleet.registryUrl=http://localhost:8080` - - This property is currently only for internal Elastic development and is unsupported +Official documentation: https://www.elastic.co/guide/en/fleet/current/index.html. -## Fleet Requirements +## Plugin overview -Fleet needs to have Elasticsearch API keys enabled. +The Fleet plugin is enabled by default. The Fleet API and UI can be disabled by setting the `xpack.fleet.agents.enabled` Kibana setting to `false`. -Also you need to configure the hosts your agent is going to use to comunication with Elasticsearch and Kibana (Not needed if you use Elastic cloud). You can use the following flags: - -``` ---xpack.fleet.agents.elasticsearch.host=http://localhost:9200 ---xpack.fleet.agents.kibana.host=http://localhost:5601 -``` - -## Development - -### Getting started - -See the [Contributing to Kibana documentation](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) or head straight to the [Kibana Developer Guide](https://docs.elastic.dev/kibana-dev-docs/getting-started/welcome) for setting up your dev environment, run Elasticsearch and start Kibana. +Available Fleet settings are listed in the [official documentation](https://www.elastic.co/guide/en/kibana/current/fleet-settings-kb.html). For an exhaustive list including internal settings, refer to the [FleetConfigType](https://github.com/elastic/kibana/blob/main/x-pack/plugins/fleet/common/types/index.ts) type definition. This plugin follows the `common`, `server`, `public` structure described in the [Kibana Developer Guide](https://docs.elastic.dev/kibana-dev-docs/key-concepts/platform-intro). Refer to [The anatomy of a plugin](https://docs.elastic.dev/kibana-dev-docs/key-concepts/anatomy-of-a-plugin) in the guide for further details. -We follow the pattern of developing feature branches under your personal fork of Kibana. Refer to [Set up a Development Environment](https://docs.elastic.dev/kibana-dev-docs/getting-started/setup-dev-env) in the guide for further details. Other best practices including developer principles, standards and style guide can be found under the Contributing section of the guide. +Note: this plugin was previously named Ingest Manager, there are still a few references to that old name in the code. -Note: The plugin was previously named Ingest Manager, it's possible that some variables are still named with that old plugin name. +## Fleet setup -#### Dev environment setup +Refer to [the documentation](https://www.elastic.co/guide/en/fleet/current/fleet-deployment-models.html) for details on how to configure Fleet depending on the deployment model (self-managed, Elasticsearch Service or Elastic Cloud serverless). -These are some additional recommendations to the steps detailed in the [Kibana Developer Guide](https://docs.elastic.dev/kibana-dev-docs/getting-started/setup-dev-env). +Running a [self-managed stack](https://www.elastic.co/guide/en/fleet/current/add-fleet-server-on-prem.html) (see below for local development setup), in particular, required setting up a Fleet Server and configuring [Fleet settings](https://www.elastic.co/guide/en/kibana/8.13/fleet-settings-kb.html). -Note: this section details how to run Kibana in stateful mode. For serverless development, see the [Developing Kibana in serverless mode](dev_docs/developing_kibana_and_fleet_server.md) guide. +## Development -1. Create a `config/kibana.dev.yml` file by copying the existing `config/kibana.yml` file. -2. It is recommended to explicitly set a base path for Kibana (refer to [Considerations for basepath](https://www.elastic.co/guide/en/kibana/current/development-basepath.html) for details). To do this, add the following to your `kibana.dev.yml`: +### Getting started -```yml -server.basePath: / -``` +Refer to the [Contributing to Kibana](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) documentation for getting started with developing for Kibana. As detailed under the Contributing section of the documentation, we follow the pattern of developing feature branches under your personal fork of Kibana. -where `yourPath` is a path of your choice (e.g. your name). +Fleet development usually requires running Kibana from source alongside a snapshot of Elasticsearch, as detailed in the [Contributing to Kibana](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) documentation. The next section provides an overview of this process. -3. Bootstrap Kibana: +In addition, it is typically needed to set up a Fleet Server and enroll Elastic Agents in Fleet. Refer to one of the following guides depending on your requirements for details: +- [Running a local Fleet Server and enrolling Elastic Agents](dev_docs/local_setup/enrolling_agents.md) for developing Kibana in stateful (not serverless) mode +- [Developing Kibana in serverless mode](dev_docs/local_setup/developing_kibana_in_serverless.md) for developing Kibana in serverless mode +- [Developing Kibana and Fleet Server simultaneously](dev_docs/local_setup/developing_kibana_and_fleet_server.md) for doing simultaneous Kibana and Fleet Server development -```bash -yarn kbn bootstrap -``` +### Running Fleet locally in stateful mode -#### Running Elasticsearch and Kibana +Prerequisites: +- Fork the Kibana repository and clone it locally +- Install the `node` and `yarn` versions required by `.nvmrc` -- Start Elasticsearch in one shell (NB: you might want to add other flags to enable data persistency and/or running Fleet Server locally, see below): - ``` - yarn es snapshot -E xpack.security.authc.api_key.enabled=true -E xpack.security.authc.token.enabled=true - ``` -- Start Kibana in another shell: - ``` - yarn start - ``` - If you don't have a base path set up, add `--no-base-path` to `yarn start`. +Once that is set up, the high level steps are: +- Run Elasticsearch from snapshot +- Configure Kibana settings +- Run Kibana from source +- Enroll a Fleet Server +- Enroll Elastic Agents -#### Useful tips +#### Running Elasticsearch from snapshot -To avoid the enforcing of version headers when running in dev mode, add the following to your `kibana.dev.yml`: +As detailed in [Running Elasticsearch during development](https://www.elastic.co/guide/en/kibana/current/running-elasticsearch.html), there are different ways to run Elasticsearch when developing Kibana, with snapshot being the most common. -``` -server.versioned.versionResolution: oldest +To do this, run the following from the Kibana root folder: +```sh +yarn es snapshot --license trial ``` -This will provide a default version for the public apis. +The `--license trial` flag provides the equivalent of a Platinum license (defaults to Basic). -If Kibana fails to start, it is possible that your local setup got corrupted. An easy fix is to run: +In addition, it can be useful to set a folder for preserving data between runs (by default, data is stored inside the snapshot and lost on exit) with the `-E path.data=` setting. Common path choices are: +- `../data` (or any other name, e.g. `../mycluster`), which saves the data in the `.es` folder (in the Kibana root folder) +- `/tmp/es-data` -``` -yarn kbn clean && yarn kbn bootstrap -``` +Note: the required API key service and token service (cf. [Security settings in Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html)) set by `-E xpack.security.authc.api_key.enabled` and `-E xpack.security.authc.token.enabled` are enabled by default. -To avoid losing all your data when you restart Elasticsearch, you can provide a path to store the data when running the `yarn es snapshot ` command, e.g.: +Finally, setting up a Fleet Server requires setting the HTTP host to Fleet Server default host with `-E http.host=0.0.0.0`. +The complete command usually looks like: +```sh +yarn es snapshot --license trial -E path.data=../data -E http.host=0.0.0.0 ``` --E path.data=/tmp/es-data -``` - -Refer to the [Running Elasticsearch during development](https://www.elastic.co/guide/en/kibana/current/running-elasticsearch.html) page of the guide for other options. - -### Running Fleet Server Locally in a Container -It can be useful to run Fleet Server in a container on your local machine in order to free up your actual "bare metal" machine to run Elastic Agent for testing purposes. Otherwise, you'll only be able to a single instance of Elastic Agent dedicated to Fleet Server on your local machine, and this can make testing integrations and policies difficult. +#### Configure Kibana settings -Note: if you need to do simultaneous Kibana and Fleet Server development, refer to the [Developing Kibana and Fleet Server simulatanously](dev_docs/developing_kibana_and_fleet_server.md) guide. +Create a `config/kibana.dev.yml` file if you don't have one by copying the existing `config/kibana.yml` file. -_The following is adapted from the Fleet Server [README](https://github.com/elastic/fleet-server#running-elastic-agent-with-fleet-server-in-container)_ - -1. Add the following configuration to your `kibana.dev.yml` +To get started, it is recommended to set the following settings: +1\. The URL at which Kibana is available for end users: unless explicitly specified, this path is randomized in dev mode (refer to [Considerations for basepath](https://www.elastic.co/guide/en/kibana/current/development-basepath.html) for details). To set it, add the following to your `kibana.dev.yml`: ```yml -server.host: 0.0.0.0 -xpack.fleet.agents.enabled: true -xpack.fleet.packages: - - name: fleet_server - version: latest -xpack.fleet.agentPolicies: - - name: Fleet Server policy - id: fleet-server-policy - description: Fleet server policy - namespace: default - package_policies: - - name: Fleet Server - package: - name: fleet_server +server.basePath: /yourPath ``` +where `yourPath` is a path of your choice (e.g. your name; must not end with a slash). -2. Append the following option to the command you use to start Elasticsearch - +2\. The API version resolution: in dev mode, a version is required for all API requests. In other environements (e.g. production), the version falls back to `oldest` in stateful mode and `newest` in serverless mode for public APIs, while internal APIs always require a version. Set the API version resolution with: +```yml +server.versioned.versionResolution: oldest ``` --E http.host=0.0.0.0 + +3\. Fleet logging: +```yml +logging: + loggers: + - name: plugins.fleet + appenders: [console] + level: debug ``` -This command should look something like this: +You can find these settings along with others required to run a Fleet Server and enroll Elastic Agents in the [sample kibana.dev.yml file](dev_docs/local_setup/sample_kibana_dev_yml.md). -``` -yarn es snapshot --license trial -E xpack.security.authc.api_key.enabled=true -E xpack.security.authc.token.enabled=true -E path.data=/tmp/es-data -E http.host=0.0.0.0 -``` +#### Run Kibana from source -3. Run the Fleet Server Docker container. Make sure you include a `BASE-PATH` value if your local Kibana instance is using one. `YOUR-IP` should correspond to the IP address used by your Docker network to represent the host. For Windows and Mac machines, this should be `192.168.65.2`. If you're not sure what this IP should be, run the following to look it up: +From the Kibana root folder, bootstrap (install dependencies) and run Kibana with: -``` -docker run -it --rm alpine nslookup host.docker.internal +```sh +yarn kbn bootstrap && yarn start ``` -To run the Fleet Server Docker container: +Once the line "Kibana is now availabe" is logged, you can access Kibana in the browser at localhost:5601/your-base-path and log with the default `elastic` username and the password `changeme`. -``` -docker run -e KIBANA_HOST=http://{YOUR-IP}:5601/{BASE-PATH} -e KIBANA_USERNAME=elastic -e KIBANA_PASSWORD=changeme -e ELASTICSEARCH_HOST=http://{YOUR-IP}:9200 -e KIBANA_FLEET_SETUP=1 -e FLEET_SERVER_ENABLE=1 -e FLEET_SERVER_POLICY_ID=fleet-server-policy -p 8220:8220 docker.elastic.co/beats/elastic-agent:{VERSION} -``` +As a general rule, it is recommended to run `yarn kbn bootstrap` on branch change. Because merges to `main` are frequent, it is a good idea to run `yarn kbn bootstrap && yarn start` instead of just `yarn start` when frequently pulling latest `main`. -Ensure you provide the `-p 8220:8220` port mapping to map the Fleet Server container's port `8220` to your local machine's port `8220` in order for Fleet to communicate with Fleet Server. +If Kibana fails to start after switching branch or pulling the latest, try clearing caches with `yarn kbn clean` before bootstraping again. -Explore the available versions at https://www.docker.elastic.co/r/beats/elastic-agent. Only released versions are shown by default: tick the `Include snapshots` checkbox to see the latest version, e.g. `8.8.0-SNAPSHOT`. +If you are still encountering errors after `yarn kbn clean`, you can try a more aggressive reset with `yarn kbn reset`. -Once the Fleet Server container is running, you should be able to treat it as if it were a local process running on `https://localhost:8220` when configuring Fleet via the UI. You can then run `elastic-agent` on your local machine directly for testing purposes, or with Docker (recommended) see next section. +#### Set up a Fleet Server and enroll Elastic Agents -### Running Elastic Agent Locally in a Container (managed mode) +[Fleet Server](https://github.com/elastic/fleet-server) is the component that manages Elastic Agents within Fleet. It needs to be set up in order to enroll Elastic Agents into Fleet and is itself a special instance of Elastic Agent. -1. Create a new agent policy from the Fleet UI, by going to the Fleet app in Kibana > Agent policies > Add agent policy -2. Click "Add Agent" -3. Scroll down to the bottom of the flyout that opens to view the enrollment command, copy the contents of the `--enrollment-token` option -4. Run this docker command: - ``` - docker run -e FLEET_ENROLL=true -e FLEET_INSECURE=true -e FLEET_URL=https://192.168.65.2:8220 -e FLEET_ENROLLMENT_TOKEN= --rm docker.elastic.co/beats/elastic-agent:{VERSION} - ``` +This means that developing with enrolled agents requires at least two Elastic Agent instances: a Fleet Server and data shipping agents. As only one instance is allowed per host, the usual method is to run these instances in virtual machines or Docker containers. The [Running a local Fleet Server and enrolling Elastic Agents](dev_docs/local_setup/enrolling_agents.md) guide details this. + +Note: if you need to do simultaneous Kibana and Fleet Server development, refer to the [Developing Kibana and Fleet Server simultaneously](dev_docs/local_setup/developing_kibana_and_fleet_server.md) guide ### Tests @@ -164,13 +128,13 @@ Once the Fleet Server container is running, you should be able to treat it as if Kibana primarily uses Jest for unit testing. Each plugin or package defines a `jest.config.js` that extends a preset provided by the `@kbn/test` package. Unless you intend to run all unit tests within the project, you should provide the Jest configuration for Fleet. The following command runs all Fleet unit tests: -``` +```sh yarn jest --config x-pack/plugins/fleet/jest.config.js ``` You can also run a specific test by passing the filepath as an argument, e.g.: -``` +```sh yarn jest --config x-pack/plugins/fleet/jest.config.js x-pack/plugins/fleet/common/services/validate_package_policy.test.ts ``` @@ -180,39 +144,38 @@ API integration tests are run using the functional test runner (FTR). When devel Note: Docker needs to be running to run these tests. -1. In one terminal, run the server from the Kibana root directory with +1\. In one terminal, run the server from the Kibana root folder with - ``` + ```sh FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:server --config x-pack/test/fleet_api_integration/ ``` where `configFile` is the relevant config file relevant from the following: - - config.agent.ts - config.agent_policy.ts - config.epm.ts - config.fleet.ts - config.package_policy.ts -1. In a second terminal, run the tests from the Kibana root directory with +2\. In a second terminal, run the tests from the Kibana root folder with - ```bash + ```sh FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test/fleet_api_integration/ ``` Optionally, you can filter which tests you want to run using `--grep` - ```bash - FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test/fleet_api_integration/ --grep='fleet' + ```sh + FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test/fleet_api_integration/ --grep='my filter string' ``` -Note: you can also supply which Docker image to use for the Package Registry via the `FLEET_PACKAGE_REGISTRY_DOCKER_IMAGE` env variable. For example, +Note: you can supply which Docker image to use for the Package Registry via the `FLEET_PACKAGE_REGISTRY_DOCKER_IMAGE` env variable. For example, -```bash +```sh FLEET_PACKAGE_REGISTRY_DOCKER_IMAGE='docker.elastic.co/package-registry/distribution:production' FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner ``` -To speed up test you can also use the `FLEET_SKIP_RUNNING_PACKAGE_REGISTRY=true` flag to not re-run the package registry each time. When launching the test for the first time you will get the docker command to run the package registry. +You can also speed up the tests execution with the `FLEET_SKIP_RUNNING_PACKAGE_REGISTRY=true` flag, which avoids rerunning the package registry each time. Running the tests the first time will output the Docker command for running the package registry. ```bash FLEET_SKIP_RUNNING_PACKAGE_REGISTRY=true FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner @@ -220,18 +183,16 @@ FLEET_SKIP_RUNNING_PACKAGE_REGISTRY=true FLEET_PACKAGE_REGISTRY_PORT=12345 yarn #### API integration tests (serverless) -The process for running serverless API integration tests is similar as above. Security and observability project types have Fleet enabled. At the time of writing, the same tests exist for Fleet under these two project types. +The process for running serverless API integration tests is similar to above. Security and observability project types have Fleet enabled. At the time of writing, the same tests exist for Fleet under these two project types. Security: - -```bash +```sh FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:server --config x-pack/test_serverless/api_integration/test_suites/security/fleet/config.ts FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test_serverless/api_integration/test_suites/security/fleet/config.ts ``` Observability: - -```bash +```sh FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:server --config x-pack/test_serverless/api_integration/test_suites/observability/fleet/config.ts FLEET_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test_serverless/api_integration/test_suites/observability/fleet/config.ts ``` @@ -242,30 +203,30 @@ We support UI end-to-end testing with Cypress. Refer to [cypress/README.md](./cy #### Jest integration tests -Some features need to test different Kibana configuration, test with multiple Kibana instances, ... For this purpose, Jest integration tests can be used, which allow starting ES and Kibana as required for each test +Some features require testing under specific conditions, such as different Kibana configurations or multiple Kibana instances. Jest integration tests allow starting Elasticsearch and Kibana as required for each test. -To run these tests `docker` needs to be running on your environment. +These tests, however, are slow and difficult to maintain. API integration tests should therefore be preferred whenever possible. -You can run the tests with the following commands: +Note: Docker needs to be running to run these tests. -```bash +Run the tests from the Kibana root folder with: + +```sh node scripts/jest_integration.js x-pack/plugins/fleet/server/integration_tests/ ``` -You could also use node debugger to inspect ES indices (add the `debugger` directive in your test) +Running the tests with [Node Inspector](https://nodejs.org/en/learn/getting-started/debugging) allows inspecting Elasticsearch indices. To do this, add a `debugger;` statement in the test (cf. [Jest documentation](https://jestjs.io/docs/troubleshooting)) and run `node` with `--inspect` or `--inspect-brk`: -```bash +```sh node --inspect scripts/jest_integration.js x-pack/plugins/fleet/server/integration_tests/ ``` -However, these tests are slow and harder to maintain. Therefore, we should try to avoid them and use API integration tests instead whenever possible. - ### Storybook Fleet contains [Storybook](https://storybook.js.org/) stories for developing UI components in isolation. To start the Storybook environment for Fleet, run the following from your `kibana` project root: ```sh -$ yarn storybook fleet +yarn storybook fleet ``` Write stories by creating `.stories.tsx` files colocated with the components you're working on. Consult the [Storybook docs](https://storybook.js.org/docs/react/get-started/introduction) for more information. diff --git a/x-pack/plugins/fleet/dev_docs/developing_kibana_and_fleet_server.md b/x-pack/plugins/fleet/dev_docs/local_setup/developing_kibana_and_fleet_server.md similarity index 76% rename from x-pack/plugins/fleet/dev_docs/developing_kibana_and_fleet_server.md rename to x-pack/plugins/fleet/dev_docs/local_setup/developing_kibana_and_fleet_server.md index 745f205c72a03..9752e129e1d40 100644 --- a/x-pack/plugins/fleet/dev_docs/developing_kibana_and_fleet_server.md +++ b/x-pack/plugins/fleet/dev_docs/local_setup/developing_kibana_and_fleet_server.md @@ -1,4 +1,4 @@ -# Developing Kibana and Fleet Server simulatanously +# Developing Kibana and Fleet Server simultaneously Many times, a contributor to Fleet will only need to make changes to [Fleet Server](https://github.com/elastic/fleet-server) or [Kibana](https://github.com/elastic/kibana) - not both. But, there are times when end-to-end changes across both componenents are necessary. To facilitate this, we've created a guide to help you get up and running with a local development environment that includes both Kibana and Fleet Server. This is a more involved process than setting up either component on its own. @@ -296,109 +296,9 @@ docker run --add-host host.docker.internal:host-gateway \ docker.elastic.co/beats/elastic-agent:8.13.0-SNAPSHOT # <-- Update this version as needed ``` -You can also create a `run-dockerized-agent.sh` file as below to make this process easier. This script will run a Docker container with Elastic Agent and enroll it to your local Fleet Server. You can also use it to run a Dockerized Fleet Server container if you don't need to develop Fleet Server locally. +You can also use the [run_dockerized_agent.sh](./run_dockerized_elastic_agent.sh) script to make this process easier. This script will run a Docker container with Elastic Agent and enroll it to your local Fleet Server. You can also use it to run a Dockerized Fleet Server container if you don't need to develop Fleet Server locally. -```bash -#!/usr/bin/env bash - -# Name this file `run-dockerized-agent.sh` and place it somewhere convenient. Make sure to run `chmod +x` on it to make it executable. - -# This script is used to run a instance of Elastic Agent in a Docker container. -# Ref.: https://www.elastic.co/guide/en/fleet/current/elastic-agent-container.html - -# To run a Fleet server: ./run_dockerized_agent.sh fleet_server -# To run an agent: ./run_dockerized_agent agent -e -v -t - -# NB: this script assumes a Fleet server policy with id "fleet-server-policy" is already created. - -CMD=$1 - -while [ $# -gt 0 ]; do - case $1 in - -e | --enrollment-token) ENROLLMENT_TOKEN=$2 ;; - -v | --version) ELASTIC_AGENT_VERSION=$2 ;; - -t | --tags) TAGS=$2 ;; - esac - shift -done - -DEFAULT_ELASTIC_AGENT_VERSION=8.13.0-SNAPSHOT # update as needed - -# Needed for Fleet Server -ELASTICSEARCH_HOST=http://host.docker.internal:9200 # should match Fleet settings or xpack.fleet.agents.elasticsearch.hosts in kibana.dev.yml -KIBANA_HOST=http://host.docker.internal:5601 -KIBANA_BASE_PATH=kyle # should match server.basePath in kibana.dev.yml -FLEET_SERVER_POLICY_ID=fleet-server-policy # as defined in kibana.dev.yml - -# Needed for agent -FLEET_SERVER_URL=https://host.docker.internal:8220 - -printArgs() { - if [[ $ELASTIC_AGENT_VERSION == "" ]]; then - ELASTIC_AGENT_VERSION=$DEFAULT_ELASTIC_AGENT_VERSION - echo "No Elastic Agent version specified, setting to $ELASTIC_AGENT_VERSION (default)" - else - echo "Received Elastic Agent version $ELASTIC_AGENT_VERSION" - fi - - if [[ $ENROLLMENT_TOKEN == "" ]]; then - echo "Warning: no enrollment token provided!" - else - echo "Received enrollment token: ${ENROLLMENT_TOKEN}" - fi - - if [[ $TAGS != "" ]]; then - echo "Received tags: ${TAGS}" - fi -} - -echo "--- Elastic Agent Container Runner ---" - -if [[ $CMD == "fleet_server" ]]; then - echo "Starting Fleet Server container..." - - printArgs - - docker run \ - -e ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST} \ - -e KIBANA_HOST=${KIBANA_HOST}/${KIBANA_BASE_PATH} \ - -e KIBANA_USERNAME=elastic \ - -e KIBANA_PASSWORD=changeme \ - -e KIBANA_FLEET_SETUP=1 \ - -e FLEET_INSECURE=1 \ - -e FLEET_SERVER_ENABLE=1 \ - -e FLEET_SERVER_POLICY_ID=${FLEET_SERVER_POLICY_ID} \ - -e ELASTIC_AGENT_TAGS=${TAGS} \ - -p 8220:8220 \ - --rm docker.elastic.co/beats/elastic-agent:${ELASTIC_AGENT_VERSION} - -elif [[ $CMD == "agent" ]]; then - echo "Starting Elastic Agent container..." - - printArgs - - docker run \ - -e FLEET_URL=${FLEET_SERVER_URL} \ - -e FLEET_ENROLL=1 \ - -e FLEET_ENROLLMENT_TOKEN=${ENROLLMENT_TOKEN} \ - -e FLEET_INSECURE=1 \ - -e ELASTIC_AGENT_TAGS=${TAGS} \ - --rm docker.elastic.co/beats/elastic-agent:${ELASTIC_AGENT_VERSION} - -elif [[ $CMD == "help" ]]; then - echo "Usage: ./run_elastic_agent.sh -e -v -t " - -elif [[ $CMD == "" ]]; then - echo "Command missing. Available commands: agent, fleet_server, help" - -else - echo "Invalid command: $CMD" -fi -``` - -Another option is to use a lightweight virtualization provider like https://multipass.run/ and enrolling agents using an enrollment token generated via Fleet UI. You will need to add a Fleet Server Host entry + Output to your Fleet settings that corresponds with your Multipass bridge network interface, similar to how we've set up Docker above. - -_To do: add specific docs for enrolling Multipass agents and link here_ +Another option is to use a lightweight virtualization provider like https://multipass.run/ and enroll agents using an enrollment token generated via Fleet UI. You will need to update your Fleet Settings with a Fleet Server Host entry + Output that corresponds with your Multipass bridge network interface, similar to how we've set up Docker above. Refer to [Running a local Fleet Server and enrolling Elastic Agents](./enrolling_agents.md) for details about how to use Multipass. ## Running in serverless mode diff --git a/x-pack/plugins/fleet/dev_docs/developing_kibana_in_serverless.md b/x-pack/plugins/fleet/dev_docs/local_setup/developing_kibana_in_serverless.md similarity index 100% rename from x-pack/plugins/fleet/dev_docs/developing_kibana_in_serverless.md rename to x-pack/plugins/fleet/dev_docs/local_setup/developing_kibana_in_serverless.md diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/enrolling_agents.md b/x-pack/plugins/fleet/dev_docs/local_setup/enrolling_agents.md new file mode 100644 index 0000000000000..6c657cf7e5862 --- /dev/null +++ b/x-pack/plugins/fleet/dev_docs/local_setup/enrolling_agents.md @@ -0,0 +1,237 @@ +# Running a local Fleet Server and enrolling Elastic Agents + +This guide assumes Elasticsearch is running from snapshot and Kibana is running from source as detailed in [the README](../README.md#running-fleet-locally-in-stateful-mode). Note that `-E http.host=0.0.0.0` must be passed to `yarn es snapshot`. + +As explained in the [Set up a Fleet Server and enroll Elastic Agents](../README.md#set-up-a-fleet-server-and-enroll-elastic-agents) section, is it useful to run Elastic Agents in virtual machines or Docker containers for testing purposes. This guide provides step-by-step instructions for both methods using HTTP (note: you can also mix both and have e.g. a dockerized Fleet Server and agents on VMs). Refer to [Developing Kibana and Fleet Server simultaneously](./developing_kibana_and_fleet_server.md) for details about using HTTPS instead. + +## Kibana config + +Add the following to your `kibana.dev.yml`. Note that the only differences between VM and container setups are the URLs of the Fleet Server host and Elasticsearch output. If you want to set up a Fleet Server on a VM, you will first need to launch the VM in order to get the IP address. + +```yml +# Set the Kibana server address to Fleet Server default host. +server.host: 0.0.0.0 + +# Install Fleet Server package. +xpack.fleet.packages: + - name: fleet_server + version: latest + +# Create an agent policy for Fleet Server. +xpack.fleet.agentPolicies: + - name: Fleet Server policy + id: fleet-server-policy + is_default_fleet_server: true + # is_managed: true # Useful to mimic cloud environment + description: Fleet server policy + namespace: default + package_policies: + - name: Fleet Server + package: + name: fleet_server + inputs: + - type: fleet-server + keep_enabled: true + vars: + - name: host + value: 0.0.0.0 + frozen: true + - name: port + value: 8220 + frozen: true + +# Set a default Fleet Server host. +xpack.fleet.fleetServerHosts: + - id: default-fleet-server + name: Default Fleet server + is_default: true + # host_urls: [https://:8220] # For running a Fleet Server in a VM + # host_urls: ['https://host.docker.internal:8220'] # For running a Fleet Server Docker container + +# Set a default Elasticsearch output. +xpack.fleet.outputs: + - id: es-default-output + name: Default output + type: elasticsearch + is_default: true + is_default_monitoring: true + # hosts: ['http://:9200'] # For enrolling agents on VM + # hosts: ['http://host.docker.internal:9200'] # For enrolling dockerized agents +``` + +## Using Multipass VMs + +[Multipass](https://multipass.run/) is a lightweight virtualization tool for running Ubuntu VMs. Follow the instructions at https://multipass.run/install to install Multipass on your local machine. + +Advantages of running Elastic Agents on a VM include: +- More realistic setup. +- Ability to use the `elastic-agent` commands, e.g. `sudo elastic-agent status`, `sudo elastic-agent restart`... +- Agents can be upgraded. +- Elastic Defend can be installed. + +To run a Fleet Server and agents on VMs, make sure the default output host defined in your `kibana.dev.yml` uses your local IP address (NB: using `localhost` can cause connection issues). For Mac users using a WiFi connection, the local IP address can be retrieved with: +```sh +ipconfig getifaddr en0 +``` + +The default Fleet Server host can be set once the VM for the Fleet Server is running. + +In Fleet UI, these host URLs should be reflected in the Settings page: +![Fleet settings UI showing hosts for agents on VM](./screenshots/vm_fleet_settings.png) + +### Running a Fleet Server + +1\. Launch a Multipass instance for your Fleet Server: +```sh +multipass launch --name fleet-server --disk 10G --network en0 +``` + +Available options are detailed at https://multipass.run/docs/launch-command. + +It is generally recommended to provide additional disk space (default 5G) for running Elastic Agents. + +In addition, the `--network` option adds a network interface to the instance, in this case `en0`. This allows the Fleet Server instance to communicate with the enrolled agents via the wifi network interface. You can find out the IP address by running: +```sh +multipass list +``` + +Example output: +```sh +Name State IPv4 Image +fleet-server Running 192.168.1.1 Ubuntu 24.04 LTS + 192.168.1.100 +``` + +Copy the second IP address into the host URLs of the Fleet Server host in your `kibana.dev.yml`. Wait for Kibana to restart. + +2\. Shell into the instance: +```sh +multipass shell fleet-server +``` + +3\. Open Kibana in a browser and head over to Fleet. Initially, there should be no Fleet Server: +![Fleet UI with no Fleet Server](./screenshots/no_fleet_server.png) + +4\. Click "Add Fleet Server". In the flyout, check that the Fleet Server host is correct and click "Continue". +![Fleet UI showing the Add Fleet Server flyout, step 1](./screenshots/vm_fleet_server_1.png) +![Fleet UI showing the Add Fleet Server flyout, step 2](./screenshots/vm_fleet_server_2.png) + +5\. Before copying the install instructions, amend the download URL to suit the desired version and your host architecture: +- Because Multipass only supports the host's architecture, you may need to change `linux-x86_64` to `linux-arm64` (e.g. on M-series Macbooks). +- By default, the proposed version is the latest release. You can explore available versions at https://artifacts-api.elastic.co/v1/versions and then check out `https://artifacts-api.elastic.co/v1/versions//builds/latest` to find the relevant download URL. An even easier way is to use the API: the following command will output the download URL for the `elastic-agent-8.15.0-SNAPSHOT-linux-arm64.tar.gz` version: + ```sh + curl -s https://artifacts-api.elastic.co/v1/versions/8.15-SNAPSHOT/builds/latest | \ + jq '.build.projects."elastic-agent-package".packages."elastic-agent-8.15.0-SNAPSHOT-linux-arm64.tar.gz".url' + ``` + +6\. With the modified install URL, copy the install instructions from the flyout and install the agent in the VM (hit Enter to confirm when running `sudo ./elastic-agent install`). After a few seconds the Fleet Server should be connected. +![Fleet UI showing the Add Fleet Server flyout, step 3](./screenshots/vm_fleet_server_3.png) + +7\. You can click "Continue enrolling agents" to proceed to agent enrolling. + +### Enrolling Elastic Agents + +1\. In Fleet UI, click "Add agent". Select or create an agent policy which the agent will be assigned to. Leaving "Collect system logs and metrics" checked will install the `system` integration, which is a good way of checking data ingestion. Note that the agent policy will use the default Fleet Server host and default Elasticsearch output defined in your `kibana.dev.yml`. +![Fleet UI showing add agent on VM flow, step 1](./screenshots/vm_add_agent_1.png) + +2\. Launch a Multipass instance, e.g.: +```sh +multipass launch --name agent1 --disk 10G +``` + +3\. Shell into the instance: +```sh +multipass shell agent1 +``` + +4\. Refer to the [Running a Fleet Server](#running-a-fleet-server) section above for modifying the Elastic Agent download URL to suit your architecture and desired version. Install and extract the agent binary as instructed in the flyout. + +5\. Run the `sudo ./elastic-agent install` command provided in the instructions, adding the `--insecure` flag as we are connecting to Elasticsearch using HTTP. After a few seconds the UI should confirm that the agent is enrolled and shipping data: +![Fleet UI showing add agent on VM flow, step 2](./screenshots/vm_add_agent_2.png) + +### Gotchas + +1\. The system clock within Multipass instances stops when the host computer is suspended (see https://askubuntu.com/questions/1486977/repeated-incorrect-time-in-multipass-clients-with-ubuntu-22-04). This can result in a running Elastic Agent being incorrectly "in the past" after your laptop was asleep for a while. The easiest fix is to restart all Multipass instances, which will reset their clocks: +```sh +multipass restart --all +``` + +2\. As noted in the enrollment steps above, the architecture of a Multipass VM matches the one of the host. If the agent installation fails, check that the downloaded agent binary has the correct architecture type. + +## Using Docker containers + +Official documentation: https://www.elastic.co/guide/en/fleet/current/elastic-agent-container.html + +The main advantage of running Elastic Agents in a Docker container is a one command setup that can be easily be scripted (see [Using the `run_dockerized_agent.sh` script](#using-the-run_dockerized_agentsh-script) below). There are a few limitations, however, including: +- Agents cannot be upgraded. +- Elastic Defend cannot be installed. + +To use dockerized Fleet Server and agents, make sure the default Fleet Server host and default output defined in your `kibana.dev.yml` use `host.docker.internal`. + +In Fleet UI, these host URLs should be reflected in the Settings page: +![Fleet settings UI showing hosts for dockerized agents](./screenshots/docker_fleet_settings.png) + +### Running a Fleet Server + +With Docker running, launch your Fleet Server with: +```sh +docker run \ + -e ELASTICSEARCH_HOST=http://host.docker.internal:9200 \ + -e KIBANA_HOST=http://host.docker.internal:5601/your-base-path \ + -e KIBANA_USERNAME=elastic \ + -e KIBANA_PASSWORD=changeme \ + -e KIBANA_FLEET_SETUP=1 \ + -e FLEET_INSECURE=1 \ + -e FLEET_SERVER_ENABLE=1 \ + -e FLEET_SERVER_POLICY_ID=fleet-server-policy \ + -p 8220:8220 \ + --rm docker.elastic.co/beats/elastic-agent: +``` +where the version can be e.g. `8.13.3` or `8.15.0-SNAPSHOT`. You can explore the available versions at https://www.docker.elastic.co/r/beats/elastic-agent. + +You can also check the list of available environment variables for the `docker run` command in the [elastic-agent source code](https://github.com/elastic/elastic-agent/blob/main/internal/pkg/agent/cmd/container.go#L66-L134). + +Note the `-p 8220:8220` port mapping to map the Fleet Server container's port `8220` to your local machine's port `8220` in order for Fleet to communicate with Fleet Server. + +Once the container is running, it can be treated as a local process running on `https://localhost:8220` and your Fleet Server should be enrolled in Fleet: +![Fleet UI with dockerized Fleet Server](./screenshots/docker_fleet_server.png) + +### Enrolling Elastic Agents + +1\. In Fleet UI, click "Add agent". In the flyout, select or create an agent policy which the agent will be assigned to. Leaving "Collect system logs and metrics" checked will install the `system` integration, which is a good way of checking data ingestion. Note that the agent policy will use the default Fleet Server host and default Elasticsearch output defined in your `kibana.dev.yml`. +![Fleet UI showing add dockerized agent flow, step 1](./screenshots/docker_add_agent_1.png) + +2\. Scroll down to the enrollment CLI steps and copy the enrollment token from the end of the `sudo ./elastic-agent install` command. + +3\. Enroll the agent with: +```sh +docker run \ + -e FLEET_URL=https://host.docker.internal:8220 \ + -e FLEET_ENROLL=1 \ + -e FLEET_ENROLLMENT_TOKEN= \ + -e FLEET_INSECURE=1 \ + --rm docker.elastic.co/beats/elastic-agent: +``` + +After a short moment, the UI should confirm that the agent is enrolled and shipping data: +![Fleet UI showing add dockerized agent flow, step 2](./screenshots/docker_add_agent_2.png) + +Tip: if the agent enrolls but there is no incoming data, check the host URL of the default output. + +### Using the `run_dockerized_agent.sh` script + +You can make either running a Fleet Server or enrolling an agent quicker by using the [run_dockerized_agent.sh](./run_dockerized_elastic_agent.sh) script: +- Copy the script place it somewhere convenient. +- Run `chmod +x` on it to make it executable. +- Update the version and the Kibana base path within the script. + +Run a Fleet Server with: +```sh +./run_elastic_agent.sh fleet_server +``` + +And enroll an Elastic Agent with: +```sh +./run agent -e -v -t +``` +where the version and tags are optional. diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/run_dockerized_elastic_agent.sh b/x-pack/plugins/fleet/dev_docs/local_setup/run_dockerized_elastic_agent.sh new file mode 100644 index 0000000000000..0d40894ec58d8 --- /dev/null +++ b/x-pack/plugins/fleet/dev_docs/local_setup/run_dockerized_elastic_agent.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +# This script is used to run a instance of Elastic Agent in a Docker container. +# Ref.: https://www.elastic.co/guide/en/fleet/current/elastic-agent-container.html + +# To run a Fleet server: ./run_elastic_agent.sh fleet_server +# To run an agent: ./run agent -e -v -t +# NB: this script assumes a Fleet server policy with id "fleet-server-policy" is already created. + +CMD=$1 + +while [ $# -gt 0 ]; do + case $1 in + -e | --enrollment-token) ENROLLMENT_TOKEN=$2 ;; + -v | --version) ELASTIC_AGENT_VERSION=$2 ;; + -t | --tags) TAGS=$2 ;; + esac + shift +done + +DEFAULT_ELASTIC_AGENT_VERSION=8.15.0-SNAPSHOT # update as needed +ELASTICSEARCH_HOST=http://host.docker.internal:9200 +KIBANA_HOST=http://host.docker.internal:5601 +KIBANA_BASE_PATH=your-base-path +FLEET_SERVER_URL=https://host.docker.internal:8220 +FLEET_SERVER_POLICY_ID=fleet-server-policy + +printArgs() { + if [[ $ELASTIC_AGENT_VERSION == "" ]]; then + ELASTIC_AGENT_VERSION=$DEFAULT_ELASTIC_AGENT_VERSION + echo "No Elastic Agent version specified, setting to $ELASTIC_AGENT_VERSION (default)" + else + echo "Received Elastic Agent version $ELASTIC_AGENT_VERSION" + fi + + if [[ $ENROLLMENT_TOKEN == "" ]]; then + echo "Warning: no enrollment token provided!" + else + echo "Received enrollment token: ${ENROLLMENT_TOKEN}" + fi + + if [[ $TAGS != "" ]]; then + echo "Received tags: ${TAGS}" + fi +} + +echo "--- Elastic Agent Container Runner ---" + +if [[ $CMD == "fleet_server" ]]; then + echo "Starting Fleet Server container..." + + printArgs + + docker run \ + -e ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST} \ + -e KIBANA_HOST=${KIBANA_HOST}/${KIBANA_BASE_PATH} \ + -e KIBANA_USERNAME=elastic \ + -e KIBANA_PASSWORD=changeme \ + -e KIBANA_FLEET_SETUP=1 \ + -e FLEET_INSECURE=1 \ + -e FLEET_SERVER_ENABLE=1 \ + -e FLEET_SERVER_POLICY_ID=${FLEET_SERVER_POLICY_ID} \ + -e ELASTIC_AGENT_TAGS=${TAGS} \ + -p 8220:8220 \ + --rm docker.elastic.co/beats/elastic-agent:${ELASTIC_AGENT_VERSION} + +elif [[ $CMD == "agent" ]]; then + echo "Starting Elastic Agent container..." + + printArgs + + docker run \ + -e FLEET_URL=${FLEET_SERVER_URL} \ + -e FLEET_ENROLL=1 \ + -e FLEET_ENROLLMENT_TOKEN=${ENROLLMENT_TOKEN} \ + -e FLEET_INSECURE=1 \ + -e ELASTIC_AGENT_TAGS=${TAGS} \ + --rm docker.elastic.co/beats/elastic-agent:${ELASTIC_AGENT_VERSION} + +elif [[ $CMD == "help" ]]; then + echo "Usage: ./run_elastic_agent.sh -e -v -t " + +elif [[ $CMD == "" ]]; then + echo "Command missing. Available commands: agent, fleet_server, help" + +else + echo "Invalid command: $CMD" +fi diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/sample_kibana_dev_yml.md b/x-pack/plugins/fleet/dev_docs/local_setup/sample_kibana_dev_yml.md new file mode 100644 index 0000000000000..3750250cf8c03 --- /dev/null +++ b/x-pack/plugins/fleet/dev_docs/local_setup/sample_kibana_dev_yml.md @@ -0,0 +1,87 @@ +# Sample kibana.dev.yml for Fleet development + +```yml +# =================== System: Kibana Server =================== + +# Specifies a path to mount Kibana at. +server.basePath: /yourname # <--- CHANGE ME +# Specifies the address to which the Kibana server will bind. +server.host: 0.0.0.0 # Fleet Server default host +# Provides an API version. Set to 'oldest' in stateful mode, 'newest' in serverless mode. +server.versioned.versionResolution: oldest + +# =================== System: Elasticsearch =================== + +# The URLs of the Elasticsearch instances. +elasticsearch.hosts: [http://localhost:9200] + +# =================== System: Logging =================== + +logging: + loggers: + - name: plugins.fleet + appenders: [console] + level: debug + # Logs queries sent to Elasticsearch. + # - name: elasticsearch.query + # level: debug + +# =================== Fleet Settings =================== + +# Official Fleet settings documentation: https://www.elastic.co/guide/en/kibana/current/fleet-settings-kb.html +# FleetConfigType definition: https://github.com/elastic/kibana/blob/main/x-pack/plugins/fleet/common/types/index.ts +# PluginConfigDescriptor definition: https://github.com/elastic/kibana/blob/main/x-pack/plugins/fleet/server/config.ts + +# xpack.fleet.registryUrl: https://localhost:8080 + +# xpack.fleet.enableExperimental: [] + +# Allows enrolling agents when standalone Fleet Server is in use +# xpack.fleet.internal.fleetServerStandalone: true + +xpack.fleet.fleetServerHosts: + # ID must be default-fleet-server if running in serverless mode + - id: default-fleet-server + name: Default Fleet server + is_default: true + host_urls: ['https://:8220'] # For running a Fleet Server in a VM <--- CHANGE ME + # host_urls: ['https://host.docker.internal:8220'] # For running a Fleet Server Docker container + +xpack.fleet.outputs: + # ID must be es-default-output if running in serverless mode + - id: es-default-output + name: Default output + type: elasticsearch + is_default: true + is_default_monitoring: true + hosts: ['http://:9200'] # For enrolling agents on VM <--- CHANGE ME + # hosts: ['http://host.docker.internal:9200'] # For enrolling dockerized agents + +xpack.fleet.packages: + - name: fleet_server + version: latest + +xpack.fleet.agentPolicies: + - name: Fleet Server policy + id: fleet-server-policy + is_default_fleet_server: true + # is_managed: true # Useful to mimic cloud environment + description: Fleet server policy + namespace: default + package_policies: + - name: Fleet Server + id: fleet_server + package: + name: fleet_server + inputs: + - type: fleet-server + keep_enabled: true + vars: + - name: host + value: 0.0.0.0 + frozen: true + - name: port + value: 8220 + frozen: true + +``` diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_add_agent_1.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_add_agent_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd826022499d1cea7da986b419d0ebd389b952d GIT binary patch literal 383468 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

    v7buQ&Krl|KvN!%FDh+xeRCQEsXixAC4)H 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%0D=b{F{i~i>+H>MomB?Pk>?!?^B z|NWQCe&mET#imLn1l`o~>o@^Cu!TCsqP1s)dGYgEtYzv0v;AKl^-aZlogd=vGIb1R zmn654yT1Tzx+jYcLUbd_{RvW;e;<|;$>_GmYCX$Lr^s6zQPCz1m3wsw^2k3fw}{tK zVkIyVmk1jPeny;;$lOAo{jD9G3SPTQ$MwG;asYD!z4AAhn^~-z_3DlP-<_v-KyChe zfs$Zyl35NXe9$d~kFz1*o3#F%764D@wgFG#MN6_E0(2tq6=9J02nP}^w*rY+{Zjn@ zr+%s2fNOv0`Tj3>7k{bJT>AzFj{c8T8khdxL+zW7DB)V4b(jentZm%TM1I-sinGoa z-ElbWz0x*7h#&aB03DW3?s;&Z(6RKgIFZQN!b)IY@l0WG9L3*Rz{3Bz1^h1vp#m5^ z5gho6u(SORCxP7m3ley6Cm7^%OI{w>sSCF`cM}4lZ;s;d%hCTnegW^YBFo0X0fuA+ z$8B>(!tsOv{`}g2ZxsPO?f^BF5=Kq*j5}5|+02R_?Qs6gO-tA@+~-4>w0{%FPyh~^ z_Oq0W5|ji>SeW&3Od5}0Z`)0dp12yO9h#4(lRyYr&b2HvM5ZSzVTdKNQ3$3HLU;mn z+yd`=idB*0WpD;3+O4FJk?o=Il@;u4Y zn}k5qj@{*##SpzGCzOt-z1kS*h4wDxS4vjQb?iq;*)}WpfgkF#( z|B(~Z)$W9}F5P6Z4e~rZdQty zd*Iyj(L2s>qko5pX6%8Z6ODPtL{L#EtSbul%}RRE< zcm?3+qt&hZk9CDD1pT_NP#hnXmHfd+>RR0ir$ECot-;Be%vP5*f-#JG@~_nA?}~ky zulXm&UU$@!kk4v-5BHMNo`1e%Mv;odLHi-c`pbhx>AThl?mW9fUOWB?lw>w(i4r0| zeJM^dW2rX1;d;>8>^gSMl1!wu1UnJYLL~7v!U0N|u*fU(sQphG<9h+}%Q$E9(xOm$o1#yDd8*%Wi>TNLx$WR19s6-4}UNz zXTB7&=I5K>bp1r0Y>3JC_Z4d=tAb2m_qDfr91tZ~p}n!DtppI26Ovp@{brZpcg6p*SoUX|E>|99&f&Pfd7n@}ipH=Jc!roZh!M&gfu-K{u+ zi~2$T&@Y;;yCBqj$Mca1NVV3NPM1J$k!khRY(1-4IcrLx34>WnIQ$@urK=USM=M3n z+Q-tqhME{vGKcQfrLWL|;Lr^^z=QI|N?zr2>3G(gyw|Wdq7;sFzBQ1R_bkd)vA!JH zRsD7{8%1qvh273G+UQhTG)8`}cyX3GO1%btRt`)YWHBG9D(;|jkLn1Z0pH(+ZQm0| zc!-5 zd#>_62NU?|3cr*$pw;WPnVkD^nP}yzz-E(HC!3@d_m6+vDj~xw$SIjuf?%5GLp40HK+$-fyc5+m$FPs>j-| zw!uPr$Zx0XC9y3>)C$~p-7_0?vv^Ol3HK@a0HRMK4WMZ|e>%Y7>Q%v=_P=GWbkx^f z>a0F~T0$06{whw-ivNPdaG_7Ik3939_*+e_XpW}$N@clV0ZQhApU`v%>s0d-Od=+> zmo~p#mmu2N9|VDAsg@@4go+@?wzIEqYVe3~y^e$jKSx zY4qaW(*L1NnT^GOq(GD79Qq8!>e%SDr8I?to%hnKn&NJ1lz7md7~erj;&Oog&|E<1 z@Pg(Jb`I89|1y0YW!X2bzpFnr;JCyO4gNN9^;ebo-4CbuD*td?X3MGO+m7gA>X%{} zDD)RjflGEiAp+|?K6u}OE<6pgVJlrD!M&(?!3AC0!4GulVbH}F<}D}pKBZk*T@zvt zlMPVT3M-uJ5NC%^1RohAkH0q?$WuR^=kivLUsM!gO3haZC8fB6E`B|^4}A1{<)oet z*tf|O&u@a-m!0>*z}&n@)YluLr{B>$E&NR!)6RA~0;tCtG)xc?9%2^9sjYkX@0XMM zHCMLqQ#oX6>dH*%SgsuST8X& z(4~*)e|=)ZR2D@h@)pcqm0Gcz{T{vx^R}35gblhV_P$8BXUV(o1yh*Z$bnU88Btm( zIzOt(Erg2#>|g_#WknH}4>f!{A$4e*n6S5XuRm%2W)oYF)q`KmHWN3cPJ{S=`V}LxGAX4s7P;_F-)2WuCUE-KChM z_D10n@lHsPnV?I`pxK(DOG+VTm|5w4l&Jfy5EH|SvrIHWmZ$ECK4+TnwR@Iwrcz3o zQe;?JHRr)iHI=5i{q`FDPvFe0aTU7@^t{-o!$u{ zA4`4+|Lyj_{3!P5k<)@V9^ZsjyE`Gr)_d?)b6-NrKslcUoJ{yed-J)d-eePT%nNPp zOPAn-UaU`xko|&}x>*+mIhDGNmRlmynv|O&$^K2#Zz1d1?_iP(7Wz3YC?$_`aeoid z?(zu><5*m+%nUd_rmqfF0}G==?aO>WGaZ^+08AIi<&tt=cJ$YXfFd_=YC*70BHt*O zgOF-DL=Qr|M5DJN`8OvzK4B{zQeL^F0CN{?)R@4UKZSM+t4QlhI7JgKk#3@kD75y- zFf*_zuV_$(zxTj6;&B?U9Okm=+=(3lYhkAH)m*>z!@YN4cb^IvZbt7x z)eO^<$@WHBqxda(Ghd9$_~zAESTs7{ zxo4+BqT=TwWOn*M`7#ml8YWZ~U7)Wl@UdcNJTQUr3i{Lr+1f^}y0E!uC%NHtyZ%Ho zi8Ya#m7GRs&4_&hJ)(#vJz_f4xVxaM9i8K9-1S}}{Da6qnEkiR&vRsq&Zoe2Qy+KpJGL+x8DJ-u^flBAP-bnwY-SS-Z4Q{h93hh?!mm zFo`H$M|cOvvE3Y!$Qfjuo4Gi*zQZCX`k&kGb%K1O8)LKn|GhaE$sd z#^N0)nVBs=4(4gJ=cL}|NUALFAbL8r0PA8bL53@pYP3mNFtzv&EO&WI`<3|^K-^dT zn^{Zgpy7=V9v{?IeXo4(`SQD|G$Aq?K~xb^vfA_Y+Vq5TQmobYZyMhly*-bT>_*wI zosJZhB4uR?vwd~K>hsCB=eWh@dMeDy$=nYVKa(*|P)djielYshyw+vu_AaHBJsy_M zLLq~1N~92-sA$#nu|#3+Cv(FiN3S>=(?$maTc<)yF)d{jSAZ)VT2~im$ zTs#gFUelp<_D7<*joPkM3$2_n=t`FHK}E;KT@#s~P=NN$X7}+ii5-c~xZhbxa?p^z zj*aS0L7pUCI{z(=E=ikCI|Z#S#q_%FF&_sX8r!q`}B><+!^Mxr)-W6b0C8uUAIQZ8R6%->8$ncY8?i@l$k|3x_ zG_;9w{IQ4y&s|=fqS=UIL$QT6>ODm0bc`lVUnF9!DQ~5{wJSFaN|oqwtFhnzU0#es zwcg@EYM!~*Me?23nNIYDx~@6c&(fZlKS6il`_+XeXi1mQs_96Vb_y*_I;gpQ$xS+! zc8+#xCnW5~!W~-Z=uj=@jmXlPb>~_caG`vr{8wqphv5sJZ!5yyu1@RF{2F|r$AGC3 zeVxMJUj2ug|NNKBt^I?Z^$q8KapLMg@uHnBvBS{pF>;f7Y1Z_q{?BrKu(c}XoAPfs zN@<-QDcU&Q8RN*)z)Y9Z%F-ul1RdARyrG$(SZ1@v>Z{9X8|YdBMg!3abiG(V2ymihHfsy~o!cZX1qOs45qh98na>+Yvv z(%(cVU>QzqTpuWTV1@Nuaqzy(F4~K}4^t?7V`NjXwN^gzj8jk8#i3)AcRBXbhA>ZRwT%yx6mYx(ZuC+IX*c07~rO3NUIhnOmdrc7Qhfd1} zhUmI4F=Zjas^WK2H8bu^Rbalcht+oJ&4B^Xm^Fo$`Kcd+?9np%shVl#v#)s;=rKa2 zrQ}d^@wrZSGV)7WkwlRxm_m?sSiO@9^MN^rl}nu!VW_nvA%&~w53m*@?6InW#qI$F z1D8oE*V&hcID3$OEn-x!dr*84vR7fR-7au6W_T9sJKDBVM)f2TUu?`QArc+oJ!oF$ zW028!qu?l?0a4GUgbMA|G=Y%b`3>iL3#oi$P%wBtEGgQvTkTkJ=BaND0tCI7Bur8I ze1vo4UE+&nRIv8Wl+LG*u9=7psnDM5XG9&`DLy-~yR!f|`S)N;@6TW>bTmOs<~0uW zLgLOHQ5!zI!_+OQnL#~PfXFL(Z@>W%d zk1ys___=5mXKdPaxVi?lj44E-CY-)js}q6cIIYmnEFKXAwsES!#3$Y5R^wkQ_W2;L zt9DJdsQV#H?K`s?aTtSh8FxfiKO93C?j_XoWgk-L~%CgwiJ6H>}^nzy*USR56~thEg+JrQH-gJ}s% z;iV6UVk;V+OD%MCuaC!qiLBxaF0w3J^Dlx&n)weP>S?H+)&kp4Vw3Sx*l-Kz|-?_>DnR-XOD7QOfGbS zW(|1^HfZsA6;ddqzQJ@Z{Ww*&%1N-v$m(G(BM zMBhE+G1~{W6qHPTi*IOK^;k6^&>5D-za*wj&Dny47pwI;;oW@@XVP92Gm@h0u1ot#PH&DYnNlD7S=@A?+S^p?hHQ`?19UV1CJIcDI zB;p?G3Qw8JFQ3-%tjs4ax1j|ePQ0(s-yAB^5VC*CDst1jBb`Y+)Vg+r>8R+#n}ZhZ zT~ZGQHs`B~l|aCeV9+m_?GbV5YZcAD5 zy2Ygg_5GnX6OJJu?|E8Kg6}JJ-Ruu=Ykn?cktcr$tKUnAwx(@^F!%_RD=a(00r6x* zFwkqjc(_dS9r{|EzvNGHVtsI8rd`rP+6U2B$R4@N7TF&_)9Y*!bmW-zPf&1if7$c? z={Ac7r&}1PH}v!p!}0pNu=Hq9d=yD0e zc*06QZ%a+dDq4p4yi{a}AYbBb97a8R73Q|ci1atm9oi>gJp-vs3w6;96jGCt1@lNF zxc9r%f`ra4ZhI@U1UWH?hB@DD4y4Ua0-@)nha_NJJM~rMSyk~x5%k(l$ zzFQM>(P*dpRhZpjo`N9uQyZ2G^>}sDuSN_YkI(`?A8kt44wnYvqDuMs1Yt zl$)8dr%XR_`Q$QxU7sexYMOFf+7V!6lh)SX%enJT^=EzgkY|ygh}au(;K&-5p(&y+ zJSlqc3FJ|85I@_dZWZ+^V#7epD|pH{Xc=2`h&vF=qyL0H~&XI(*VxjmT}B7w57 z3+%5y(J^Rx)2uz&XLIS>k+&vSHphDBBgbn`gT+D27Gk}&u@q(BT>RYUM-k=Wrwayb zqj4vZ9B;kj)(uu{j_6@3=2@K~wE2ONPW84q#4`61A&yBbv4&kOBq_@C+@~O`#PTdy zu-JPUd+JG#N5YmmSgJcs8*WbZH*<=iZY{0@v}VY}jfnZ#OGY9y=An!RZu$o9!>qa8 z8PnL{E&cU|N1x-2>(I&smFv?R2FSHau&rPz(Hb9H$v!GGzQms%WM$Hzfw5momQ~L+ zc^Pkn=QZ4`)C++uPf6=|;b)zRw4FFVs;NMVy|{1!eySr@w!MMB=yLu#Hn*myuJy#I zbbSA^#HftD7<~f<>%kqZ0=H(GMRO5v_g_niO$I z9@?oyJ5B8CH;-0*zd2CsD60pO%Ids&gBDeO?Lrn4jy1ZW{Cel;xYcs0b^F6-la{tv z6HuZNRb-v;`nWLcEf5-VZe}xU__a36~xdZL6^w_Tz5yNE`~VE!g5+_*RXb zY3u|MY``p{d_D6L@tXx_kBH90k`zh?o6@x7T++>jjZ1E_iQ!3NhFy>E@_VzuF#=O=7>A=9Cl zq)!M#A4;k?T+v6p)@DQefv1$ny-{8(#;$nyD$+avW1Mfc>F_G(n<*A3oW8XRc zoCEx5#v1LE9!%o?7$ z-k+i!)R6E}XgFBcLG%=ra(i;wx^#+A+Zv2oXcgloN)9!YJxV3{f=MDq{#ljO__%?K z=75VuthS0<$7{IXtl;?+lRim8`|#*Ol_WRoSPIPG?V)*9CG#b11rUPuTHfx(zSAi$ zL*H}`{Uq<3E$H#kCIt$SXdIr66=Igz8nHLX`;x}A)&r2%yY^P)70r=MPc9yyJTeWp zojMdNMB&D%ImnBG6*@Os?kiiKFU02&$fM>-dmjbSMpEqdmXQs)P_aq@GY8O*Hhe94L6c$i(!l=BF8# zK6doY-UVn%=&0Kfaq(Z7OIpP4B%~`Q#-pj&NTxCw=Z9CHKMz!<)Qa2CYRy|3P~|X6 zJJ$QnIyv13k$w8WbCi-HZ@I+h2m>+794out%)*)Z>mMUEAS<1!8{{jVTRBPixQQ{< z!qk`;j)$9BRJQxeDqjs*>4B8cW2kW^!SG#-?i&Y%=q*n-H~l`$b{S78_PIvO>zAk} zO8}Xx1$Z^ZN=tWv(`2(uwzTFw1?P5xlw+StPky&-et*7Uif?@PVUJ1t!eZL2Q1B$~ zWb5djmhj@o^}u%-&zyJG6`L=;tyeU{KCWAk(6)w6GI;Hb#b3y3P?5u5>o0bEo9|uz z@QqMfbH;V6t$MShlLCqkD%1h4y#ghRk~Tn&DE5dPJfQ)YJMr#_EuUQLa4;pF__74Y zHvKRk=2JARG#=hs673nvC-g9Eioh~1)F*`oVx`{X_Kqh#PDo_H9xFF+F3e@t3zyJZ zrXL~i-nCR1wIp+LsFdBe{vA58p&W!ZAm^0vlCQsDdUIT3Z)SudjnZLjzb0{$i0qrN zsrGVby%Z=Slak#o&gypTtirfwYP3)OeN=1MRPiG^K1+)aC%xT{l)1St_oP`3CBB-pa50Jll zwbQxoEM|V;A(7`<#s6Mc`A-MwcLu6QDuhLr7Hvd(#%;Y<6N`+9J0^&biwl~0=JZ8Y zkvgXNW&W=2wC|f3Y%V7;a=FYebyCJ}=Qd)SOang!a!th+lldThd({Tt}u!ufC z{OePQ1mp#D=E-x0hPTmS#ko=$8>5(t>DB0<^CL&Mu`Dm-2o5Z!;F^;g`WF2FEX!0K zyq5s>Fmk!pJo>=2)|&O$k0F);o}HxIHruCbv#dBLC1vDE@HM-G=})+``Wp zOWlo~o%1FrCQ5x))w@UzO(8qB!KS47I4aFV{QQiLEu;!*j{*g)nd0S34xQ;2YBWC9 zluN97K(Nv@?rafbQNF7mc%GS}P$Rg&jZ|3)(^%w}ja+m&k4>3$wtR_b`=4dh?DJt{P(vXsr>b~U z$c+KH6wAg6ZP9tXtLrarEIDOM?KBUUL-#FX$&ano9~1TeWy5mLsTk;rRXl1PO||W1cmpIe?=4)uqzFPyN|>j_inwdOnE#SRx15@6{w_ z8Gt!OjtEnrVtHqZ)~a&0XRHMr0t&V{fbG<0D{>#WT?&tWXhLzMM7!$1YADzW;#yLI z*l@lCQrLJ=?}TxYu!K@)HEBEm8enhB_3rmmdLTD8_BkgOeWAXX`QEV55>kaz&pEnw zSSbBgT=5GQY4HT}uJK?dufy)5;kl{d2Mm5BXswp2?Lt%@o||{$$}R!y@v2 zJVfJTq9tkp7gSEr+{$rQoNvGH+B6~^|8db;`Y~*e5IMBF)aLnZfOQxZ1yGVGP=6yo z(3U*f!XGAsX6FiW?D)e@Yr%2Ti)>^6&Eg#m=hE9{SPvh>ALAR#_4Va^`ejO7UTd!3 z((hd`E6^ONzyR38I4vVJ!Luo!8WhtDp7uGscnUc# z2@&=F0>9NHYEo>K54f2OiZ7A+4%JyV>J3mgq`b=q(<_+DbLau`k?f$58e@lFJL)rj zqMaMH;?L%(#N{o_i8@7R1b^7~#;)(8KlfBIfHYhMS3*mIdp1MP?kz0fDxGgUxt8s;wX|CaPdZZ^ zI@Uen$Uj}7t#jg9bkoL*&RBH)(CHfYq>$yF(r%~L0_W9uQO~(an9I#W8@Z||x~5EL9M?$WuxA1OGw zB5u$oc66;CiLYe(iPZDAvj=ZX*zW45KK2jJqIQ0THrShCuVNgw2COvJcq$Cb1J{$B z?NpuG-`Im|ut^(ja)x|&3ek7!k(K<^d+Jt@J0}F9ma38BA>;)%w#vPi2Q6~%7DJvzZ+?d@HlJ1t z4ejqigE}HB?!YV>xt4mv!zL#W+Fng9RbXHBET3rtoGJ+x?uHy4uGv6d58>K5Dn?3 z3Dz^Gnm&ly%GJvXc|>QIq}3&d<5v=tdhH z4=7G6o=d8d7|3bl(#TIM;X!3;8GB%i>coYZnKJ2mq{Y~;OH@j{G0?5}e>dYi`~zo- z-)RCgR?HPofWV%Z4LIm^d(Z1<_(yDf6%(Ate+{rIj-G>RCB$$*9qOK{A2nH9jO@(N z6CjnU(Ga3~8C(cMh*-$K>N)Gt?6ru=RXv~W&P5_5Pp>mVc`qhr$od{Q4+g8VI+=2o zZ*4>X1oo|!*eQ?%bHZ;v-P*I&Gkrkm-OU)3U9Ns`bq-i3xLqHvetB#-!|n=1OnfLh#%}WJxN_2~6*L_J4f4yo zGH}7BG%n-^9|Tb9@qKro*L!N9W^Hcn-Xa+|H^=E(;HrZsZtKF<4oBQN4;WW-rMSc= zvd#6Q+F07PBD?Ao?rWGTYE=i7@$PpM%jF>;JghXCmHHEAQ|emcJUhZ<;?Q%hrs1f* zR76;WhBrW+7D0WAE6H>N0TY0N+qvO2MdZ0%2htyp2UFP=Q>I_Ck#s+ODI#^=KYYofx zhhzh)uEr^pXTPx+xpoN8dMxBJ`l1br;qb*-5L{ElO1a!8jPXzIF!TqSLg5R z(`*cRbNL{wrSTMgPnXX)P$ZGB5(8(3_PGI5@m3s>HMrjg(R5>SlfwY!uvziNi9tXd#44g+CF`d5u_KB~YX z0EeVC4y1lu&eD8Y5633C>p`(dBQ^;0nupK!2kb@V?2L30ImiRHO6Jcjg{jI$7+3kd z6twS*7UJ1(?km#-soy?UWxYA~!HesShulJqB{pj1Mn~v^uAjUTEx`QxAdkP3#7$C3 z=&@+Ytk?<*oA`7zh)k#3ray(S=G&aZK;09pZm0BAMoHZ=sXXjHpl{oaH7?M1=C=jg zZ=@8fu}(GtPF5G>WIEx02q%7!FmGS*%4rhKBUeH)eC&v|g$-CEr-&3In6(ssI%yAU3&!hm|X+Vr*~`qs{Pv8;>&Ky?l&40<$BTS;;f9Sih#IUBCcib)ae?O9uy{?X=8?X8x+jf{ zB^9nxd30yGuP=rOekafX4Ehl7X@6XZq@$?+Rw+S=W$jLZH5_FB-Zt-#A^H(z8a)LT zw`28LDrW!-jZ2wZ~*kBNI8~4uS zo1L&)e)e`g&Jry7I8$lz$ZWt;YO=S)eQ;e3zLL;~pI1!p71yODO!EF3C)qrDV`e26a;bbV&(JvW2nsVedOU>?+~6 z{^&AhyHzgVXEU##uxlteb9u7knb9qqm^9rJj~ypp}|@W98lK2VvDImQKa0D;QkqA7`aSBuqY9CFLg0@>m^ABO%O9ifA>Vl|pJY8zxXufxy7}jh2C>PSe zYZCilwO{f~o@+=}*2}qJ8V|x2-W*g1R^_pQ)14V%A{L$Xcbq-pmR*In+@Q{R?djRB zoqRSP^CEnu^ui6dbl9m7rq4K&<3F(0K&rxC*`hsZ{QX)pXT6GMx=h@shX5m8xhz5o zTRfY5n)=OcRmslc^P0nqP}IAUEnIX(zk@t=mU%ZsVOct zS7ARryy=?n#f|PEfep4Ivt_Fs%k{(F_N~Rhz@RrQGG`gZZx2o;u?hIIcS@L1dK=G` z&X0anjC#i`lBx`VO)&uxi~3GI%rUCz$(hFnbz=a>FzKR%7Nh$Mf)<^cCh`FMF$a5U zMVr@hGr>Fbs!e%p>>raI?ho%lMOdZmVn9*s11k4iO5E)_twH5z|Bbt!=sm|KAim+8 znx@mfG>}7-&nI;Zg=oq^z~s6($=D>vH8l>mFBUp7EE7Z^Jw+y}=KyCOA6+4H5iU`4UDo+g%OqLr*S4OCY((zHa(+$BFg&#J)e zSG@r9Zg?TWynI6Z!3|UK@hM*Zx1}!JDXbmHOk_C$Ij&I`TW{sOC1onUYLnO- z!YK6-!Fmio0c&qSlyM?TSDa#-?vfC*x+u7lP{ipDfROH8H?PL{;8)7C{e`W1&O9vf z_I(vMyg#IhTB4RJ&87GDECN5y7vj5S8Wq-gyQwxwR-08QeRJvUk+)a;is!?iO>d>XY zR>SE-nCi$l9cJKB_Q@{F{|+e(p^;g}Hp7bN3P^s?5zEsGi!Y=3xu>m&m(<$fZX+(V z(>eYH@{?Y1oZm~3wfMIr_=S%EvJ9}1af>-xAbT}luZQZR{czKgxt_-#%yzlO0H>$a zcrdtw?gDjagAW2g;ct_oTKtqZ*uTo5e2ylcB2EWGw)mE#Ce!T=PAD7z&Dmk7^u+m$tkzgpA+zR~ zD9f%aS>Xq|A7Z&Ab8qXkz`hT-JHFdMjT2Kf%WFy1r^DRBj9L`9dCr#wDp3R>I4oGg z3FIAacc~y22PMt3pXN1|84hXMKs^)l20kV%(d2&fo0K^ceqIf4dRC+AqseuVwx}ZS z_Ki@6HT5u(p#z{k4q55-Q%>H^*zC=IZIBl~ck<{?vD)EqY0uJavxD~TAl8y*(c$V( zfHA_Q|`+jz%+1T(kpG)h@fd(SWny?FP;ebJCJ*bTL zlyc8}0U&joXD^^Z(#2_!E}OR!m=&uY5WOy}d9iuvz$6ImBf4SgtY4TEQGG3w`8o0ti@D!I!w0!`QyHtEx!OBYFCZNsX;MvG_O9@$h0 zaD?YsuhlN-Mwh}_M9ewlDDKW{CJ6fo%$~&Hi$KpqD?*K?JM~W97m0*iy9O(wok`XP ze^$dwjB{}4`49W83#{IYdiwQ&nn=Eib?;{s<(=_J&pWLvc;Zr_)DaDJqbEvBCcSl_ zc$48y0bsuBiY;=*#7NtE$>f&gA^0=`DQM;-(4SCB22GhuA}+@@3XWp2<(cTkkEg5a z03B&9LOE|B-HZ-I=p~L?D2FJOvCp|61~OVL^|}}TXc};Q&yX@W*WymMNW)rQqU*<* z;s({uVbkFZ=RWS-vMAORt-ey1@9+H6AR! zqUD!u(_P!SwC_KAO+!RLE}aj0-O4mJ)HCi_H_ass7O}0h+Jl9Uv4#j4)ywff0ARC#G@Y1duK%*0Vl~f>Bj@`3Kij)VCzFi#@~aThVG;+ z)vnPBG?XMc(1d*QF3HarC500_nvbKYB&)(u%k&9-UJVOhbP`Agxao8d1X#uo$3|aw zdO9eSd?q01;8X}gLs}TQa zKo|&Lm^*_wH#+TupFa(POJ~?j&g@A*BlFZw*Eu&FnbiwgNv-rx=b3e-X|FaI`?KB& z?J5UnDtY8SQTFudr{+Nbh>vtzwB%Sq&&4sCK#=s^jdC8C{H`3jy2mzF1P=c~NwML||?NZcz&%B^C` z16c4u2m5RKx)O0K*3V|1h8c*772(cvh#r_ZGYhB-&>7O*CFJ z<^?%R+B+_d@9jbYSE8PM^eD!{syH@?TI43>eM`^zDuCAIyA^G0P6 zdgJ8b2ni)}BW^bDcMj6a_gsm-LCOGLH!^>w;VaC1??%Byx&jGyKL#pt!|${Qm4hHg zV`6rA{Z;p*V{57NhMod2_2qez=?c4!^1N2yK;kn`HwMcQMU|H<7g48sL1h+A%_iC@ zRf_9iaQZZ7D(nSnyAv~3w;=e^IT3RWMymH$;R$M0dCubVaL`KVDz~p}N@!xSVT<1e zNr=LWS@hZ}Q+uQ+iq7d}dMoq{Fn;<80)JQjXiJKfu$ll`xrqi3DSmR)JAS;(x82*i z_aEcvaP=pFHwJAkT}T6cgymIOAn14J;1=NR^+61H`Ujwv@ACqp{wdJAO`X=2kARlT z4nzodQ$5HqKvw4~$7X;IWYi3sRKpwn5*=94^%+xL-8H$76X{CWCb&&^anWQ~TuJd~ zY9jU3uU{AEzR-+*4TI7|epP^RNrH?aG9fS>S}yaD0W<_g7%Q`+Hb1QJj&?HujpO6x zSFcYq?`yBnY)e!bxy9Y}&U&zc#WI2JvI`-@8Gf&h`y6?IN{VA4X%oKfC* z1>96?mZ4{N=5?dVb~CXQ^{jPW$aiGj;*%w|Pa#=MWt(^br-2$kVc}!rfiFFn{8I@7v`P>1dmkJMf)*N z!K!5s%<%fN+PxMwZ|4{_RKi=f`rvF*wC6u}8ckrcQSD(o2hC?swk8jK%gSm$1&7ln z(An{-oO6=FC#vGr2fSc!`5egZ873GvjM=Rj9%ukTaoA%bA>+yHJT@^p8|;ov_1NeZ zo?g0E^@{tX^OKp$7a7DpTo23qK8iAw%+m46R#$K0!kqLWH{Kal+? zVk_F1M3W1IO=&O1r8qTqdNy>RYcF3C-C3bI_%01hW=JG@1DdHFlIrBi9j5B14y|Wu z+m_4xpO&ke92y}?7-}?EPY=5@Nt#}Q3MyFQ>30kn-=CqIs}+jSIma7$RgO_I_zCK4 ze6EW~GF0t@STBljUp&~pojpuIFaNIBmTS0_7j8;V;`1wtoD4dOWI#n9Y~CnH9nXJI zr{2OY$tZ>E(Zkr`r!2WPo{Dfvky&(RI?iK3t#{^$v}o}P4!){*WL#!KIv{sq=}r|{ zLm0wguH4T@tGLQ$xKsd#>~<*OI_Ld}ebhsEZEdMF0qpfWe2$0TuEu%<{Mi#4I)9!Z z)mB~rS}f}*#!reeSUJd9I8L{}0S@IkidKI8_F%ahk^@Xg7>cGU6QQb^Y_z=( zP8AmhGMld{M>iE)@;Gf-wCrD>!@k^_O*Ssx8()ad<^x>XEk$F{*szc7TlI9w)hH|8 zhqN$X8FEJoAy2K%6}-8#wrA&*y>|5N4Zas~rh{fJvFvc8O@7>Thoc-ooZ6omO`NxT zVcAzuzr|E^wam6~=X9_bO0WVW(5qdB_&aK)M#Hn3(GUSg=xUF>v)O2)#&Io$S4H|`0y?Jsqol$(5pMey%wjnB z<$TQE$!R?0p~#^dFt(Etd@lLPg=qipJ3yLk+4SMqJ5QP@DtqPAFTXPVja}w9=>f-z za2~F%7irM$NZoHNIsK|k>_^7_{qT(~)90lNi!9b%4JV6$4Ha~$z^NmwS?z=Mh#o!K ziwJLsWq;yJ=9SiF#{E7yv^qnLe7d;`j?Rg~@X>{>18iYTxn+kgwP!0jhtLHf0>E^hhubVQE(8r=}uP!T)^}FN3 z@+>d`6m)@sVo%E$mzI`{8&$~TO`4dQSc6eJeAae_|ME$)0n#wyZ_N)Ve~D=v*bZrv z=>7rh+nfWSh8DpmhoAn(z>4kZLq5;XU2y5r(cK(=`;Hr06|Rz!oLn3JG3V@Pnfq*! z|6PwEiF2z)2lgqQUicHD{lj_It?M(Xf+jx@&H7VB2A;i7&X3mpkUYWRUkZ%wb_s$_ z@E?>V>|2npBd=cliV`7yOry`7NH>ry`7whk=G$S9Kgp`u`j1eF!Y&n#ty!{!uIdLI z`!>l0N|*ggSE~1U-yU>>OZL`2Dw9qyp)y%LEPtQ;A9RQZKeE0MM`-d1-KCJ?4V9Nb!A(}a=`T3AEO@Yxg=|T%Bgq0zg~S?w<7;Vw?KZA z$H-`7$Ec6)PzPO?#W%Mv&J+E}i_KeRR@rqjq+le86OvSV87^yv(RT_30O!q~PXjWe zTQiR?Cz5K2qKMhzJNYD4>(YtB`CbHA+PP5$M${HU%m&D zy&Q*bJKdZIDWpDmmX(g~vlf^w;>z4TMMN(JdGfrAo`dd)6_L9jY3VC{<*~_u3FQ_Il@@K19oL`O%)eWcv>O=SAfC*UlHIpfGIq z)L*~+&tJD+_yq1V&uusFE?I3vO&2k*ItJZVv@_x=Lk?NIAF+T!%geYodlf&FE@~pi zTV`+tP(SvcKIE_KttISVo#p=d#Qt-^#(j%iD;}3>*D5hL6kqK;*8jYTmSf?_;dYah4tDR=sBTwj?cuUH z+o@~TjbE6{ViyQU5eTSIxmTAbkw}1gOMWOF7?5FOq&xAqhx4~fZGRQW4UYLs%w=9D z5WfE+Pk+7}qRkNm@pk&_k*Z49y$sg@EBrcZvKk;k*;~t#>z?{*>z$3bXe@I$_T+j? zFAi_>x_v}5JpC8fy}@B4QMQ1qa$&u(+iB9St&_R#*~m5e+YMj;al`k1zL~$>XC&8a zF`x-a{i$xdYC_t6pb0!*=A?6%+%l^@`-j`#^t}%d@woc=ABy$YCyA?Y*xY9>Q!UZN z{q@VA-miTGoRQ|Ue~QIp*{Z^K&ELGN3dj6C^b$~CGsZNwU9W9Gx^`-oJ9?%xD$N$UD(-mZhjF^F z+g*a^uS!=N@!k*7X00jxHxb_LdAjEG_kZ&t^DLAaAXaY&-e%nOm@X(KtLOF=;F__cNyJ0wZ$G!6fs5j&N8KWv@JFKitz z$<`hHO$s~lV-ArV^Ec<;GofZ=!zwqbFlJ)Euo-tq3i$kYZN~9hJzz8F zY_wGVqi{dHs0i7%8TWqk@cwIt`4-1K$+Q07HyOaQejXSYAUW6U-JRSY+_)A-8^YA0A>J!b{~M+V#EIGCuKyL$koPGKlty5t317ao%kL&0 zw1p}p>)cuPKL`l~{=bSA&B$Eo+JL9Z_=TssLwXih{s*24WTBt*e&M$BNV50zcir}( zk!|B#kh*(7XTGh3*}r*u$7@TvmfVm7YJ94@n&&+}z1yk!>~C5mlGuT8|GP=Yu0nVB z9LXl_{eQ&;x*l+ks$m2QeC z1;?qT)WBU+6;+ZnGnD_PIi)-C1C!C+-F{%U?Z=bfv>zbZto*MenOd literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_add_agent_2.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_add_agent_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb0f234204c124e34ffcef047bbc35cd7f0ef03 GIT binary patch literal 539466 zcmbrlby!qu+dfRI2!bLYjUXUW(p}QhAzjklT>~N_Al*Yt=g`dnN_TfkcMmbdZ@HiS zzOP&N_s{ptam=hWYt4PHJFYmd^SUNTK~4e_oe&)X0RdA=Qd9{zcp)I%bGnZPT#@pj z(nLVO5HJ@JQIHZ5Ay;s)H8Hm`MnI4ZidDO(uH226sudL>WQK^6^>G2^F)d=&$Dua| zvMO($kjFej7H$t?d{ygG=8LI=t5`Zh|I)xzao4*nJ-sLdwc(f=)oET0%6VzBJ}78< z>$pBwXN;i0+xj@jLD3oE_#^6%1ad(SB?t7BG35I~$hUL8&jXW~48+9(5Y<0jHOISh zB2er>W~8fbxo`DC(8ALOQ4xYZaHYf#_WNI8Be+qiynQA)KC&V|6 zlEJKNwMxOGYi?C>Q5XLpR=#NoRT@Q+~p(+6m>5fJu=kSOeV8@Q+)MBe5;tTno2EPm6p}Du2;>6@=8<_{2_n7N8 z1Di;Q_+?+{edWU~f)7F*ZFYg_qbR7mT%Vnv>$VMIeSSA(^;kYk@#4)6Ya4ye2f@zA zz1MHO`6E`_SaGi)6&F?k0y&y7xbgRyQ4LPs2){vTE5PPm-Dvyt%Blm`xQybHRa?|E z^Xql&&cgs<9|!NE*CNEvGE15Id&xAJs;Q(~!W5Q}Q8nyakFWKuwZrIrYVmei^t!%~ zjVy1_1Yi~ibe>~HKuC6$AFdeU@{oz5`Y<2Yaf!tcWtVo!Ue*aKEj%^Yxc;WzuFaQ$ zU?W*4kox@9=iunhAbexTH(ytemU@Ms=_7)K?mbZ-Z8eI(L?Q9U^gc}UdVy`{`^*SQ zpj7R(2x&-g~NyUpVnqw=SAD0;diza9G}>i?ggomT(wJVUSW%Ue=m7?su?pYpis zxUsqzc!%tSGMwF;Yq4lKGVP|qr%M0}mLaHR5K`(trLp_Mg_Jj#9f4=!1G~ZA6f-U9 zf{wgVgJqZ27y4A%;byLZSL^EJtcxO0zQ|y#yCIBjQ z@3k+jAy2{slW^wOcz8kC`UDBjl0st**3@xTL)gFXc;W7RyDAOmdYrrLG)KC>q|ZmX z@k9A=`r?TfGV~#&bM~CZ$#&TTktaz6}zAOwkyP)sU^eSL0FJ(y|$N3h_#X`MG&md1NZ)1&<1>-lc96kE4%!jMEh` zjdxk#S;$lcS%_JzS=<|E%s$7V)o$VS0_%ob<1JHZ7R z&XgLd9K#q|HD?@}%W;2u!i<@jIIPabXf0sPyT?|n6_RJ1-9FJX@oIFYa6DriQk=h6 zl#!I~t^GfqP z^E>rvr<)##9^4*ur-Y~bJ1bY!SHoAzXPjGU69+{3>?4jZT#dH6kSPzIrK44&F{80! zR1;JZVLT%wKqCmom?TPN*<~GJK4$OX(6n}%%bQFv*|nyBt!q7JaGhKtYdYe%wXVtzEt&bDbts4C(dN4;d=P0K=$2sS`|D_2=1xCfVNwLYzddK?mI%~gW-+_7r!!tY$ zJWGZF&BmI_a+ykPvuXWl!)(j;>R06jW%Z`ARj{&D107@U{!eD#OS{Xa%^auks+`OE z%Zp2!i~?usW*+Qv%s7Wpd~qP7B7VodozoP|KMEa!cHCz8hlwPJl!^F%?;T#xR2GLk z^L9Dql)&%Q?%WG=?KBH}K%mT*AJL_gkag?`{r|ctO@#w2cSN|uI903N+DKq0ez7cf1%Nqz7}xHEqQ!8fiTU72dx>c zbRTTXF{ia%*c$}f7>raUwesGYS#5qAl6YVJ{zvJ$9UI>ZuXh(s_e1W#7ZrK&*+`-! zxRJ~lmz`=`l8u??RXxR(d0#?8BD1NXd0Di9YbP}1Bt#3(m2-hd_sJqSJuU*Qka8$6 zENE|Rpf<9Zr6GkMeHM+{9ZH)O^D%~m7I_7^146KvvK^%v`_9w$=hZwl}1Xk?zD(S^>kFh)mf^ED7_b051Ss+p$p2$CV1F^JJ^;hVO!Os z`0^mtr|PG(7+z?u;yW_Yi6%2&!FOe=``6gufhu62gNQuG8pqRHLN36~NM2eq7EZ zT`SFa&9gq~-28~KUwx*m&v`m$t!?ew8mH<-(NvX^q497}XW=)saYzn?QRl{`KZ|{% zH>H;ol3f&Aw5N$*U1HyKd9}9FY}GYm*YpkYwPYmS!F~-M+8C&GzJ{LOa48turEcfv>PeAH`2lo{jFn ziOLD<38RU4liq+ellYUc$n3ewPx88lgAHdo<4AIe_3XS#v-6CXK5mLGcK1bxYtd9K z@W(oBYic=Zb#4ufZVaHLay!SlSFa^c)@5$+4{++}Yn#<>dXz!uvu_R$7@NuV?e_AT zS6%Xt%HeD41NJGMkPB^Y_wl>!M9W=Ee29ehLE~f4%0&NIl1`0Vjfc&~f{%0V;lM_N z4okFmp2m3-^-A6nIR}H~p`P|cq?7F`0K?`*6@B;O0TnX{> zS0wC>M?+}GaS_f~M5gzq=1wJpn z_yhzL!N%%RCbF^!uYmLW2q=hz2&ljrBJdVKB>LZTam1Gh$bVf&LO=*KM?m@eH*&!7 z=PLqu|7`Q0BXZOygnPiZC&1e+9qE65jp>z+{6FXSoPc`>!pb62QovE!(81W)#?j2y zNf_E41YCGvC#m6xfPhE!^NlE_^x_ccf681%-AP?mhR4v>n(@7nt${J4o3-7~eh~QF zcz{!DW2g7zZq`;djy!Js6o37K2RQ$EnTdk@ub((s@>8hGDv*oVIvA64FurDdO(B3z zPEO9}U}VChBr5)QbKo04g_)C+9S;+etE(%cD=VX|gDDd;H#axaYZfLJ76#xK436$L zPVe0qY#b^7)5-tzBWmnu=wNQ=WNvFi{M2y*8e^7m!|6f z*OZlwo#of2zufx0={rYb2N7Fq;Gs?e|F>a(H~#hJ-wpYge$M@uwfN6M|8*5uX#sRT zrvKeF0d(fYI4ocziOogjRe&QPWx=mZJ*E12HiLAyHNR$Ft?4sA5vrG~!a&o@-)j8b~i9TceFp7I8AHY!`Pf8@1k3G5O>f>z!L4bzPehyrSRe@ z3bqge;(zhs_vJz5pd}6AW~@kyT1P4}kNAJp9U{sXp;Y`sD%~!8M7=re`{cd|NdNyo zgg&7LvwA%~j9t$4+kgDuO%yTmhcDCf@A#a^|HXiQPA0EZvquwp!jSf&#>bPD`%$^8+)KqqOAej zosO=5WJd5W3Z~zTzr>q&bBhN!fZx@xC*RlPqUWeXu0@U88;OA9kIjg|@=H!8HlHfZ zIA26lYS!h?S8W2T6f0$WVWcWj{EN!ONc-tDxb_Z^@UC@+5*goIVJ?6sr4yjV( z|BJ@LX#8NhE%81fA}y1*r$wx4zYh^xvQVhXVm!wui%HQ|rT*!Te;(qQ*Zz}dD|39_`S2|s_SkvKRnIY?_^S39-_bzgY?>=yxv0Gs@~8rsm-lRw4;!}1dkC6sEYw$6GR+r#2G zk&EKFM<&l(A^NA#l&cE)LwVN8m>OIUBAKAtALkUAf)zWSRCGl0PIx z2*Ho-p;=3OT=E#x^m<90 zwnxyKtE_8T-^c$lGPvK**|kRZJ^gcbH%PIs-bIzhMEQq~ zk^B1U34!u9D@$?{z8^H*`Q5R>|84g)$Q9lrL($QXvz3JXSJHN2PS>{y`SEN7Y8{vn6xk6B2nr@uYZ968Mk8>t;!+z z4LhQadd&{+{h>7hyHsY{DqVVThI9a3xpZ zAEw|4z0{6cmwEeNr1XB4i0?u1NQMmApF@GPJf=y0Ud(f=XXmGTi|FR37h(dX3K4Xl z1yS$7W=%a?;!Sq9XLDWem)Nb-SMXb$s-JA4dG;rs5(QBW(Tz>raj+eRq%$?6|0%K& zMFv5+gLFL`)IP?Vf72#BLEhS2?L0tbS6yLNIE1~iR~d+%gTlA{MqcEyU++M z)CbONv42~rRa9Vj?jo9hU`oGLR88X1cMkH~sa_&dm8Eu9h2>WJF)uVF`?CoTV^`Qy zqGxkN6fNpMH;+T0$(D>B@OAqU5BH1r)9H|KYOIJAF#YG|==*B)`A*rZxXCntEr||( z^30guxd)daf#KU|!q9snBeP_afr8hApf}I7KmJqdus;LCMtYz1_}_-@`*Ya(3Sf~x zj7lwP`SYpXM?6IS&>2reJc{NAS&JVyfbx0ij{OU$z?KXLlrOt8QTHEh{DNPmGm~ke^Q_|w;yo3#a3ItY z4<)cPVA&N2Z%3MtGc>8p)1XkTPB~6q&6Bc$Rvx(6Gt0zXr=0JzmU}GApWEjIW)naw zjbvNmG3zxPx~K9u1YuT`ohgoBEBFCZ=7jWWR{yc{^qQLLXHEjk0z6#y?`nSM;i9=8 z!ZLDsBRNZMT4_<*(EcfgLYjchi^enI5&nIx07?F=4Cw9;luVv~w(*@>6*yA(Ldq)l zL}Qjro@_1KhOOBxrN^^HZQlP;v>ZR=gd)+Qd}oX9RTKdeR=n(vs!@9_+mduZIk3L4 ztn=*K-iKe2s*=@-alyg9Oi62W3;42Qh^B|Dx7b~)pcCGLJ!bom11vfFOgqGXK3hl$ zi9T5>I6UOvY_!r(8%_HmTjL)>k&c9ZF}ZE|1pFP`R^zaKt%`4cY9$M+$ z-cDKYlcWqssjR&I(L1*}?QPB4>f05~y02)xxXGh>+w3-x_l>d?7Wqq%_6xJEau(m=|EZi?5Y)YF?ufB?NZ_M2GJb%ir%|`N`}Pr3kD9 zp?H}SRoC7fP8st34qmY#fHeQW%@p|OWd9O*A)cQ$f~4ov?;jcv146`9D)-ao7^0gX zf6*l8-#oX&)NtK%93HiVF{XsPcJ0G~X8?L|!SmxIYu39~CL9%+LE{kg#hCWA#+1~7 zucu!LpluH?dw@BVvv_&W(@PB0LgKyH+5MUdvH&q<%Jonbn(J<3U^KP;T!g7@D6anIm@*vO872oNGuh)l-k5$ANU( zBuy3(C+7SuDvNT-QYxFyxUljm67-t@s)p;3c-4$w?3uXf&e7+8tTupkU!f}1*>&7$ zs5fhmfA!N_ABG>llV;JY2cscfJ6^8EODAziw9ozM2qjvB!uPSpn^(dzMr!R1EAD12 zA-zPljgNWaOG2;Cc6wzw=gsQj*C&H(iKeNtYLlmc3nzHGRFx*|RsX9&@r${ib?jLf zgOMQq+q#du(qG}R%Iz-VKZMv0acCUa8i$ab$NNG!QamLqG8I5|Aon5Dy3GnRrgF;j)#6DOqoIEAFe*a#!tn|Hg=zT zi0q%5BV>Vc-KtxS?;84{L}KWx;M>A7a?M>ZimUerof`dDT%bxDG0A}y8QLE?mP>>) z53SJHCfly!CS`P8Z1xRfx2v*t4i02qHB9~(6pUgLxQ(B+YTKh`nC*SgT>J9JC5yb9 z1~iAyy2~4B-xViki`R|aq&&L{{ zs97K+pm~~4!xr`8xbRmWA?gWRKWEeS}--#YNpbVOCB{ zboR0VAnL{lz0Oe_5W#lC_GXQNwLj7&l=S`}fb@P2LiBv8&`aQ^5!SnL(vkP87L%9% zTuZV2AlBa?*_u>K2kB=0M>$lIUW_TQA{XoF_lo*BU5I^!&*etR5rL)^xjOaa>x<5~ zVDFv$6IHr~eM-&bV4cOsv@ns*{39IA9%Z!B4~|#TO&tth4snd8rqg9It-n2M;ctjme{;5a}~PE zF;7tP_FLziK2yzOB8Dwe>G5js$AJ$?M+D9S3WrO|pj>-NADcMlzP>)M`)sN^ykJIA zm3i_LxxaKa%<{Nh*>}{Rwc8OrcG#KPv%7n(?pll!4k3}Izu9rz$jPf*S$_Oamym9N zjsh549~Z3iL=IK{n=tao!Q--OJ=G?1Bxuhz<@m;fE6FOmcH1;x$nhod$qZB4AW`No zwlkgLelkc`-h8GqD6yx}U9StY;LQ|aj(XYjjvV>xZ=lid%fl(>2R7-E{OgYxzEF9j>OHny3b5pAcZP^UL`Q!=UD0uO*;i&}~XJZ=!)I<9)?AU1ltzF|OnwK!*e^0U3bl^QQ&YACMk?=R8(Q^LoJ38&9x;MU_-pN-M);gZvF*Nnxt)?&8*dL5ts^wUpn5v)L?73Pfq0`e{EXX zC~b;Wi&{Km%36%F9J7ee^%2b*f^UG2UL6EMbqn4VQlD%L#)EE8aJPms{8u+Nq<1DH z-i{Z%GoG(MFox~QuNBuUFgo@yXjVp$^83(*5^=^6vRfp4F?fj27=y3pC1n8+QX+wm zn62q`>c@IDT|kL@0flxK%YoA8`=-5q_eeLZG$dgA^OQ*()=}XCU`FK}nMiLqEVjNc zwdi#so4<1=gl%1mY3b?izPDET{ZTBK z-O@dAvbqO2etAbhFgI7-JHvSBL$H53Dj$!AN!W#WkC=RC5)v;Kg4cbzHEIkv7)2(C zR!zz2u6x+#i9&AJ)dBl$g-Jilxg;0J`Y=kG@u2jHBE|BRHgN- z>h?r24H4(<%Mg5~xQ$d#U6+Fe9RrN!i*}|)GNEm={pTbVaVflK+*+2^&VBOyXED<* zcbjtqd?zy8uqneVz{#zToiE-komEIu%Yx}WVY~K)Nqa_mIG~H~WLZ+tBCF~CkD|86 z3zIlN*GCf5jqVlG)#v8BDfvbdn_SM>trtZH(?}aRrX*utEr(zCY$;C@e{ZlwR|c)omvU~ zJ3Xw6&RVA}maU26q`HICOZ75?fH}||GF6G}>H_^R0`D*OOhw3#aKSVW=Quo`N;=Nt z4(|CbpJ02V3$H(^yH6txJoqvD)y1Q+A`NAM6n34{lkm7n-Mjd?*N1p|#ceMBR|~Jo z7V6OdX&cCiPKvPP}t7KK!~1(pfDGlkEot1ML&% zL~%4})OD95(Ajn=EN&b`y^{rRaaE?|*wZN-^K|bV7O&|f#sz&Q-tP1YFNVK^QJjSY z+Hh#a9E#^ObmZ}=F~3#XekSyF)n*8%_EB@!jq@%Mgf#q=B7CB`xycS5Ipe%jzhW2O zS-*GteHj|r?$M;hG$)9@f1$*kR-Ve_n*6(7#@PO?m&*c!9dub~Al9>KwrO7o;Jg!C z2vbfDm%pzSLh!&_mP4%x%$fbwXz$JSzX#FW_U*#&%oK)FTs@khm4<j#uBD=#mvEuVa52+f(4bKWV_Y$8+A_}j-I7VDWx$y^+PlEHHlR}6MP zmSw_WZcBx}=G(IayWA$v717K21IC98aVKgc8}0zelR-$ln-jsh8GmS1X#T+=)nnVd zZo7c)=3O7On%QCXJ2gVTYVGaS&I?Y?$^AHwG2enDTgEywdE}B$7fq^OEB#o+G z$|cptFyCv>(r!`=U&p8(e%^eyhpOws><6;Bt1oT^)hr5#*1PPz!q;{4yQ`d@Y=N}; z+hP(u)ts;tAxhxbqfC7L{!M=MJTrjb8%F9JO>yW==&lY1MGs_WNyC2?Yf--)$PSI# z-4RyCU=m;sA{{++U(PlSUIKJ@97xWi^;$o8Ku544>>0Oa$IV_@-qWUAr&w*yblbcE zjd@QnS>$~ZNdwBfgW{-XNb$c#gGQ0QI`P;xBu$vwZ;gumLY42=&(nVm;d)AxhHX*bDJ=_x*59PU@OOC3aS@A_gWNak{+8Z z6Q$c;VmjgqNNV;TsGPUkYgoZ_T@WPwJ$2O6ETr(z^whB`u3X@tgCfToci;iY`dDvLx61sBpZkiejkX*nELCZ8tYa5_v?F|>0= zD5{wK7FSuef_8c-NfZf+hDB;s{$^U>OcA-kX%1}Ob8ApzqD07bC|(1uZPf%5yk!NO z4>NCRvtxHNgy1p6z5o8HE)dCFgov197m-zWwiX6ybpk)=GWj^djY-Hh)%)ozvly={ z6AfHtHO(>>H=xJ*Z0p1-jfg)#5z6+mmqCIgmJS&W<39J!vvIvN!=?p1Yx&NS0h=;J zJr5cDjjfaH>DEf902z#X_+(}ulM`c1R+-Ir<6g^8_&9ovuSq$zehNX2)MM%u9b5dyvNhJT`}3CV8og`@a;(Fs zieY@mlF=E1DdAw7x!U15Ls(U=w`?+(VvgJm?dR9i?lVWZS5*gS%5{T*3!K|K3!LD+ zUNoicn~d{xPuuMT!K+P5_p7ZDVJ&~Od5Zod&YDq{1JD(zD&T;JPV#8jN8<%&GkC>4 zZ7p?3APcUAs>SHW7jM@W#yDvIsTVkMTym+2hgpd;)Ca8IBnP0tosDEH!DMRCwKAFe zReoo7x*_zEzRr1v;{cS44??@K4nJAzMb#5~;SMjJZ2Y3%e#fgPNP~M_#C77{_V5SS zhj_7-Q@=GA>UYNthvd_~22c=+!P+IM}CT993Mn z5?8)ilamBdZzde=CErP3MaHfYAp)#ZP?xHc#5FmULk!t|4nuQqrYhFw=4yKMcq=!p zrDAjU=HuPzC4j7!K@yE$@6Tr4Y7v{-hS*$=4P!V6D0zt>{id( zuv=Ta?ncJKU~MI@#_9KnP18%x*Y#Ip(^6Gf3#KcHkV`?AaU^_tx|s=zuXEf0d+SKL zZe_=Jbp%vZ04qVQ=PP4UdSWgk$Rsh;`DvpU^g6Y@#B=7uXlD< zgWlbG+NRdTcSWtEd6|>+$7Kmi&cw%!$_vU4@E$ZO2u)WE3eb^x9cFNw-Z^cLN&Q4e zCN-s{3aM@ejr_PCV|8=RlPMYWCOmlFC29~|>us}^P!kNxiK4{m^Lz1iehQk;BPT!V zZkRNA{2d=}Ew=HhD{&u=%wW+WgNHOBkKYNW(qq?9rJ7e@Un>>a_Q-UOYgYa-7w12 zZD!1;MC=xo@mmMEVwt8X&T+}k6A+R3>ze~myu83ATjc>+CbatO?5rJM@8kBSc=@?W zP{-6Sa+8kqV2*$iE+td-g-!$zZ(^X1e zDyy2V=Nc8$LnljjgKK4nJ7f?hT}Il8sn@me=3EGqY?PMm!+lm4g+;9Zw65PdSO$iKV{fJ1A00bv%v?sbDrMSG zo-4eW1wyA>R!GF$waw$%e4RU?d?%r`&l`sPW!|G$EY?5f%T%!{bvpo*M#LQH%fvag zvlgB!J%}TZo?*76R{WJJYPNC}a`5TZwJjxp;+l%qOU93vKRbR!Q@e!IS}sDRraf*s znLYXDGTAFPC{VfU&UT6Xny9Bc)n}@0hpHiN>t+zzo#91^7a?YQZ7ldr3yW&6)^V(p zlYeIb1pm^(!6ISr+sZUcoXg$hqDG>_?CEs2baJKPA`Wm>7lTdd2msxh^gjixR|;;f z1mNpNoG*ATHjP;=g6_PPAiDe&{4Tq-3h5D~&-mOFUb=OVsTeRG-kMFMWQYV#=>%~u zNh4?1y9#Q}R9o*DOI!&7fx=UZUYlA!GD!1neItP9VJbnp+8#q`t4Nmbkw(XpE&0ZO@~|f8GZ%>S~dhm)$@Y)NZryORF0(MG2l?kV4yzQ zh5|EgW&0i&KJ=X`n8;08oon>rrpMQ|OLZh@y)*ATO4wEa5Z4{=4{C|{ncEod^A{7O zv7JQ6k?Z2j$Q2+%$1cCH`aDnJb>*0DvuXDJtbvj5-C#VH7bqLY-)}Pk(YqVUCtptt zn}ia{WViZpE_zA7oa&VmN4{p;ROkhwJfp6N43pU#R)^Kk3U=BD3zHv_Fp1dA^vheP z>u>cLJsaiIEF0-RNhIm?Gr~3m7xm?XKwoOyTf+#=HkrB?l5SyBztj(QYV?w6=~Rm__GlV@I;`$6|D9ji9w50=F4BTVdWjrEK@x5{#$iIC zP4BPsJuQeGGZ=t3yReZ@fPeNoec=PHJM5!(Y=*ZQ_FKw}LK(Ta*u)T$yRj4^0Qq zSL2f^85pkk-_(ZyX%N*#!lxOCm^SwQu@tCY<|av&ki8vUycy`}h;&m+)Q??x+r}d% z_r0pgK5k4N_ti*dYR6C*uia88RXHet@Q}j>dTCNYE*;(u%&{8Bd=?Y!>bMt`#bH%G z1Uh#qfqsA3rSM&$NjbGS>_y6;FXChn+K~B!uc0RcylVB%bhokem~()Tl$!I7g9Zfe z_?Y}BwsMFtVWXbp+U8?(`7_R*a~zZx zHUS7%9oHK%)e`!qq5Zr}hqd~h64o0yWYT}%k(l;-yotgnf-pm7ql_#^ND}wb^{|Wu z7*V?Sbc?K4S)SjxdR{0`R2L`b@qs*`2v&l|{EvuWzGL~yohmzvAfZhkIhWKekDpE> zQn$e-eTnzry0iE7g##_#IdsVPwY79FDtRYSh3h*ydbB< zWO0<Ydtn{e#s+6Flyka*mA70OsU` z_cjj3?Za9Z!uieCO>VqA);0Kzj($+R=gw)oi(@0#ab|FTjHTz2%FrFf}$ag&+rc92Sd+i zwwr`-Q;MZt_!Ef*g7b}p&Syqq{fF5W=2#cyes7LYyu{F94#L~kv$V)Ou9&DkTilqp z<$ikID4yn8gooMfcj6|Gs1G}#ug^x@{L287zQ-{V!kZ{yH5*B~cVade=y-I`Pz+tB z!urMW<^km#SC0j!Dosslb)ux6acIEFFQD}&=Z-5vo)^G+RacX4=tC~7IsN1?I|O{% z9N7~Fl#*TTK$z@jFja$}9#+|}h}Ui9BuQ(Vy0S@b@iD1O^#U7c{G;thfI4_ws^X3L zk!ch2y%a%0yDUEm%@6l4MwYTD!?@mnIjkvua%MnbR+5bP%q>uHWIR>+zTP~T_YQOi zUp(%igUl#rlO8mklMWXNYLa>#LXP`67Zdh?p!{gTZAEA_^>(_+vj#v}$_w7-O{Itm z8NpIEb55h7Bjv`@qrrkAS{kyP0A=%Vu6|YpprJkUJ$suL06?U%$)-Pm2iOud$O6nR zNJ6JFSD0OMqC|%dT-C!+hT_G4eb}X-Fi>m1atdE5&GtC6aA?O>OK{x3*+hFobqp>| zF{W55bXe6|cT|1d2rOZU9MHj6z7`D|xWXqy4=p;Dpp0o2a!st(67U>8FjmXiQ z<_#L=%AuMFD#g7yXJ0a@bqp6gpF7b-Yo*O_xgoNd2jcMI-cJ{)`9H$!uTHmg50^%7 zrTcvVC^IF_{Y(B$2=(#B&02hSC^CdK?OhKz>XxfB#dV%;u=!AFsvwkzjGj!+oyKWD zKQ}G1;h;{ilB`V}04k`=cr(8hE_5~e>QEl&5s_`VHByF+$z`n^Rj0|GS$`3$tqqdg z5uBTfu(N;e0R?KDekLz)T)&=>u$x$!@g}X4+0f_Tzu-BZQqEo*rU}>?xL!JVOv2-- z(H;!KV71Ct$1-`nR0!mSvjM||cj&yIpiy2k9BHgHtq+M8Ol4%U($X{W#=N#zHohUe zZbrodNP=(pRFHHx;Q?A?>h9_S*&eG-z2~urdds>Aw*V6a!;}k`Kz|mJ9o9Ure!iC! zS$qKUpIq5b3g4F?%uSW9%%WSOBXN`(^WFJJr2*h-)y;e#>PV=#~#d!p5ESQs5gYY^SiN; z!>mIEXB{GkO^VqpVft5L!`$Q%F}5jDRt&LM!$?q4(DefxBiyZ-of0B)2@>ZR?wfEB z9~Bwsx@_776USPF=nCMY;sE?RP`PzGjA{wE$kPwa3!yv$=V0|3_LuVgm9@fxW!j4+ zI$B$kkhJ`IgLZVL76{h`-AEPqNR~BgZ@xk8>Xa7BSy_S!6efv*(0FE5f$Fx#B5kas zc~N9&N0|4E?WXr|2Qp6E1*`JWEoM&aR{&tQ=F~yd1NRqso>yecCUH=Ur0faKWy0rZ zcn6)DVDtI~=A!~p4{)esz?zMSdaeuZ@kN?dJ(Vj^jya)Hr4+Y&jL-{;gPV<~j&J>& z*fyo5=?%v`001$A_DhkEUofMcQ6Xg(P`!D4?I_<1^@gv04PlDkNM#u4@>&*aW)cp(0BZ4T=+pYbN$!*^9# zfvYAL+a9+F-Mp7YS+n$oeoYOoJ)Yt7N~%>c$%E>jnBYIWw)`(y?9Vb3XeR1-f2~M$Em(!3-VL}(#Iq`8;f?x<#SfT z!jR3PBQ8#M};98gr^YL_hFi@!2(x6>Cjud+$|wi~08&Fi@qf zKpHpPM8~A9@hCz1YV}Caj?j=hURF*bjdDK)JQ^VO)~R=beTZOuM6{H1J6m%Q0o1_; z4qy>;DFAh|2A>jk`J@-{^F8-EpUA|@w8X<_HYXv?yE9e20s+~igM24yx^_CQj$T)% z;Y~8S?ICi81ev-qyG}qu{x=N!0-%_K|EvVbbs>aph zF3EenPkt2&4|Eq~D<2#?y1O*nZpa|x*QoNSN_M$ox_KA1fCW?%WZe@%{>}3d;FtPI z-kzbjqzJR@;93#gy4@o(T@p;S|MCJ2yEoZt?hTi+Wwwajpk)Jixwk`4v>?81NZG@D zLmEvwv_3RypAz8IXE|@kN2$f{6sNOj@BpB9F%kvC(3{EkR<6AbGB3|E@#I%2n9_$l z9?j|MhbU5{)(70nvnGZY%x>Q2zQRnHSb> z#pI|L0aMoqhqafSQ8W#=D|If0hslOOX`eb>)28>5o=?`mBaw>dIG<`wdXLpvCMt4` z_I>Ba@2zgWkzDyap-L}z>+{5Y;A^O#<8PD4l_u{3>?Er>MVfnYfe);I)pXhl^MdF4 z@cSA-gs{l`ClsQ6v{?>R1pvP6s~>^p56p}0#pY%pAw)ek*Aq*(b}}d!&(wUa6vqIc zK=EX^bVprV3L9PBc7{d&WIU`nm*|E$uD#6# zNqAkJ_J193ba#x_>6rjFwv6wv<#j{SSSD{SKt(TJbk67lOl9N7nTfLZ&D9x;nL?R; z?GAfIyvfB#x#zhJ6I|=aHMl;l#23PBC{84SiR5*${KM+~45+f)uv6|pK+~k)1<`$D zxRf(cIrvcEVoCly&;taU-e9p^;IkE8HPEOq2_@*Uu9<%YMwO9{K-2?}=>H1sGk}Tc zOA}mF4}gyrsxke{X7%My>VZUbK{w77B)!k749d@Qw!R4dvc4)ph&S}yXW#F-{6Y=% zYAY>b@w>*0oyg;TI1kfm7Vp!BlAOB|FgrMz3Fd{8H`kzB$oyW)8o`a&K;7D$(?U8K zNmZ}g+7T*>P95^}UL<#Dn`aoCT8$WISldDInYLqd;%rzkehFrcE{9dxP*V*XU#0Vi zNH;)+U&ZS6(m*=yGK;0;CoIVg37}4g`=K6xd*=*p5+Eb%@E%S`T`}3Rkrru-MSpv? zpb&t<0R}ZoebTWj({>&-N<1+<`Vj9123Ajv&k%5*BSbp%elpek-ouu@Y8rkz)zCZU znWS28kt01E8@-Ju@@TI?v%?*aO9c7xe%ij{!}Vw8P~u+#&!2EvvPozNput0g8Lk3! z8>td4SN7^(>IRbvBvBym(s~ zYIiej7)z%Xm&!jFIV#87Pdrm&o2Kn3OXkUwFX6fiX@b=^9(BlvEcRHaR}_X4Yb1{s z7HwQ~QHIC-OemQ==RdYg3!tx zz9;f+V7y-+*QiCUUKd`5qD+NzxCZ4|05Ue08-jNPM=o`L*GM_u9(AT2mZSHv&6a&p zq@(t<1rJ>OQrIkn`n2{KE4~*%fShUOP9&|3?k8(UogMB3jj*0^&^BfGjdzh5-in~E zcj)EgPnI5f);^ntL&YMiKwZ|Y?M1^Ki^{;>G-cLUnKJ(HV6Jd{Iv{Z#UX{PsvFIW; z$O&l6e9$pX>zcVV+v|8j9IG3!>RF*Wj8s*Lzw>o=S$qCu*nrXsG`wv_mdI$$a~@$L z;VR|vEb;z@=Iy15#%pVb5kvVbzb^n;>N}s#l(Z%7-=w>(oc!)po<38^iC0ZU-}>K( zZ+Dr6%(^sQ6=S=733|VmSO^36TT|V(F-)vzHgbED8~!POb~w0t8IO~zh@L2=A`U3a zc1ZeMPqL5M2l87iFS5UYOx~y`U*EK`RNHymWBfB!s(*)l-(&g9jdnp=zeFejkzRg>GJ`ss0(-KpouXxjL&W4*hp$>R{c>p6g8 zDXv*vyz?2gY7iEIG#WTAP~ImR)|eUhO&L11z6~hGc`os zSK5>kWZsq2DLl?#nPjfv)K^DSbG>;vtWc;)irLxLC8Qzs zW(BRq^%pAtA6W3^>mM2Kj|=ruo*y)Eig}!GG5yR3Y6Ora4z5X%jVeMD&hyRiN)5wy zUhul^$Ix^NzM}C+D^3F~Q`LEQ=}<|c-@!A+3e^UQwbs2;1y=3`80`h}Qhv&+h4#N$ z$J7O~qSX$9wu=3h68j;7OGw4evr}yf%e%9BD>@gsVFQjiW{Hzw4_M>kfVD_kg*x03 zB7N=>J?CYB?FAnNd$KpY3BtHhZiF!Kpo3z`5wk(ze2uVGjz`TT(1xEaik=bUe9cWq{wojFf&U3gaj;)k47nx*jW*D3?K zXx<742w)O=`mGrNr`u$H(n$tlJAaese`if>-}YG7q|DDmzLVMG^jV@H$S25x-Etzv z^PowB%`-9X+qcByHXM0?MnKA_%#dcR6RmgJvYHwD;sj1))E*A_%%Sf9WQgAThknzU z1XA90043L#KPUi~A$8BXXpq!W+pvf4)da98Z5;u6H*z!+PL=Q~(UvMpz=<>(9WmlnzW42f`I*_$qsa*++Uc7~ImIMEy8y0$#*;V98nN}U^BzSq-!zshrO;HC5?!UxwmSsZ&b2C`c6K-{YTVK|F7cYn=b`v z=T$Lh?hCrn`GXaJLS(mM6Gmi*6jz%0jzm#OuK{VXGbD?Gx4CjDZ&6arQrwWCbH2>| zjoH&FK&)iwQw875ob6SVAi+gf8G-epUyS@e(%w6u$#mNuRupwW#6qu@5u}S$sVWLe zRa)o~5ReYiArKJ}1pyTS=}MIv={=z%z4sD|^b%ScY2S-8=iE7t_q)g6{1;5j`;`6c zXYaMwUXcMB?1ExFRuHLyO4QTzYbAC={0!?Eaem?hJpkXaG>4D;R79S|nZ4E*{mwE{ z=oDn&;qP?94|qu#J3ujb`gQ%W=R#okB<+prtcqOy|mw@vus7wVV~2a%oJtQ_Nx87m%evxC>C4?49MJ zYx1mkRRNIe78>k5OO1*hL(*@oDW3+4p%L~U1A~FC$S7)B_};Un>4AaF$C*Vyt*v7- zenyUNX28dG#@x)z?25NaN(evziAJxDB<$a$hHwVpX3cJlYjm@~B@vpGZdvEpuU919 zmrwU~Iveq*e^{>6q%}R~*qBnQhKfC4O95=Tbkl0jMTK0QEX`Lu&rab~TkREN9_Bov zf-~GbQh4lC&4oR#)cW@*gktlgNC?-sZUA{VC1jJiHUyxi2?8yQr^Z^YDH~sp^V0!W zrzy*G_$Jw56uYSI{smb5SVOzKlt9r;IlC`BjjtGuEzxuYIZ>_|%R(bw($?rv*NRto2(7Yse?86b;&u_Wt zK@Obq%$r8?n_i*r;lo|S+Af;VgSIK{#ssMiJ^V~_h^5`7mrr5g_A&Qn)88qUvFa=x z)&m+2M3SQD&R0!3gP#3M3t(nyyn@f8|LPrWrjyiUbt6sfM6Xe|xFzty; zV*V>@=K$zkFg`zYz&y!e>cVB*!A^-#I&UJm39K^7Jrp?4+3BuDU~un`5%xAFMve;K ziU0PRRZM*=HaQYNPwz$XJn0aU3VGJvfG%t#T;4ih>gmMCsfy{2%^kD1eG|=|_-JiZ z#gqX96t%Hb?bZ`Yi=r_3(rCZhkpN_}nYkpQekJpq(7Kist;O4CM1lw{3fX1BFtpm!`(4A*- z5kh^CibE1o1l?Ed@T3DuVy1fBS(#NCpvh*!saoE>dun;SG}i<;A&b3#;M6vg1J;DV zt_RmW+u*%W7~gq z^q)^q?T@X%{Wjm1ZH#|?L8sWR)X0qqIBn_s*iI4USrto7(9%YBydwe(^bVn*5buy4Dk}dOhk)Y`9k%IObp?Dc2h$29t}K6W9_GEB zV;Q-&53Me!=W^o~D|D*gQ2gr1ZgX0AvA)IRxvWj=Oci0O;riHUh|7{g!Wd@sPd>T> zyZ+#|U?Mq3FhTaRU6O9HL&`|Ec*^&VHh$UAQpehDGqQJ8&6j-K$YaY|;bC86xS62y z-YPGOSwTb%%czpHX_jOo?Ck%T`Fj3G@4z5OEwG>!Nv15H9hK()U}7z`_NimiZLWX-h?w zEJ7HgAFW8<&beQ9(eJq3p&@|7%MGMiV9~L-y$Z$i9mC-mgDg!)5zGEA z;4)3q9)c5h)Z)Z#i(<2F-&|jEM$!$lDL^V>`?8|lQ30M;(jp!27n{j%H+dfb67meb zCsXMh^U9d_GBhhID>L>-It|rg1mC{B#4Y^x=3SVZn6j;P?ggb6tFskqOWjEsDv`(+ zO!Z^O#Kk7sqjPWj6T=oAIO#b09qh@k?R?F|xNN_Sd~1txM4ycWoUd&fv#I+h_m%$3 z3=cnJ4S>4t`(-UJfWcv+(_@|DCh+*`2;jnb!I14>ztKnc2LvsQ-T^q%Ndq7vO7hus zu$JihJ(D%np^&v>kP>gdKiVj&NL~dY_KMR|!s455zl?nCQm)N2(Byw@iAH<-6<$p-v0!(L1A- zks)+n!>nGDF=s2KO2YwWjSuVOcEA=z863!fez>H2p)K5jG|k^;>w5i%=9NQKWR}Ad>D4VaMuw^tHFG`0^=}pj*s@Ca z=J}MYo$HL)vb!HD;%^zP$IJFSLBUWaOt&(rPe)r6`?V z3BP6pE(r3!L7un+x3R_2j*-^JUMWlf*Wg`%Or|a=O!v;9 z%)xMvc1|w0Ue?FQ$Lyh@r3meio#B^R2d?9%x7MnMI5erV-ybVQlCmoW$I>THwBB0(^`;gMrlW#ChONk<@BzKJRZ znC{9BdP~_i@5wmPRTx#d+hz-DoDn%S^Zc0KihZhf1_uhg<+vO$wEddndc)of{n4;; zV}FG(v5|$B$8NMl@d-}DFAiy;?G?2VH@OwRy-}*c1~V;APZwE*F(0bB@}5;_84lQ# z1kMAyDW7Uc_g7}!`TK%fUzgAH=TF#Lt3dD1FI&olTDNNIwJoCZwIyuEe`ue7X9WY5dKLhaPU zyYm<+w>Rz*s7@Ab5?gvy5N;)0ScamgoIlfAl(_CqvQ$kMnPB?yLS{5RKLIolF0DL^ zz^A4-@{Ng{7B&!=esH``xyHW=O#w2q^p79wIQj)m*h-Z7kW`#9?ppxmT{7xlgk5~{ z>9qd@)~@}2)dq7i`$28hia(hd+ zb`BL4o{+q%xs-QjLdY=v2wd?gUjop?!d5M@ zCCjrzubStNuWg7Mcm1*B@C%goi;FcSfE<+Uf4bi2X35*m8Ycii5n(sb5n&%STNzjy ze-uAAE_g;7RpV9*{)n>#J=~6{Sml(gJh1_ z=eAhJuixOmwN5~8gZ2+C7IR>sD^ zlv56{*DGqk#M{r#$^EB`ddj#3TN^3eHxkFGg-wlkU=I3PEyVAi%O^MAQgbpC@*nJC4sdd(Dj@sbYHn!r#9@nrX74`3CM7_VQ-1@b6vR2Ze+b2%pL019 z-;hM_CDGY$KbU<{XrK9mcRKZYGm=34?>AP%7k;U!l z^A1aP~U75X_E(Dtp1$zjcH!&=swg`Lfq#vc(SJQL8$ zj}IUhIqof`K$E{MF;h zvEs4$Lg}%peHJa~rbl6SYwZiiABbeP|#S&ZQzhUx8jP9M0EV#vC4Qn$e*}rw$&;x$sedN-spNU2h5`c}|aPE=b z{oxM1ab6Y>i&z$5531c8>wgO4K#8tV!6(=6wH@=XtT$tGIVZGyw}%iEcg@2%R-#)s zvSR~m`b^k~;52a)%~(MCIPTfH<`lA~)00&N_B#3FpdLj6E&oMJl@EXa!Gga3sR$ga zAuT3{AC48^nysnhzb&c}21Ir)CWzPYg=c)eyI70O%QItv)To~>evG1qF#6D0nbyT> zc6SZFSMMFcOR%c~jM;a6mMy_W4{axm#Koe7#?CHVwf=Y(0KM%2s*_Dv~dHZHr{I@(q-e@?%jD|+$1ywB#t<7(7)wgat{Lq;VYy=xMAe^D>P<89z zI{D#td1(kNltpIh#s9orfb~r`{OG%J>=A_`62b-B`eU`Y&tzwdDHmF>W8|+sGLW{%FyM0@Y9G zW}B(Sa}7OUE0<9|khbVOeXv#bOkL4>;I8*mvSmDj%9+Ca-CKIU{~_IHcX}I>8wf6A zaPP!k^IZtD-s#ttc8lq}lE^w5+Aqf+gP^bXa5Nc{~`T# zBa`~zGCWYjGOxjskH>MHBK_nboOpibYlpo}#Mv#zV3hgMJ6_SMAY8C0q=0iwm{ls;kLdpU%A`W72E)*ie}&cl$Mt-D|I`|@KTNop3h?W#?N03d zT~!JQT!Ly>1a2IOI=c7+C;g8@{j-Dq^M7My2G+kNh3eR^{>L9j%5WeB z$aD?D=(olEx2^o~w)pqj{Pc~l9}cm?uPJM_{`ibvT)G?g4pYHZeZTxbdHCg-K2kr> zkNmEy`@Zl&ujo&G%rA`f>FKRzjb9$c50iiN3J^my+_`=A2&jHwRGf z8IE6=#Lvws?i_GSta&6~ItsDcy#CSVAC9f=#J9JzVX}vRWj;R%PQIQB!~g?oJy(C_ zrv~@`Z;pR`H}EK6;h%oy_J3(VPe9J|8OsFbW&Y6O9y>V)HL6MEa2}#|KT?tq6(y4pD5Sj*UPzG2bw7o z{|n*$=hpOpJg|xHqfhOV8eQ-sTE`D_g7>3@2vXnC%_wOzf>Fer}Gm8w3|cky!xqB?Js=yjrgNL z6`c1GPW7DR)Gsg24-e`)D&7GIg7-cDiN@v+AN@c6OuzT^DNOw40Np?I&ZjjV0{T+g zKr8+=$Q`9Qj(_-dZ!`lrM7lr^WMtDt{-HBG6xdJ2wtA-yWXl}!PuJa+`TUH)#y9tW zdIWDX0pY_V_U?Z?o-?D>UN8=qy2H2XKt>fSNB_IC@xPv?mxA|ob$%bww?N`k1;_6Fpvw76ZvXp-XMl(+7X17_WXAs2dHnBhoL2(G;jK<2JN?7E z<1hkz^MEJP9Of(HFd{{+5CN;!YBQY2oku(XsmV!&8z9AJDXG z`Tu%!if+{9!LVcot9k>LTZgD}%N(Ow?Li$xI%LOAeuC9NfoYLQvzBv4B1g7yX^wcV zp2`jz$Cad0P8T)ohiM*4t~gt)b=MYojF^p;*{3*Qxv=X3?-+J7pzjQO=P#gh+Uq@X zlsVd3!V_*&)W#@B0XY{zAUli!GALE_>QF`wcKX&|m@WVN`u${;9zxHapUHhD2aq7p zJMV(8ZB$1ail%jkaPZ3;FUBO)!Gz2{jzmsizGiOtslNf~pV!~ISwe2jT=aB zwcG#g6bnLgUEZlH-ekT*4EZXysOMR{$y5>IbD?7qIK z7X|oKEWa@SKNss^9OG9SzuzF}Z{-R6eo4EdLGp8F6w14mB|s|zdKll?@X7`=HN4d0 zhUFHP-uqw=#_V=b4kqKwU8=?qdYzRH7}YN=`@x3=cd7Ux=sFOwA;E3V-is&@Uo>c@ z^%!mFksQV2#4R9sD(}@oce1QvGSuIxMhuqCGdz&MEcykS!lGz*L+=>_M)i|O_>Hqb z%MbW9i>Tl}7DfO3*LMH=Fruh5G&C-34IKe**wQ1J%heOc)AZpRqtSC}YtBaJ>^03{ zD{j;IuSyMWH;sOx6ZLgb(hFr3vsT`JeDq!2$D2ordq-UUpVpkg;0@!;v$$1rn4}(7 zW);KkJDQUa>({O?D~RR?yA`dP>6rP+E=r(ZuRfOFxg%1a%KO^s^K8vI#j`5K&DA`AT7V#Sj_-_viM42a@l%=Fa4i(mr;d@wW&Qf zU|mzJJ2JBvMsso<$=edi_GS4M1(W^-MB{G@ECSHdoeHIpum1Pv?qAkYca8631Bl)) zU$Fue;r)0&SKeW$t7FQg>8o_Wz$-P6ji};PGcja*`N7kpsasAtzU&KP=TGVMwdwp| zh|}eqxeYtRa{b9|aY;!`{1W=(FWY{v?9ur6_*6LDEEtxIsZxY?cx<;!R?0h$1*1=O z@b3_xOeDpwj&u9FYSzd?>$OdT57`6%88KsP&q5Rg#*r zZF4H7prPO*TKjJ~iYVNtjH-9XQ&MVmQK-c*W)|6!3(E9PpJiNHUdO#vFhVi1$hhB4 zk5v98C;2hv=qAL$NIzq({_e!^_**|m4sfS}qiqVYtyE~yZ;z-|vT)6^>gG(~Jy=s? zR90(L4}y!tzTXlra4MYMvD8;EcEkQ?jPCj78X7(LQMl1r8c6Bh^7^GfST~cYJOUWXfmwu&DP9G}Vuf8@XITn%tfSTtZdPWOk0xR37B9u)|NR~2_9O30F*tVA~(Yff4W z7&s^W)@&&|#e05h$bWeA_OBR1uVmnWh~N3#P4tZm3?ARi*gd2<^w==_8->-kxp>w> z>qcH*cbjKN)LeG*{c@c_XXBOPK3rlRr&QL-Z-CC0Ojp@Md9GWD`iyrr7$J7sUb)tt z+Mqo|T5s^18v!ZQd@a^A@p4G?>J$#!8+p>|ft6ziD{O#+FP}0g08jd30)=9#@yx<6 zuRBW}hifW8ssTc*t57%gdC+`!t%Pv3m9}{{-#WThOCxW^DtAk70loL4ZX{UNzoLDh zeBI1(iPNI^k|HJgRN3tQ+;TIZ%h8*;IRs%25#NH%z?^eQIBODh6w=ILxs z`RXqfxglv-s^R9|{BgvlmQxBzaWG#k)i+fbHgv=nRA}V7MR1OvPCE|LlI-~)D%PJ> zJ>FG5#V9omQQ7viRE~Vz!!^DmQasnjRUx)enY}%j-WD9~T(x~n)B@KV?@tp5i}#mc z`jz9jTuSA0ULd$w#^|?Px%KG#yLegIE%dit=cXl1vWj{F**al*>P2qkYcWKT(rXT* z+B%g49;47888+Pb!m`?YCCHjF`QiG@7HRJ#56hvxAWPgwav^@)GG;ESlrl^O-jG_0 z5CD9#9jpQ5CFiXLZzYdVY8yL5=pb~4j?oPe+M;*Qij%?O;j%8lg@q(7D9e#nPtDTo zX(k-on`m*4YU0NnlmmWUq%utrt~U!2qK0$D?>!;T)ELvOjXSrZ=h9^JbkM9-J5A63 zj4g$E^sV9c@7gZL>|{ad+CoLV7(u;?^$@|%#~7(4~Isp zoQhyJOW^d9lMyPYCX9JM>=&SIbttzc&I}kcNBWIxs!)MN5Zl%@6agro!p^Id2}#VP zZ}^<6*2EcHPM1_n4rItmv50cJH2Gq0Tp$b{e#9cBLqt$v|C!)n++qi;g|>X^3^oa$ zYeD&n9tr2vB)blxSG>oXf%O}=YmA;3AUHoLad1?bv44;hNFp@h9t=ex`PQRvfla5( z+R4?pAs=SJCkY#6Q`gESG96J~Z^P{KlxA{U%w8`1*OB+Zy6s&F>^|{GkJj(<%kB>d zj=kA7m{lN5Aan{mZ4)I8=?M>Q#dj0&v~#&OQw$^1@|RJe$Gb`1;(Ht3Egz-Lr8eDv z2To8)Tp^(_mJ#IF^~$d`$I{p7%$Y#gTy9=ACt%#ZoQ}ropkr`V(ABldY}cu`D$O-g zNPc$&b`2acq*&p$^5*h5GcKolIHqo-dUvr^$?)3#!pKq+F_T)x0Quh%msMyGEu#f_K1$!e~a+xqvhW6@$BfaJOO78V>|BBAV{y38Y z6A~j+EM8NDhqFv;uxfod;_|s*(uJVo&9RZv?uF$6ew&jY_V(U?*l$o1^&Q+14M6Kz zx_EAUF5&1ZN*r4D0A9i$K1#q`sN0Lzq1nYN>2auHN)Hul+@+R71)PakUH% z7nU4`jg3ITRqMAt#wLSp$N3>1*FLZOQh+BT2=s30 z+nd8mDk8eUD~Dl3>^Gbd)3^2sPMdXZrQ?_$dSi!Zwz#D*F+AxlXrKh{{_97us*BA6$RY1YhfQQ#xuG=%f50h!e*{M3ml#e z>l7Y!{y;LzS9HRUx;K0d^$Gd+D!q?hby{67%AV{OIy{rg~i4?wBYVLy=+0Zq45RU*)it4i)Uw6<&r)o-z zn!8(`eEb_c&fA^umy8m%ptw!atm*uV1n0<=0pyiLS@H*wQkJM^#!%v})%N3li}6e9YnZOhlb8mUU@Yd9z8q0`+I4P zWf7*5V8^!u69M=JZ^y-nU@}G4X{2H%C6f7;aoEXD8BOU&9nz0mO9hfbRkGA0dy@Ae z=S(t!`bj-S=&8|9JBVhHT1;LC_iG)IN<@kMTM~-9N^hM&{;ioD z;hlbOvCBC$t-FSg_O85fVliY%&CmI43Z?f&UzV0BKKs__dXwT5C&g2F&y_2v$eNy{bDJIqoHM;DHrzX9p!(k zu25mZ

    WN&8)>SPrtP6abRsyy*FCE*e#%0fs9ydR`D{(@=o*|_nUfeD>lcT1x8v# z^arI_2g3AXZ_U_0q$r36=%UX*ILN3#pb{G%MP}&NXQ1qiRg)CL-c46Grgv4_hzr?W zQd3tIDmpO1y9@KQ;>?dPWmP)}Yz2w^zwS?b2X!N zD=h_z^12Ukq1iRtZt$KVV^-lMwlIIksW{Sbwd+=7K}2hcpMPO&;*)QL;!sT?C2&R{ zO!u;Y-ZQ&=)4e2l8pcM|R=FtZE>Fd>1%!{VdL0#0lME3OkAK#(OmdQ+zGnlKUg{l<6Xt%;NNxjZ9|jP4o@(jXsE^?50iR zvnt~DhVka+vToh7g#_1Fy_2)0EFU->s%Jx8F(6Nq-^F7BU<%~M+%Qx=v5F`yuS9b) zGv|qqz0j6NBdMqLj3W5M(5N@@GY;J+%LvulxnAX$aE+P@Je5CPPw=pr5fDOWS|ZL3 zY{JXGteOV+*qvlY_=Y5ZET@J`8v8jw_LUNJC5!`>pXLpkxxFhhnh}VG$nnscFGSZW z6ff}nI*Q+;6O!KO{pD#~jX-)bggSKG_n^%(6WPy#zg;k4g!m;%Y zcyq(APf{WwSM^zBWoSdX!l2XMev=+rZZgoirweoTV6ua2vfNg*jP|m9kGyASDR16` z&jFqb5>ic3Q9R780lUkWXf1al{v8B29>I`Y^5XQU1RP_{0yN}^k9WbC1cwr{^`d#t zx5=bvP*y8Sq~iC*nlTdv^vn@#glleriLY%IiWcG_ll|LozY-(LT>0{QAS{CwqZ%m- zB|pP8X%)QM$x#alaH$==p4(9RfT<=&_j*nuzh0`09BtR+PA_eZR@ipR*KY&QkOm0lViTKnKZyGfZB`)OB5=cCki~oQRw8Ds!vVnco^M z*Bmy%+_i4o($wjv@Y_SKJ?Cfz?rwZ(Yv2BqKl~Ei8V>vlM!hBAjjj0DN zC!pD$ybzH$r#BsdAL6vE4v#NBnk|wfyVqpDJ5We`vrv@tc#WYY{bZve%1^i(=R8ya z=>^;(zM>I3dBt_qS$lzaY zgkp1jk2Z9-=32x%LZBXSdajFrD*So@;gT-Avn1$s+RwYHm;ploTmhiZ%Dvs}|UVGLzyn z0LiGZH5&hfJPDo%LX%`z=ScEee{(4dPIWE*J1`>-f~mGH2l@S!+*OXUw$$egI`+Neix^U3aB)$E80_C$m)niT88$rg=`{H&*e#XC7(j z3_o|AJd?xp3FZv7=#btzV$TdSp49YVEL_vtf1FnVahnl9l%;X$6hFHv>rZ+Islv^f zvA4b*%PQ$|HaZyug9KOVDyGyHi z8v)NB1v$lQI*@~DLs5d9P)cvU1rn=ux4PLAsRL`e8D~G;KJtV-6xozdkGOy0=w|H( z4%cVi6&C^_+KVA0_Q<<2{LeE~&3)AD)$O|`tdJC!bQgVF*|_2tG}ZBR5E7soFs0$U#E4US{lygp=ZPw=QoD?Za*!ShC{Ur1#t$f{6(Y=MIq7 zAKj_V7jY4_p@th#m0sTR=(fVPpuMz&O}xp!aYq~`5lRz(m)&19lxj-P?wUq5 zGSSs5V4Bi#9T{CWJ2#M0qGeN6cti&=d1Y=M9&kG*6Qz@=xRFR9gw5fzyZAPD-i!mT zWQl~lBZ>}Qv{wn|I3w#&uJ?(?z!$#h1l)^4n*qNBriYz-tTmIX-(ZFp%Q!#S#yrIi zt(tvRlRGCF9HEVdF`VRg1WPZZ08nHPbCvdeUTRPNQltsmg}B#)Wzck#GO-bee%dTb4xq^-! z1Q=A>yyTV52Da9S$FJEnr^_p*`;(6I*0K?7%xi0=+%Px$Dol{x_M0`M>$}j->Uo_p zSvAIyc4HlVCdbHmGFwzumtZ0gcnAci7Rb25mZS7e2sravArzO)wo@#yrZ$``LB~pn z^7j}QE>@THqy3V$%Dst|i|V&?tUZbK#te(`giYe;q8c-kl1<8_NA0bJ^0{zw^)5zs zcTNRbk$c}%$b++Hx2ka3uIr9w`w{T*jS5c)F$BcCq}~E04m%azGIW6vxu!hipk(4L zrW-T4>L$UknDga{TO{vUj4W-EY?9BD*9N&(XNwn>o4L_|bHzo!Xmv6UhtU)->v@K05u;jyHAV3mJDgwsRIFAm$^|G zXW>@~keQp(q#tw_oO(RKp@#+0V%IDhMhlUbuzf;Y5rGOs^mu9O!Ag1Z&agXv(LBjM ze(h#TG^(Y-2Gmhg#fw z5W&tJ&zK+Gtf|Vo22=#&V(LI@Zv;-^9XfpqD|326M5INIy=EJGazi%K*LcQ0mktyG zTSq1ensVr6)PXQaTMn0o%VE_e&3G_Zwckn3ipjI4QVzXOf-CJLwj}<@_{|>h>tR*( z;4*2o_+ew$o$RGDpB#DYXys{NRpxY6gY1j?cJ_I2yL3CF=<$15Wc~xytcGkkAcof{ zZ_O{4$|@8v)tN4zt~zItBA*boVakeA#rhN5vgX@!DXebOkX#6B@VvYNE^yR+9xaf( z)~N~9cm~Cpe*va_dc)>K3GbH2h^0s=fO-xO4g1K>v#KuLWsKVF9QN^GO0C+9xtEb; zv4#e{JctuN!Q^fXS4rjB5@jKEKGGw+i6{X9Hpa>eAd(b;|}4goRmtVBGe^wia&2M(%U>HJT8 z2(3MsSJBF++5yCj;=7hEjRBQ2?K3gs_GfL%BK)Vzt;5!KgJR8~Vr7b}B6xEm4}mnw zPmph$=y0xKjYaOeo5V~x_tT2)Y=%zsW4&4dgzXc>&(w8tBMZgdcuWH1A>b)&oh81d zry%Y_+N>}Y(B~B3o=9p9?ge2kg}r|)f9D}(jWRu(VOB8^LhH8Y$Z?ur5@0@rH>=rA zuD~ZCg%Y^|NwLBSybXwRV)z_@5M}UF!~2(=lRW^T{Be``tyUGt$Ni%e`KWgp{`-R> z+a9*@MkgWR-^&+Ly8dKVL%saHl|0X-DQs)$2y$|9Mc>dT827CeEA$$Qo$_&=YqMd* zsGQ_xQ-N%rV_d@5zsh1H?ADE>MJh5fgFW>=L4(l4-8rF-_c?TIZF)Zjib6(v8?p;d zK^Cx3*YOTfpZ4A0RhxqlPh3J`A#3i<5$vlWeba33Nk&;Ju<0i|&0i|rMx1chyPBK3 z=-5*X|3ICuedP-EtDTsTm)4ze?B^nhZqri*8~#fi3>^}CLMA$F4My+kMgox4*SLHa zhZ;-{QW#vz;RKLrhf}K=Q&g4&Wn#Dc6vX32s~Im*hznY9UFkmh0)OIHC4DJ*X$b}B z4!Ze_S7ISlUpMo~-Bln}X?kEYX~0qqU@!MVoSCbguNO!=uXHDtBZYK*I|v71mqmz% zzA%SEjC@DE;Y*?L?7@D2osOQ^V{oSm3Z6-?b5nL{ehj6aqB@|v0i?>&!uwD3Z*FYK zOXc|bd!>9HqXAFR^$l!}mfbv>J{R_>{Tr+ulOg2W5_Q($1J-F zWK&k$P4ch780~`JB{&w{1mHfqw<|imE30eqlqYJuk^BATqE~6PGd;%*ms(%P71Izx zxIJA25yY*A0CJl6X!QP0-ALY;+Z?kEG4pC(i7zO?)P7=<1`=IhzB%bN*APZAI|0og zW1Y$#tXJ(4)I!|%;lM9rM8&`PrK==}%9OElHOFUyP|*Vy7x0u{?4PsZwV6$sD%#T0 z(GPk|Qlh{{DFCMD^k6L8JJo@gx^~#u@pfT(S|Cg$ai^zZJ8+41*Ri}$b-M$$X^>d$ z&Ks?6gz7~yR?En44Y6{i$ggm_b|{H34CBb*pokv-&*+O6@r@28Enk-t7$fi1moq%= zm`KqYm6v2wyr$?-NSZ2*Y>A|JgFZRC2ErIp)y%6@H{S9M%%>p@4Q7@jTTx621=n-7 z2!&G=69!lpq}qF|WnQIOI043HTiw2VQ`FbM60$pK92Wfza9Z^0zL!to0^Dv!i{G@> zE1!EFHpWK}*{B%f59YV@Sr#!3m=>*WYVv3mw$9wVF0?fy-<=c?yLkdqi&>s`ZH)|I zax-(#M4n=ixTb*19Y_P~-}{`VF_T;Mu(WO@pI(7E%WRZ*eEAfLl^HzhSIiWp?r)_J zSzBkfXnq@HNs>@*ZuN2`H$s4@B#N@M0-7TrDl1)5x`w&fTRDn6!u&k3_5Z5bIqDqL zmt}G_p#I8VvLmVyVm=c&?m^{G`ZGTPE zV!|ARyCEDUTH>c3p9<1QAuA_hfxtMwoQa$feH`9TeUM>pcguFIEcE#A*Rdp#qzuLn zki8Fko$p!1e0A5qOzDd{l`ejB1FCT&kLpXSH~qi3BsiA)Iy)eyn&yNCd_~A>dfVfB zBbHxhZo1-Z=wDS;E%s;I_R>jBbCplKdI3(FJ)fC-Jb#D6!N|Kl6Hx~`e%Ms=-+{}2 z@uGL-PlG&HcM42W>+~(gBZZ*+v^(iv^h+fHxMXxjj5f%$m2+-tb(vnV*kgScE)mw6Aq$q@&8%4MZVN5| zQe_~9D#bN33oswA1PUzkAKaYyH2pWUu-_5CEO6o(KMw4O1!YXd|Gf6g{F>+&lYlj@ zVEKI(^Go?Hb-+oSD_HST;0g>?@Q;Tc2Hr#&+Pf1mA57=t0PMCAX@v88lT2z)fux^S z=s=a0lu?1z)ZjtbjZUD7(LPSt&@t$HhTpZ+XEO4cU$L3X2bnn*wsUIY@4X&(Au;)@ z`JUg>Gc5qH;{3{8n%UfYItjTNwKhqN7UlUZtxw7Rma6*7J1{AEE)gr}`K+=f!Z80a zc+6gvc+YzI^s64Ci+L3Ws4JgqJWl_T-a$cle-MN-7BL;XZ(Yo~^Yz|Jr#{=m z_^SaX>j+dxt|ny$$`#%L!>P;?U!G~4dntG_db~5PczzvBfwN5Jz+jP#EfEoWAt+iA zxGsy%ewz4}2Z}^_B>=1ZJi#4nJ~;tWUY6PMod&TaGZFp7|N&V(@CGRRH? zC@vwzJ|d(EiC`ZBX5*YO+-rbE!QpZGAyCevm|Kqll@^giuwVXmq3tm8gPxe*ew@vG zrZGzJ^*vsCg@-7ML-|)LXai0_JPzmZ{Tg!jd#_%7UO~K+{5o(=u>di4#?~ZXqFWn< zaQ`IR{mT0-rCwUEDA!3XseLQp=?mH!>4O1J>Zi6R?78^XvwVapv&n@fN+}JlE0JrP zK9XFJ{UHPU1@pqqoJ$s6(JvUa0LzU|z9g?T4fp>V<2n;zzZBB!X#0WR!}HEeZW`AJ zl3)Va9$bWKB@cTyM=GAR&$}wVQTCXx#5M6;WrXu@DW>IMxY z0~5KP1YIeCGGYcIReC75T@{h{#zMLjD6Pb+fTd=Ob&+sxT|S}P0;hzC0YkAF_)Wjn zXzAtSv;u(#$hiej+!X0F1PBrUJ7>->#ZEY4XT+Gdxe!rR>Wvf{W@SfQ_gzXg-@Yw{ z0(L^o+h(eu_y{;Z-+qS1(lP<%FYqE?w4l^{Lxy)tFDVzmrcFiNx+ifMm=gd*H`$h! z?T0qbJy$|9A5kMeGwomNmk-#RFrE+OH9i&6ruH+d&q<_ zx8Ec?2b8lpG`8`6pga7!GhFWj#*(mp#$L-HZB=H|^CG%VDY6Aw;Bcyp(b=G^c${CLx&HX(RO&ux?2YDi2HYxxa?~$@ zY3`{vK-9%mcGG*yKz@<)I=Vc(H8KAXrFWpfv$fZS7ur3dPIHHDae-kCP74)gGGc;EGEL-OWluLU)4> z%E8U5U?{HDaytl#9J5gWj!kR>5P(G%41D(B2L3XPF2cIDpFu_HwF;gz>iT-^7&l=v zy7`SBjs2AGct9Tl?AE*auNoaLZzU;x)jo(lA*`^5*pjea8C4*1EW5w1>?mA&W_1#V z;^4a-WAucw&Al0_=4@y%_zj5PLPb!;_hyO3B3+@Tk(DK1QUZtz)qYL;^YK9jE7J1z zG-s#xW(M629xnhJF=ao07P*?!9@Jz^KQ`xNcNth&ipx#Tbz4N27q}U*YEY`w}V)!5ugd^x@Yg`e= zT;2uEknH}EO=B1<_qg>fack(^*m3|`BQ+Bf5L4W?rapxJ)@k+$r^&>IZbH=)**|N` zzF~hLZ4M%}M7s;=(TnPVS(XS-Z}W+9dEtuXoez8N#RG)0v5V7)jhNR>#_3FdQ4;9Usg}&L#Z&UzRTbE_SmQV8b)BmMCtr;@*BYNV+T}x-Vp>AD)-Ad&A0M&r^YUS$kzGtQ z4)s5X0LqZw3oMcq&`In!fw0LmIov=WATsWnaRWrdlVN88)Gl&aPVfs~n^*}2)&-Hq zr6ou4)h}FKy;6#F40A11)i)K;tF8i~T{Z4Y5wgp*+pkQAg)kXwo}`wH=3awb@YC%6I%M^ilE`-NR| z#eNR=*AEh$<2wRtVJMf1X5G|AwLxRcpNva$N)r}1p36~t~t zuobFm;l)PHJ)5KOai0!N&S`)!nM9*+UiAKqh-+ zi&8=_8Q6@4X=4_CTaOX*>gxN>8Q*G9{MLcGcEHt7NuFc^y%mr*-oNAv&}>BgFp0Oe z97exf=#&2FJ5=1gbyu&$+8WCteT8;XsC@FGPUfmjTL77u3B;X`#Ki^K#7(}XYObHg zt=?AGIrHB(Ivn61?x8ohIuFQ_O-yUAH{M@I0q6o`hj)Z&(HEf5y0<4TM5Xgf zJ178bXih($z-AVjJ4H`dpoj5$$*xn2Qh4`EuKPQNX#!Gl%JiTjytYO_@CIO(7B5O= zxP2q6?1TONvqs&!9{7OF{m`a5bDzbW9Qr`MZyJoVS3zbA2Vj5ggh-O7(xeNtD4 zoGnGHI-gqwV3}!$0aU}4cwN?YB_z>)T&QG^14`*jHe@VrM@evxL>mXfXsW2djQ3>< z)n;DMyWysq<0V$QIXJuNJr^43Iq%#fC!;?h=eYk0HOEtomh7FdKd0*_xsBTA#cu{ znP+C6nK_5UUSfMVadq*`25q`+SoTVdLMT;7o?8Etxgo=$vF^(5!(gvj2ye z{*U_oJB|HnzjKo3seLAZp76?(QOA|jljq==n|C?audZ`CgEpYPyd)`uAse}gKcpi!N6evPM-=$}$$(YtE z2@KKG_p<;>6kOT;PMOF@PE;Epsj8@@CD>D)x6wR>Vnw|*`DV; z?K&#_pL`~@A2)^65fm@AU~?4YI)-LREKX@`Iqce`%Ue!qUq(eKjCs38OEbQ=IJqhc04z8KjHz#45+H6T>pz zNR*htgktS=?u0sF74N5oBUD?Vxm{Y4qZC@*6uZ4Q2qWx0g(6Mnk@62})%LACgkqNh1 z<)fQpw84spmp_HKzWdvu3bP6P?T$L_>)Z!}ckns6>qbWB4*i2I{7%iitEWix0l}rj6w2WH zVBEJksj^iEL!u3grvp_gPKbFeG!&Cmct9AcarbNAR{JAa)y)Dn%_YT-lFMWYcfqlH zEm9f3rT!z2`8Ch*Hc^N_ww#`Ea&^+2cga_H?9=Un{^quD{X0Z<-RWasP)#o#7AN53 zd9x4l&J{)-BH*ke37?NW=@K5R>-!|aR=wAk;R!!BzkjUOS zm1oBzR!x?TAKNqNRp-n!R<WiNzLyvvz{AxHSKW@8dl&0=^|`<4Wg(_CKX&p?iFg`rplJ?(;@6Z@TivY-((p zw;BmB{m}$29LHy53Pzq-lS2ItpJD`;QG5TJ z8BuL-jlqmtBb*y&h^>#IcIk@_Gegv}>H#HH>s;|RpYf+V^-PfSkQfe+k`Rx+2%Lsz ztquK;dA(apN5Ag@X;M|I1NN@gz?1eL??626Q0gq|aPcI4U-U_OsfFu3{FWBV;tlym zkQag37_H3DSKeLh%>5u+59T)eob3!qh)@p;@zRTim_^6^*awcU`#>lmSwsuyQ2+Iy z(2bq#EjQjLY;6B$nEdWmy$#OAf5h>xrmN2q`gu!#qb}XH5EnMns&^lY;X!VOakv~Y zzyD10z)|>;U*Jn_Ib^eukHJVOnO)8RF4}1n8%4ZasoN#wTWXQ{P-iW~ZFuhckY@+# zYxBMw!Gp|WW0`akwdp?O(>qq^k+)|ya%Io`(=WP@tVDqXr5dY~%GN!(|9n>Yo9W)l zB}=PCltCIW%vAs4JA9Q|yfDQf_od{5Y3+Z+=>0`qQnkNMEF+PS!3@*>Am4wEs^3=A zOxQn}!w;o$?NxWX`_D1)`yRBvmVV(%;ok9C={@7W{g8h(^Y>RB@MfUBHJEV&`qJcI z3&U;yDClwbSYM>@M)oZc|Sizi7}uNnDSOH-H4HWNq5b@!xK*g(7ICNjC7S z{72N`U*6mtMZO>7y3oBc^%wd4<@f(vIPI^%RH<^wQU8At6Mi$>0xFto(5^u85~hy} zC;yQE|MKR$=2VCNMPl;TRbM)usy>);y@KbTXu*F}TEl&$)z#J8J34&JaB5{vO8<6S z551x^_AS|uQM@|!|059K)bjctZT#zxU_E)?!h+J9x0Ld)V)~2F|99e_y3d=Oitc)E z3AIE?{DDqGihun{U_kTNaM&|2$m5MP*f>1^PPP0;-{g-sr=Iez+P9UEoy{}3J?4c` z%bZ2AZWrlJnHyNYFEtIfKC{PHM4f+k_i7jYO{EVXI!Dv&d6r^as!l063nTUd$5bYg zR~e;*%6Tlo8u~FN(5I+XhU{8|Eq7IW?BAOkZ7H)q-!2HR^LT^S?wH z7wGgbuC2L8^Fy{JHa(xc`rJ-3=vMMU~hdqHxu5qay%y$N-v`uAAwdfPDa61v#b`Dl}&jF+w8 zK)~HZ`R*{~@V-pAqz-Ihc&xTyO+tN#oeV1C$GzJhNIxp$XT9b0z*Oipigfb8l@DEj*0d%g$3NNIJ+hyVPLKU2mm% z$c0;6`y?!XkHpnGiR%`_$H{6njs|r+uG7OC2`?tc?GfL#he)r(GiRc}l*R)G-$xMN z0m#Hh-!etPJuu7_A#Hvv?L3 z3iMUU0**{!fYU3Iqa3+ukEiqwv-rGwRKLjV-TF>bF0Rl$yLG5@dBJW?3)F6{KQ8TI zcc}BXRt(IWcck-pM;n7{y^A~TO zWAgo89Ug?$lXRnn_*=c4-0p+qsM+5-_i*veOk^(2=?N?8LaKdnKxBzS#mH8z0Zv5D z9y>EWK{m1RF5DZr`5gb-X02cM9y-I-O?tpN)h;|^(iq3|m`7MXTg+lEoU0DChotsf zD8}0kWVD{}E#pWV-#uLbXYsgHrzcSBSjNt8w+`h&J)=8=S5l^da<#W4p?6mmVEk(I zufes5ixX{ZlW?i+C**4uFT`B-f(vOR{iP#%-0U|{A{AQzL-Pk|>up@-a%m$|=7Wefb;HV;BlUHEqgDqngbsmWo++*_v zF9u;Ybbedq(2t&lq&@Z6Rpq6TwAGKbl*rzFfMvuqZ7f(8I^mn7!r$cTL@ws?mlvlX3ro!ND=*>{@oDiQq zPM~ORBjMLHmHW~nTfXP6tN6v+k>b_UY`on)-Rz9Z$$7l}s@<(yd2j%iv9|LH)7r7` z_Yl^83pG}coeQ&?p~$MYyQe8iP*!Sfl+y*vl5BUqBw*zBQOk9K^ zf$a_^_JO1oH1*6oZMrS_U#5la_@G3*?k&Tv@Qxkpb2*f=%0brLJN{R14T+-&p}$qofBY zlDO)Rd+fRB`CAP67KH25=w$l`6P|?-Pd#&8JYsnvuneNxA7Zn|*F*6%x3|-fK~dY` znY+(LG&hjByi1oTuxt`s`wT9(j04_@q*h~CGH8;|9zeR^H3z`%&4CQI(yOrD7i#bQ zb<5kQ(HB{wtd)qNE1LLZ%w}kI%?haQkx%a)aJeGOM8;yF&Z|vK%V|f?xDP%{FwAWb zg2Nlz`eYM{rIVABp!iN@wmTHx)uxk&o<$X)RwCWqF%3kBYxFWF6Jl9dP>_~~cD0t= za(AOC(Pbq^&6KQcb7i6wqCH00m7WAQ*?hhiH?>>_!Q7?A*i!5f%zM+F$;h{Tbs(3{ zNm){;KOD|Gt+X+Mbt&T{HUUgfq}^-X1=7r)bwZjUa@o^|mln4m9v&r>&=_y?-6NB- zoU=iGY4`O5|Eg^+3a)sup` z#9ZkHnO#ls4jphmnr^X4S-9b$dCLij+KpD5J_HdW2F60e^7c6RAZS1S5Z7 zbgN!9c7<)Mtr&tP{y>+dXZ_Ngy469pd1MzK^ zb=@A2Mx;rlnM!Xj$a9z{mVpN?M?Lh~eMv_s5_yC1ZFItz*0su|q=mKDt(Goco?NpX zvBIWYy9zztiSpHf;*heEl|Ggz%lxm(FG$|{6-xw{6uEZy`tR)b&)?N_o56g5rNjGvzM8(w^#KLLyYa9<3maD2B3nJT6|i8|Ck`^m z`F!`Uw2v%{V)!0Xql*&-E&wkb1&99;%O(i~%~gwOSy8!NpE}M>=Hi?#(bSC>oECwI z3W3PPT`G%Ril;x>?thqV>cv|O%c2|g>Xa26OPWQPq78z|mBDVR!j0sa-5T5u1kGT=0i(7H265!S{$B=_&FqG z5eyTPk@Q&6gh1H90LkmoKiIqfda-Ely*P5)O$RolD~6Z}j%zAN@>pYNMQ^%Kcmgu^ zo_rqyG|i(UcV~Lyov5PiX4Y(G(4_$lLfz*ZB^O>@_?Y^<8Ark9UgXi=$K8@p_-v0I z5C68@&-m5+SWYHLVO(brK;Kpn+~#A>>?K)MR&osR)7}@3x{Vl`$F@s4eNLh5o>>pZ z&;usAD6iLV*Qeg9_!|5Cp*Wt=2a8%GNz3kwTS>~IgigEIRqY|<_H^m>8PEcz)em>r zUBL=LT&<283(wM5pVl+?0^Zpg>?6{Vgu?~KyW{X9Y1I?*{lVbq-9%y2tlhPe=h&qq zS}3#i&g=}w?7UKYsosLcE7K%b3?P?(cgO{#3`lCLLFuCPbgtI!ZiN2Os{a!hdh#2rc5M)lQk{oJMPfz?sVMtx60D3yEm!4oh*tmkp}nu}uub@d9EzUHdUtWJ1I<~Z$Zy`$ z)Up~9>`dd;s>fS5#^?lSOBFhnBoAK-K@Kgv?py__J*Z*Q)7 zjF>sK*2z4riL!>1BqZK%Ih!pqHx4K+?;eMhl5F*nnkcy&huyTnweus9 zG6(nizQ?S+^R~ARZZZ)SBB=l7%=JGHXlHezdhL_Onz1NQ#m@G16HusFf~azR9)nVc z4-&MhC=6Xpsau{dWq*t`0;h|#=E&MX(Oof%pNCXyg5Fd}STA(3vD8tpX{^+Xv^I9- zjw!A%mx!mhEJv`7)N=AH)W13T{Tsa03WonU3*c`R=o#XX=Z(H z1A!85#yc2~>^h!1@8W5A4SG;j@8Ofp#PUn4ikOw!lY5#JTe`%Iv@7#456Xu?U%$cbO6sGUPB%^LM84<7bb&fSg9W zo*2_XD;b6^J7vB`^+$tyi>%gB$|xUX>GrzPWQR4E+wxSvlIYuYIrwiJ)7>%jv`rJh zenq$&w`?;W#rYu7cBYCA41%_VbMJU|mDYn}cm0qLq)iledk1MlSqms%pG}V^EQmF- ze=~X1lBn<&K3S(67mbdSFPM>djQRL*+m}8cF(?DAZT;+g^z8s=Y-D{{H5rZjh52ry z=^u;x>3$mNP4c5Gl3WuL6H~LaUOJ|KbA92Tvb04$Vt-3nc&&6OdVY!z32RHq!l5T{ zLLHQtZ3k>Gzs;B7c;xQ_UL7k+Nq62GM&RUzp7gB}N^xJd*qII!#MZq4tX5WVLeK_SVM8r%1MgE*`hh zj}Mlx>WezPd@*MH$OjqSK5Bs01}}Ox9q*jp1q&W7?r&XRVVPZNDUxuy@u$)M&8uqm zed?EK7d<_(=#j1=103FLJu7QTJd6q>x%x19amLQ58S-0jf4U~sDS`ElXLnSfw`RlI zzVz@GP=Xh_{f7yEcU`75coH1`Xf69Ckls*}{+_~M1j10iYCYu?ts5&b<6!v$Z69z^ zRhNLS;hWRI4-(c-TZd1yneF%Ry}ia6?!ld;81~|Ync&0m<}+(cxSiUk0jEtWo(6;j z2cJn&LWInZ)G76bs)iT4EL^`C6GILabDY}j7wxnT>Mh;jxuEnaC}*U$w#H#nzU8g# z*-kJGp*PW&0J&c8IX5MsS{nw@Go?1`M$LT5cUhq8$}!1!(3hiqlx16NFrE&15K9Ifrj?JAZ3EgN9x0dTluSIYEnPR$2~?XN6-JkBzs6ozkwZ zg*04uni(kVvybW)SW$^Qpb&Ww1~B%iXKZZ^A1&uouk6J!PHt}Q=IDzeo%n?@-eXGw z89OT~t1(ad0x*cJ4eIJSEDM{Uia6h9uGJ{KV|xh)9W>)}Q59c%`O$c2}{xYv5VYg{N(^sNf6%cnx=IK$y zbhnos<6BuRiR_7sPCcGcG?#9%f{tPzUhdzc=F0u}?LW(FW88g*L@$4ydwY~Wey2o@ zPvdeTc1llec4=#c(`5A-WVj-N!3zJD*c(72Gt^%QxyTUS7Jh;-{z$j*Y(adDH z`u5u*EShOuz=0^Sm8cL}6~P{sq0uDnBwACeV!JM|-6+;}jr^9;Ft#HjCb{9I`CxY# z#DFJ8O#eKVSyx1WnJ`@D{j2S@0MS@;B!>THqZHEeiX2r_@=XuO(<3bGFkH4BV+t{` zCN1UZ%bD<#DzlF0(w)ci_;Eh?!hVW;^ESmBfefdN521HKt6#_{SnpzX0JiNjpi|lt ztG=9xhaMxB*o4p3=B}XiVLf=WM&%y86pM147!kuJ-0L1S#`(Z=Mr5!z)t>ElO)%mC-AhZN7z@*GgO+Og_ybk}SeFPBi%-W&JVXeYoBMork6~);iqM zr%{O@aUNytIM>x@U9^f$^8nosQZ^eYPFH{WYCV}W1c zZ0Z|x%(8*Si3r=+#iWx%d)*c(=`XpIRG7tjUK6$dAZ^hhS;@)WQ(!ztmUipSwR&;4 zkL8d3hFh?4hlrFWM1O~@O0APsr5D;#n!pc6!*)P?gYDs-=rt!Q^hXu@5A@8u(W0$I z&^s)N#(Ip_JUku)QPEmAV7ziC)@9i@^Kbxzon_$6eDmY2N}?6CFyV6;#DQ9)+Sn>x z3MvC-K9ALsD1XAJTPo(hwYk7+YuQ9FoEaZ+KB;uesf$5q@q)RdtGd$V^>*uWNJOj2 z@Z^ky;mij*kAuN>jgm??N`?6C3age3Y1I<7az@E(#a#zDV*B z*9zh@Krc(Cz)lKeWw%AcV3G`~l|D!&F-OIc^?;>0i9qXcclMFGu+Z3&Y(xZ0!+d>5 z%rjTLwgv%g8aQNXz2?dD(C9+zsalRJqmK=fV|F{ML~b)$wKL;{=y6qo+C_A!&4wwIQ|yLzkNh8b z@&ZkwI(lzUO^Vomb50}3Y+mf5R%}WC1pd>_48r9xd}Lr%7CF>a(s`Ek2-^~$)#i2d zLbjKiq)}U2Wc90>p$d`El;U#*eU5%+o(VUOjFdRBxs84nlZsrjaTdPlCN7p;LWvQw z?mMd-85_Y=5D+QQM-D{>FrU*|3}uqbG)w_rpw^e(A$X(?!q_tHkdiOqw(Qz?JYxVh zRHfXS*VPqkXN;d>#O1iqB0|R+9lom2M!F(mzFy|@+R7jC>}QgG3CGj*>16O z*~R#NkEE0o^;r|U!4tc^i)4B7iu=^XX@>_l;m^a&h)#tU}SmAdLuC(qB z#1S!w_Y;>aSR1rYE>KggKK%8VO1MM`8U^m-;S=R&(aEB^7p3VeZX7choRw%^g$jv z%JXNa_tPuA{htTx$e;eco0^cK${;SX2Fer{_L=l%7d zEFJRtg)XuqlW}KH3tQHz1;5rU$EC!1@aQ88s~p*gO5DGQI*-R^>K8SNwY(9IC5Kv< zNEpn_I3X+a&&pWh^Fr!)O0L5t@^cvLtAkiP^_bR0Sk9JaLRlil9}3!jx@F!!Q=A$L z?gv)vRcDZ^EFsg8*2;g-#Wj6sRC89)a5!VWxgyY|SF|TZ?7724j{?XdFI4)|Q<3=|mu<;Q?%Ue-_dyQ3A;pjHCG}%x?ouY5^^xS+d|9Um zcX%mMP*5lypglAy4x;iKrIK3Pc00euT4&x)csk!#6nf5<6jM0$EfJr+-g;|LQaC^O z(tP=0I|?ss?wb6dD@QQBi5VEk%lj?2!HAlGQ)H`+&hJ9^zMOX}B%pN5A*EjZY}OdT zMu%vW5eZ+4^DVDa`7Ji<*Irb0kz1#Bu8tgaVMhA!ZlNU#WTRfonjv2@a!fY{@_b%j zXp%}Y8dEZ&gKib|$Ji3Mg=Hn$5^K~)^1XUb(K=D~w67eP=-tp^hi2=2&?T14)**)r z2^;HuG4)vkgn{zMZ+gcVs-oqvQcItV-pZPF$}nLubKyNJar-(Swxi)27K8L5v9Zi8 z^mzkHUY^-S*@*iscXcAGCk3Tylz6F^N-BC5&D9g{RU9}DduJfNSv|z>{)w~mR{L6y zh(N_k;3Vs=H}(a+B3myxOb%68vv9feU)%MUeH>ufr+#Tk_55-~KcDCPlt?Gc&dS=s zmm#;R!6hA7^SHB3JyQTP1MOj_bl-mw z6G7_x)x!!xCp!WWbJnHD-?zQ4=~!7=6lki6Z&uOtJeuOeTUvQdbSII*S|QgoMXb+a zR4zBs343$FDNJH5p0Tko}?cBeXc42sWdEIKG?^e{BXlp8p2 zo5L=-_a&IILl!8l-fJ*tvn8AbYpE2R{Z zjhaRVUV<8TY17}?iuA=S$1avk2qF4*d{a~+SW^T=1kbX`m*dn`B`-ptAcS%*X^tBy z=RFdZ66+}hbnG|rao=Vh6Q=3GdKe{!pZ&_N7va4-bZge6e1PUV@Y?!G->522zyyiA zEXWsDu$&yHUpq+6JdeT@zY!_kW-Z5^KmRw*+veEszG_#K=f$d2V--X84Dh_7OGhym129PG9wMgrvWudgjn`EKBfA zZ}GyS%Ocv4X^vx+f2GCeT(9{9EIcO1ZmhB1aV)#nR(T~O@%r-<7X{Nh_?9Mx;V*Q5 z)frB%wCWsM>Gwk5*@}q#CbnWA6nlE))B_%-?zIK_>Li3)_oQ@z4{xu@O{dd#V)nv9 z9xEVwdZ<+M(uvqoXP1&?^(M}nO-72Uv%AT_#RHN7ElylnH}Hp zR`EMZUrW)EA=k3`!8M@%HQzao8Jhe3n3DEPo44xpe-pN{V)x$+)(AR%;M7S@Tv|Va z0Lgb`kbFl9$mib;o*N04i<@=#02j!I1WMU%$8-QZLqJb{w)cSpC1RrPG6MGt;9JJJ}rhG|bz?`C*$#kyr)e9dNQ68H_n_KXS=@J|h< z!g^1o*@U*4Y%KS`UC-Q?;)6WM;;L~2!(SUo=g^m;s_OEvZ0oj7igadgvVDCE$7*YD zDe$ixg>_LgXOqaCJRNV?ajd#}Rr%TWE_uWp;x_^pV}?5W}UbCl@HHABKm9oB}FvNoF)qwOEWP-3jc z-TaGJ`ZnNe7q8e?v!YWgd`DYzJw`fk!`=s3=IU!^e2}D|5vPO+X7SSFmfC!$6OO!d zJh!?DR<1%0^>jQ?l)TX~ziLG7rX15%U|8v7YfyAF0;j^JBIfR~&`@AID61dcn#-L( ziX|q3)GlISgMHPaJ@rlT%FJ**pA{RRfPiY9E^_c2qH%YbZ+`v*4Ssf)cLDcX0V2hx zA20k6-cge9ux|2+nwx-v$+4f{hbr+vFwxN(xyeYqke}krWAX>~sh_7E)&_Zd=-4YG z!{iQBgdMVTF-fr;=l|=$I)Nt4z}jTGW)=sqs>S+KYqhZXPob)Aql|VpWwk+2iDe4- zW|C|!a9ks_GmFGzeX4JJvX5Gv3kheKjv#2vI@Flxo0R+b#t!vG@ZZiGuW8~NdK}R@ zR(M)MJvRZw4&kM%hM2>rCDkO?fVbT^IBgGM3wQF5n?N3O_66 z`Nt%CpXc(#eyX)22-~zx;_K0n3=fsK^2Z0sU5cO7NDS4F&eyFkiR2sfw#YjP<*)!+ zJLB>L_d*Fq8~ywTr?l4_-adPcs|2-*k@wiRdBx+vwsV^-F8~r}fl+wJ|CYBZ%8Syy zI0W&;v2(I{&JaoS+^HOw-%QNOE}a{FU6k#@Q=8BRWV5|ZT?hi1$`hyZ% z6JuN2j+l6U`bM^GU<_wf;(Er{K z0kB>xrbS%;g$=Z)WDfjOL#(Tf%`T(Wn{jtn7e*I2vR~Uu(;n5@GKA*(8ZX~ zX{#`QcPp0`!fD)1)E@fmW?4a0d=3Nq~7hvey>!&8rRwM z;apA2`{lV&e1_oAlqEl%yTn?%0RL*zo3E=S@aRK%buPIqj6Q$OcJ7=EJi}A%di}%~ zgoD)6s!@l@7cbVjY--a6GU_T3b>KcL;&~yHd1rH1ozPS_QSu*dF1nE42n02)XVd7i z@Krr;xE898vH@3pf}3GM6!^#kM?AG-UDrjB_iS-7J0aaW4jE?fi5@@>N4w%rjkdmb z;8=~6^tj>dB!J!5MUyzd8Fe>;Zns36Rd@eaQRMiBD}1+)0eSMzg9LeUb!%~QD2N4I z4F6Lc`@G1Kook`XJ2_u*B|O2#Ee^eG(Qw5r>H#^_kD4XCO+`v6FZE(dpu)-iaMKjw zfWm176rl!C)CpfY%ii*iDI_Uk@5p42Nw_WtYv-C4EyMiO%W+3Mtb}JA+7nVY2C3yc9R3+0u-y&8+J@0eIotC$1079CW zJ^~^2xw;ki^b!pSi?_!hdY)Wf_O=jPY%dfiQz%N1J^(G z@NCiqRb~tje5k}~3X~9N?hA}kqpx3(JY`~qFFlF4V6@8xgmz12;0QhzC(>x*7?$P&l-FBvEUf!=q%Wc6gU^Qa4^p2F=Z5ltTd$V{ z_5TdM?2SRejVXd9;U{npft1mxlDk|hH8LD=S%Srt^y|5yOruMb^Fdf@qv#YX${+^{ zD#n#L7jBo@6@6!lVwGBBUR_jnt^<*5ifY^$T)(p&DUwBAee74Qt}1ofZYrIKP<(G# zDZcQXC7Xyyhyk|v0;Lp5=hoo7qYsklXhP)jbT=q}q!aK+CX(0Rm{vo_%a}FU;6?5a zEZEv0RAOBUpFRzUs_L0*NE=XcdaiyDnV_3GKC9sORtCv;bseD0TUnmn(-h(e0RNOjx$?xTRrl!Vv+gmXdez&<&uL)Vy2ayDf^ zH>S2m@mUh?s}EQC>hHj!ZjwVu;2BB~e5QT#?AT7$zFg~?Pz(jp6S$K15<;(2(2l3zq*T%MAK+)DZd^5VdltMoyV=e1 zl}Jik%}}5O7tX#E4+8vr;~L@CH$#Z-WLVhRqFJ0t8a7?$Jesry0;9aJ0L52*Yc5dFa{gg~UhZAbku_1Umu;%hdU zuS`GdJz%{rwkG+ndBwkXA{x|$#`5^e6a||{b;E!4+GgL7*}+?HlaZ6cx)7_igcr_8 z5Slvs^RxWtPDcK!ZWOQf_#1>)=sW1yUK|*@tdlKvb+! zgbu^SHqb|?u-!3UvBmuSj(mNkGaqy>szgtT;HWtf{xf=J@atTw41Dg-^qRNb7Y^n9 z97X*R-70X!mj$eWQueistU+)oEGh3T1UKan(kxL8G@&F z({k%*D28*L+HOy^c?;OX3rgSw_g;)Xod@cYA?QjuS`F@pK5J-2UkF#kG7f#tg0)KB zAN)f-e!#W%{za-ctbYBQcU%m%lAH2OJ%A}GhxzbI$%>FFf7Y07wbtC(z+WVm7IXRU z&mOCo!EfiSyRqMSch|HOgSe>N^omkaprYJRlQACm1ef9R3tj=32a%h~Fq-yp!z9D47GhNC^XBD#Z z%2n;W2G>#rwG@dTenxkGU808)@&$Z;zp}Bj#Dg$C!u&*G$5}YY%j!UsA`zFM zN{pQcmv_01esJ(Sz3$OQPVZ<-XnYyy>frq07Kgww(U!L~+$wW!Hc-K%9y?&7Z+;Ix)8yS&p-CQ@VZvc@WWM8J%U=SE?EpYugRjS{jk9#Wo$6 z@nEd+@)Q~qK0}gn0?ORY8xTDxqzn9VP1b%pRE$I#A`$fNi^W#P#SmHW*hIHg7HTg zkG6LPA2a{CBe2VV?1(Y@Y9tfKIOv5yoUyTFQ)OUF@$*E4gvm58TozTf$8sYRWc;X% zKL?c`XD<|J10^0T<7vL}Lp(sI?G+u=kkMDZXwEt;aPNeq5pOP_h7T;M2D`5<)YOJ$ z7}EWMXS3&AZ7nvbgUA;x(|7q9*P$Tg5S2}?j?CLKqxIXr7oQ7X+Ghu#kGC`vA<$@H zrT-SWP|)YD-zYKm0E+%QO7t7voezKH87ET?F)R_#^8W^IiiZ*{$`RXG?P995dg_-m z$qs|Q(@C~TiWgrcEhAqZUK>x)&M|F>W5w;y{zRe& zvB#If4!N#=b?*I(5uKSWdSWON{e&_P1)UIp{bvuos493Ko;5SO&^vE^!MaZzzUAo? zD7l*Dh?jnDG|&js*=AcPFfq zqeCT+S73ChbfcHO;Hl%|p`QWvdx0I)`glNv1~i=nfFg}+miUox4z=b?&?j=Uge zUIuQmBO`a|0tn3X7NG|lYu|G&@?KGmT8^Fi{Qewgg-1XQg16Lu(mvSi9s@ZPb4lUn zULe+7X^um_?CCEAt3X(!IwrW4EV#n|r^;Pg#TQt|wO>ig9(-t7>%4g!=PAYH zPtO|+kKuhDAqr5r6|{uhb`f4Ik?nIMZl!+cmj-P)!;=|>wf?`Jb2^qAxB?{C^WLcc zmD>!#nuTtB{k3P%Ww-@u@xc-11{#Sk!9ksXN>9w>K+_= zQ8~EVsfEDiG%}Uj zw8<9an+qzefIe0wwdX7_dI0CgKiM&OTSVt~`<+JzE65?YVndN< z6p)&z^T$sLwi`@a;$t?1DN^Nd20d0y0&67->=01fP*Rn&(Yz0zd#e`4M=JVrK(e`h zJy&YhGSzJk3yesP-=^O*LBVy3v#G`sli#O`&WzC$L&@b-Bvs`C1&cZ-p~6zz;%~0G1@I5;p%*e?bdSFLOn{I zR0Gh95;{eR0i=>?1Rx0({oh~DD>DL#QV1_pQt2`*<$F3QIyyiM=M4_Ipd>n4vN->{ z%a@uIrj2Nyj%%e0r}#Ea(sWmhPw~xnd;l`?81p3=0rS`kABkzXeL=GeOYU>h@ zF6J7TTJUUfJ1AmRv}B4V6-7Yzaa9sf=n@Bl)+tcXCH0Fnkx6fL5!#9niyxAs?zbSA zN$7(XdeHM5Pmk`qyKf9kC&qgw&Q7=uEe#r8MpD?qzI7$ec&^m8J0-htOTD$;E>^w1 z<5c;xm-)l#1c{TaZ$Wg%iDq4coGyLrs^5|(>DEJupeEu~V2u#&cjv_R>!U0>5{_=!3&u4^a17)aS05@UvY02Med>w*B+|D+n&v}UZl;js$oDV0rym@b7(q>V=zFK1S zj-$g$ZqchaCQSXuyk~M$CQlDD@c<+i7<{JXAKoZQ;F|CPt!i2LofpQP)}L7$8m|bS zZSp+c1pc6BJy&cYL3d4$4BXwY@ zif_wn^l-lew4ck&n)iIUpFpqL$GJ#Bi|Xp*GQ*!vs?OFY{OI5Q(~f?`=zJu~rGBL< z{hP(fTX?gQLs77fkVSEqFQYa$a@%CQ>`$!uQFYclrjbHD=(?to25Ax%|FQ|nl=Ge4 zL&jJ*)A6}G^h*RB!gi#V)K@8c?eyL0p7-jD)Ua?KeFoV5>t02UV|5CGup6JI=*667 zUg5AWQGOCge>!dsQW-7Bq*n2H$c6Jm$ir*gi!Y;uEJHdnAZ~D!)AE!{77g{*z2{4- zoabZ~sY8xF)vTgL0jm$6H?-##I*crmJ{g|t&-#r*nHSmteftl1}oRW8UK zsaNXJDV}0?vaQp7(WM@ZQhw@#WF>M4kD5O5gd|j6TW|4tHwMNLY+DrsleESYN&{=s zWQau$g#20f?bD#=w0~z+1}>JZv+5)X0>b(SAjM3 zK7Ce>+IvItG=0K(b||KpxMs^SSJ3ZR&3>eZYM%oWy}@ULr_>(oN=mK$G25VhEXT4N znd8u%|B%nvdvoo=qStBpk=n4N`5pSVY3i=7uHiGm-3QI@;YYcnOopBYym5q$d#U>+ zI?sK1V}?8rz^tZaM}NeTv(xVnd;P;*ea#!shdx?63i@}AT{Fa~zTu_9*<*m(>t)4{3jG&m2k6&ebED5L5Nia`Mc(brcIXz3UtGi;O!n15Ln%AIopxI8B+I z99u+V4CBVl*@R~Ie!p!KXeqdgA^NOYjLXwu>a987wl`i=3xj?vHK6}Fx-h}e?CGe5 zZTboee4KSFA<$;1N-n^O68H)^e7^Z~yX@hg_bu^6Gw)*`#&2+-y%61~d{cL!WsGmE zGaPK2b)??@v*da5D*la>bX?;_&&D%k{gdnvb!XXf^m{?)2AbICnSTlKUpVupTn6Mo zA|<6b{5`RjhEpbjvd%EOI%q&Xf_ZTI@_p8^SiAhhB;WkS`71~Lwtul0tq&abWAU7= zUQfw@AY;|I^3EaJf`e^t88GvIN~`1R#CW)+X%Ah;O2THFq;?JyALP5OSiwHe>Fq3y zF-v5(1k{TIZzJw9{*%v_zrBz98Kv$1nw8q6ZnFkEQDHvNoEwLY*43rN_!OJls%zf$ z7nBCN^`UE82$ z47#0gLkWa3d<#vI8(ii+sli5lff=}Ja2hisX!CG&ASh;NaZlgF5tO5Z>OLui>TP5( z0R|Zj%8BI+FGK-x@#5#2u=ES6ar&!Q16hrVfu|+ywV>&jWxL*BdFqqk{o~yirD(~m zHgGZg=JOg&a>TZxl*Q5=gPNhaqH3o;4^^weHK8V#JUc-1jDW`3%KCFZ>eBy(b|7Fr z3z%n6yEv=-;d_MZt;ZTfNe)%QtZ7MZObI~oI#Ze$JrOASqWMTV%QZ2NhRcX-%bJiR z5^c-4k)rIT+L^681`5)2N2ZT;mbeK6Iwek!alyS4n>$iO#P~fF%8zj#qPp{=ODlnQ=HP#~=I=iP-9TGb00z9ouY6mAQie1?eL z8VVzHng!}2W4`S*Nz1iukFUzbJ9IDS@N0Y+Spj`tH?KGVo@etY#aId8^=!M65c?Tq z`2UkE{13$2RFy70oiN}Zci=noTkQb)gJ(xpPLa&Hp-F;GiFhBhpBwLNd+=cm?3A6@ zHFJ!w_vPQ>!*{=VdszzWORvYu7VGR2*ZwRTG~(3~jH+&YisqrD<>10WaovEAy-^Oi zNY3^%usk8Z`9|XyoTS3N>r*xaR2#bLW{;;zIV4C}iHB_G(D;lVAj}t}ydPZ2FxYaA z5OXuV?}RMw`dv)@=M?o%j0)-@TbH=w>MBYOt=Won5&gER6Y6Ewd>W48y@I_(3TbLd zdMO6q11(fPz9q+mN+iiZ0(4O^8?SIN-O9V)k}9&fe|f5Fh)tR2$d*!37^mioYW*Us zn43|{2G{EeXE|Zw_T%r6K9@^~Sp|J(C(O;WmEs5L!k+##SmjMaOX^!9~b)2 zb*kc}WoL9ze@P3I+_5zMqVVFSs{6oWZyvAzcYUdn?IDx&Qd2=%PuRc8!Y68KRA+} z%6+|SZ2qJFW8;>$$XrQ<``};M;r^|ekc>iuGvt&sSKgw3d%3Ile<3@u4S(sw>v`h) zgIRGD``K3u)2yL@6tIR%$N(7A%38lF87(4!?PMg}P>zh|FpIUhaUGA%9jksp%X!vN zZs9Fx0kG9WS^OV$M=z=~vqKL?a8xNrfUi4HO-{#aaJJ%U;45m$!^>iIT3I^sb#x7+ zp7BI5za@t`X8Lz~@%?AsH$iL1pN)IoJ!eT8R43!Bkt;*4i5|J%o*Eo&x2%1y(w)-XjdUYj z(j_e&(%p!(bT=s7-6`E&KjH`PLfvP(J?HW4bKdd1;~U>!$QbHcYu+=jdChryb461q zMF83%^2PJfvV)DmufWP5Y6J-1qxg={#@CcM@B-E4@ZlfTSdA3k6l~*o{)K2()2&;f zl><5Ga%E&-WyYeZkI58B<0k51(0}b>;Q_9;d*AwBzx$sq=3o2?$QIqWV`5?ePeZK>V#L21jRyo0;4j=_ zF$Y|-YwC5*xB#UE&#KD-4!JMlf67(AJBBc$2balD0ib1CO}F8@v(0$NQ;OlTI}fg_ zf9X_S#O!#vnJo^!%m#J$naIx9I}&Ma=yEC+suD36y6M5yq&V!&igw4+>`&u{hFo79 zi>I8}PUKda&kzG04~N|<`ya`t8JtzfFQ&mW3?0`@+Ju1q$9p%tq%$=Q{#)-Y^5eaS zF?9=mym#2$d+TFykkT}9v`%0a0I6fS$yBqFIY;DOp(&Roamu9sqdvOq?kgnxKI{4m z0)ngnc!3KIcaG!awWGkPtCQ*0`~oJxcovw&aefmM0ryG(j5F#0qnE$F(`KFv&5Pv*2MlCCk?7w{Er)*}Z$aJ+E>ZlhH?kslXaM)X(IMgb`govm z-XxW)AyZ_rxzTz#+LpE)cIp7B2t+RSEyu9B&|kc*4w?Xa^#gdZ4BgQ$;)>9?6PIiM z+coySRkX76&58gOHPa-3qihkw@mDqdwe%1`9^7vQisB6BcGVw6F}{a9DM+EJiS5fOx1!xr9=!dt_PUx zvZSMi+*~P~!ixFI+6e5LRc0eXTcf$Vlk4cSjjnaQpsy{r1r+5W4-8yyn-n$FJRYP~ z_)hDRD@L81*jD8d0{w*3<E8!V`V-`cgu(eYxZ_O8Q$UmwQQz+*9Z`r^ya_%x3kMG!4?Hy2S*QzOpE$5f@160Z_ zQ2=y!;cJ{W0R$<5^_i#BoW1))nc{}Is+oa?m-7wI`YRMgPQWCTcnl>GNs5d{AUXwk zo&7FCRPM_^b^*W_P4qN#rI`L|S-|u;K>jOj{GeNZlze#?1OD)(Xe+xB-&;Jtc;A2g z3d8`wX-#AP6aYQ}aA{uB&CL^l^(6VV>Jz(-LcTI@AO;OJBs><>z9oPq^?yDFW*O81 zQK@&>_6C}6B7kN>7%+%c4YVRr;m|UpX_Ta3eAX6#X2qMi+P-shZG-+&{hn?GCA(-w z6iZ_SY%WSK$flLyZJPWn*QzE7A6vsEz9|2C2qAaw;ixX`!v$N>#M8gp)`e@` z%D6CzE zuc==cHTG{awg1&h+!m-Ee|oi_i-;d;6F?gF-3?eR=0E$x4JhG_0d7Fj?P82T1=uVe zQa}1Jji5-Jra?dqm1ghC&5z&R=yb1cB;+k5RTDGEUiI>dC+xI%W4$97K0GMMi+-zO zNVr^0HC-rpC8=!S$WZ|9we`_vIw@C8I_Ff) z#JGxzb~4ZraI5DJkl+{9|KnE?#`|DR08J2ZHqHMYVmwe0MaDd7Tr1e^_o9qPvU&Nr!`$gk)HD*&C4;JVNdJLDr>vbth zU;a>qBSbQhx#!vuR&QiY(j$9&`c&+0dhDy!lV2+ryegRl^)EI@m&%y{I4^L&F|sd>AP-L%i0P}N za+p5B00e@nm$N^6XY(?9ORm~rk&BF(~asK+-LXhY|i}1D|T{@m_C@dCB9{b&S zD(CZ^Xu!L7;--aGUL3E-o(xtNv;|_sF15WEE&14%VN~)_w%T&hl7qyIjivnp}K$qn?o{-Tev(w{YX(8Te8FJ1rPv3~wiz^*?v|NcY6HomvlEWCjB+Ry^w z_OF@4UlIw*2bV-LVRsI4_g_3N#*;?jpQu=W`S*w-=s>j`u_}4=PcGqSkIEx*_gSz+ zKYy0sp9lDNo@0CeIQh=4-4LsA|E@-PjZ};wqf(0{?X|W|_=o$HYt?TEU5g8Cmkco` z1IeQOf=2zSZ+b|;Dh!o*!hzq4+8bi$k$i~^;5l6W%jXDS(B94DL~mF`oc`K1{!2A| zOY@p0<>(>GKAqI@T~40mFFs*@S(1rJ5!2@{E6N?DLUmeI_ z&Xey!7QoFAs_$UwTL(&=cmitI$G|$AZ)Wy)PU-P?N3QoalH=j;P6-j2_K_?v?Gk6Z z@m+pCfNHhL5Xbd>jYv7FOD@cB7h1jJp@-TyzpF!A5?7x6VnToU)g$a3Ss08b(ocd* z{c>UqY&2kI%>ugL3M_y5>%S<%eF$U?o~BzdX=$K&Fr@WwYzf%(6-GbdHvKl#D&a06 zXAo4cwf|3qhkoB4Bo@QmW%IM?{3D0`t`I!kuyGG^@emJjmKjr(dgl!Tt52RuqynS( zR*|}@Fpcs)zh*&y{U*F;z?1>73L;`r^61I`;3~goW+DK0-$@lSzCkQPJzfrw=4|1siYK13Dt8>tZ%Uy;?wlr)= z>w32hQ%)t8pe9VXt1QxOBIYx5)E{0{)-vy=z|CfPD zTwK?$=zrfw{J+x&$_K{4Rx=R03XbpkU##a>HI!Ak3r}?aSK;aZR~gYa@9=HWAkpRf zf8!vK07F`vmd5Ak zxwVA&m)K91zl}9_NVMB+^mlUR4Z*)j`XMAdqH4}Ye)g>u|FLiVeizA#Jg@hSi4*Mg$$Pby&wO2`|Uwt|Mi0?@8H#*#1+<`qr+bl z6&}3RZx8YRuOIUN>}!CabjM}tIv{rZgZ=R@eGwkvT{`soM>=Ghnlb}$EG1@7He=O^ zvw*E-xetC90f27WT@~~CZ&oq>KdP81-Eq^a8n9}rpzd1w#NT-c%=c1hIdL`qcgI8Y zD8EhC?f$p$>fGyO#$BbgZDZ8ya*_a`0AK&50RC~pA}{ZQaVR-ClYzkJT*86yo6;|% z@Lh#+cM;!RDsC96Qnb5%X6gzb93QGFcaRB#1tkD;eYx$f-zROlI@%6L1W<*-lmFn9 zeJ@O69)T=&DM#pNyB@(~vk?NVglM3%B3fah5OHnn_>Ybp-a0TmO|jlr^WryegBM2i zU|ff+iTPU~*`eF60MEJ=45ZN=4{gf>lPQMoH$Jg?w;m5KLBl8Ia+#9b=!?g1Z*d{v zugM0uxJfz8awCXVvl?APHqi5wZV8u3q@V|eaIQ556Qm&>)C#f(Nva#~-N>;Z3`UHaMGf!KN>`+~Vmmz|;xlG9>uMtvs#*;@!BO0x z#MA{~J4CmJ!z{tHbv113a#Pc+VKxZ~#1eR6g|%dD)+zL@GI6uJ>AIr3#)PMjR@V+| zs&DLMrKC7(f#~vV{j7h5>p7S_{<7a0iH;jX@I5N@?Rm^z=j#yVTZ`l_@r<*B#irG* zy$1chgo;J|1*@w*>$X*l^+4glg%<#YgyUl8_~NLCW?O%z^451kAy-!Lj?Kt=K3lfZ z%OD+leQ~rJc-roaG``>pY|QXgcM{EhyWn~8LqG8#Ax<2&fN|w}j8(r?yqnO5?RQtX zm$#{@gnaQ+_|AmRdU`^rnKGjMa+&%DXha0zV;_*=UcH=R2=^B_n~&Fz8oYI%7hdOB zcTREMKX*&rcg-4DKXn53558Tn>E}FmTDhJ6sd>zs##)av_xqf z-YOXQ(2srP1rt!OZImpJuJm6K^!q(&@oPZ&C<98AnRG5UV^>i;)Dbk=F~n`lo%Qb4 z>xV45f(!Dfh;Vb&N_RRnp|FUkCSGBYLdFi!eQ`a1%z}=a{YJDz(rT*{EhX1_?CHk? zPsb55-S#JBFyR?2Qjt1|5nGbXsk)OCuLoX>Sz|Q?INo|qy2pe3Y)A~WS}Le&+94ZA zqzhRfhW7A^87D}~yUdEPPt>7m>+ud4dk$tAX_^v5_~$Xn%D86N?mGe79(r{m%ALP> zww;)q&s&)+54V+(nN6G8YT972a&Fr;6D}Rtxbylu?=+p8GG4V~9uG64v=ccY08>I@ z*zD(c%4^3F5k&7t-rczJ!3UI#B(mW3Z#T^LC&t~ZobA4#D_N?2c3p?3mBu2GwD2Du8whd=yA91*5NiGC4QfEzIrFI^Zeo1QtAesRoPE&$m> zj>KKC#(H)1Q1nZ9*fI;*2{X0XyGMbl6_}g(L&(&2ysuaybP_*q^rIy+u_7B>&li6e z{q<7()6HhGFC-m@+vm@4aNk0f+#byoDsUI1t%4*2=MzoIY^8ial}JBNtsRm zgo=v>5#x3?eMpCaY=aHWOiQp?6o8A;NR2xjJ_@bnc1|ZUkz-}U=CGH9Mcr*NCX78dE%h>AR zKLq)X8zSyt6@f&m?ca&@hva!8gg+CCUzoiabWG|lYmsQ$tpsmCHjm<7Dz{IHRD}$E?h4z(|z;;F#OCX&xW@%x+FKd ziXzszF{lSW3W^(_?={Gm2{AQ`u8N8xJ7JMzHVO};Hw8wAM?Eu}&X~+Hy0Xn&lMeBI z)^tuz7BZ4CN!;|7Scr|-<W3GjH7FeneEHc!|xAt=$zo2Hhk1SLgI@MrEL#1BrO|RcA0B2Do zyg72^tP~n*PN`ZSRBOAN`QF#=Bs;}LLKWN}LBya@Ya0Lr9|;D-zD#K@xC((adm|W> zM#iKaK!N|zV+f&p&arugwSiPFM6`SA*#BOOzl;0O_nm0Wk(%hg61Hhq#D1<^Y|4hc z|GNW5hci7fVCYQbZFveFDnZ{%h&0PLD2?d7iBiuP3~2KXccpT@X%_Ag$~JrBbOem{ z<>Unml+bT=yP$`m&a9MeCiU{YgVsXFJKR~VL3#FhG3smNGDuS5qtKm59cYn<{TAq1 zu~8a5u^#d^EmT)fajo&`6uvMA%P)qXFlQn*24Ya~>2hC*@FE^E&6ZIwJy@pWx1Q@L zcl!Ejy23P6;IZEa7g}qmOiAb97qUR(Io)u&Ap>E;ie26hS}Wwh3hz&u5Z-$LlH75> zy#n+e`JQQ^=bbP3ABhuT{RHxvN}V=75f4a!Nf za9_Gc<+A!eEVy%%gCAa=rvYy#=AeF~QEmCk0GOg1WpieP2`^sKLmBjxVUdFIrU|MM zkG&y6p@36`fKTcUz%`c36kDZG;v;orn`71revkLcC1e>Gv6Tb3H><|kNQ_-f#$j*2 zy6NunU0sVH21fH%;+nyKlq7{b-%Kz~il#zJMSV2RA*&V5)=JMWYqY*OlHF!=aGP-o z(WDEzdq&Xvq5gd=wQNFOQOKwFPxmn(%+Jd3sC|U!W4xYbhmWpjbMux%pAw$TeyI+% z$7;=-15T@r)mfg1l7Jh{Mh<<9Q$Lq$eOFn)zhLgo!fx(OrwPo1?gR(I{6PgZo3ZFL02vuaF{n~LFDQn;>)AsP+cNe&jYm4r;wV6+`9NR*!C!}Z{dGB z=zx3k(Ki#o?yy^3j=yvI-!&tG`vK^XL>8JYRL;>pZnJ8x5*N%Hcj|RV6lnU)u}OR-sy9 zB9rK+3Z1zK%O|=;tugs2`hEF~Jx>}ujAdkY?}q}ls-DOa2E%>+pJSh*Eux3fv3!iCX)-?do%2BGM2yRq*`sl-oESNF*IG# zH0TT0gd~OJ2c&cF#iA*B3vl0v5{aS8b*60ye60# zxC%|u;EWWFV>T0VgBIwZQmU7R?{$UJz70BD7)+{xWn?XT{pI?|t;%f1_h_vPJCCYG z*hK&cap>NO;^nSaQrMw2xhpYh=2`GXG_-*a0e$$|l2an7% zgy6R2MzVr8r)@WFoti?7roGvKc_v25L@x0Vccy+sc){*kJM;9qM5Z)=14lrr;>D+e}A5Qqm1< z^L9P&JnQHNY2DjvQPPr(YP?dL6As2)*o%>$XNaz}TK2Vd&vWJ&-Ua6*M}r#ukPy>8x1vEbLnW-swfWnKnbh2TQe>*QlG{Hd-{b(h@+mR+H~ah z$q;B&8|4y4?N6477vaApj-poZ+!`$uWS*1%OlB&gT)qn*c(6L2N}#h#Mszu%8nnB^ zHGz}8&R@N*ub#4q&vSVI(Qw<$aNKiyKsX)zj+9mt5!9! znDK%j_|o3fIgCI5LQK=WAaR)sdjB)~f#v zhay+`pSR+C&u;G=mjBcH*Oi~q8wq@a8U9{+d+$Y?HL3H{fB|dB?$E<30e~5xip383Mt|l zqXe5aczx4}KinN6$3|+`Fy-)pu%4wYuNc^qrL1Zp=Z3g(d5W7+U#N6E4^miDEwM&x z0LfxZ&?DW?T;<(AiOxV6@aB5qh1DUW`sP-LWWWlNetynjK@_;QqW(?VMD?*3WYkfu zy<3|?ct7D#Zz_B6G}mFi;g!?r4uL2wu?weDBfcoJLENtW79{FqUHxT(B3}9NXN1gF zX>J@*z)Yr}be~yy<@{dX>>7(A$lpb7IN8~ZuYg+4NRK>bhqVzezFtBEvI*vJ+ z-k@IM-OCZsE`rF=`P@wJ$aGffy4T1tJ@tTP8N%W$?_N_sKnDgx){EP$Q6A)@L-dCN zl?)|cE!19E~ z6Jgw93#=FLOm{^odU-FGC*#a{pJrpDRounb$|lSpteZj$cJW@IPA~Y>d~3jE9?}hk_r3RwpqA7kMQMQ+d)0hCnmz9iyz09kPR2JxduTy9i(;WlBMDALu)fV z$=0LzVm#Na6ON)Sn0Z_~9jIm=IIpRnQ*9|Gy?%4~{#{Y&hL4Mklc#=Ix$%gvGME<& zb$A|=<6U7R8&kdN&BZ#d$%}5f5y!=`NcDHQp#^AH9{7?q0kl9+zW@{Eb=$sF}E{0us0o&KXo#Dkg5s1A`yw+XO z6xk^)r2JhO7EMqkCyz2e11z}Mp*2q7g{UYB2iS(|VViCWD*w}+)2y==j}jPIXW>vB zxcCm41n|~-X;&2$*+=b}lAW-ouVhe}9x2bp(a>PCxe$)CFigB;kY-`d$0irlK5_1M zh*YO4*_|q*@$O{1>5=9~^>={nfex*7eYuj7E}<;S{(^EMZu|bULX{NN*7^8$3F;d& zeFK_O`ReklCCX`?LX2))xJ6iWMmLov-sb#E6IC5KP>Tt+f1MQl>#vB$Q$0Z~$~{S} zW#w!}mCuZe4Oms+yqM~%LsqMUMvS%?uC~@f#1mx{`TDTO%zNJh*H94ay}^ff_7ZQN z{=m6+H#+-(cPi$?v{{HFiN2Lhf!#D@^(o{)KX92ytCRiP0#5S*NbUjgumu8F-R?nN=!O2dY(&v1R4fRZTt*oaK zNT#{OnVVaX|{WyapMdV<~QNZY9hu|ONze|Ie9zdx4D^(11pLk&3Md3ef8AFoSm~}DC-Nq(4bOt zX+D_=cE$MzsR1m8)Yut9!lj0srs60}jP0?v%zLvHvE?go8dKBEG|?NgpvAvf1h(i( ze9?sPvq(Z-5bG@sYu`=AT=|+k(}23Ifvk5-`4P^Z6+}(9)8K)hK~rQ0Yp3h(-69_b z?|F5&2+5DN;HdxLrsGdY13KiM8;WkTl4nal8vWlwk?y@fbcc%5BWtRF_z6dH`-USC zAvS&}o;bP@9?~EyGjQPtwn#+p9csCY@57kVAd)sO${W+f)7$y75OK8Y$hY{OZup$- zl3uy5^5UN*T4W6#AmO%=w*w`qToS#Rs@J{TH2wE$2@=*zt)kCajEpEvb-2EB%rEN`AnB%riB#idowb~Jpg^-1Aaao4X!@x)Uhd&Wco z16`E9+qU@A;hNe*CLtNDL^j9zb{Vwsvw-z-okJsSjr88WOnLcErX+fdsMdY6At4Gq z{`hUPwCl%hw06iWP_mp59wJChABs88$|iLQGL~pl@H!6j=A2FIWz4SDQ?k&h_J-nk zr<}gB@3)oatTFDr;oy<=IC7s-Gmi;0SGE|3;c#jgS6aTmI$EO3l`)#j-{ndSeSep) zHf4?-K-1d3MsK67?S!2RiE-bI6)7doZ(%07oS!eO=PK?Bu_cdO^Aol&VoUCg!K~et zBp4~~LSb<*CYh6Cc@x8B15F=$JOvYD9u$eRStQEr4W)NLlx!h!_P;Y7z|qL5$IBy| zDmQ*#{@Re7%ndyDv|uN1*r#rK*E+%PQ;;+lwlJ>C+js%vP*X%T9E|a=Q6FC%y>6Tz z%JE3S+?W_##P!a1=5)5rs@tpQSHLgIqPJn$R$d%V2rT=AjOc>NlrQ~^J|lKOAm|~J zyTbFLJWj&(+P|OX2z0Z49Oyt@gc$^cXER zI+S%`G_PPA zhSL<8c*>z1OJBzchy9Txd*x(td2T5hf$(zyQ?ulw}gk4l;J}x+r$q61L7251Deb zgo}cUp&%b56S!$>G3!pZDnmYi05XT|Iv50>O5JP%%&;lR#+FH-!JI&y+UrS7gljQR}?YrH_J9;$q)8W&VabG zQm!JG`FeDp(TD-6Q@JYIdqzCZ_UyE*L~GbTJl&Rde5Zejv&eq;xixqk35n%(0jvNE zRHN$$GbtUlM=hFl1KV@_l<%~;hZ_uW!FwJK9W>mbW~Wc~so(m&8qN^qKZIL!SIo4R5vjY?+ z8$f}g-yj2pb-W2#5;cniy}D=ED!L@bV;Ly4Ns(g(bgLAdKttIIWu20nSTG+fPTffa zpofiT<6{Ee`I%J+C_uFBI`5ektcOMlaz=XJ^J(6c>oCu&LL&(3nF8ot1wiWA)&(aHmN(*d`OYIw>PN6t=^1}moQ4qp(}RyhVKv`*Qq ziR+|xpPNj;+YZb*kQX&-R$GSSxG$-=CUEU7&Q3*=NhUC|1?TqeRJh^se@ixo>r^`U zlC(-XwpK*7j51%9J&`MUwpeB;iHz<}zfJh|=4De66R$Sf1KCN8Wg&KQ04dPOrlvc8 zq=(e2MZ_Dd-?Yq_b18q-Q0O+}P2XGc#NA~8dxQ^X3zKUH`;&U^gCu=3c|;r6qbjX-laE@%!eLkW%E84CJo9_75_1ejgfYyy5NK2OJiyV@K~kTnMxkeIlsD{^B($|e!fI_z-(~Ubah)L*A-oQ)=rHL* z(!;Yd_!vt+xGNr9P3?}nGqBC#gNoW)qy~gCs>a83`>&J;0X))e>PpCE=IP)qoFuIh zxEU>jyq=ryT}A98t@zGG+;+t2GV4|85*_VKj8ml?8R~HdPvwB%d&kM+?+<*ykA|1< z(8_P~Xt-j~Q-eQdprCK5mIsz3u*qTVrNb}tKDfeZZYEy~qWXMRbA}BC>B_U?Kwf1B z3wcuy(lL~b5>^w2$3^9nDBITI{t4QKfADsmVUfbBcwP06F4ylM?Qa+X2E@TbnSX9V zx{Hyxq`7CErpy;PM2;H_IuPw@ZDbUfbIhM#_InDnOc zBMjk{@`h#3Bq_Ux$o}%CQdD__yr6(6{?IZ}EV_7>34l)VMS(sx)us6v$FuQrW8JMG zsx<){hD89_e)Ni@fvaLJ$ZMu3B3r3xF!eE9qOp&wa^^cU4CXIj;EJ$@Am2w+r0s2j zo>(2kDliZP$`uR&FAc7C4s}B7fIWY*;2GTm(8_YSe62imnLi?P)Y4TGxbTS$0a`qv zccF%6+S>UnT7;G(Pf~Tm&|J5;6d@JRE~<>cLp@0Iw}4$c0WP4xf;O^OWo}w{$$N2f z=IgL+Wq{(mb415YD;?FF$PoReIX%#(PA7?LZch*!4jCI2U2>|_4zt1$M24-WMoNz+ zpGJ7m|Cza>4Ly02+b_7Tz~7XdfxUp+z!As|c1`B%$?SHoOXE4E%x&_gTbavvI4m%k z%nPZ;CiNI>8hE+b=P6;$l^Nt?NZ-JkzRa@1?s4ldmN}hrwLQ8rlhf%N$Tr_vMxAgG8vHE$*s!PoG$b8B%`>*(an9YvBL`m2ZA7zh<1_^sW( zn75Vth^?pNu>sr4G!jQT&lL+-1~Y?a5~d)m!*T;O%981aLZ$?J*kVQ&&)UTmuM1 z!;PjG0E?$a`DOlNY%vSC1J}KqrM_ydCze^U*781{tLw$8!1I?&{1X|VnEO37=d-R# zlsYNNT{Mg0t1XM@7=oBbs|{~16nzpW*b^&9V=}ZAFt-DdM?SK{m&Bj+trzY$UY+57 zsG4^YHfU=!`1+3dr0P+&-8OIoGWs~X*4T=J-jj2#{OPuzaRV%fgT0$3U?Z*IO^?=6 zd911a-)c_XS@HqTJ?)YlF2H-~2 zla1OKm9n+rZP!at?x?lK#ESyOouL5lWiW!!NVaZc81GrYfC1a8uPj&8ar9&$aA;=2 zGFYCIFHkwfw>xqDuq;jN$c+9z(%y3AWt8fup^0Q7dJ-FkEd3d5Leo6z)ssnbry^M z;+;kzRLU?9t;7O=uv>nUV_WSjZc5&Nwl(DgG+jD-aY(9I6?qdV0f5w$m8O1FMNO!f zN;s|+g+%a8-5{`sTGmFJOu7re^T?df-V9@oDp&4jf_G%?AQe){2e!AWB%wJScI;ir z@}*I!QD=}-l@<^&Z13XhNiSnZktm4G{f1+#p31<@g(B)>18V-zne(2jjG7Rg=m%bI z8ZZ}76OD|Mt)C1RF|AfBbK^)XQ1=_n% zZwh_?Opt%u=kovweQWPh{8M{3N(w|@kjA2d`rt8ei9nhYoDL;)1NV}~Cz&*?k9;eq z^I)TK2OE9mnT~0r9xVKTCj-Dm06DwM16zn{B|U^jPn<3A0A|vwY&&b0o3;r?+et`z z@+9k2IXCYq@1m_4-4P5!Wb%EQag=zNcJ$%2NL z4mP`>=xS9-a++6_q&Zg7l823ya=b{%uREH8pBd-`nMgh~jt0Ft5>Qo(ht2k;pzHE* z>wHG8RX%~&Q6d`kob_7clQP|zGV{!KrhMSVJIDK9$TmVbpYsdQ^~jh9J&de3M2VL` z_7ugEx#-I?zF2;5m7XgS&SzjNK(cv`OB+WlnSdVAWWSprUm-?Rn<-&Tu3Y>s&!;v_ zLYu=anzPRe-P}BvTyk~rY=D~zjY=VDVLN9ibtq>@SI;_e)C8q@{@G-#$ymJthS`8z zq`*fM6?mIBQ^#FFun`CP6#c4_N4vp#`DbqF+*S@eN=*&lX*4d%Vz|O*f?{->^^I_85r+Vi~Iv z0u~D)wECw8ndvivLxQulDA$g{DNGb6()5e?A^;0A>1G%o8W_lX_8}D5$xvWv(ybEfK)M z!F`hpy+=Nn^iXPmEgF8p{pP~&Y;R7Q-C-A40C0vvN!{FJKBq6wS+M`}&UQb7}+Mg_ryYVitk5fj(YqI4} zSWFcDKCuf?jaoCD&fkn-c;??gF`|D0#Sk(jN4Vci%0Og8v7S$8$=6Bg&S4<3kh3Ay zgndosr30HgO<<3vI~yiTvrab+iju$lax0XIGkS3LG}Ae{y?%OyJo3P9bC~FpVnd@8 zms$5j6vH~)^!^Gh+KMNE%f%}lTNBu3iA)k^*=}CmqXafHV##SmwgMn&)lLoUR5hKwTD~<`i53Z+%ui}SW_G}HebTY`}i?y z$gUN$O*?ZGr<&rx8ntq@x909yt%Po99k5Gsq!3TOdqCR`LIvi2H-VrY1 z!0z(Icxy0Mm@-pZ0XIKZ+hxw?TqBCxoeK@?aIB~_o3(#-{6(Gh$fY97sup|E(f(9f z=w0bxLhHWASi4snMDGMH!rTlXNsTop-RMtbU}~*ReuhxL=EAIkw(X?xqe=G6Ld}IC zI=%%dtvT~lHp$LRJ5Yz%oFPV+c1+?j)9gpo;;A$T2edUpCt- z6CTWDd8e?iRr?+71KhidO{siF-YWLlI0ww8ETTB&;1i_RA=+iqyc~DIsD)|74gPV( zEt~ThR$mg6+MdIkRhz1pk9a{aCaJ6ALJS=KwavkjWn47PN@32{W&M_WM&tE(>loAV z-w@poLxSfnCL>}nlM%@$N12%UYDug6=s#oo>fV@fxcI03B(ftGG<)MXoZE=r} z4PY;Qi4@oVN!7mw3Vv;FdvANPVbu+AxiTAw`_SG$bVvds(h`ElLfdnj>sC=VyDfy= z!FWy54PgCFEWn+p1?5GFOUXb;1v)z)E)jLdP{D#}cum*3e-2+Fj^8Y$0rqDm3J<_U z;U+?9Tmy&#KKE;UR@LmTV8Ffm(WyP&{{HqPG=YJ_<>sX$FDgz zBS0l+Fn);4%@|Aed$W?uO*e|9as%%sURi#+!E~)jGY`(NFhivr1{+3H#I81n%0Ejq}>S{pq6k8KoniA`H3Ik#o10v>% z&B2L`T9VKv!TRY6FTD17vdDN>YgLBkXno+~ zG&x2^#wFcbyQ5Jur^B}XlmYmlP=K@Q7Y6^4$mLPPKq(zFn0E}#{7r&g!T|P6b8L;h zP#p>L_Q`U{b^^xAH6MEaHAATl5+vPs+sc~daF|c zmq(n$eNJ<;YtBC4l+~CHDvnvKdtI=K5pxjxJj$^El_rgfmJO*fjJxnyb8PoVfSBN# znJ)Z9QBv3uni>|9s(k^wR7rCr4tlT#o_AwjsWCo>+egUssn}<=LEj(+Y=ryR>b0P{ zI|B0rl}7yPQ}#7}a?Sc2v~JCx5;AhAugr8nG>ESIvilPYO9|pex)tjJOo~0}?%$un zE_~N+mCq8fIUS37xyy6}vB*(lBU@W;tkLt;e*=-l7UVGP{xyt}&|wcNibP3D<7XdK7ZC0%9BJ=N?ERicmZrHoG*K8wcU( zCDR(UdUV}1QXeF@js|>SPkJtUVBUpSRzz(qS8VE}SZHorW$2S+o_scJV&TM%5Df!; zQp$^pN+6lBmfGP4U<$#iJj=8PQLH1U(*y8-e&}n62;>LED%}=!KO?H#cZjNVmp9EZ z#G4Z)WUJDzV+GC@2~Dp{DBC5U_2%pLjGK+FEoR$>0UG~$w^owzS+~5z@H5H|;DUQ^ zqEc=8QQ~=JQH=&@!5`^=!7CAV^E`!QV3jIm^atyJ{jhij4dUnE`ZElttT}z_K#WCk zw8uU*l8Kdrms-q&(-qsg$!Bn@y#ZRG(cE7@aa3Odc_N!!e2=0)5&*-UVgwo@DhFZW zb#fn40mLnvS=X~oNcoQfbOY2uSL(`#&)ud1V>$PL3{VIR`6T87xU!3XuJ)1y=6c^f zmlRkT-Atg?YefVYZuaBH0D!Q~g4eisQ>*;~OwgD~d36I>0P$%U^om-^xGzsjU)m<= zi_=`^Vr)l}O3bcXg9C75{ha!<>(R*2A(YS#<*m{YrwiU3m%IhM_zbbtK*l#4Jh>~X zMZ9tinyh3Do?$>oKXmhBEKMSY&V32try<4w`-=GrJ`DdUH?HeJN=UFk{FFSFUFqYs zOqM)~ph2WAWxyWd2cqoNfscApriPg$dN z{Vsmwlrsa4b-3m?A7-%4d+UN1u-Wa09u~}O8Av_l7ODfYSg-YxxmyUR{t@lKi{nH%{*R5!}rmLYb@#HrCa!{T(t(u++CLT5rC zVh-xcp0;f#$avF?$R?T$H1s77QB_4{5%|EqDpY5MLN~?7b*GOhj`aqqNE5`Lm&zOt z>~lTdY*?$TIRl7%4=UbRg?=IsRo~sm&8m1k#$&T^b8RDybhZcdC?X#7?(Z2$ZmbPw zlDd0fk_m@kLODqxVzJ#XC2n;qOdPnj(&hdL+*{IV8-BwuLABEMg^A_$a#yz2;Jyg+ zY*@04-(^3NF?LeQpA{JLjagCQU@!jta*zuXh9L>w*4(u?O9EQIC%5gDb)yhQ1=SZJ4 z8#GwhYRai-95FmL5cjTmFP{~bKSATXax1DIuhvI^IKuFFe79V89Y@2tA8RU?uZDhl zAfyKhRI?t0_9yh(%Kgpk&3;B-aKE81^34-K7cr+xgKAKaOlICwHY~O`wMjYB@6$Ja zzB(~M4u_Xt(1)US_ZPrc_OYxgZ+$cxI<)DqenkjoXbKJXCJBHobxJN3*5Eq~I0XIY ziEo$Vhx{c-n5qH-A7_fd~7b=ajhju%o8Zq1Fqqku~0viFLR@X)|_NAdlfo60q zxsF9JA78Z7x8gX6$GAu**PcXKy;P*9ZFavib)DXeW!t6~ukvllwR{$BFWQ=G=f9o{ znJg)(cfq>N=!Gzlrc-OO$T4-Cnk)@9s0o{lmj{@t7Ws4Ea!8(9gsQwZfZ6t{bJ$H= zpLPhFnr#Q;x?hXJJ%2eO=tU~~o!T4MeGP{>p3dx~r3o2^K7Kuq&7p2kS2vYBx;xf$ z${wv7K^1|y*aQ18yD2aPfAxU^>|V-QFe~uM{Nx*~6V-vypUMlgVI54YCuz&1&9{Xn`GO$a zQWu5Lm9lFzh3alE*HhhdgbI9XsS%lR9YObb4Wu$#qFPd#0JBE6PDT4>)XgwTHm>F8 z6hIl+=d`>9U-hjFZ2w*cF5>6AIU+sNmg5<(Je$;ULMZc%2 z_yN;NgGa=>?a`Mu1&90~`W`6eeFfE~tEU;~Td`A$VGTT&fix-&PE^`KJb_RY(TiuN zBIo-}x55e*1+dvsuW;caTS-?t#%LC|r`EOb%kO(S6lrqSR_}@SuGdO}?s!7RS7*tk zSR_5w^vxaIHggY3wiBV33A^Shqx@Rfd;<>c#}t$FJYw@Biylc_@Jf3FzpK`sHRNU6T0Dtc)>)MFB8?^Cm&fpnR zrdv>&MT@p}xLx1CcIItu(6bzaQ*yQt>_6W?-?H6v9PS}ThHOUmoUd@Tb} zoNuF!Dl3z$wJ(V)ywq?YE3z-K$-nk|;{_N`TOyS$h2EeyXW2~n3WIGZG*5B+b>hM4 z**pA`-Hcp%9Eh^>$4$GnegJnfiLe-0+bxw<6~J5@K^x)?gek=|^8!U5-zR(f)AVx2 z699K|u~|@iXpNA!rdyOYByrxgiFl;#%sV~2r z;>7`5sb0NTq>K5uV`UhcZ7kQAm4vhK>;q~*iOZZ_|8aY;_gC-m+{tx6;LhI*7wNV- z-Hwp=7fBw4HEYkaw=zyCm4{@PGIENRW(zAzv(*x%l2}B8pEFOiv5<*xi7ZYwI3rZl z-@d{=IaSildChB48ZEW+l~&YErgWjv)sI-7t&d8<+fh2j>>PsgQp6MuZ5xIX#|ZrN zi`aveu|n*Pl)C-VO>|0iz9M^PjZ0vorD$ppPTI1BpJb(oxi?KDW59ZMIoYztI^?C9 zs$k1?G7*$eC7*HmU1(Q0$Dh8GXVp|{G7}4`(G77{9{2L$WCm`(;4V;=rIoH-o-(+&q6~Ue(ftyK-aN;=7RX=#|32x%j$F z0;6#h^9sz7<$7U*ZQO`WE1~OKmA6lvQZq4Eze1H3TI!DE&lA3!^e*~vzGBd@I6IW@ z$lFI#PRFXdSuvpqx&rzh4XJqxcCG3Y>2m`hV~k;eVXb5EXX6Fk@lE|j*iBEYNP`CR zJwQ7ePOOz&!+KzMQ`7uZtE^3t{|{+j8C7N5ZYy2VskG85AT15TqPrUb>26rGv>@F` zOD?)gIz*(qySwW=yz#y6y}z^1KIi;#I2??{4&8gWSLQ{WH)c*YoOdN)Z#8Eg?i$Wk)o08ITvlCF`u~&sqtT$Rbi$GJK$~D& zsehW;B>`CQY*Pfl$0qa>pI}I$d5pMTL*f$dNd{D{ZZhjS zl-<*H20e@RAz^OEPqtgTG*YCcl#2fm%d3W_2A2VAX-}rYvP_RbP#;B)==*iDBE~S{ z(ZD#|&mc{+cBI-cLeAO`eLpV{B8h9A2{?!e1t!9hua>dw`3rRdaJjaKfiy+20E z_xfbLmgoTO^UtoC1llBxPJWh&R!HwE-~qZC&V#pO(P{)wogV1l;&M9JCCe8 z?VljCw^HYM5|a~UcptN)5?}bDRfKTzybAB2+G0rL)QQ$^|KJdQq3E8>VTIRxJt3HM z_>(H)o7xc5XJaA(u%GP?2TnCv4eN_y7a^A0AY6g|E83WroVj`jQ0@It)yZnkyNflY z{q2Nv!Vfhh^E?VlnQiM7y7$8Fr&V?|5kdt&sI{TJ>xSwesUnZW_9K zxE3gj*)z2%%NQn)<1We<%H=ZnWzrhYun-iBl|V)sSHhx=rg{@*<`Z>s@Xe!Y`L)DP zIt`;9FEL6fJOFyIeofPnv?3<_X7sz2;i~B0?aY^-9DryhR*%TX2qo5pS|*(e2~C%J zeOB^*AYm}O2y$_$BRsxcD@fEMlYM?jBxmEx}P=Eia_;jQ5sjm~*pIjKTbm0D@jStGGuRRj+dp;i>K_{^_h?)Ff%{@cI(HxvnP=qAtT>_m5s55=3UX`!v}yrpHyY}nhOnuCu42H}!)gwu)#3X- zm^<)RN8E32h^xATmLdAVkiifvn0moya=nbG2e79qbva!C_SD}q`RVXUk7mgyWy=&r z6QQ9tO*xXD&<~GT;y(Uv3+vh2ZgCQD6rg(sjo(ET$*^9`bOe348)7?7p?!OlcIh~l zkl`)u%4~~G^lPM1P9T}rCR5tabZU-UNf?|W)(OlGIu}h@2ZA2U?I0tuE$S^Qj4z_TP+7sr>)u(ta7mshL;3iQnR3E`8p{!39S5*44!NV zyjaoydX0iNP<6E_mW(h=dZPhoT?F$@pL&JA3L2n_cQsj^{uuzd>Pfcv2dMBx#3;kP zGbkxCk3)_HsXN+5w|0gk7flvt3k0r&VyXMks$_jTp}H>83%u&wk+6SF02_!6e8s}i z1NDj+i0+JReXl2jN5u@zX}SCL@Ro~&nl;P8G)J?LwHguxKB~JF9LENyUCt4xObU~M z^A*w6m$j-j{t)$6Zqw=ZNnGCNb*q0BC?Hs&d4%y1$68knQSLgO3ttPQ7Om8=D`o{=QdCHa3DUfg~lw!BuS&bZ4b3z;4m6-c0u(9g`vX1JrqU#{0V0bU)n-q=hA9m~sTSUiZo6 z?WB4;)=ZSkEsBLzf#bBTU?zH~m*j%iCS##OcJfI-z3hDV_AG|_rC-G)0IiS)ujKv+ zY$}@>Kd4t*iuL0-_sTX6uI8+2G|DHLX(z;4u!Z)ZfXxgb>S-fht<(Pw4V!yr)t-fo zvkAt>3zo5a=~A=eIofy-^#L?{Grz}uS}PV3GazkwB#EQPH@`<+tGzIkHL?`^x)3k+*3G>l`1aq=$HMF@I{3#fdD7YwW4%93UveSEwg$q3I(uS2HWCjVj#?%n!;$jL> zipsRKyG|txg2jZ*WPH@UQS+=rQdu~ndxaQy6(*dyywWALB05{-sln+F9dHd3uXY>F z`km~X2LdHaaDihCMga4e#l*HVso&NnB@2^Mh~0}$F7d`k{I=AP4@3(i;f5^vdV5D)$s*4cBp>uuqdd$lvWlpds9NSPquO$i@oht zMN_gm^N7G1A_Fi}D-`z@p7B8LcODCd1?u5f(OqE}3}5I9)U@_EpXajU9&9EPO+X|j zZa!{W3eU+2Tn3K*tC6IIf{I~SuNC+&_=yq3^Qwx+>gD#==Q=V`;0HVk(lx#M6Y3;BxpZwJ-GnTM~ z@G<}gK$CB+${8Z!B?5v0lU#GdyDG2Z2nMVV5uYLskZ4JafGwB(v3wpJe&_K>*wlfY z9%)k~(Z9a0=F8B{`uK`GXb1tm}xlPd?d=t z0;nA5Nk5d=RIc@9m`y(ut!SJwmteIDB%Y2BxF?nT3OyN1HZEmU_s7NT2OV>#t`wV_ zQUC)LbFQbfjJn@O(8(q98qJ2sc`tzCA$h+tP976~P5pvR*1vdYFC}GGE=73(7%p;z zVD7iMYZQJ!;yy@Vy!DMWX6^)R^FO~w^Tz*)fm8^@IM2G{-7(T)=D@CnwYmCML_lPg zr$XE|n!wDmzJS{F4v=y518$C z)_SdQH|Kpvk7k+hb2cPZ&6N~`1t9?yQ~zlLyoy>~xmnG3Pc-flwz5o`fw%?;*Pbe-F4`Y9-ZIf)qb)rQvlRRKR>>^;C(HOI$zQv3H1bkr zyKy}nTA^8;T0GsH>>=DfmuOLTGEns!8!1x#n^QyWe&yHNs@s$meguIDK0 zfcdk)*v6N9;b1YY51EEtC&1`~X{OSK^gC-dt*j_J+rl89MLgM0q#~WXC2rjYWsn{7 ziA2RIARiT85Rby!zdl?2LXMF2jrAxZTeg|1pB^$b@OXc@c=izd{e%y}w+v?@dy|kS z?FQcGkRk|;^b4%_sh1#S)zd{Uu`6^e8}k}q8;m^4TPm};` zgD{WND)5Gp=jsxn69zKk=D7_zpK?bZFp@^l`z`XR!^SR<12s`soRrbOhNQkU7+g$0 zd?4EAl}wqQ(<8C;rfB<@_IJmdW;YK(Dm@}7&Wk7WCJ0`9BgBs66r zNDniPX28m#-2(Mt;dF}1>Q>9I*ehdl1`Kh9s!Vc|h=$W>c63V%UI<%FSL$#euW^+V z5frdQznw^p`rs7x&f?7?ZOI!W$Qod*uw6K&24e1qXf-y3X3cwC4!C2;3*Xr$vxz&; zR5%3{%78uiFq)KFYtEFF0aQ45>X0XIpa<|7fz@Jp$^*`n{&PVe@t;JT@^&on z7#ud=71MG-*#uo=#9JMiN4|lt)cv@{3*8>SO}*WJgt-QU}@x7Dxwu7sQR7NR8CzMDVgNSo0E2U+XQ*nVgebQx|^?a6bBl z$>V-j$AG@N1E2XZM$MCKkYR!VF&NdOD|LZ#f;=1sQKA$;S@W~Rko)+11tYzOe+G4G z4!moiINUtJO_)59^6PXL@)T7yj5fDNd?%GaSDJN(%iM4qsQBvOk=wWEWszBFOL9eU zp#k^T@EY4bd*Wmayp~@!?^es;A1Tuvc3$|h#EbpFR&NhD zQR9lHIN6`6R-;?EJMJ;_dxZ|W`(lH?n=U;qPxRK4o&twxn4i-w8Da(jz0Oz!+z8?= zwCKu7U?~#^66rCPCd-7ZG*9j&`E0_Fy8?l6%S|a$0YuMEV>f|8i@YasGL_L$3985I zMY=*8!4Te@Rv;UWiw%|$x!ggj0yeJKB9UzG-#teT8SL1t9)%9_Z=-y#CsPRlz){GO z@}>Hj+czhA$MM=Hc|Z-%`4SA{RxW-9Y9C6N_7LKLGSxOch3}Cd=ws)RP=Hc;92aH_ zMy>6z;?B*E1zplAE=3-`-bZof<~fz_Mob$bHbP&3z!QwT3yan!0^-W0_LOrg^+J$K zmB;H3Sb5bMas)R(Fz<1Z*%g-1_g42&pDzbcs;oCgq@f)eLRxOzgIN!`WzDXZsz4D|7E1);!5zu|lzTCY&?Veb%g8K~VAz=(Q5otzNUu8@NoR?0l30ko&-N zGkkLc$*yTNfgEby$nDEnsx_!m{{>=_usx&r{5fE1f~V@*(0%;|SLJhqHDLKb;aI=O&`J|G z@I27!+X4ks$R;RAc3wn+#Mfiwu)CvxJ8?_JGnF;j}$N-{~H# zlx9WJkkReMuPa^;9JXR;zrL2#AF1c^@6F`+;I_?SVT2` z9;iTnj)-Eu03?@yUHlnG;VozYGtrvr;QiGKWpkO?A4f-~mAW>{qW9~TH2fkB|4`$8 zaff(UAHC9tCBuun1e9W6+X2nVfGlDwu@4Y_cMf4$0cjh9ixC9s6(?|k0*_FERni@L zsfbg-YJQh7E{ogZ9503s8_w@9>DQVS)|cF7yuRDSl4b|@I-eZ+V zk>sQyuNz`#*!pdS##vO2G-yrBFEKF$L&;9a3o^j;!9cg;OK_7F)g#R)>Q;3r3oMp9 zL^8jM1+lV*sC}G$kxAfn)jJ$zZq<&DBL&v2)r|tr%?3gL8ro5z-x&@1Av_4gC0eD1 zfEO}srp&*AT%TmJejIM|&yT7nHT6b$EkGtHBqk&lh|=v<`CLOdh_j;7R?1FXd2D@WV) znl&jwTsKauCZGvNN&hz(szOx`F=QJeh9$<QIy*POO^N_~^XMd~e_5&p5bCNdn;01R{PcMA*B!rNozLc%-W7Kqi z0zLMLrJ`LO^pFaGPl4i0Qn%sz2!==~hxr%hZq_|oLeIxvGM`v@c}l7jd-t%!(A!Xp z>!`oO?w@|lHi-b27LDqAzl|>Bovhto{ykR0e}!6o?v1|unQRM1K;L+HOGXiAx>pAQ zRiS9|+@Q^fK4RZmX?F8om@L@4vqi?q<}gMUoO-B?8Gj0SJI+ z8YZ>UVXpY&>!^B68^_n$L_%0CHHT9m^ct}C1gyo|vQH)`J08H=V_VXl@C>5SvFw!0$rHR8_fV)*mjk=N(~OJ;B+tHgL2`s{radl4k;sr_@> z$YLRfWXrdKj)~%BWp59{AjEO|zY-?UYjOaeAaXa+X!%uwh<2o_Q+x(I1bX5q1d`>d z3t(a|&z<=$NJLg&2sJb)%68SdZ)E+g?vD`ml`&6hv(XK(`FK`+6?g?luhAOY>(ve5 z`L|wcmG6kihNK6`ujn^Zlr+_!xp}lu%Vwh#0VnrdRU))>##w@mgFd+QIYC; ziQslfWrrbNwNfinm@ekG7kvJnmbK7Uo8>~t+-j`Mm*93I!GTR>ZZ1y@U)_Co=Gu4> z&I)g_qCDQvavFNz*=21*q-ITB&`5sk#Amc)qXQAzvoL1rt#V&j^^^?H70jnuvNEhn z0E9ZjRrym&VAD)9r_gr-R#$le?$5c@q26D@0SezZ0AClV?>%Uy+O$ zJ@AceK$*?|qHRS+F@NH9361B^96FuPQmMQb9!iU7waT+Iob#9XfRY}A`f?0+C{Wd4 z(;V=`;oP|YthXoAap(jxs%1-X4Gd4v>!zeHm!t)n3y@v>UAuX-@M|17J>Iq zLZo%f(YhGjb9XuGn(uwYfTPy_lT*gcyakLm0Mc&jatDeve1@&gurm)+O3Ziw^O_aT z&Aw{I9-e2ItU7`#l3J7|Fnu3XmrWc)9$4?{N8x#$1heZsPt!XEBT{Tokmu_&4?y@Q zFAxkdbM8;&uzTxkVA&7v_l)k&Q1&})@?!F(^M|^@FHUsBxZb(YAz5S%g}Ef$ksye? zDj|i^*k6_FaU*f|vmui?G-tTji14~cs}^h$_m}u2q7(P-aZbrznqHtZhDr{9VwgW< zT)fj@@v-+cy5i2WTz|yh+Of3eiKDPUKp^#i##7N-PKCKCpZ_+nwW3%>PD#H;-kudJ3Ey-apGR$tQKxSCP071{6u zOk1qWqXi59App z8PvhElVVvgvfUasvXI7yIlWB$juqXGwf*K(9L<13|6_jQ=vHKsu0a^^`s_v_)Tv@$ z&FqM7xCh-iyY*T?DiKek11LQ2k9#uC?n5(#ll{553MK_V z-ap*Fqe!3n&C`_sA`k)Z$;dpG8Hiy1Siy!$#XuEnP-@R|;VDO_S5#MTs%5ykVUVPP zLE3Kf^&e@tL!GX~mQ9pJ>hx-oJD96aaXwrS;quJ!DPu@yw}_Yc`o-+nYP0vSRf-k1 z1vf`7BON)^CSx+#Cgck;PRo(iv$dGIs;*-6weXItChYbbYhaD6;twwoQiHBNnM@j_ z`Vv(qzj27Iz4p>G&rG7v*HNpV2-j#2?ds*0cTNZ+tE~@P?#~W$y(u*iCzjJ-4;AIj z-?{H4a#hjzOQYB;cm^+W6f{JV@VyV}ytECklwN7(0UFekHjbuA1jY-bGg2?E*!~5q zTm3rQbK!Daya`*^u$L(E-=wX)2%oE=t+15p4?jD_J>}rP+0Q3FPJ^E!#W6bSU0&>J zyw~Wb3QnjGTtE1c#44ujB>yy*M=j(RNIL`KuBz});xVK!IfSmvaDq#MBD;A)3dcrV z-3t|xWSR+*;@v2s72EfB%RaRdl;1XuqlRqH$iLm=U(f=cXiqMAVTVU%>tF=c=c|&v zaF~vZEii@|G4D&SuMRdT0Ju7}zorALf~nD(+54A=J-`RT2V&~l9rC0}>oHP9Zie%9 z8Va~y(dG7~0vK_1q$sy8bloi%zl++ay9m4hhq@Hdyq~=?*uv z`OXj|%PM^SUuuD-$eLh~}5E@dY~&s1AeVu(w#fUppIf~eIc+i5FysCPtG z#0T|YlSFA{MXv8IZfZj!`4alHP29rb876aBXx@sHPlKdi`GpQKf{B=^_&0ncV6W9^ z1Za!o8ZY-=tGg>gQ=V6}OMa0IJ6en+N$~34z=#&VdxkQ=nU{FZL%ZSu3_eQR+ZaY2 zN#8k&YGx}KaBwsAdLT%>N(mIhq-<;WF-Un%Q0ID#Wra&#!Je%xZh>=jnG&gv&8;}<)mBl@0nLJP?20|Dv_ z?Ob~2qnbCnhXbNw)Vpt~LO^kFe$w2TL|+aBMo_^-9RxiDii*dMx~9Z+8-rG7lk z0A5mt9*{3PGY-X8C4-H_qV|K*sa? zpJ>IImR(=|t)+8)?Xzk2U&ZDEu@TY&*eyQDD6gYVFsI7wVkq7Q@}A$P35fvnw?3?> z_;wz(9yAubGev$$HEZc5-JsCG;)YKCJ5tN;ee2*UBvHCkM}LEH&PV9Rw**f;so@T!q4m6Y>h3Jc+YQX-7Zb&iUmW_e-OFu@3$!3ryeaJrj{)EGN|OtnCnDW~CU_ws}l zFXan4T(DG9bS$R})B3m?#&CQHx25KmeKP$i9>e$t+_OVqz(Lg0{$()|q?l9KRgui>rU^MJCKLyM2gkbMkLf z1KA19(K{-Ef!{&nzrvkeJhx23UaY5;%0(*D$v(;Z!SN+;gJ1?4FjCGkOn&>5IyqS^ zPbxtcTSTR9n%{%(lNfK*%;yX)${7C~xQb*(vSlU=)uLE9%BXhvcv^=I#)&n_+RfaT zx31P}Kipt4iJmTW8$KETC+5Eht(DxR8tQc4OUH%&?UC=*p&ibl!hw1+&jIX48itb z{krPq?u!{Cdh2XBw0Qp0&CimJBEmxJo*L!%-*jrAL5DrFz&-95MsS*_`vj zCnDw|RvO0C-yQ(txu;T&Hm4>4uQ)d3S+V5YY*xg(dQv{mgK6sRFF~ZzNoni4{|Ju$ zt)+`#=zGC?s_p;?j#o;(!{1G>;E9kR?dR++`BZC1k2FC-NbDyC8U~E-SYJ}^$QhhH znHgLJzrL~7QeXvP$>O>Gu-`<}7V z&-^U(BwzNPyx2s0SMtp>kbb#PO=XCTE-Z{Pwpu%W@o?Kt@~aIAXjK`ZHr8Hz8UbJq z$vP%y0T%kAIEUyO3~Nm$`pqNg4IzHOH70gOmYDS`b*Borlv51{yqzV*c0;0KZ0-6YDqCa6@1DKPf_&NkEq-&EBw z#x0QyiIPuYPZ3Z1WPWgvN65@@({6O4xAS1aIuKEaQ=bG&lRcDZSHF+>Xvz8|A}$3t z8Q7!{Y7bTw8?j<9Qh-Nb)#W;|kUxb&1r=9I`(t!3C%iMffQg?GTyW4Lv>FgDn}Q#( zlKk-mbQGO5=m2yREgs%EDt__>%M7J=BR*%Y@1x9`ds)g%kXT>Cs&0hhwSXGN1&YPh z6UcOTF()K2u;)8dYrz>d&aJZPIH%`51E;v>t|j7RmG@VpLypTCC>5Y}xcXTOVn++k zb|DFPDD4nF)8pqIJcY0mI1ZsP9ci7NX=`vxx`(2Wv_asR%ZO50_H-IfAg8dtvaJkYvZm#U0A5vPE z#HE0Geu#TT#j)F1|3sjAa)p;|)L(Gyr$NIo0J$MP*?+1+bfvCp?$*_?|KJYC5Ri`M zf5yL@zfLjf7xDAx{HHGY`%eCc>r0CYb%zJs+E{0`dV#-xLXcH#Y3dkT801l6*&GvB z@Ug)OL}NU}5nEw_R3yHP)3*6?LUd=c05qwMo&C!?8U-2UM3zNp#SWV$os<`>_#Pjh zqEgt;(j=?^@j#9I;nSW*fns2Vvx42pp@3^JSmQC}r-yh)Lu|i%6Poy&H%Kz_GoNtj z1x`kjoz8BDS6OLsSZ(zzp{1iP57Z1~K0wOoprL4Cp4vAR*a(J6pQfpU#B?RK{SHvQQn znviPOI9`hS_9xmI>*z;)c8M>fX z?U(kUpQb5x@=@;1wsRMkW`!l?{rTl0>(lo1Z^|KA zG7U&c%oAe9Ws3USnoOFvAu`mA!ZU#>Mo97e2J=JlYZc(kdFx%QmAm3|@CHLakNX}M z(C(ti(h~TWrN>KRJZStw?Ia_BJ<`SeuUw^}0Oqf4?TFeMh|)u=QeSlXR^EV4sVi|EN{_Tonsh!_;IM=jOUj;7DP98KTawY%F?$%V}r4Lou6a_;J z1=I=xBAGSxfOuIblwIWkPJnQe*1ZW=>@Bd0w@P`Y+pL!CK9%3={Uxxg1+jhdb6TU> z=>&11WJSr|w_vivc{;n1-C-l@55t@r1AsW6uC&muX$CK8g@@`MYel*}0YB4h`h;|y zPc$1~D+#{6Ivrwrb#La@&LYe4X`R$qMaF3^>!$1JAwF%G;0XK}v>L zEw<6N%`@zPHQzXur&|QI!;eHSRD1rfc28C3vsHjVK*H^CQB1*HV0afLE2D@nAzfyk z(-~eFB2FihqXr~q6ghA(qic;%)JI8*{YJ-aJs~vQQ@!F_*KWf>0s4t&#gBQwPrAIArOq#o7ZeVFp+3O!+2t%$?aw_WlIUNTs(yxfrkq z7So@qYY6TB_5uKO^rRyxvc!5hc$f3USlz$*DgWE55|I26{z+`^+b^~A_Yi> zlvgjQ{?&}4*p(I}0jRG}q4wo~q-TJCuoLvo(9m#^u=WI<_#q9fds!4-17iAuQ8?FM z3pnm|S`e3=&VU8>VW=9N563CQ8lTS|iUQu+6%&af&LmgBDKTV3a9j5t;4pSP!C0r& zKqp75m#$rU4u=b6|3;!+QV>hlV~`y{+a4blTdTZ!toLg#QGz9qcJXhPO-nA>Ocn6f z)(Ql+dQ=2PDTN;FvD8rp=?~Z$vhzTzL-ya4xQYI?u|>P!54{G#@07?ttTg`)Gf9Z4 z0^aF(Oq!AcAvP^f9tlS6fY5$LJ^}D9e)9MZaS8ELuD6Ff=Kr$M54(lDbDq^T@Uiv^ z4Z833!fSdJ2Dv0Q(*{3`rPBX{y{Dk0=(AS;WqCU)&)m+&0k40}tfFb5saWy=?O1zs za3hu*g-!q^srp$+(NsJiRv5*y`0(Q1>)6T!h`N~fqu0W7G`sv}stEZ{bxZ*S7#RV~ zRc6Q0>zdzrfo7sWHKH(9QvJd<8n_jP2J12!HBYlBu6fQ{r8u5Fn@p|>{o%`*3?f9m zN96Tdb^!=_eMSS!Be!5;!^2HDtYUEV6@@1p3z|%OfXpuiuQCYPna>mqFcjQSFFOr9 z?Ld|RI%lT}0E2_$CjI3L%;ev?8W4edUsF+$1^YBTt&&w_jczH zjmC5U=y+*&5e}{OZd4ldboAJ7mr;zCbVi$Kr2_88cQifm3frmJAx#Db0&m!WBpTjzV+&rrx2~hG&|i;6n&mTN<~AY{P2I5pE~fosznV2)E=*&O-6>0!q4zlkwDiVBk-LLiS+r z?h3aUu1x_XjMef~JhX-=2y4 z#3larUo|R)5-i~KFR{yMIZ}e~qL)H-3lX6w5Cz|Cp*>eq=qk_ex4=Q+xo zGFWUi5JR*mg=he8iy(%(Z5%%YpYiwp(SzR7GUXDka+A3nYn6B74>ZuQYG&C3yhW&z{JJ^rTW3 za&6t`^J|m@&@P<>kshER>Rx_YX4C{Hb>3WGZ7wGKI0q}~?Xbx_9KQyXlMUyF3`9-u z@C2{?x@zkr|2*m~8=y`EmtTln`2~`N8&i^<=~DMb=o&6OT57N<#YwI^ok&b*q|t`I z&P3EJ+k;~zgzYRfH%xC^iH%7lxFYwQHull3S*{(NF@KfLNH#k?ln7M8CR+2s#?H4{ z$FmmReJf(LL>-R16T~?Tc}chERj(wog&(?dO1H30KYDP`b zsC(ot=4m;#?thJM$l%EIqjT?^ssA^b{EwYozo9w*n`BJj8yox#j1Sl`OEy)`QUB}B zPI_f~oK;rH;$3cie?DoPvs0^zmT$^9YJ=H7G3##QcD*01Z;!B*XNvR z9Q=rSWSYLVxjA3SzQ!@=in{SZgytKY{p7E9y#bUA>#1=u8>z#7j7JVr%nvlCrIhX8 zr~A3f<8T2@yf4NPAofCx;ON!cB)m#}IP{4lvYOnQ!ngsc0o?}s4&USZ$G!RM44m=# z$9p!m=e*B5S`K-83w`>TB**F?pgBXV!8q-{^ZVn6t~=CA&U#2E1=Vm}N@u5z@|-*- z9A=c);wAB?7y4`bhcD$EcBEzGh8$to_#mgQZ*?}6$G3TgG#i3S<-9k%k3fa%!f>AJ zCtP>GOelD-b>6cYGmKuD(}Cfs8L{C#uc3$;lQ}s7Yf<*Vi^OjQb@wZ#Hx2{3KYW;* zO-g?voI4ei8oTdHOXhul4L-{9(-P0AulcCgViS4KW;*mf<&Ec-KHEqA*0GJTb)FQ> zg7}ay+@tlwq3penxGxeKwNE$S=u*P6Rg!n^CEiSG(P%*r?tTjwyQ_Ja&<(yH zQQvual&jydt(1TDyxeU4aD<&tXQGrjfq@M$>kFP3HEl1rU?Ye7YZp2z_K|-st5!B$ zBHgI*y#2N=wVCeJ#$?BKS?Q#5ipMwEwgeoS|87b4Gw5qN!8Wy)1C8#$Ki5jW#+|A& zE7GX67BSy#bl$e4`rP^h2agJY-b`qIt|X;I2h>38I-cxgavHxs{7S5b8P0VqcHLq! zz1d`Ya*+Ve#j*OuxAzf5cv=&!FFfz+hVx7>tq*dG_->Ox=KZqA%RL!MF~<2>PPpH` z`UK`ECI|)?ama&wh3H-$URrL%RNR}Zl5)M)x24k1Ef)u~HhA9E?+kx=+@U&{@U$Ff)$Xb)kMkCewsR7X1XPHbE&r*IQ8h`97h(z=4CQ z2MpFfQ^SeW8MO^sY(eSG$O;fjCj2DM7G!eyS!Z|E^Tnc39!hUVK&>b9vszlmfx6;i zzxBi@yk2#6(g(Ud7Uy5^jaNwzRpF8ZN4Yh)^plBJvo7YWbebkxOTOiTqQo#fCKr42 zn|N%%ibc-*n={FAW@q4n4h2a$F-k3uvwksaOJJR7eq6rZZ7iMbhsA-vv7E2z@T@eq z+ED>^SiFS8$$z;Q;0?|}VK|vAu(~mX^Su5()bGP?wXA0gO!JsjN6uTCP( z7!zZ^D16t|V^%tvyLMQ8nZm9BWeDyYzfH*ylDfaF*5Gksx|!sJ`$pUL16WTYCG|rk zhWU~+e`5QbkR!#3kV9;szy?n0_V96==NF4>VbeR!9Mec^le?+mf-b__b19fUilw5J zGqdbHyV7t%Haa}A-I;Ul-C)$8Dql`536%**c#|KeH^Y=}D_tNYCVR%Ob?_A?CL;ND z3HXX4kye=oXtH3*yXA;li8`q$WFYl2YI1c(>yriaIrT{quz;5HS9UB zU7QkrAH7S4B=AiLl5IyvRx$<8sBOh&P_H;C7yvAGnH7w?w?6O9ci5E8GakU>$ev_z zSnDkxix?{i+!JMjX=%}|8QGg_?m1k*;k3XjqE_jSAU2Mj2h!g@ukp3}qraTtbjF90 z$r0vPG)rQQ^}YIKZ6bz}0#M-xr zllF*RXF{?y#ehS768(*It(W_dvV4vn&fQ#jmB_e9>fkqJYyXT6;3v&mNSksRn$8{+ z6i0r>&Q4C(TSO`dLg@J{^9GPOR*lu~yuP`edwEN_wA7f*^B_N4tbG*RTkqJ_v@}7D zyC!9jfQzGx$$*Y$W!&YQ(Jw#W^zU*!FxP7wNrdRV6rqCB)0FM``gkofIq2sn%r;_T z>^MDwLvuAgNnhn!xTU^t7|D`G7=%t*^P+9#`xaZiju{TlVgIKHt*mDI7g44`yB7;b*T$l%LXAqqXs&w^8ds9O7r!w3-PMIhi@S9&%M6AFi>!d3=ih@ zgEfvc*~2shg5P!f&7(^#XDS9w;IuNVzl=3ub_6B*-rwf!SihPS!iwW?7~Twv&#BO< zn;br^o|NW97FGbcWP4W$9z{ZHj2!~5E8kOHRiLbRomGtqMpLzc`bYIxO-7H<1_r@> z<{5PBn&D!Bz`P^GN4S1c87KD5btuxtDRX=d9ti(yj3$jiJNm-$rD@%_45Zyc+Js4h zy1J!Nv4XEvA=urb8l~ELH$JVFU4=9R9o3Y4yLs0R&UXiScW>Uj8YQDT*U`cdEd4CP zi3V5dWx$4$R=ixN`gI|;4?CiQm=;ljl6FaI9~rDs_s!k5U?WiMyEby0@~;9t*6M!a zwgg=P{7rvvFjbnv16QlAwLhm-RAm1za+tv=A(*@AVaL453Um62UrPum<9J88OdK}T z)~eIRk=3}(a@uB*m;$byB}$XK#ahhs4g^PW*3-7Su6q+TUIxERr!saLT4-UuR(KUq zzXxx7X?fJbdaLl)Zs)I(g5HD^)&C*civLfO z?NhAtlK+pfE~(8R#n{w;FnQTp8a*g~PulC|jMX2=gZy&=r!hM_4)>pAI98?X-y~Td zsS5g6WKqNgas*2Xkeouqk3a{5sb;)AYZv#EZi1o7__NbL2mPO)Mg=A@NchG3-EjO zS5A-rnRR-cWLPLzKREul6(I*OR+SGVRYx&&4 zE)PBLU-T-+_DMi7fhcv_612eCe5$~}JC$H;qSeNRZ4RD|ZcFC74V{60hXUc%QJ;%1 z`gVn?nT`OWV9yv(^%QZd+S?Iz^Hkxc`S)XGKSMU&Qp)2u-rF6?RfJ z)KGVzu%_k0+bQA!sN_C=N2A;~dVy}Csnyffa86icj4*Q2Uo$pD^5}0>rkOZBaIQ9c z{*zHHVH0>EjVru>a)(2Y`L_FNdUx(($IA*xq$UG3`vv+bLNK>U%OVJkVv0k^Wi$Ga z*Rz&OIgQ=N8`V5^e!MAu?%>W0qKnwS$z}OqU*cjk?qpZM2amh8BdPdn zce~-jxhkWl`}2z=WKS2bZH=Dx{0uKlxM~XxI6;?#v0=RcGuS__ZgQ32 z$Y$+~pnbEfqPIbc9(sO9Lyg}5#m#-aM89}Jw<`4PsfQtpggaXn6XH>@6-Y0&fi1roMexzM(hV!G)aZ&A8$t2APHZ;yj+)IBwRk=^A&Onl!skIq9 zG|TjE(Qb_`Ij{4I9N$FqYAM{l7ylkO+){O@(lBT4&0(V(H~+Q@X%|`4!XTk!=$PO_ zjQEd^(AN{|*JI|`|3_H4fAit0zm{*n^{+VfbV|KOzQnvPDc181qAy%WP)COnIW{W3 zGD?PN&-~WFHzLIfV{+zHNP93WY|uDcJaJ?MFxPiGmB`yuuAeS5 zh?%yo^r;`Ik+EPinu#mzX9K<)+hMpmu#Tg>F2G!z1yWeqzrKd!ljd-9cIhZ-DOAhNv^RCl0xhwN;qWT`TzVv z|J^qx$dA0`!2;cKVmHJ}_2;Mkaf43e1%AXepFu%zat|f_a4RB@WvnicVFHp?h}rq(tFMWx(~Dh^QEHgz6_d~6LErW$r1cB zQvPwU|K^WgPAD(x_fK87%3odgzdN31&@!5B=<)qHuO@dX&hcxm&uw{%Er`q=(8rOk zqM`rBlYV>Y|GY{6i@Z0Fhr0j%hr^{sNsCBArDT_FCWK0q5VEh6ge*g{WhX^tt7M%l z*=3pRyHP@6jD5_EH8Gg6HO!b9%>CBY_4)SsT-Vj_`?&7=bN_MQk4JyVLzDOWyv{k# z^E}UUUcVnF2rC=EKM{=o=5;S>@Bg^vpTD|$ojK^8VeVA-KY5U=Oo80MgQx&p)T6(C zhVKVZ=jQhZIq^>(M1Xa*5%6YejRVi&pN`0X9&9;HCRI~WgAhx2+yLYUpXQ#AR5m<2 zp~c4e)9L>6`w9&>+~aebm6dfHoyGi7iTO&maBs z>;7gGvhPnP{ZEgfu>BbQ@9{qu)N21rSAvB!?Gh6gKivYHEYn|~ER$`67@qtm1{wct zHP!UeB__ZoRREIul})U^+vM>-vdIzQ2gK6x*PZD1(vrV2Uxvt@_4hZEW0d~cvyAxM z{x?wm*Ji)--RuYdq1l1tI9mQoFHCv89mVG+evY93>vN^k{3DwD!QuV2C+Zk~cfx;U zbHE9${@YH-*+bbj#Z;P|_J4ZCPe$oE{oNEy|Hu^j7sn$HF2~3ECrJMQ8h`bwF2-?g zhj!L~8rnIGO--+DNB94p4?5tPf<_)QHt7z4cp1X`q!8t z`+LMX`Hv!&&c*SkK*VzMkN+hYjpN#mSdaf{#QJZ8(QOQ8`rbBnbH-9-f6T99F93RV zw$qd+@&CUeWgEo_3!nJ!N0k4zfBe4!;r>4YO|~8V2q))(|8C)F!Xy(gO-Qq|{Ldu# zGs61%oqXAq{xiezoeZ*RMx%l^8TrY-W`sg6W^vu^ZAcaY3X!a_2$u`LC=pH^*aj)L zW%~?&4v!$K|82!{v6G8!T~zMR1lWIKiHy(RVZ^CF!3e*j%WL)Ho5sjjifpe{3>?{r zig=9xznxK~MB z61ePn?VsNJzla*Sd!fu*>9R28E6pY#zoN*$!l-|IPwvF`G>q){tLpuEpa}f@VM4ZD zwymi{{v zLKWY98C$3Q$&8E!+Xzao-(81I+(i1fTg*S#w7=uQyUWb18>$Y0vMV>wkam?3NiBPq%t3W4!k=K@=Wl^Zu&foVdAn8<4tc{S~f$Ozd2Vn=ZY9t#srm z1SfY?uQXQ+$-3^u-uf*@VAQRnBPORR&jTHloBssTq!Vg6@wD7Q7bY0t4f|F$HRIVT zLgxpLAlqJ@&IG7-q%l-yFMT8zS|B1WUe|1KneyhMdaGu=8#y~g>v}zAvkzqC@E7*D zm=U^{^IMDY8b)nV2_X39v)UDZ;qW0BS-uxMqYZzFf-s3$?YgasB97=QvgiPdgB}^b za({&b!Y(huZlu_A($_|6$B z|0U=sliIaE{fSp!Z3VPw?2c%>osNC}KF&Y8!H-W2jTF)wpk+21HZ?wP;{LbR$$$Ks zzyCEd$andpe>8bGxelhel8z*PwXUAZj z9NEAhrKkaBGV1W({=!VZeS>_*Tor%w`1KS4dDbeJ2l)+t(ds&2goEUJB{FGqMF;nX z>ipUYoR!dfxPc_llYIam@Ahwe{J*;(a6T^{+m2<(+ofhd{~o-BKj^hP5bs5WKtY$ZJF+?gNm@VM*$`5ivf;wA3{^%NHt70IcSRWz8Jj?M1BUH-$TPsoOPDa9s3 z>AJ=i4{lMs?Qc=42Ci)5X-kYiPOhsx@y~^_~ko{%7dDEHXRy6qZ`8Horh9%V4y)?PTRI9 z=|+FbTaq8U-D4=O8s=ska2WSm0o^SPw3V`|urc)EXNJdKH-9dZA+5CU?W%P{=sdeS;-SQ_zZ?$yChqCNSnQV!ub-IzJy6N(U z`mIySAdsCGB);IC!`0RQ)R#2&G#R)zwK?jz^o3&!D~Hc^G5br>a!#g2TFP!H4?M_g zan?Bhl1suOr3#8m@`mD)RRaBB-V4~rk$P882mz*Pwa+g283aM=el#tf2bv);Tgc;Q z*2@@YZ|dC&UtLNG%!_^(;o-1f{zI{S+~0fJ-C<_dR=(d&)DKYUWPjd&w@`*R)8mT+*}){XG|>u#klJjG*=UqVoC{njA`wCyVM9z;3VX@&caC@?6)50K!Twv zwArcQgbTD;!QA*p9?LVM?gADCPYrLpzTgO`v$%MRALg+Uj&}K%mP7*w1`O0$OC%kUo>VYioYS?BC2Nh`tM^84qTHjcO=bx?7kXx)Mf@N4$&!i1XhjZ1$TG7mTuHPG{Cj~?b#>= z))<&hxR|kbG&pNSL}6sMZtVDiwIZ61S@SPV+q3=_wpwP_iQFX+bkt(*Mf&D|a8jk@ z^ldBNJ!AQu){ZruLRRU=E;plJ!V^+h_jWrJA5*xWUE6KH+vV=`?Nql(!dKA=XGSQ? z48|cnvNVX%#*3VIA9fpBn|}}a>G7AGCBeCr7oUxFl4V-80SO}O9&7{f#)WK)mt^3L zTj7`*cUz~m{e0JvY8+$fZ}Egj+dTf!zvS`nK#YsWkJypRYI;eZ-Yfr}M;BK^HEIT3 zWd0r_v0G$h_~OGGL)kqE0H?(RguZT@pF*FyGe;5}%va(*`ME_A=FXz!{5suDcK7<* zaekeS51i!HPRQ1WZ9yXl4^?iUDx|YCb#!!ebr=;Q--qo&W?W)fu+_WamedHu`GreK zlg;z~9;?8`9>^z?EiwV|;ne_5;DtN;TfiVPGRH#@IOR^enIH~gVo2bA0c3)Ng*H4* z8F|lN!lf6Oyx*DHVl6r3@M75u5YSED$SzdebJ|K)W?|y;9hL#-!^`n={CAT&soMbB z=I4X?N6#7n(ARmFb1c(ABVvC13fT_iRL}?h?$j6uyvrlCTfYiI_keU?FINL~+Q*x{ z^l|sP(?0)a&?`Sc))l7FN8eWIu&#n<9UrMq;!xbkh;lI`nnZ%`WP+^WvI&I zO9aPNCYVF_>k_hP^>`3$4wt7}Np?8~yflraJ~&~!gDw9v4EmRLu}n$~Ez**>&`!g; z?MDhTHj+PRy3ANI{*#yGjSlBCdl=f>xA6PK0Ab<5n8p07C zY2|t^)_Z1P?s_@BN2Gk}VzPpnJ7_-7A|k>5d1@a0o+ZXE5mUGH2oqd!%6zPn;Cm(g z5G?s^Gv^Vm6iqcHYI!Eab*u@|MN|mrI9`qOFWV?`)VDm^c%!{aA`|Us{1tK2Wv!v0 zVPlB_NV=1O5jP*2%h6&D`@c5qdoXWVmX2)nse=lSJZ|X3zMNJ<$Vn2%YvLD~toEa{)?QHyvfUlQOwXY9WSOG$wvo7QE9 zP+v7ol4d~8?JD(Fxay^I^*&1=B$42~*w?y`S8-rl>>>fT4Ve6ZLIUgnvM)!=U?F98 zxHM}H4HtcI|I@_#Tn7|?Db=P`VSS-LS4TeHK@2%BUx*xQq<6h&xvEVkduuoPB~P}5 zCx7{}$}`|8IBpM%zB2V(Q{DHmBd(;FPfhbq-(ZYLK?9H#?SYRdFaz!Z15q|-BMN8_ zbycEW4|%e8c%Pce1}+z~F1MM|@aP)5=l|_avdDs|QynG{SLw{%-%7T)izcDt%f1b`+|E;y9aj6dDuat6I{0(QsXJR?}b!xpgt-NctH*3KwZ&a2ETf<)#N9FV-*=WmLCanM7~1oYR{4b8t+ zavIl_=L*#5ApjB|%xV?-?RtE@lb8n|Fvk2*v;1ozJW3{@#HxNs{|ai8P66lS7-1r$ zs%M}@fu@pc@>4gh;A*={c#KYIqN5IzWk2r{2sp|I#Luxff&7!RjUSpEW@TqC(Z`BC z^qKDXaSSOc6Y>0kDr7BCyL%u?ow4SeQbKTFL3SAFb3p=k_IkaK|MF#q?9rT`{}#0@ zcs1rpZVQU9W2+EF!x6n)TEf|T>9bD`wjk}uvX3BToBJT>%`9}uoF89MTK_ndrX)E> zdcCFMm5%qLEFK9=D zHP4GkHos)+CNX9tG0_oRY@KSJY-U>z14(=dl^``??W%~%$>xTa%vf6olp z>}YKzPysm(Hi#-AzpU*-zGTOT9T~YlNyC5%X*= zrgZ-tM)Gw$*o)PDgZdQlu}${=*H5!M6;-cY+q>}v5#*Wz*4@uPfGh=WF9|gRaC4EA zNwNwwMZwW+!>a7gQ|GeKok*lq@CwOrROb)SUXrpNuu$pIC0w5xq{((*eMOBUIhI>I z-&-x;!fkPc&;{U%ta%>ZsBZ`c-5*@ohUe+egRM-p51xm}zI>?9|6n4BL?gI;WOlYZ zTWnqlsvh(6;5>oHZs64-_QQfVNRXL<0vUt?Ncmp#4v&^-@D(QLRuq=Gsc&?4fu?^C zSOL()#hO%8wOs2@Sp@DuaFZ#vXbrn0I|l&|25zi8bPDy}auz;6qoLHqPxktdIq{B4 z8V6grT(qo{asTpB_|v(4#@DNFsHG=HhQODP>YwPD)z9kME7g>AexnI=fZ$Ia(SQC( zOcOtD-vt#HZ03Ys6GDSk;QjBN}M}p60<#sy;lXKi_MK$xgu=8 zvGB!Jt-Xohms@HgSyyHVH_p_Q+9JD>WxGNFC?<=#KycG=@(WRBaB>z-6ug_A`4+rI zny$bvt*=ZW2SGcGnF@mTpwgF+sm>i@9moiQps!L1DaNX7l3q+sdsQKKxFpP9r9k?x z^s%qGVrbU9-GQ@fk#gh)!EJY7xXB*)u5$bCs1iE@aonLK zibuAsD@|VZtv#K`I(5K-aknv>@(8PfLMBNo(=Jem<*0&4C-qAOU`s}$Q##&LnK2Q@ zL0r2K)IjAEeiD?scFZ-5wE1P1OD*}w5J})4qB2ZkJb@T1I2$3vneCANc{#pOMES1> zogd%37!L>?*OU%@Z%eP0+e-YvY&9R5$FX$Xv;a3-@oQS|&3v>MoYUyH$`x#6jcPNA z=9KQ)^g1f0l0bdV?oDfdSR7j zwW_skQ>z20Y^0_}U!+vsBs}v=MKaheZQP}VF-FN0*DP&Y5+%(v+RB;~Yo^3I8BA!b zcYXs}LO=z847Ttmj|Hi<4JvDD6k|T98oK zeY@ce-<&F&*^ql9AC|cy7C`OYa@p3I)L><3)p@(FZ;`-wK^5G@ z<$%r6cT-Y?T(5;1+|Jm_6`6`NskWHk0z|}GXlsN~En|P~f?E<^oN1~p(2)5Q^ODMP=<=tePRYosshg|;cJ;w=F=tgLv@XesHBp7^ zfr(-_4;-{QSB7cGj+fKZpAo1U#VQ?+?xwxwwoIQf+4~#HtJ%bA3_r?rco7E#w|UaB zj#cUgNvbBXXpKrANA&KiTAEy=ikI0HZW8aXoRAe^J6BH`tJgUT8~hZ%tT+|CKYzi} zGjJWXw&ztrCpBd?O%La7e;-*hfOh7&kIcu(+fL;oXDZRwBo1IzB6qMWOS&rR#IjlH zYv=TF*MoNbK&PyS1A8LA=pZt7OD@6=v8p~X5`t|*R2^<9=(1v!N3XRwi&=Z1I-->zLO z>YQ%!RFL^3;6v6HVFJrJ6XleIMG%aVhMLG+J2E_23MC2W6AjhviaMJ>83bAzyH+FJk(-!;B?tJ2?WcZ9ICC9is6mnN_ZjJLOI?GnfWBI{jg?m87 z(!JSVWhYBgt1oe-eXf4#d3Zu9n7Y@%F-)4DF_nJ1Wi5DfH2n>vj6p##roeV`#ju#o z5UI`kG*u$JCqf+z;o{;-0WQydRNkdb8AM9|7C^V&#~%iJ9K- z8VJ`nRi5A~=b$>?Mnq-sxyF??*i)Xq3P$(qg0z!x6O{E#N&TW8T3-{5;4=L-coXJj zb7}Cy7-Al8NG)(m)~^uY4_FTBFH;|sUm)0ZzO_^8t74xWM+sY8yEz1p2;R`EjM5*| z0>AwX%sDE#B9s@7ViPOCXRO2}V@GVQ!EZ8IbU3Z|X)*G>x8_Hn=#o@`uZC25 zT*K4~-AH=wx3;{YiM%HJW{UCRYLL^j1$IIt)VLM6%T;LSQmwPOzWy8PoGyP!X?vYD zuUEf&6&*b1x5(VoWKOF@?p}9y@%I`Le$r~i?NsOO*ag&1GQcL_BKt36do9~*&r8*) z3`#suyTrcD?YVMaL3Py04%#COG!-Q?c`7#ya81P$6NL$jS(wVkaIU`E@j??R{|&x; zt{o*IbLqn*y>!I*=={)^Grkc9f12ldB71{ z_LUym@H|3X=c5Ph3)LD-6d+sn9w+W?$ zH+{57pcEh_w;D9%|Ix>gtZi-|C&~h(K{T{|w4auIllN97yRcQMzx(e^Vrtx!UWYyvez5JnS(uEi;Ae5w{5iUv>pRu^t~9oLQPSWb7{%B+FIA zAE`C)w|35=*?TK_O&( z&MzAA9tbFtNxL)`>b$e9?5X2>L=!J6CRg0vM~C3%Hve|s0U2XElXb+uP;`9LKXJ`y zhlNVKEy!a4!XV#qxdwn&`E8hyzn}^#G&m|gwac*Ph}YqfwrE}}dA}j}djj_WuG-Ck zjDby9`!B3HfdvV<5Y-97=e)ESR=-)Hk2u%*R?mgLGxMaL$rk-w5!Ln2<6|kVG+ucp zL(YrteLHnU1iJuI?l$gi2V(;THvmr;@Q)GCyN;Zf^=R`%cI2OC&AQuKSkllJ#S0$d z9NtkiSZHk0S(0nFAr4szUVdZN6i}ODU^o2EW~R;=pOl$-Dl2dup2)D0$oNXexyc67 zSDy~;3FF$}#Z_KBZ_LnG0@k}HfyV=6*RUx)>;&+*XWZOCK^Df%&7AQyP8Vqmv-&6% zd*PdGf1OcbzK9ir?XLfqr-=2!6cz7!IAd(YFgFzms~*4fn4I;!-|vF~3cCc*#~;tF^+yglBvX~-QnG zw`RPIF28R#?1JOV+HV~qy#yfXZ>@NP7Rd0R}`^bBxUZ;;ll2|J)V%h7yf3AZB9|;m8KnsJ*Bay*D#wu|M6!BT9s8qVe2%cHFc#c&TT2`! z@$hA@4HT1nYGfGE>s?hQYBx%SZs}6GG=5h$nVp~0*?BiQD*S%q%y!fY-=D3zHTQIQ zr5N?XXBc%@G(Cu%4D`5Kdn@Se9LBmGAGz(%Ay?0Lx7N;9Ne6Vdx*yzX%ysSqsC9uR z!%D>7ijWc>gIsNpvY#gyPZXd$2I*Ob5->sGC~wATtMrP-x)_HDBK68Q$K~N-w1)9 zGu7g$b}db=Zi-BOM(Y7J-VW>GjGF0~CRYjtQOs=w%7kyUtiEbO_ydDh}?jut2&uioKH8pfe}yJ<4Rj| zJ8!Hv?155FpEo&NJ$65`SE`$SMg%qt&;fh>1#g#sg!poVogF}r6Qwrkmu#KrbGpHY zSX1trp8=W>BKdEeK7S34d#Jw=#o}75tFqZ8Zhaha&?xly6g0#P5LF|~$oOIQ@ZJYO zw0rYA)z->!_A34>t%;V2K=j;ar|;m@)$lkj@}sxLXxNz0z^!83%PO^F!bY9wpLQ(0AEl&d`kPhwnCIyosi= zKuwh|GM8&%SERo~XRq@jH!E@d(v1}SE^L0#OqUrcPgV7x(pJ{K^Bj!x9oC7SF?NTS z2a7Ghq%i-bUahNkz1)x#U?W(a(<(9D#3_lfwadQs*^yGa#hMm=|3-hSf((i20rgvcv99252^fb+1=`61=AT+#dZ{DF3SCNjx)D?*X;)<(!C@l9sP z)l>mRaEEUERlEhj!QML+ zBkxQn((O6UL0xXeLA?3JW#Pd#ZUHOL1eTB3civ1Webd;z%c*t{gwwu7k4fWLKju>Y z#7efxUrtG6g798}MW^%2sp`6dcTBFj0B$)oO?ksA%f3#Vg*DnE$?LI=Z^4827TjWUE<@WE4`JQ~||^Z{JQms$Ex- zv^}{fImke6vrl!)(R)ELm`G!Sj1NOJf~7urzTsVpf7&Wl$Frd&wS1LixvbWw6TGF< zS&|McjpDcSc3;bnr9*e9x09GSftH&laJe5Lq8}(@G%xLmh&?W?tGq@To|k+gB=X$p zCGwu)*oiz8cz;>u*l3sJ4B21-*e8HhkHQC@{!N={$SmNpaTo z2bPb)CiO>N%8YDw+2{1>RA}Op5XiY0dNwrGt~@?^Q_>>YT2*BC+BPA{vTNTxn8V95 z-x1gHXTtT?eN?5pJsHAECU3)*gqq&Hw*y*(H{|J;)F-J^yK-xeykxe4*UlV+u`UHP zkG1Yw?`Yl9!CrN3*eXw#M!IoSUqXi+6x3LcywcC>B6LnwuUR#>#rB%mdVA7*Why`@ z%yTv9r-w)}l(pzra;mnoKMilxS89@u&Y#1M;C4PD&ku@qG@~2+!ToLa@Ym#CDghslD|^dzFxNSt#+=Md*Zj8djX=_05%T@2I3accLLj9*uSnG_0r~*po<9;j zdF600)mfayQ77G~vPh1`bu!89Vp-x!ffa`UT1}q{~7g0EOk*CQNYt zq;WWxT%osB=UNYk&8%B=N(nxwIbq0P&+jG4D9y=-w0r%TY57*fK8VpHKqySp%Vhcc ze(Bpi2bPVZPiO566acCb4MXui=33b`CpM@3yJ)HHwlL4uo*TIa^(4$IZ$8mNF2Dg> z{G3;AltY8fiqfyb1r8M!-p|}9@+F5MOTD?5jT}|=lvl{%!wuSEY$bJ$HwWR{3&n!k zWDp3vD)x3ve5$7WAb3JdTPL8syZaVrhM*WaG-MKEs4WEV~*vM z!?1;yuC)5zPScq>%?`uWX7%0ceycCilZ}hJcUd|4H&x<$+=A&!)sDTSA8k@MZ{mpK z78MoTI)hAALPs4{5g!8b#^F5d7K*W9uDjN~oD;>3ppP=R*Cw}k>||A_h$l-@M9tWAfZ+V7Qq;{W2 z?f!K(mZLA3cYMe|TGji&60KI z7y;GpeaFt91C6uVQKNsX1)=HxSdp|XGr$Ps=|9vaI3pC~vcf;gGTSrQqO*1Z%C7dH z+hTvK20NAr5Z#ysDVYE}d^`4spy=K~)^5Wz+2FvuASUBhBpXuAV<+Zf#9Q{Dg-AYo z^m~JXV)RA?JbF9{o@{p{er676I41Nz+Pi+eqwa{sIh`C2&AlG&MuAypK7>fI!bcS< zozlkDOPHGm@MD70GmSa*Ss@^X{L9>Sc2W7baPOGKP0f_?qqtZ4Gv$x>5-R7)?U6FJ z?Ur1{_5JolHn-=b^8R(H<;e(vWO$;4mORxgMTNR5>n}U=WuT!>d*nU|Y2O^O^^^%R zsS`X;0T^5=*u+`Ma*tcl@msRHM{mpSfsQq_0<81~dM1wf?f~inOvKsixdykZcJWOLj{?;1r zZ98Z=`vh#BUu%;ZY39;qTfhH4DB0Bs+Wv%)SHc9*#6$Yrjrx%v#Y~E2mYV2k{?u6v zs}-Rz}?>_a!#}YD60=qVy7($~T7upD_90DpM0d9+4K?b*n ziiepUMLTw{w+M{zO1y|9UFLHSH0L?Yn3f8%VQHGe+!@n%8Nx=ojz%h&4=G)1I-6HOo4@qJq=_mVJ07W?X_b8 zuvbX3yVVnywBW8k4&*Gq2{#CE&K>H5WolKXPfch|4XteySC4hi`jyz~@gxH)okWA0 zjR&6h%t##uHXx$&zHbV7?c$9p95S&JG+E9ik6i&FT?)5&6bQO9rriqb_ z3CidqDg!bW1z#0^Qy0Ce`#7UOZ9ola zUIJqquRY_u-tm+=-8|P3#xde{T}#Wh^UUZhQO1H;8LEfEg$N@CUMWj##BUlGo5QXO zP#r6rfR4;I<>O?cZaQUtZLS}sA`1!P;h1Tnr1@)87Dtck5Pdrnif2^e4TqdbaI|K-y4wEr zzKfi{l?}!?cMcWXqf15|RsBc(;gxgVV?q}gaVn7kuH}A#TfS@i3fNp1?aI@==LbF$ zt1!+VGHBt4mg7B}hVaTK=Z2r~U9&#ZU@uoes039OSj*1Sl7%*Km%V=o!eWIMVsCDA z5=Sa!Q^*YcclW@&6NMCu&E0L@uotL!+RlLKFP5G-y?zf+yLt(*^Atc#xXn1vv52KT zwQTEsD!pp~xFKi(f!dpO)d>seETnyueJ+`8efY~@Pk79{227PJ3;nW-sT~pmKYBG) zlx7V~cPPFnJ@-TZV0k^%rwI!MEh+0S=^P!)YfP4|o7d<=q502sg7{+Aw+O@np0z=W69`>N6({%5RNm=k~E7E7yqE$luB>=EgBgAnaS5wYsI1i%+LrS1jQ# zWqQ_%{9+cIR?TE!GchI=>{!l%nLg$R>>qW%u<{Xd9B7-5R-#j02wwe&bt=qO3LdFr z2ln{kUVSG5ycS0=0OaZrw#bHfTKUbsrvq|!=uPA#DC)REpQX>j>wyhzq5JOE1FMQU z)3k~&FgM^0F0~)s7Wuo@FAO=E865ev{3TM#ND03=@j83zR6{L9${0rvs0)M@qMxv1 z3tv|;v207gzEYKt!~mn` zjruPkkma4wXR_ldXUB0z{RfRDo^=hpu(E{)O}8BJNAmD~{CeHJ{4!}mo<&FBCKO}C z0vlUDwH1kcf^Gocnp}Y(1_74{USgtH3dJ+BJQn^gaDY@;!3g!c90geei$ot{r)5FePH9#u& zF2CLSZ1`JHTQoP39XqMhY1V~zef){H6E^dxu_P1FeeadoaA`DkS- z^Lr07bUFOK>V)$fWn(VZc7PZ)t@Q&g^xiCU!Q3akj}Xv+Pj9W1zse>AlV&79o#;Z> z%30s;*9rx;w<;zFk z>L)}2rHfBNosgoZa5VFk+tJY#FXxcGbKxd9=`TY_qh^yn_ne}Tj{UP8Z8|WdGrV!; zZEv}Z+-Lwvr`NMjVd%L`fTLgw3=#hxpy7fz>w7KD4l$^xL}*prhgrX&4*R5IZYZn7 zXwgyX;Y-88z_Iqir;^QY%kCJ=d4!AegmwWHf8A3H@Ek{#+0K?JBb@3)y{#G;|2E*; zoWr2ZvC-i1KoG8%+Pu*3(47>#NwD)E4!ifiHPV9dmBj0}ebO|scX8i)!KfRc3XMS12y)}MTGg%RjMTo6Z9*ecd3V?&DgmFuGzx^ytGRiR??vibw zul3hUVj|Jw5Bgn(-<>2M+VW~f?uILEjkCJ)C_B)3RJiG9<0y|@SegK_&)0rkWU_2s zn#mP32@nLQOp=$_O+1x3%ImDXF?RO3n--?69K-hsKUxGOx|Q|5zXd2@h-oGzIHMzT zcF+ZIg#EztG>q5qHMEM4U$EfleGu>8Qh}l2VgUW;O%D%&6E{r%_&Ld!&2?7o$X%UZ zl6SQ27ne5(_bPGUt5U`UarQnQiDZm@Ov{C!LBLg|Ne(K*cWxLNw#^jwHF=e8#?N}p zT%lr|NCOkQ0{9ezup3ixC!V+OOb`)FU~Z2|OqF)_;g_xFNPV^@@9#n}d~O7kOjW}~ z2a*ey9OAC{F}DKti@d#gr`f*w%{S_7og&ZBFMCWccjr1sB+T6L&7s;8Y{~-}RG35M zyN4e%$P!PB(MQGVM6|)6wDSj1ocM7)z8J!+zJCijPPZ*(lXo0pR@>J=8QT~RFyibP zEU~i4;$3(Nkd!%8Ha3gupg(T}QFdrx3#iVPr;mX73-c!o6D(Hh2~a)33#?tXu| z@it7AAW`zt3#vxdBK865x#}vOnv!!+qDS3J&M4qgCwsefU?et*IcWn{F}jhiN-MwH z@b)aU5W7~m0tk7f>-M+<^q$l8BaPwdqghoMk3GTO^SRi(G@AcgH}IRyzCsh-a@+PB z<-i_j^l@decMAt$R`2cRuA>n$hqsfdEx52S4$vgRwm{35!JUNgKBGe8R_hkT8!K>J z1h`B$`GNx5NY6@>>!=@T4Gn1@61Yv72IS=e&dx>g*|01x>jC3jY)0dDJ0)_^JF2G1 ziOr>VLmQUU7y_;MKCUM7V%ieZW6=ix&stAGeBLxy>7#u))z>=n(< zReY@d4-q0NrUbzTn#1NqD!0X?7>Sv{QtQ8jE_vX)by%mf0l*y7pUSPXNjsgFP4UL( zQN-f!LF%YBI}GclJ``u+vnk!X77^q8gq+^nb7ZKbwV=ooE8A4pun|AcC41Gd)Tk00 zn-dMp!|hSE;_|PwyQ|NgvxIx}>wvN7Ih(Lcu`pc~>VONDlQB}rz09KAXXPNXb`4qq zcAp;*A+@V+Vw?+T$K^(LHp#ntZo zwEz`ztxxX?aD3BB;7B>c`!dY$!$G0Kt2N-TuDh*6 zPBoxwAO*z7ZHE>v@JrsbwPLcNAdlTj!QtDiy_Yby))hRp8-3Mo5Dz-Enx-?D+tRhm zeB%AC#aP#*jiIr7WGUDip$2yq;uW*xjpm)BuZTd}!=$)=;h?V&Jn(6ZoGoovT7O;T z=m-`eK{6gaIx(6<6g3mO^Z}p{czM?$uRsVi>|VKezh!4#0Kq4-br?KY;g-I{cba|#@C$V}f{ofJOMA@TY%HG%Wv zV6rP=-$vCQ= z0;I?aZK3ZcJ$pglLNX>2h-fgMu|V+386oYYTe-ThW5~|09ub7>5`6IxN%eQa#o7T- zBte7Px2$S})PSlCOM!csM&_!l@DAP$*(82V-qfC607<(1s$bDP%d3#c43+sgi+3^jkdky;`boG!rd+S&%vo8>z-C|Ls)`VP>95=0kH z4@z!9vx8dIjour>fSF{Uhef8Ytc`7yvuhxR>AOLBb(BqWV%cK}%f@m0HpN30k_DN! z;4mQyi0!n;857`Ih^2lbdAA7OYRj=ICQl`fw(^+Tg_ZQ}=~R!lwR2~@>q&0{8g7Lm zg%2~lD9$CdxkE%rh@|yxmCe=uqwkGOta zhlM@BD<`Hk`Xj~Q4aO2vafJ5ZCfa-<@<^htw)}RcE5qz9@<6F%L6DbII^ z#8sL`Z!ciq2^pR!PU)}%t#5bNdIdx#Wdx+wPXl*MR7I=-qPkHa#3>EE-u8&3&(W#8 zAQw3}Vnw59JiFruLcU!tGp9PLlV95Ha>g+#9TQUHSyjTp=g~pTA=*%HZV&q9>|cKw zd~>KEd-Ds#d1NEoqv(y@dS6vSe0(xM^%V|saBcbi|!Oe(O-vdOBc`;MTzX#9(zt4s4#cL{O^U~*EkEo+Mx-Y=B`ib%mYAzjUy-1HWLPNR$b^e?Z*#m570c)8Jc?`k{g>iO|M1veLKStCMVyPup`x-#+K1f8L-f zG(Cf?5zvWhgEv+`;k<(`2Ro#>Yw%C=t4`@B0(Y`1mc7HN?dXt7ef6n7}@v`BGxE$;3RinnN6ytsRC4Fq>B z?!hS1Tr%e!_4A>0rfgeX6Y8xb<~2b5bXejk z`CCF}jT2CLC`YnwL6cKJ0#0XBtZjr0Wq<|+ItpYYQpH5D>zB8%{x5D_Qciw~pYNmq zHx4nUav@Ki=Wh?v+XPPE@6xWio=qvsZ*3}z4o(4`NhIfrVF7TPH9A=RA3KZoLXP|K zE6Pg+)uDa9oqD@D-ki9*^3cK}MZb4B_COR=Hc1RPHczI+DMoNVu-lDSYpCpZzluhU zVZuEsZJ5g@WmP=wbY*juE~cNE{T*@$1OHkWXzbmIu2yeLh|hDLGBls!cqd&#gE1#| zwf5d86FpM$hR1eGq}vM;P)WD~xT03|A%8)27?Mtg1pGASvO?P<6Hpfgca25ss#brrx!vn>0cOoo z20~`7=>V(Bw#y$}r2!Gm1^X*oiuEpCSQgv!o*oCYiG}@SG}c+rw#Jzs$87ap-;v85 z=2b6z5{>t@bMZAJAR(|K?A9b{ZFMN$5OCC?qH3Gu$ZTqUs;sXdHmC_zjBF6 zsa|#Y;v_LR%<1X2_X(A|yc#EFJji`Du3hFuG$-+^%&4u!cElmwO1P1*K|zpj`f*DZ@|oP-io9Ae?RmwRo3m8qcp}woIW8_PT1?s zAOA`@`Y0+1OuBDWC&+L?mUq%VhcO?h_waFw8U3JYoZosOa=&cvj2{M&goEzhk-RLT zW=TF(O`kOhjc#NOonhb>;pIpom&iiBtwACu7<|6tnZ~=D1Rrnbv+J#s6H3yOgzqrL zmEdti*|!^BT8;Zi5V7d2Sy*8c`v%Ppw#!Y}-nDqtC}Gmym+cp~*0ic2t*>YYd|K!J zLM!>69>!(m@wa6Ov_mCa37V1ig9hKal0Sls7_B>AKP5Oa=|n4x$P>&rYZ zP%Ws)CdigcX5zz;{>H z;dqqgaWFS{DVNeFx6SmOg&2Li|0I~&q>-6{zGG5tp~eDxX9wMzcqLGCsSlR4RGpqs zsR9{lwl6a*Xa4nI=u%_Bv*Cb`mlQ~b^$xCQ>QhK`XHf9UeLZy z5y-I3&fsOax%||wO6MkFUa5`rEy+!d>BvC%=}$9hl{i@uGP$nblvTO91#*c42Xb&F z)kPNoytnBHWk^D2*lD>*bu`3c<|=Iw^kul`YO{QuTT`r%W#-JOOL&Gt4 zvA@1!;~^Zdpe!uoY&=Lnvn-=OV}w>nBP{&Ft{XHepm!x#?s{HdN#tKPtCg6qHER2n zc#kIN*$bT-_b^|vMXKlfbHggJBXnsP<%S?5Fyc~1z@)tm`&Q`4e&ZXfMQT>9tSeaW zE##p}Baq(xMB+wniY}(Mz*|=n$KMMkH6|&-o5-wv4$foU-ySdR`?lWYY%s#1Vwuc? z)>JtBv-E@&19IeF&G8LQ)`XPqoAH4~Y~zx1-bS9x8}YD8*%TBS)pcgP=j{KgyaZM# zRS6deul6D6{#BaV{$h4Q#(hz_#f-LAtv&pBuFQPZOP{r6ZE;U#_In01aT}%2;qHdd z4n_yl)Q60K5RJvPVSV?rZUSCZ6_$KGe<=Z z<^Jnk|N23^n&vZQvbsmA(q?iNspZXz+g#kPL<*uqIgDN93)Gc}Z6>LWz(DURGLBmd z$E;6Tov0O`m0NnW%5g=|Rky!EQ1E(iv@uQ{Yd3JH^C?e4t^TfFQS49RjprbX@{#n5 zQYF`2R&DwCJe-fT0-HZR(|vC6?mqcdW3x#oa9f4C6|J7;V{X}gRrriVQ0_*kPVBv} zyA9NE^W!gi{*^YFdWi6H$jHa?~eG4J& z9sRL~{aIX9XX@_qMz0x``PH|!s#sPp%O&@nsJR&X^;XIFKyVm@N#HY+>-ILW&$`t5 z+ojbbSFpj`IE6r^yt1NIGxn7;3Vi~dn&?!TllzFQ;gMa}cDLVCAhYj!P8P8!ZcNWm z5Y0w7q)t(1!fLNB2(~i=AKFwMH6Q{72lrmL-zN`4^ClI?+->l(yR=_VXuO1_y&?op zZuV>ZE5AymKPuN#^tljP$S-$UaE#O2E=W?_xxUF7J-ds%sPR35Tv|9hF1tIu@UIA> z{g7{!M*YX$Ft`M5jX!A>I?~X+oX^Yb2=4unl{C;L74;I>JypK&VE%B|08mY*mwbVP zeCroLVWJE)+0Xy>$R5D&z!fiPQ7Aec9{*?W*$?}-k}%Xo%;J|bGts5(pXuWIdmix` zadyyaW8t!P|J;1}cbdE2c}!lcn08jy;+Z#zyCOURCcM5Cm7ux!TyRBKZr(*4GORWh zf;mZla^xk(cyJVG8#NvCdRAF1Pg03wmgp%CSl%f02FSL~R&O^HAGgC4Na*^#F?DIz zi!|-@Jj(ST1J_&FN|aODcD8sQQHww`qhyKioB?XS$Mn>`WOa;Vc1(y9O=V9^r0o$H zkA}y@KM$J9@-{jqL#SltK5IU9wOPou$vn|O?Yc(n!oW#mB9(KxpV+$66OM2KHd~{v zeS66Sn;O&S%fIf9U&aSB1OnnH7slo*{Z;#7a)sHhMchhFRTmW-qDfSTe(uAFcdw*O z6&rO%4|a|HHRWcUS3Wzs>XqTQzFQE4%GgvcTsnG9eYx3cUa0i3w<_}>V3BuXW|Pa< zrjKH9(*mqQw(cepiqO(lJ4RD@)%Fk7h7C5Vzq}Yo;w2;`y*2?@#F?U5ER; zt^G_gf!%$&8iGp6M!tK+Cy5k%`CVS@$ZDHKss3Np)&&IyHl~3B>X{0P_z@F}HGVO! zj0L7!8;T~~#({&=C2_@u@pDpuiJv@na!UTKEt_j&mQO(Fd@ zKRRGdb-|^-#&!G%H7Zmy>9Y*ukIsN6%PdaqH(z(eyvFk1Af7R}>*)8y9=BcNOpSZa z5GKnm)he;ojO!9$XF?q8XZCp}t6|~@i*4IBv&$1wAPZMYwl_AqK~q^}i-KMjAlGRj zDzamBJ0N`MDdp(Y_@jcd9owg{m$dTMVUs^dt^(eaXIVv^g*%}?LHp$JwHk9IJ6h1@ zc2q4#@)ts}ifSkevMD1zWA5Rc;F8A>7nS;%vS7u0IORn_d8&z;!5IUVouK|YHdJY9 z1Lf~s0DPd?k3gNtz1-UErosrHnS=@$AmQ?-BGePmg}4JACM0RvR=P&ce@qY@9+!#a zvfAFgQ(V=!;(8l-&#Awtq4DFNNu}0<;_DDA>88VS-N%;mCL`W52!=tU$@(l*+f=c} zeNWAiKmb;^6RZgQjTQR{nOCf0s-v)s_h4pnFR32?;}P^pe67}LZr}#{2XlZX8}b}J zVQ;I>@3CkGD0XweL=t6D*7m!GzP5yZ2y)|*!2STuTYRy?ok3xF6y#Tqmay~Ff0QBn zc(jvEWU2r6?}zYzhpZz{!YZ>DdyaSK(aDbs5B%h#cGi=myF#HM$Lqvk&m&(}yy|Y8 zThZw_Wk5J#1D;7?CabRg^2r?J47w9oV9;EX+CmHaDw|EUIFB^zZ^wzv+FSaY6YEgaENObRKw`!<#{Z8SC@qNFc0C8lKT}G~|A09!#_G!^Hf)TyDWgh5 zfgJuT-TXwiPa_8!OyZ=G)8+2W=imN*^ykhUw0c%-MP?EgM2qR~-W4D5=&v6Av&Q|j zUTExGy)ZvRZOk{Im*SC_796hJjS{rlp1V^7|JU6reG9W|BYU@Mc_93QsWJB@q=61G zvI+lK@pC3p?pKtDK*>oW;9|pzlgYneJdW|>-$^(UGpL^Q{yTf%tzyzciv+;1QI+=& zR++E}4%Mho(JR$tp-G%^fi4mz@)YJGx|KLf3d;kd17|jTPd9qcX0(lm_mPMY4hfvI z0BV%{m@Za*U#eBXgp?Q34h@(QKvUg^s*hMrS4&Q`R)Dct9ovW#Bom@_XM0m&Dopdw zugAYV4-lg?)M!kTnhVAl0~}M1yv7a1GEq%;P{jzr;?&?_-6jqFOEqVkb!O2q|G}Ip z0`S?kX^PETlrUDbS0&$Gya{6r{vbQXfRN2@s;j;gC(tyhF2*<{39Gams?i4M=wTo1 zF66d;r#v#(AB*3VSzU}1blg&GJ_`L{!?(a?`GN7ELEWu)^CR+diCkFgQ#dScsrbN- z;yl(16=&=pUuhR>nW)dM`#w(6J`RU_meVcgXzP zHDO@*$2IY@{GYE$URb3;c<)Nr9IhB!{CNA7o+#o_-od44jE%?Q;qJ9;?PlCry%Cqw zJ&MmoJ^WpI6q|KLdAi2P)I8uOpu+#^l(@$Em)9BcbLMN599bkU@@%K%;ePKXrKDQw zy;3^dHP#wVPhL&PN@7Va7zTW=vGDx1C^Yx&f!r&U%-!TYglh@?7Mb~ia+f!H#fFA7 z+vP57HMcl43*(i9rH2@zEH)|q74DZ$lF7=?1c7^|o@!A4ke2%{d8dzK+K_>o?RHtj znb44t-!WSZ?t*f`(p;2PmPy2K#yH`;5GA2)v=Yz_o8VnhRv>LwiSpiLK|Xj0HIn#Z zf3`Xvs~iwb@=$yW8y7npT85*IKYGfH)@SH^yr)*7XR-NQL{x0oL-%SFu2x}d(Y)3= zg>K<@H;TJGT-p9h!EUygDduuTUN6(VJb}H@%-X2w%h?EE{kiV#k#g{Li2-s$f|iw) zgA0zqtwGA0FQcUhOqpRo%>Io9HM90TQ|)xE|ILc>*$t)L1#sl%xHj3g-ETNER^|8g z1*!RMPrtjUhi3_`Rio%2pEBAaTn6OeH#->Q62dm`V2-RAHD(K3lf|Y13q_q2EirEo zP_c;s^z7pSGJso~=G)69y?Rw0o&~qK759v6q^-{IIM~*#xSwzJT6QO(S{$I)A{j?L zQ>Oj>PBS9|**<8L7%(cUavG-rW=)_X$i2*kM(OB%-LtEir9o>-c zpbdF^`6Yy%4`2?a(>Q-;?jlsH$L9RXu+R-V29bXCg?1U)^>%S$<} zO@B?wuAUxUyHuYl#=)C2CU$QQF4uo3%B06}YHcTTnGd4VT{|tSBp#NpEao&BFfPe*2f2)mOmxsuoc)(xwjn_-$eG3YiWa#A*@oPAFr`o^~R|5Xa*QjCD^b) zukQu2h}-D*cD-I$ai2De6Hpj)@QZYZ283K9rvvQvJQsXaYkom#_eQWiclOHL4qcYd z^NJ5XYaEOu)N{1d4wNmk;D?|+-{n4EGM5!EVGtz0cI?!T12is8E~IX#e6zwg z1E12El>oqNyO%vkXTjcll73gVosBVn zzHWE?o-56p6*u?RV(kLTR`y&rE+4KNR}ng^ns%|Y@_|W#({P2GGAKi=`hjCB?!xx_ zCD*wIx=Q{d->JgDt&q4K%vn+6fV+y@0v6Dm)U9 zwn5K}Z4!d|=`Iu+6)SpXatF}Xs1Vy_{!PGL)TJHSk^Z~xWcyK0^1mUZzYFz$gH4~& zBAFgz zg>37qMvyJbhT}HBiK}X5_TR?Jmz2$asBg5RW^9k9?g@Y?2EZ`hBYNw*siuX`z>H^C z@otA}p)gdq6BP}#iA{yW;xfu<=vz+S%gI-`1o6kOei@Hh&%J+Y=zUM3XFY7dCxhX2 ze#otHf9n>4DaX&Njis+`1aP6)X4Y3hAR+fw;@s**0^3V2mCRKU!2!f>`ab&RLK?3! zfiRrSQ6N?Dl(#}*E&K)%!=W0|b}(3v+9C%n3x7I0m(ggzsu(NS!%j-hySYcaJu5_s z(F&L)p_h9QP2MSSik^}o4+JWC*$!`7Oz^C<3EOL7^n1+Fg4jbPg%~VwY1~mIhP13a zE;3<>3%J{=)|_zfjS}Lm1`wS!`&rO88zweg(jYZR{T)aSxtR)Pj?Kmw+r(bwKqY~P zpQbNSSFJ2M`dy!}2nsg-u`8g^!TP@P<+;z2RK<-(Rwr1dus`Q1ohXpt31y?xcjsfh z0j_{&ks9#0774av{}^b>kr4=1wrsp~8x+F% zi$b|n2CNZ1w&Mpm?h11oMXblI0FhZxuPEtR`vm~n65y%^GuvvhYeC0)_elZWP3$T9 zpt_Q%5gXJk9-M9;?Fk!*J1Y{Bp|#UiDemUS39}X>wo+>Bm)B|Z^IlXaIB%T?#Vi%6 z&ieH$T^#kxhJr-_=P{Uawk6S|o;NPLAJiEzF1^}>y@ltIxT@tDAaeGrU8Ab2#lyN@ z&is}`taof05K0?C-qMbF7F)avk`{TZEDHNUyptK-4lT?d(xOu=J?aB;kAxUAKZa)W zP$#t9T!MS_QB(XjQpT1OZFP@s5E*HJFD~0Za2(7#JR0dg_-*AZ)&FS3j9${FNWD*A z=Ju@_WLy8jwG5nXFRCBZtaF)b|LS0sug0OE@qs&)T7&=#N6^H$`C-+7mfXPYVAN=8 z!AF^lPcp9Z^7{2bKd)5-N8`lir}>}U3n}XsTj>O$UD|?XUl=V*1K4LSZRfh9ZSFnN z%b&L#II3T2#J-AOY t1)16Zyx5vo=_P#|&CQ-tQwX}O=|9z&dt5S0 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ðF=Gsp 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�=Uc>v#SqCGU0|eSJ^=M9dZUu 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�W&SF>X674Eoc)U`#xTGK=gsjM~RleRF@CzIS_ zTTYdI@8abK*TeE8*_cHYqWzvNsT3yH8B@N%TZ6?p&gyFNFlCLt-RjO7G?E|{8On@x zhpn#fDfhAht*+R0zh{gufh|6+2QCh;XHC5YYC>I8)r4ASwl8=zko#>FO!&2jR$2wC zgzmul4u{~3`xDAQkk3e6UL*liLW&Mwb6sbD42wXEU$Z}(7^i|sx7A?aQ)apa6@jl7naaQ=q_8ChapeM_}ES{TR1Ya{PUjBsu#7x8KV zNmCwv7*>3QXve>gxSI3}#+3nZN^_>xFJC>pb6+uJX%J{BV2D$C?+f z_c-CL2z~=r<(t!5KFbN;T%cF0W6q)kAIczW@x3dnR(VmH!bc7l^fZoSkQrp-u504L z#p2504}OFPr=l{l8qX-XZ|jnSa@^otq|sJkl{ldEc=^-3!0v9YKBtKME*Tvec%EzH zRH?+cu4s6gms8ef>U&O!p?BXaO0nCP!l;Gmb|U5AU@!!0cU;F&oG*!}^H`kJ)n}TY z8yCLjPlu}Cu6sQZk<j4A>R zA;o#j`E|NYPH4kFd?k2MlMi0os+9qt1*{95CQKur@uUA z?oqp>Yviqg+&KW8+~xpf8*&-29Q1}(@l0m3Z(w9Eq6Mvqd2troI-0oqj2aWu*bNt`P7rH?i@()L~tKdnyNtN=Kb~awTXGU5cd#<|i0pqef@{y3jQ6_|sR4Z1qx)$a+ z2C#Rl#83tyT5f1-)*E7kV_?4#I-8$8EV6M{d#$eaKV=v%%sm?pGs3uS2x0TCJ$N42uCXnfAU2>l8Ie`;m>l zI~X;ZgkBc?rUj}#kbYCQaAOM+0E8T%q2(~9nTcuxOeJf-QEN@$y-siASU-v+&$4sg zyI6uaR78_j8*4NwSc}#1jP+u`TW8VASPC`x83o*8M!tNrFOHqL+SuMGxU$Fnv#NN1 zFnahF_pnhvCy_)z2VUxH$RM|8`;Ow|T@a;>YU1RjL~RKO#cV4m!(6;M*Z~zD6kzW~ z@OPF8&Y?d(&Q7Nth9LZdGCT2((6nO^<0j}xn|w8JGR=V_yXO>Yv^Zy1G;u7PZtf3IlBXaZY0(!*@JuG}i6Z$7g(U2YCY}{)dS;g_rw5J*b?rUz z0gfN={zI4po?@bW#H!F!$iz?d4i-VJ7G4Pm3w{k}P8DQlk_$fciz2fqn0f ziW%+w3s3=&8}~;GKgJ�#f#$HDS*uRXh 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_fleet_server.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_fleet_server.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7349688e9f6749b07339898027ca90c5bcacf4 GIT binary patch literal 278309 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

    H%#R+RF|Hy1+`Zlf*W%8iVOGe8k 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 E4?}eI8~^|S literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_fleet_settings.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/docker_fleet_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e222f322fc83599526129092a920aac411de959e GIT binary patch literal 399716 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
    @6Bq1DPQ?%AX)8-+WU-%dvBdHX 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 Boml_? literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/no_fleet_server.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/no_fleet_server.png new file mode 100644 index 0000000000000000000000000000000000000000..70d45386629dcaafa118a33930140f1be48b3712 GIT binary patch literal 214279 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%0AiIR(iEiE|s$uCqp6 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 +$bCm!jOp|QSpf}G@zRBdX$qklhG@-Eo<6vy& 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 } description={ From a0096cef0cbcf9524c6c78fec9a4a1e767334a01 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Tue, 4 Jun 2024 11:48:21 +0200 Subject: [PATCH 36/82] [APM] Use random sampler usage in span query (#182828) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes [#178979](https://github.com/elastic/kibana/issues/178979) ## Summary This PR changes the `get_exit_span_samples` query to use `random_sampler` aggregation, to limit the number of documents used in the query and avoid 502 errors reported seen in serverless. **IMPORTANT** ❗ The change impacts other places and may lead to a potential loss in the long tail of results ### UI The dependencies page will show a badge to inform users when the data is being sampled **default** https://github.com/elastic/kibana/assets/2767137/ea13031d-8ba1-48bb-a2e4-992eabfa90dd **sampled data** https://github.com/elastic/kibana/assets/2767137/6811c293-c2a1-42fd-bd38-b91e084e8d21 ### How to test The following can be tested on `https://keepserverless-qa-oblt-b4ba07.kb.eu-west-1.aws.qa.elastic.cloud` Document count for a 30-day range: `594537153` ``` GET traces-apm*,apm*/_search { "size": 0, "track_total_hits": true, "query": { "bool": { "filter": [ { "terms": { "processor.event": [ "span" ] } } ], "must": [ { "bool": { "filter": [ { "exists": { "field": "span.destination.service.resource" } }, { "range": { "@timestamp": { "gte": 1712587750933, "lte": 1715179750933, "format": "epoch_millis" } } }, { "bool": { "must_not": [ { "terms": { "agent.name": [ "js-base", "rum-js", "opentelemetry/webjs" ] } } ] } } ] } } ] } } } ``` A sample rate is calculated based on the doc. count. eg: `100000/594537153 = 0,000168198067178` `0,000168198067178` is the probability sampling passed to the `random_sampler` aggregation. ``` GET traces-apm*,apm*/_search { "track_total_hits": false, "size": 0, "query": { "bool": { "filter": [ { "terms": { "processor.event": [ "span" ] } } ], "must": [ { "bool": { "filter": [ { "exists": { "field": "span.destination.service.resource" } }, { "range": { "@timestamp": { "gte": 1712587750933, "lte": 1715179750933, "format": "epoch_millis" } } }, { "bool": { "must_not": [ { "terms": { "agent.name": [ "js-base", "rum-js", "opentelemetry/webjs" ] } } ] } } ] } } ] } }, "aggs": { "sampling": { "random_sampler": { "probability": 0.000168198067178, "seed": 815613888 }, "aggs": { "connections": { "composite": { "size": 10000, "sources": [ { "dependencyName": { "terms": { "field": "span.destination.service.resource" } } }, { "eventOutcome": { "terms": { "field": "event.outcome" } } } ] }, "aggs": { "sample": { "top_metrics": { "size": 1, "metrics": [ { "field": "span.type" }, { "field": "span.subtype" }, { "field": "span.id" } ], "sort": [ { "@timestamp": "asc" } ] } } } } } } } } ``` - It's hard to create an environment with such a data volume. We can use the query above in `https://keepserverless-qa-oblt-b4ba07.kb.eu-west-1.aws.qa.elastic.cloud/`, change the date ranges, and validate if the main query will work. ### Alternatively - Start Kibana pointing to an oblt cluster (non-serverless) - Navigate to APM > Dependencies - Try different time ranges ### For reviewers This change affects - APM > Dependencies - APM > Dependencies > Overview (Upstream Services section) - APM > Services > Overview (Dependencies tab) - Assistant's `get_apm_downstream_dependencies` function --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../dependencies_inventory_table/index.tsx | 38 +++++-- .../app/dependencies_inventory/index.tsx | 2 - .../random_sampler_badge.tsx | 29 +++++ .../get_apm_downstream_dependencies.ts | 9 +- .../apm/server/assistant_functions/index.ts | 13 ++- .../get_destination_map.ts | 101 +++++++++++------- .../connections/get_connection_stats/index.ts | 8 +- .../get_apm_downstream_dependencies/index.ts | 6 +- .../index.ts | 39 ++++--- .../routes/assistant_functions/route.ts | 15 ++- .../dependencies/get_top_dependencies.ts | 35 ++++-- .../get_upstream_services_for_dependency.ts | 6 +- .../apm/server/routes/dependencies/route.ts | 24 ++++- .../services/get_service_dependencies.ts | 6 +- .../get_service_dependencies_breakdown.ts | 8 +- .../apm/server/routes/services/route.ts | 28 ++++- 16 files changed, 275 insertions(+), 92 deletions(-) create mode 100644 x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/random_sampler_badge.tsx diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx index ee4cfc5d89fac..720703c2f52bd 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx @@ -8,14 +8,17 @@ import { METRIC_TYPE } from '@kbn/analytics'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; import { useUiTracker } from '@kbn/observability-shared-plugin/public'; import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; import { getNodeName, NodeType } from '../../../../../common/connections'; import { useApmParams } from '../../../../hooks/use_apm_params'; -import { useFetcher } from '../../../../hooks/use_fetcher'; +import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; import { useTimeRange } from '../../../../hooks/use_time_range'; import { DependencyLink } from '../../../shared/links/dependency_link'; import { DependenciesTable } from '../../../shared/dependencies_table'; +import { RandomSamplerBadge } from '../random_sampler_badge'; export function DependenciesInventoryTable() { const { @@ -24,6 +27,7 @@ export function DependenciesInventoryTable() { const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const { euiTheme } = useEuiTheme(); const trackEvent = useUiTracker(); const { data, status } = useFetcher( @@ -87,16 +91,28 @@ export function DependenciesInventoryTable() { }; }) ?? []; + const showRandomSamplerBadge = data?.sampled && status === FETCH_STATUS.SUCCESS; + return ( - + <> +
    + {showRandomSamplerBadge && } +
    + + + ); } diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/index.tsx index ff569f369ba4e..8caaf7a930706 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/index.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import { EuiSpacer } from '@elastic/eui'; import React from 'react'; import { unifiedSearchBarPlaceholder, @@ -29,7 +28,6 @@ export function DependenciesInventory() { searchBarPlaceholder={unifiedSearchBarPlaceholder} searchBarBoolFilter={searchBarBoolFilter} /> - ); diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/random_sampler_badge.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/random_sampler_badge.tsx new file mode 100644 index 0000000000000..b85c158498cce --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/random_sampler_badge.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { EuiBadge, EuiToolTip } from '@elastic/eui'; + +export function RandomSamplerBadge() { + return ( + <> + + + {i18n.translate('xpack.apm.dependencies.randomSampler.badge', { + defaultMessage: `Based on sampled spans`, + })} + + + + ); +} 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 c1d1c511dac4d..db2e58806da81 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 @@ -7,12 +7,18 @@ import { i18n } from '@kbn/i18n'; import type { FunctionRegistrationParameters } from '.'; +import { RandomSampler } from '../lib/helpers/get_random_sampler'; import { getAssistantDownstreamDependencies } from '../routes/assistant_functions/get_apm_downstream_dependencies'; +interface DownstreamDependenciesFunctionRegistrationParams extends FunctionRegistrationParameters { + randomSampler: RandomSampler; +} + export function registerGetApmDownstreamDependenciesFunction({ apmEventClient, registerFunction, -}: FunctionRegistrationParameters) { + randomSampler, +}: DownstreamDependenciesFunctionRegistrationParams) { registerFunction( { name: 'get_apm_downstream_dependencies', @@ -58,6 +64,7 @@ export function registerGetApmDownstreamDependenciesFunction({ content: await getAssistantDownstreamDependencies({ arguments: args, apmEventClient, + randomSampler, }), }; } 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 ccc643cf4dc76..816f1e17e0499 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 @@ -16,6 +16,7 @@ import type { APMConfig } from '..'; import type { ApmFeatureFlags } from '../../common/apm_feature_flags'; import { APMEventClient } from '../lib/helpers/create_es_client/create_apm_event_client'; import { getApmEventClient } from '../lib/helpers/get_apm_event_client'; +import { getRandomSampler } from '../lib/helpers/get_random_sampler'; import type { APMRouteHandlerResources, MinimalAPMRouteHandlerResources, @@ -76,7 +77,15 @@ export function registerAssistantFunctions({ }, }; - const apmEventClient = await getApmEventClient(apmRouteHandlerResources); + const { + request, + plugins: { security }, + } = apmRouteHandlerResources; + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(apmRouteHandlerResources), + getRandomSampler({ security, request, probability: 1 }), + ]); const hasData = await hasHistoricalAgentData(apmEventClient); @@ -90,7 +99,7 @@ export function registerAssistantFunctions({ registerFunction, }; - registerGetApmDownstreamDependenciesFunction(parameters); + registerGetApmDownstreamDependenciesFunction({ ...parameters, randomSampler }); registerGetApmTimeseriesFunction(parameters); registerGetApmDatasetInfoFunction(parameters); }; diff --git a/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/get_destination_map.ts b/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/get_destination_map.ts index e0e3e80f2b417..4ab2e753832a4 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/get_destination_map.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/get_destination_map.ts @@ -28,6 +28,7 @@ import { withApmSpan } from '../../../utils/with_apm_span'; import { Node, NodeType } from '../../../../common/connections'; import { excludeRumExitSpansQuery } from '../exclude_rum_exit_spans_query'; import { APMEventClient } from '../../helpers/create_es_client/create_apm_event_client'; +import { RandomSampler } from '../../helpers/get_random_sampler'; type Destination = { dependencyName: string; @@ -53,12 +54,14 @@ export const getDestinationMap = ({ end, filter, offset, + randomSampler, }: { apmEventClient: APMEventClient; start: number; end: number; filter: QueryDslQueryContainer[]; offset?: string; + randomSampler: RandomSampler; }) => { return withApmSpan('get_destination_map', async () => { const { startWithOffset, endWithOffset } = getOffsetInMs({ @@ -67,6 +70,33 @@ export const getDestinationMap = ({ offset, }); + const query: QueryDslQueryContainer = { + bool: { + filter: [ + { exists: { field: SPAN_DESTINATION_SERVICE_RESOURCE } }, + ...rangeQuery(startWithOffset, endWithOffset), + ...filter, + ...excludeRumExitSpansQuery(), + ], + }, + }; + + const hitCountResponse = await apmEventClient.search('get_exit_span_doc_count', { + apm: { + events: [ProcessorEvent.span], + }, + body: { + size: 0, + track_total_hits: true, + query, + }, + }); + + const totalDocCount = hitCountResponse.hits.total.value; + const rawSamplingProbability = Math.min(10_000_000 / totalDocCount, 1); + const samplingProbability = + rawSamplingProbability < 0.5 ? rawSamplingProbability : randomSampler.probability; + const response = await apmEventClient.search('get_exit_span_samples', { apm: { events: [ProcessorEvent.span], @@ -74,45 +104,44 @@ export const getDestinationMap = ({ body: { track_total_hits: false, size: 0, - query: { - bool: { - filter: [ - { exists: { field: SPAN_DESTINATION_SERVICE_RESOURCE } }, - ...rangeQuery(startWithOffset, endWithOffset), - ...filter, - ...excludeRumExitSpansQuery(), - ], - }, - }, + query, aggs: { - connections: { - composite: { - size: 10000, - sources: asMutableArray([ - { - dependencyName: { - terms: { field: SPAN_DESTINATION_SERVICE_RESOURCE }, - }, - }, - // make sure we get samples for both successful - // and failed calls - { eventOutcome: { terms: { field: EVENT_OUTCOME } } }, - ] as const), + sampling: { + random_sampler: { + ...randomSampler, + probability: samplingProbability, }, aggs: { - sample: { - top_metrics: { - size: 1, - metrics: asMutableArray([ - { field: SPAN_TYPE }, - { field: SPAN_SUBTYPE }, - { field: SPAN_ID }, - ] as const), - sort: [ + connections: { + composite: { + size: 10000, + sources: asMutableArray([ { - '@timestamp': 'asc' as const, + dependencyName: { + terms: { field: SPAN_DESTINATION_SERVICE_RESOURCE }, + }, + }, + // make sure we get samples for both successful + // and failed calls + { eventOutcome: { terms: { field: EVENT_OUTCOME } } }, + ] as const), + }, + aggs: { + sample: { + top_metrics: { + size: 1, + metrics: asMutableArray([ + { field: SPAN_TYPE }, + { field: SPAN_SUBTYPE }, + { field: SPAN_ID }, + ] as const), + sort: [ + { + '@timestamp': 'asc' as const, + }, + ], }, - ], + }, }, }, }, @@ -123,7 +152,7 @@ export const getDestinationMap = ({ const destinationsBySpanId = new Map(); - response.aggregations?.connections.buckets.forEach((bucket) => { + response.aggregations?.sampling.connections.buckets.forEach((bucket) => { const sample = bucket.sample.top[0].metrics; const spanId = sample[SPAN_ID] as string; @@ -210,6 +239,6 @@ export const getDestinationMap = ({ nodesBydependencyName.set(destination.dependencyName, node); }); - return nodesBydependencyName; + return { nodesBydependencyName, sampled: samplingProbability !== 1 }; }); }; diff --git a/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/index.ts b/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/index.ts index 91f58138a4bb5..328a9cb98523c 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/connections/get_connection_stats/index.ts @@ -14,6 +14,7 @@ import { getDestinationMap } from './get_destination_map'; import { calculateThroughputWithRange } from '../../helpers/calculate_throughput'; import { withApmSpan } from '../../../utils/with_apm_span'; import { APMEventClient } from '../../helpers/create_es_client/create_apm_event_client'; +import { RandomSampler } from '../../helpers/get_random_sampler'; export function getConnectionStats({ apmEventClient, @@ -23,6 +24,7 @@ export function getConnectionStats({ filter, collapseBy, offset, + randomSampler, }: { apmEventClient: APMEventClient; start: number; @@ -31,9 +33,10 @@ export function getConnectionStats({ filter: QueryDslQueryContainer[]; collapseBy: 'upstream' | 'downstream'; offset?: string; + randomSampler: RandomSampler; }) { return withApmSpan('get_connection_stats_and_map', async () => { - const [allMetrics, destinationMap] = await Promise.all([ + const [allMetrics, { nodesBydependencyName: destinationMap, sampled }] = await Promise.all([ getStats({ apmEventClient, start, @@ -48,6 +51,7 @@ export function getConnectionStats({ end, filter, offset, + randomSampler, }), ]); @@ -155,6 +159,6 @@ export function getConnectionStats({ }; }); - return statsItems; + return { statsItems, sampled }; }); } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_downstream_dependencies/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_downstream_dependencies/index.ts index 8d478cab20083..1ceed34367422 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_downstream_dependencies/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_downstream_dependencies/index.ts @@ -7,6 +7,7 @@ import datemath from '@elastic/datemath'; import * as t from 'io-ts'; import { termQuery } from '@kbn/observability-plugin/server'; +import { RandomSampler } from '../../../lib/helpers/get_random_sampler'; import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; import { SERVICE_NAME } from '../../../../common/es_fields/apm'; import { environmentQuery } from '../../../../common/utils/environment_query'; @@ -35,14 +36,16 @@ export interface APMDownstreamDependency { export async function getAssistantDownstreamDependencies({ arguments: args, apmEventClient, + randomSampler, }: { arguments: t.TypeOf; apmEventClient: APMEventClient; + randomSampler: RandomSampler; }): Promise { const start = datemath.parse(args.start)?.valueOf()!; const end = datemath.parse(args.end)?.valueOf()!; - const map = await getDestinationMap({ + const { nodesBydependencyName: map } = await getDestinationMap({ start, end, apmEventClient, @@ -50,6 +53,7 @@ export async function getAssistantDownstreamDependencies({ ...termQuery(SERVICE_NAME, args['service.name']), ...environmentQuery(args['service.environment'] ?? ENVIRONMENT_ALL.value), ], + randomSampler, }); const items: Array<{ diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts index 2ce7431ba4181..c3a3eb5500869 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/index.ts @@ -63,22 +63,28 @@ export const getAlertDetailsContextHandler = ( }, }; - const [apmEventClient, annotationsClient, apmAlertsClient, coreContext, mlClient] = - await Promise.all([ - getApmEventClient(resources), - resourcePlugins.observability.setup.getScopedAnnotationsClient( - resources.context, - requestContext.request - ), - getApmAlertsClient(resources), - requestContext.core, - getMlClient(resources), - getRandomSampler({ - security: resourcePlugins.security, - probability: 1, - request: requestContext.request, - }), - ]); + const [ + apmEventClient, + annotationsClient, + apmAlertsClient, + coreContext, + mlClient, + randomSampler, + ] = await Promise.all([ + getApmEventClient(resources), + resourcePlugins.observability.setup.getScopedAnnotationsClient( + resources.context, + requestContext.request + ), + getApmAlertsClient(resources), + requestContext.core, + getMlClient(resources), + getRandomSampler({ + security: resourcePlugins.security, + probability: 1, + request: requestContext.request, + }), + ]); const esClient = coreContext.elasticsearch.client.asCurrentUser; const alertStartedAt = query.alert_started_at; @@ -139,6 +145,7 @@ export const getAlertDetailsContextHandler = ( start: moment(alertStartedAt).subtract(24, 'hours').toISOString(), end: alertStartedAt, }, + randomSampler, }) ) : undefined; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts index 68b7362f85d85..5fc89e00fcc8b 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts @@ -7,6 +7,7 @@ import * as t from 'io-ts'; import { omit } from 'lodash'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; +import { getRandomSampler } from '../../lib/helpers/get_random_sampler'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { @@ -54,14 +55,24 @@ const getDownstreamDependenciesRoute = createApmServerRoute({ tags: ['access:apm'], }, handler: async (resources): Promise<{ content: APMDownstreamDependency[] }> => { - const { params } = resources; - const apmEventClient = await getApmEventClient(resources); + const { + params, + request, + plugins: { security }, + } = resources; + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(resources), + getRandomSampler({ security, request, probability: 1 }), + ]); + const { query } = params; return { content: await getAssistantDownstreamDependencies({ arguments: query, apmEventClient, + randomSampler, }), }; }, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_top_dependencies.ts b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_top_dependencies.ts index bb55ab5825fe1..eb7bcab85296e 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_top_dependencies.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_top_dependencies.ts @@ -16,6 +16,7 @@ import { environmentQuery } from '../../../common/utils/environment_query'; import { getConnectionStats } from '../../lib/connections/get_connection_stats'; import { getConnectionStatsItemsWithRelativeImpact } from '../../lib/connections/get_connection_stats/get_connection_stats_items_with_relative_impact'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { RandomSampler } from '../../lib/helpers/get_random_sampler'; interface Options { apmEventClient: APMEventClient; @@ -25,6 +26,13 @@ interface Options { environment: string; offset?: string; kuery: string; + randomSampler: RandomSampler; +} + +interface TopDependenciesForTimeRange { + stats: ConnectionStatsItemWithImpact[]; + // to inform when the query used random sampler aggregation + sampled: boolean; } async function getTopDependenciesForTimeRange({ @@ -35,8 +43,9 @@ async function getTopDependenciesForTimeRange({ environment, offset, kuery, -}: Options): Promise { - const statsItems = await getConnectionStats({ + randomSampler, +}: Options): Promise { + const { statsItems, sampled } = await getConnectionStats({ apmEventClient, start, end, @@ -44,11 +53,15 @@ async function getTopDependenciesForTimeRange({ filter: [...environmentQuery(environment), ...kqlQuery(kuery)], offset, collapseBy: 'downstream', + randomSampler, }); - return getConnectionStatsItemsWithRelativeImpact( - statsItems.filter((item) => item.location.type !== NodeType.service) - ); + return { + stats: getConnectionStatsItemsWithRelativeImpact( + statsItems.filter((item) => item.location.type !== NodeType.service) + ), + sampled, + }; } export interface TopDependenciesResponse { @@ -63,6 +76,8 @@ export interface TopDependenciesResponse { | null; location: Node; }>; + // to inform when the query used random sampler aggregation + sampled: boolean; } export async function getTopDependencies(options: Options): Promise { @@ -73,16 +88,18 @@ export async function getTopDependencies(options: Options): Promise { + dependencies: currentDependencies.stats.map((dependency) => { const { stats, ...rest } = dependency; - const prev = previousDependencies.find( - (item): boolean => item.location.id === dependency.location.id - ); + const prev = ( + 'stats' in previousDependencies ? previousDependencies.stats : previousDependencies + ).find((item): boolean => item.location.id === dependency.location.id); + return { ...rest, currentStats: stats, previousStats: prev?.stats ?? null, }; }), + sampled: currentDependencies.sampled, }; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_upstream_services_for_dependency.ts b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_upstream_services_for_dependency.ts index e75f443e548f8..797b4c6c88295 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_upstream_services_for_dependency.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_upstream_services_for_dependency.ts @@ -12,6 +12,7 @@ import { environmentQuery } from '../../../common/utils/environment_query'; import { getConnectionStats } from '../../lib/connections/get_connection_stats'; import { getConnectionStatsItemsWithRelativeImpact } from '../../lib/connections/get_connection_stats/get_connection_stats_items_with_relative_impact'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { RandomSampler } from '../../lib/helpers/get_random_sampler'; interface Options { apmEventClient: APMEventClient; @@ -22,6 +23,7 @@ interface Options { kuery: string; environment: string; offset?: string; + randomSampler: RandomSampler; } async function getUpstreamServicesForDependencyForTimeRange({ @@ -33,8 +35,9 @@ async function getUpstreamServicesForDependencyForTimeRange({ kuery, environment, offset, + randomSampler, }: Options) { - const statsItems = await getConnectionStats({ + const { statsItems } = await getConnectionStats({ apmEventClient, start, end, @@ -46,6 +49,7 @@ async function getUpstreamServicesForDependencyForTimeRange({ collapseBy: 'upstream', numBuckets, offset, + randomSampler, }); return getConnectionStatsItemsWithRelativeImpact(statsItems); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/route.ts index 8730f13492408..4459a127ea13e 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/route.ts @@ -9,6 +9,7 @@ import { toBooleanRt, toNumberRt } from '@kbn/io-ts-utils'; import * as t from 'io-ts'; import { offsetRt } from '../../../common/comparison_rt'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; +import { getRandomSampler } from '../../lib/helpers/get_random_sampler'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { environmentRt, kueryRt, rangeRt } from '../default_api_types'; import { @@ -50,7 +51,15 @@ const topDependenciesRoute = createApmServerRoute({ tags: ['access:apm'], }, handler: async (resources): Promise => { - const apmEventClient = await getApmEventClient(resources); + const { + request, + plugins: { security }, + } = resources; + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(resources), + getRandomSampler({ security, request, probability: 1 }), + ]); const { environment, offset, numBuckets, kuery, start, end } = resources.params.query; return getTopDependencies({ @@ -61,6 +70,7 @@ const topDependenciesRoute = createApmServerRoute({ environment, kuery, offset, + randomSampler, }); }, }); @@ -83,7 +93,16 @@ const upstreamServicesForDependencyRoute = createApmServerRoute({ tags: ['access:apm'], }, handler: async (resources): Promise => { - const apmEventClient = await getApmEventClient(resources); + const { + request, + plugins: { security }, + } = resources; + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(resources), + getRandomSampler({ security, request, probability: 1 }), + ]); + const { query: { dependencyName, environment, offset, numBuckets, kuery, start, end }, } = resources.params; @@ -97,6 +116,7 @@ const upstreamServicesForDependencyRoute = createApmServerRoute({ environment, kuery, offset, + randomSampler, }); }, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies.ts index bd13469325204..27dd10a63ee05 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies.ts @@ -11,6 +11,7 @@ import { environmentQuery } from '../../../common/utils/environment_query'; import { getConnectionStats } from '../../lib/connections/get_connection_stats'; import { getConnectionStatsItemsWithRelativeImpact } from '../../lib/connections/get_connection_stats/get_connection_stats_items_with_relative_impact'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { RandomSampler } from '../../lib/helpers/get_random_sampler'; interface Options { apmEventClient: APMEventClient; @@ -20,6 +21,7 @@ interface Options { numBuckets: number; environment: string; offset?: string; + randomSampler: RandomSampler; } async function getServiceDependenciesForTimeRange({ @@ -30,8 +32,9 @@ async function getServiceDependenciesForTimeRange({ numBuckets, environment, offset, + randomSampler, }: Options) { - const statsItems = await getConnectionStats({ + const { statsItems } = await getConnectionStats({ apmEventClient, start, end, @@ -39,6 +42,7 @@ async function getServiceDependenciesForTimeRange({ filter: [{ term: { [SERVICE_NAME]: serviceName } }, ...environmentQuery(environment)], offset, collapseBy: 'downstream', + randomSampler, }); return getConnectionStatsItemsWithRelativeImpact(statsItems); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies_breakdown.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies_breakdown.ts index 19a7a98c44319..270ffc6852918 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies_breakdown.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_dependencies_breakdown.ts @@ -11,6 +11,7 @@ import { SERVICE_NAME } from '../../../common/es_fields/apm'; import { environmentQuery } from '../../../common/utils/environment_query'; import { getConnectionStats } from '../../lib/connections/get_connection_stats'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { RandomSampler } from '../../lib/helpers/get_random_sampler'; export type ServiceDependenciesBreakdownResponse = Array<{ title: string; @@ -24,6 +25,7 @@ export async function getServiceDependenciesBreakdown({ serviceName, environment, kuery, + randomSampler, }: { apmEventClient: APMEventClient; start: number; @@ -31,8 +33,9 @@ export async function getServiceDependenciesBreakdown({ serviceName: string; environment: string; kuery: string; + randomSampler: RandomSampler; }): Promise { - const items = await getConnectionStats({ + const { statsItems } = await getConnectionStats({ apmEventClient, start, end, @@ -43,9 +46,10 @@ export async function getServiceDependenciesBreakdown({ ...kqlQuery(kuery), { term: { [SERVICE_NAME]: serviceName } }, ], + randomSampler, }); - return take(sortBy(items, (item) => item.stats.totalTime ?? 0).reverse(), 20).map((item) => { + return take(sortBy(statsItems, (item) => item.stats.totalTime ?? 0).reverse(), 20).map((item) => { const { stats, location } = item; return { 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 4b0ef92450f34..080b1100d98bf 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 @@ -761,8 +761,17 @@ export const serviceDependenciesRoute = createApmServerRoute({ tags: ['access:apm'], }, async handler(resources): Promise<{ serviceDependencies: ServiceDependenciesResponse }> { - const apmEventClient = await getApmEventClient(resources); - const { params } = resources; + const { + params, + request, + plugins: { security }, + } = resources; + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(resources), + getRandomSampler({ security, request, probability: 1 }), + ]); + const { serviceName } = params.path; const { environment, numBuckets, start, end, offset } = params.query; @@ -775,6 +784,7 @@ export const serviceDependenciesRoute = createApmServerRoute({ environment, numBuckets, offset, + randomSampler, }), }; }, @@ -796,8 +806,17 @@ export const serviceDependenciesBreakdownRoute = createApmServerRoute({ ): Promise<{ breakdown: ServiceDependenciesBreakdownResponse; }> => { - const apmEventClient = await getApmEventClient(resources); - const { params } = resources; + const { + params, + request, + plugins: { security }, + } = resources; + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(resources), + getRandomSampler({ security, request, probability: 1 }), + ]); + const { serviceName } = params.path; const { environment, start, end, kuery } = params.query; @@ -808,6 +827,7 @@ export const serviceDependenciesBreakdownRoute = createApmServerRoute({ serviceName, environment, kuery, + randomSampler, }); return { From aa95692deba515b6d0e606f8ef5c54ce9b50f97c Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Tue, 4 Jun 2024 11:56:45 +0200 Subject: [PATCH 37/82] [Security Solution] Introduce method to clean up/delete Risk Scoring resources (#184509) ## Summary Create a method that deletes all resources created by the risk engine. The method returns a list of errors and an empty array for the success scenario. Signature: ```js const errors = await riskEngineDataClient.tearDown({ taskManager, riskScoreDataClient, }); ``` # How to test it? 1. Enable the risk engine 2. Call the method 3. It should return an empty array ----- 1. On a clean instance 2. Call the method 4. It should return a list of errors ### 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 --- .../risk_engine_data_client.test.ts | 45 +++++++++++++++++++ .../risk_engine/risk_engine_data_client.ts | 29 ++++++++++++ .../utils/saved_object_configuration.ts | 9 ++++ .../risk_score/risk_score_data_client.mock.ts | 1 + .../risk_score/risk_score_data_client.test.ts | 25 +++++++++++ .../risk_score/risk_score_data_client.ts | 43 ++++++++++++++++++ 6 files changed, 152 insertions(+) diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts index 15569b0b17f21..b13a9cda99352 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts @@ -352,6 +352,51 @@ describe('RiskEngineDataClient', () => { }); }); }); + + describe('tearDownRiskEngine', () => { + const mockTaskManagerStart = taskManagerMock.createStart(); + + it('should delete the risk engine object and task if it exists', async () => { + mockSavedObjectClient.find.mockResolvedValueOnce(getSavedObjectConfiguration()); + const riskScoreDataClient = riskScoreDataClientMock.create(); + await riskEngineDataClient.tearDown({ + taskManager: mockTaskManagerStart, + riskScoreDataClient, + }); + + expect(mockSavedObjectClient.delete).toHaveBeenCalledTimes(1); + expect(mockTaskManagerStart.remove).toHaveBeenCalledTimes(1); + expect(riskScoreDataClient.tearDown).toHaveBeenCalledTimes(1); + }); + + it('should return errors when exception is thrown ', async () => { + const error = new Error('testError'); + mockSavedObjectClient.find.mockResolvedValueOnce(getSavedObjectConfiguration()); + mockTaskManagerStart.remove.mockRejectedValueOnce(error); + mockSavedObjectClient.delete.mockRejectedValueOnce(error); + + const errors = await riskEngineDataClient.tearDown({ + taskManager: mockTaskManagerStart, + riskScoreDataClient: riskScoreDataClientMock.create(), + }); + + await expect(errors).toEqual([error, error]); + }); + + it('should return errors from riskScoreDataClient.tearDown ', async () => { + const error = new Error('testError'); + mockSavedObjectClient.find.mockResolvedValueOnce(getSavedObjectConfiguration()); + const riskScoreDataClient = riskScoreDataClientMock.create(); + riskScoreDataClient.tearDown.mockResolvedValueOnce([error]); + + const errors = await riskEngineDataClient.tearDown({ + taskManager: mockTaskManagerStart, + riskScoreDataClient, + }); + + await expect(errors).toEqual([error]); + }); + }); }); } }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts index e8f7f573868a6..8eac52332bd5d 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.ts @@ -17,6 +17,7 @@ import { getConfiguration, initSavedObjects, getEnabledRiskEngineAmount, + deleteSavedObjects, } from './utils/saved_object_configuration'; import { bulkDeleteSavedObjects } from '../../risk_score/prebuilt_saved_objects/helpers/bulk_delete_saved_objects'; import type { RiskScoreDataClient } from '../risk_score/risk_score_data_client'; @@ -30,6 +31,11 @@ interface InitOpts { riskScoreDataClient: RiskScoreDataClient; } +interface TearDownParams { + taskManager: TaskManagerStartContract; + riskScoreDataClient: RiskScoreDataClient; +} + interface RiskEngineDataClientOpts { logger: Logger; kibanaVersion: string; @@ -193,6 +199,29 @@ export class RiskEngineDataClient { }); } + /** + * Delete all risk engine resources. + * + * It returns an array of errors that occurred during the deletion. + * + * WARNING: It will remove all data. + */ + public async tearDown({ taskManager, riskScoreDataClient }: TearDownParams) { + const errors: Error[] = []; + const addError = (e: Error) => errors.push(e); + + await removeRiskScoringTask({ + namespace: this.options.namespace, + taskManager, + logger: this.options.logger, + }).catch(addError); + + await deleteSavedObjects({ savedObjectsClient: this.options.soClient }).catch(addError); + const riskScoreErrors = await riskScoreDataClient.tearDown(); + + return errors.concat(riskScoreErrors); + } + public async disableLegacyRiskEngine({ namespace }: { namespace: string }) { const legacyRiskEngineStatus = await this.getLegacyStatus({ namespace }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/utils/saved_object_configuration.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/utils/saved_object_configuration.ts index d5a6451cb207b..c9ef818aa0d90 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/utils/saved_object_configuration.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/utils/saved_object_configuration.ts @@ -95,6 +95,15 @@ export const initSavedObjects = async ({ return result; }; +export const deleteSavedObjects = async ({ + savedObjectsClient, +}: SavedObjectsClientArg): Promise => { + const configuration = await getConfigurationSavedObject({ savedObjectsClient }); + if (configuration) { + await savedObjectsClient.delete(riskEngineConfigurationTypeName, configuration.id); + } +}; + export const getConfiguration = async ({ savedObjectsClient, }: SavedObjectsClientArg): Promise => { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.mock.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.mock.ts index c25961f15702c..6df1e72e562a1 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.mock.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.mock.ts @@ -11,6 +11,7 @@ const createRiskScoreDataClientMock = () => ({ getWriter: jest.fn().mockResolvedValue({ bulk: jest.fn().mockResolvedValue({ errors: [] }) }), init: jest.fn(), + tearDown: jest.fn(), getRiskInputsIndex: jest.fn(), upgradeIfNeeded: jest.fn(), } as unknown as jest.Mocked); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts index 34360fc28357b..493f419cf6cc2 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts @@ -463,4 +463,29 @@ describe('RiskScoreDataClient', () => { ); }); }); + + describe('tearDown', () => { + it('deletes all resources', async () => { + const errors = await riskScoreDataClient.tearDown(); + + expect(esClient.transform.deleteTransform).toHaveBeenCalledTimes(1); + expect(esClient.indices.deleteDataStream).toHaveBeenCalledTimes(1); + expect(esClient.indices.deleteIndexTemplate).toHaveBeenCalledTimes(1); + expect(esClient.cluster.deleteComponentTemplate).toHaveBeenCalledTimes(1); + expect(errors).toEqual([]); + }); + + it('returns errors when promises are rejected', async () => { + const error = new Error('test error'); + + esClient.transform.deleteTransform.mockRejectedValueOnce(error); + esClient.indices.deleteDataStream.mockRejectedValueOnce(error); + esClient.indices.deleteIndexTemplate.mockRejectedValueOnce(error); + esClient.cluster.deleteComponentTemplate.mockRejectedValueOnce(error); + + const errors = await riskScoreDataClient.tearDown(); + + expect(errors).toEqual([error, error, error, error]); + }); + }); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts index ac912e3eb6308..c0920188acd31 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts @@ -179,6 +179,49 @@ export class RiskScoreDataClient { throw error; } } + + /** + * Deletes all resources created by init(). + * It returns an array of errors that occurred during the deletion. + * + * WARNING: It will remove all data. + */ + public async tearDown() { + const namespace = this.options.namespace; + const esClient = this.options.esClient; + const indexPatterns = getIndexPatternDataStream(namespace); + const errors: Error[] = []; + const addError = (e: Error) => errors.push(e); + + await esClient.transform + .deleteTransform({ + transform_id: getLatestTransformId(namespace), + delete_dest_index: true, + force: true, + }) + .catch(addError); + + await esClient.indices + .deleteDataStream({ + name: indexPatterns.alias, + }) + .catch(addError); + + await esClient.indices + .deleteIndexTemplate({ + name: indexPatterns.template, + }) + .catch(addError); + + await esClient.cluster + .deleteComponentTemplate({ + name: mappingComponentName, + }) + .catch(addError); + + return errors; + } + /** * Ensures that configuration migrations for risk score indices are seamlessly handled across Kibana upgrades. * From 6e3b14fa19be367e2c29c32b56399729be3260bf Mon Sep 17 00:00:00 2001 From: Tre Date: Tue, 4 Jun 2024 11:45:34 +0100 Subject: [PATCH 38/82] [fix flaky on mki] add dismiss all toasts (#184659) ## Summary resolves: https://github.com/elastic/kibana/issues/184655 Ran this from my local, against an MKI oblt cluster. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../functional/test_suites/observability/cases/list_view.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts index f4307aa674c6f..6009c4557bed6 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts @@ -17,6 +17,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const svlCommonNavigation = getPageObject('svlCommonNavigation'); const svlCommonPage = getPageObject('svlCommonPage'); const svlObltNavigation = getService('svlObltNavigation'); + const toasts = getService('toasts'); describe('Cases list', function () { before(async () => { @@ -258,6 +259,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { createNCasesBeforeDeleteAllAfter(1, getPageObject, getService); it('deletes a case correctly', async () => { + await toasts.dismissAll(); await cases.casesTable.deleteCase(0); await cases.casesTable.waitForTableToFinishLoading(); await cases.casesTable.validateCasesTableHasNthRows(0); From 7ab3676af4b96f9e2ace40399f5012be377de893 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:04:01 +0100 Subject: [PATCH 39/82] [SecuritySolution] Relocate endpoint tests (#183611) ## Summary https://github.com/elastic/kibana/issues/181683 This PR moves 1. x-pack/test/security_solution_endpoint_api_int to `x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int` 2. x-pack/test/security_solution_endpoint to `x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint` 3. x-pack/test/timeline to `x-pack/test/security_solution_api_integration/test_suites/investigation/timeline` ### To test: 1. ```cd x-pack/test/security_solution_api_integration``` 2. ```node ../../../scripts/functional_tests_server.js --config ./test_suites/security_solution_endpoint/serverless.endpoint.config.ts``` Once the server is launched (you might need Docker to run the serverless tests), open another terminal, go to the same path, and execute the command appears in the original: The command should look like: ```node ../../../scripts/functional_test_runner --config=test_suites/security_solution_endpoint/serverless.endpoint.config.ts``` --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/ftr_configs.yml | 25 +- .github/CODEOWNERS | 4 +- .../configs/ess.config.ts | 2 +- .../configs/ess.basic.config.ts | 28 ++ .../configs/ess.trial.config.ts | 28 ++ .../security_and_spaces/ess}/basic/events.ts | 14 +- .../ess}/basic/import_timelines.ts | 5 +- .../security_and_spaces/ess}/basic/index.ts | 11 +- .../basic/install_prepackaged_timelines.ts | 21 +- .../security_and_spaces/ess}/trial/events.ts | 18 +- .../security_and_spaces/ess}/trial/index.ts | 13 +- .../configs/ess.config.ts | 2 +- .../timeline/utils/delete_all_timelines.ts | 0 .../investigation}/timeline/utils/index.ts | 0 .../investigation}/timeline/utils/wait_for.ts | 0 .../apps/endpoint/endpoint_list.ts | 7 +- .../apps/endpoint/endpoint_permissions.ts | 12 +- .../endpoint_solution_integrations.ts | 8 +- .../apps/endpoint/endpoint_telemetry.ts | 7 +- .../apps/endpoint/index.ts | 2 +- .../integrations/artifact_entries_list.ts | 238 ++++----- .../apps/integrations/endpoint_exceptions.ts | 184 +++---- .../apps/integrations/fleet_integrations.ts | 8 +- .../apps/integrations/index.ts | 2 +- .../apps/integrations/mocks.ts | 0 .../apps/integrations/policy_details.ts | 460 ++++++++++++++++++ .../apps/integrations/policy_list.ts | 7 +- .../apps/integrations/trusted_apps_list.ts | 7 +- .../artifact_entries_list.ts | 8 +- .../endpoint_exceptions.ts | 178 +++---- .../apps/integrations_feature_flag/index.ts | 2 +- .../apps/integrations_feature_flag/mocks.ts | 0 .../configs}/config.base.ts | 8 +- .../configs}/endpoint.config.ts | 6 +- .../configs}/ftr_provider_context.d.ts | 4 +- .../configs}/integrations.config.ts | 6 +- .../integrations_feature_flag.config.ts | 6 +- .../configs}/serverless.endpoint.config.ts | 6 +- .../serverless.integrations.config.ts | 6 +- ...erless.integrations_feature_flag.config.ts | 6 +- .../artifact_entries_list_page.ts | 2 +- .../page_objects/endpoint_page.ts | 2 +- .../page_objects/endpoint_responder.ts | 2 +- .../page_objects/fleet_integrations_page.ts | 2 +- .../page_objects/index.ts | 8 +- ...gest_manager_create_package_policy_page.ts | 2 +- .../page_objects/page_utils.ts | 2 +- .../page_objects/policy_page.ts | 2 +- .../page_objects/svl_common_page.ts | 2 +- .../page_objects/trusted_apps_page.ts | 2 +- .../services/endpoint.ts | 4 +- .../services/endpoint_artifacts.ts | 3 +- .../services/endpoint_policy.ts | 2 +- .../services/endpoint_telemetry.ts | 4 +- .../services/index.ts | 8 +- .../services/supertest_with_cert.ts | 2 +- .../security_solution_endpoint/target_tags.ts | 0 .../apis/data_stream_helper.ts | 0 .../apis/endpoint_artifacts/blocklists.ts | 20 +- .../apis/endpoint_artifacts/event_filters.ts | 19 +- .../host_isolation_exceptions.ts | 20 +- .../apis/endpoint_artifacts/trusted_apps.ts | 20 +- .../apis/endpoint_authz.ts | 7 +- .../agent_type_support.ts | 7 +- .../apis/endpoint_response_actions/execute.ts | 7 +- .../apis/fixtures/package_registry_config.yml | 0 .../apis/index.ts | 2 +- .../apis/metadata.fixtures.ts | 0 .../apis/metadata.ts | 7 +- .../apis/package.ts | 7 +- .../apis/policy.ts | 7 +- .../apis/resolver/common.ts | 0 .../apis/resolver/entity.ts | 13 +- .../apis/resolver/entity_id.ts | 7 +- .../apis/resolver/events.ts | 7 +- .../apis/resolver/index.ts | 2 +- .../apis/resolver/tree.ts | 7 +- .../configs}/config.base.ts | 6 +- .../configs}/config.ts | 6 +- .../configs}/ftr_provider_context.d.ts | 2 +- .../configs}/serverless.config.ts | 4 +- .../headers.ts | 0 .../registry.ts | 2 +- .../services/index.ts | 2 +- .../services/resolver.ts | 2 +- .../services/roles_users.ts | 2 +- .../tsconfig.json | 3 + .../apps/integrations/policy_details.ts | 396 --------------- .../ftr_provider_context.d.ts | 12 - x-pack/test/timeline/common/config.ts | 103 ---- x-pack/test/timeline/common/services.ts | 8 - .../security_and_spaces/config_basic.ts | 15 - .../security_and_spaces/config_trial.ts | 15 - x-pack/test/tsconfig.json | 3 - 94 files changed, 1028 insertions(+), 1110 deletions(-) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.basic.config.ts create mode 100644 x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.trial.config.ts rename x-pack/test/{timeline/security_and_spaces/tests => security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess}/basic/events.ts (96%) rename x-pack/test/{timeline/security_and_spaces/tests => security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess}/basic/import_timelines.ts (98%) rename x-pack/test/{timeline/security_and_spaces/tests => security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess}/basic/index.ts (60%) rename x-pack/test/{timeline/security_and_spaces/tests => security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess}/basic/install_prepackaged_timelines.ts (73%) rename x-pack/test/{timeline/security_and_spaces/tests => security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess}/trial/events.ts (94%) rename x-pack/test/{timeline/security_and_spaces/tests => security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess}/trial/index.ts (85%) rename x-pack/test/{ => security_solution_api_integration/test_suites/investigation}/timeline/utils/delete_all_timelines.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites/investigation}/timeline/utils/index.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites/investigation}/timeline/utils/wait_for.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/endpoint/endpoint_list.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts (92%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts (93%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/endpoint/index.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/artifact_entries_list.ts (68%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts (64%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/fleet_integrations.ts (90%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/index.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/mocks.ts (100%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_details.ts rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/policy_list.ts (95%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations/trusted_apps_list.ts (93%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts (65%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations_feature_flag/index.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/apps/integrations_feature_flag/mocks.ts (100%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/config.base.ts (92%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/endpoint.config.ts (83%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/ftr_provider_context.d.ts (82%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/integrations.config.ts (86%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/integrations_feature_flag.config.ts (86%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/serverless.endpoint.config.ts (82%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/serverless.integrations.config.ts (85%) rename x-pack/test/{security_solution_endpoint => security_solution_api_integration/test_suites/security_solution_endpoint/configs}/serverless.integrations_feature_flag.config.ts (85%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/artifact_entries_list_page.ts (95%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/endpoint_page.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/endpoint_responder.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/fleet_integrations_page.ts (94%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/index.ts (82%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/page_utils.ts (97%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/policy_page.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/svl_common_page.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/page_objects/trusted_apps_page.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/services/endpoint.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/services/endpoint_artifacts.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/services/endpoint_policy.ts (99%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/services/endpoint_telemetry.ts (95%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/services/index.ts (77%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/services/supertest_with_cert.ts (93%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint/target_tags.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/data_stream_helper.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts (95%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts (94%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts (94%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts (94%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_authz.ts (97%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts (79%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts (95%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/index.ts (97%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/metadata.fixtures.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/metadata.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/package.ts (97%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/policy.ts (88%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/resolver/common.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/resolver/entity.ts (90%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/resolver/entity_id.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/resolver/events.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/resolver/index.ts (89%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/apis/resolver/tree.ts (99%) rename x-pack/test/{security_solution_endpoint_api_int => security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs}/config.base.ts (92%) rename x-pack/test/{security_solution_endpoint_api_int => security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs}/config.ts (79%) rename x-pack/test/{timeline/common => security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs}/ftr_provider_context.d.ts (90%) rename x-pack/test/{security_solution_endpoint_api_int => security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs}/serverless.config.ts (86%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/headers.ts (100%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/registry.ts (96%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/services/index.ts (93%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/services/resolver.ts (98%) rename x-pack/test/{ => security_solution_api_integration/test_suites}/security_solution_endpoint_api_int/services/roles_users.ts (97%) delete mode 100644 x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts delete mode 100644 x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts delete mode 100644 x-pack/test/timeline/common/config.ts delete mode 100644 x-pack/test/timeline/common/services.ts delete mode 100644 x-pack/test/timeline/security_and_spaces/config_basic.ts delete mode 100644 x-pack/test/timeline/security_and_spaces/config_trial.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index e3bb62e19cfb3..955fe7a72414a 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -1,7 +1,4 @@ disabled: - # TODO: Enable once RBAC timeline search strategy test updated - - x-pack/test/timeline/security_and_spaces/config_basic.ts - # Base config files, only necessary to inform config finding script - test/functional/config.base.js - test/functional/firefox/config.base.ts @@ -16,6 +13,8 @@ disabled: - x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts - x-pack/test/security_solution_api_integration/config/serverless/config.base.ts - x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/config.base.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.base.ts - x-pack/test/security_solution_endpoint/config.base.ts - x-pack/test/security_solution_endpoint_api_int/config.base.ts @@ -399,21 +398,12 @@ enabled: - x-pack/test/security_functional/insecure_cluster_warning.config.ts - x-pack/test/security_functional/user_profiles.config.ts - x-pack/test/security_functional/expired_session.config.ts - - x-pack/test/security_solution_endpoint_api_int/config.ts - - x-pack/test/security_solution_endpoint_api_int/serverless.config.ts - - x-pack/test/security_solution_endpoint/endpoint.config.ts - - x-pack/test/security_solution_endpoint/serverless.endpoint.config.ts - - x-pack/test/security_solution_endpoint/integrations.config.ts - - x-pack/test/security_solution_endpoint/integrations_feature_flag.config.ts - - x-pack/test/security_solution_endpoint/serverless.integrations.config.ts - - x-pack/test/security_solution_endpoint/serverless.integrations_feature_flag.config.ts - x-pack/test/session_view/basic/config.ts - x-pack/test/spaces_api_integration/security_and_spaces/config_basic.ts - x-pack/test/spaces_api_integration/security_and_spaces/copy_to_space_config_basic.ts - x-pack/test/spaces_api_integration/security_and_spaces/config_trial.ts - x-pack/test/spaces_api_integration/security_and_spaces/copy_to_space_config_trial.ts - x-pack/test/spaces_api_integration/spaces_only/config.ts - - x-pack/test/timeline/security_and_spaces/config_trial.ts - x-pack/test/ui_capabilities/security_and_spaces/config.ts - x-pack/test/ui_capabilities/spaces_only/config.ts - x-pack/test/upgrade_assistant_integration/config.js @@ -565,5 +555,16 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.basic.config.ts + - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.trial.config.ts - x-pack/test/security_solution_api_integration/test_suites/sources/indices/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/sources/indices/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/endpoint.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.endpoint.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations_feature_flag.config.ts + - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations_feature_flag.config.ts + diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 914973516f4d0..ac51c9ce0f926 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1585,8 +1585,8 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/server/lib/license/ @elastic/security-defend-workflows /x-pack/plugins/security_solution/server/fleet_integration/ @elastic/security-defend-workflows /x-pack/plugins/security_solution/scripts/endpoint/ @elastic/security-defend-workflows -/x-pack/test/security_solution_endpoint/ @elastic/security-defend-workflows -/x-pack/test/security_solution_endpoint_api_int/ @elastic/security-defend-workflows +/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/ @elastic/security-defend-workflows +/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/ @elastic/security-defend-workflows /x-pack/test_serverless/shared/lib/security/kibana_roles/ @elastic/security-defend-workflows /x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management @elastic/security-defend-workflows /x-pack/plugins/security_solution_serverless/public/upselling/pages/endpoint_management @elastic/security-defend-workflows diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/ess.config.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/ess.config.ts index fa7c8aaaab2e1..4c96f07342a58 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/ess.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/configs/ess.config.ts @@ -8,7 +8,7 @@ import { FtrConfigProviderContext } from '@kbn/test'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const functionalConfig = await readConfigFile( - require.resolve('../../../../../config/ess/config.base.basic') + require.resolve('../../../../../config/ess/config.base.trial') ); return { diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.basic.config.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.basic.config.ts new file mode 100644 index 0000000000000..cbe1173e3b244 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.basic.config.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.basic') + ); + + return { + ...functionalConfig.getAll(), + kbnTestServer: { + ...functionalConfig.get('kbnTestServer'), + serverArgs: [ + ...functionalConfig.get('kbnTestServer.serverArgs'), + `--xpack.securitySolution.enableExperimental=${JSON.stringify([])}`, + ], + }, + testFiles: [require.resolve('../ess/basic')], + junit: { + reportName: 'Timeline Integration Tests - ESS Env - Basic License', + }, + }; +} diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.trial.config.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.trial.config.ts new file mode 100644 index 0000000000000..5d8538c1a7ae0 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.trial.config.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.trial') + ); + + return { + ...functionalConfig.getAll(), + kbnTestServer: { + ...functionalConfig.get('kbnTestServer'), + serverArgs: [ + ...functionalConfig.get('kbnTestServer.serverArgs'), + `--xpack.securitySolution.enableExperimental=${JSON.stringify([])}`, + ], + }, + testFiles: [require.resolve('../ess/trial')], + junit: { + reportName: 'Timeline Integration Tests - ESS Env - Trial License', + }, + }; +} diff --git a/x-pack/test/timeline/security_and_spaces/tests/basic/events.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/events.ts similarity index 96% rename from x-pack/test/timeline/security_and_spaces/tests/basic/events.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/events.ts index 8fd411b9b41e8..a694a4cd170da 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/basic/events.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/events.ts @@ -15,8 +15,8 @@ import { TimelineEventsQueries, } from '@kbn/security-solution-plugin/common/search_strategy'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; -import { User } from '../../../../rule_registry/common/lib/authentication/types'; -import { getSpaceUrlPrefix } from '../../../../rule_registry/common/lib/authentication/spaces'; +import { User } from '../../../../../../../rule_registry/common/lib/authentication/types'; +import { getSpaceUrlPrefix } from '../../../../../../../rule_registry/common/lib/authentication/spaces'; import { superUser, @@ -37,8 +37,8 @@ import { obsSecSpacesAll, secOnlySpacesAll, noKibanaPrivileges, -} from '../../../../rule_registry/common/lib/authentication/users'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +} from '../../../../../../../rule_registry/common/lib/authentication/users'; +import type { FtrProviderContextWithSpaces } from '../../../../../../ftr_provider_context_with_spaces'; interface TestCase { /** The space where the alert exists */ @@ -63,8 +63,7 @@ const TEST_URL = '/internal/search/timelineSearchStrategy/'; const SPACE_1 = 'space1'; const SPACE_2 = 'space2'; -// eslint-disable-next-line import/no-default-export -export default ({ getService }: FtrProviderContext) => { +export default ({ getService }: FtrProviderContextWithSpaces) => { const esArchiver = getService('esArchiver'); const supertestWithoutAuth = getService('supertestWithoutAuth'); const getPostBody = (): JsonObject => ({ @@ -101,7 +100,8 @@ export default ({ getService }: FtrProviderContext) => { }, }); - describe('Timeline - Events', () => { + // TODO: Fix or update the tests + describe.skip('Timeline - Events', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/rule_registry/alerts'); }); diff --git a/x-pack/test/timeline/security_and_spaces/tests/basic/import_timelines.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/import_timelines.ts similarity index 98% rename from x-pack/test/timeline/security_and_spaces/tests/basic/import_timelines.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/import_timelines.ts index 4c9b82f0825cc..455780b333c8f 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/basic/import_timelines.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/import_timelines.ts @@ -9,11 +9,10 @@ import expect from '@kbn/expect'; import { TIMELINE_IMPORT_URL } from '@kbn/security-solution-plugin/common/constants'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { FtrProviderContextWithSpaces } from '../../../../../../ftr_provider_context_with_spaces'; import { deleteAllTimelines } from '../../../utils'; -// eslint-disable-next-line import/no-default-export -export default ({ getService }: FtrProviderContext): void => { +export default ({ getService }: FtrProviderContextWithSpaces): void => { const supertest = getService('supertest'); const es = getService('es'); diff --git a/x-pack/test/timeline/security_and_spaces/tests/basic/index.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/index.ts similarity index 60% rename from x-pack/test/timeline/security_and_spaces/tests/basic/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/index.ts index 248c5ece3641d..809e6d7cba75b 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/basic/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/index.ts @@ -5,15 +5,14 @@ * 2.0. */ -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { FtrProviderContextWithSpaces } from '../../../../../../ftr_provider_context_with_spaces'; import { createSpacesAndUsers, deleteSpacesAndUsers, -} from '../../../../rule_registry/common/lib/authentication'; +} from '../../../../../../../rule_registry/common/lib/authentication'; -// eslint-disable-next-line import/no-default-export -export default ({ loadTestFile, getService }: FtrProviderContext): void => { - describe('timeline security and spaces enabled: basic', function () { +export default ({ loadTestFile, getService }: FtrProviderContextWithSpaces): void => { + describe('@ess timeline security and spaces enabled: basic', function () { before(async () => { await createSpacesAndUsers(getService); }); @@ -24,5 +23,7 @@ export default ({ loadTestFile, getService }: FtrProviderContext): void => { // Basic loadTestFile(require.resolve('./events')); + loadTestFile(require.resolve('./import_timelines')); + loadTestFile(require.resolve('./install_prepackaged_timelines')); }); }; diff --git a/x-pack/test/timeline/security_and_spaces/tests/basic/install_prepackaged_timelines.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/install_prepackaged_timelines.ts similarity index 73% rename from x-pack/test/timeline/security_and_spaces/tests/basic/install_prepackaged_timelines.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/install_prepackaged_timelines.ts index fddc9317dcff9..3e85d2a85c399 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/basic/install_prepackaged_timelines.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/basic/install_prepackaged_timelines.ts @@ -8,11 +8,10 @@ import expect from '@kbn/expect'; import { TIMELINE_PREPACKAGED_URL } from '@kbn/security-solution-plugin/common/constants'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { FtrProviderContextWithSpaces } from '../../../../../../ftr_provider_context_with_spaces'; import { deleteAllTimelines, waitFor } from '../../../utils'; -// eslint-disable-next-line import/no-default-export -export default ({ getService }: FtrProviderContext): void => { +export default ({ getService }: FtrProviderContextWithSpaces): void => { const supertest = getService('supertest'); const es = getService('es'); const log = getService('log'); @@ -23,9 +22,10 @@ export default ({ getService }: FtrProviderContext): void => { await deleteAllTimelines(es); }); - it('should contain timelines_installed, and timelines_updated', async () => { + // TODO: Fix or update the tests + it.skip('should contain timelines_installed, and timelines_updated', async () => { const { body } = await supertest - .put(TIMELINE_PREPACKAGED_URL) + .post(TIMELINE_PREPACKAGED_URL) .set('kbn-xsrf', 'true') .send() .expect(200); @@ -35,7 +35,7 @@ export default ({ getService }: FtrProviderContext): void => { it('should create the prepackaged timelines and return a count greater than zero', async () => { const { body } = await supertest - .put(TIMELINE_PREPACKAGED_URL) + .post(TIMELINE_PREPACKAGED_URL) .set('kbn-xsrf', 'true') .send() .expect(200); @@ -45,7 +45,7 @@ export default ({ getService }: FtrProviderContext): void => { it('should create the prepackaged timelines and the timelines_updated is of size zero', async () => { const { body } = await supertest - .put(TIMELINE_PREPACKAGED_URL) + .post(TIMELINE_PREPACKAGED_URL) .set('kbn-xsrf', 'true') .send() .expect(200); @@ -53,8 +53,9 @@ export default ({ getService }: FtrProviderContext): void => { expect(body.timelines_updated).to.eql(0); }); - it('should be possible to call the API twice and the second time the number of timelines installed should be zero', async () => { - await supertest.put(TIMELINE_PREPACKAGED_URL).set('kbn-xsrf', 'true').send().expect(200); + // TODO: Fix or update the tests + it.skip('should be possible to call the API twice and the second time the number of timelines installed should be zero', async () => { + await supertest.post(TIMELINE_PREPACKAGED_URL).set('kbn-xsrf', 'true').send().expect(200); await waitFor( async () => { @@ -69,7 +70,7 @@ export default ({ getService }: FtrProviderContext): void => { ); const { body } = await supertest - .put(TIMELINE_PREPACKAGED_URL) + .post(TIMELINE_PREPACKAGED_URL) .set('kbn-xsrf', 'true') .send() .expect(200); diff --git a/x-pack/test/timeline/security_and_spaces/tests/trial/events.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/trial/events.ts similarity index 94% rename from x-pack/test/timeline/security_and_spaces/tests/trial/events.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/trial/events.ts index d08a89e4504c3..6ff03cc9b2cc2 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/trial/events.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/trial/events.ts @@ -17,8 +17,8 @@ import { TimelineEventsQueries, } from '@kbn/security-solution-plugin/common/search_strategy'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; -import { User } from '../../../../rule_registry/common/lib/authentication/types'; -import { getSpaceUrlPrefix } from '../../../../rule_registry/common/lib/authentication/spaces'; +import { User } from '../../../../../../../rule_registry/common/lib/authentication/types'; +import { getSpaceUrlPrefix } from '../../../../../../../rule_registry/common/lib/authentication/spaces'; import { obsMinReadAlertsRead, @@ -26,8 +26,8 @@ import { obsMinRead, obsMinReadSpacesAll, superUser, -} from '../../../../rule_registry/common/lib/authentication/users'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +} from '../../../../../../../rule_registry/common/lib/authentication/users'; +import { FtrProviderContextWithSpaces } from '../../../../../../ftr_provider_context_with_spaces'; class FileWrapper { constructor(private readonly path: string) {} @@ -72,8 +72,7 @@ const TEST_URL = '/internal/search/timelineSearchStrategy/'; const SPACE_1 = 'space1'; const SPACE_2 = 'space2'; -// eslint-disable-next-line import/no-default-export -export default ({ getService }: FtrProviderContext) => { +export default ({ getService }: FtrProviderContextWithSpaces) => { const esArchiver = getService('esArchiver'); const supertestWithoutAuth = getService('supertestWithoutAuth'); const getPostBody = (): JsonObject => ({ @@ -110,7 +109,8 @@ export default ({ getService }: FtrProviderContext) => { }, }); - describe('Timeline - Events', () => { + // TODO: Fix or update the tests + describe.skip('Timeline - Events', () => { const logFilePath = Path.resolve(__dirname, '../../../common/audit.log'); const logFile = new FileWrapper(logFilePath); const retry = getService('retry'); @@ -182,7 +182,7 @@ export default ({ getService }: FtrProviderContext) => { } // TODO - tests need to be updated with new table logic - describe.skip('alerts authentication', () => { + describe('alerts authentication', () => { addTests({ space: SPACE_1, featureIds: ['apm'], @@ -199,7 +199,7 @@ export default ({ getService }: FtrProviderContext) => { }); // FLAKY: https://github.com/elastic/kibana/issues/117462 - describe.skip('logging', () => { + describe('logging', () => { beforeEach(async () => { await logFile.reset(); }); diff --git a/x-pack/test/timeline/security_and_spaces/tests/trial/index.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/trial/index.ts similarity index 85% rename from x-pack/test/timeline/security_and_spaces/tests/trial/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/trial/index.ts index 2103097891a31..381d3a5b657bb 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/trial/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/ess/trial/index.ts @@ -5,13 +5,13 @@ * 2.0. */ -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import type { FtrProviderContextWithSpaces } from '../../../../../../ftr_provider_context_with_spaces'; import { createSpaces, createUsersAndRoles, deleteSpaces, deleteUsersAndRoles, -} from '../../../../rule_registry/common/lib/authentication'; +} from '../../../../../../../rule_registry/common/lib/authentication'; import { observabilityMinReadAlertsRead, @@ -22,7 +22,7 @@ import { observabilityMinReadAlertsAllSpacesAll, observabilityMinimalAll, observabilityMinimalAllSpacesAll, -} from '../../../../rule_registry/common/lib/authentication/roles'; +} from '../../../../../../../rule_registry/common/lib/authentication/roles'; import { obsMinReadAlertsRead, obsMinReadAlertsReadSpacesAll, @@ -33,11 +33,10 @@ import { obsMinReadAlertsAllSpacesAll, obsMinAll, obsMinAllSpacesAll, -} from '../../../../rule_registry/common/lib/authentication/users'; +} from '../../../../../../../rule_registry/common/lib/authentication/users'; -// eslint-disable-next-line import/no-default-export -export default ({ loadTestFile, getService }: FtrProviderContext): void => { - describe('timeline security and spaces enabled: trial', function () { +export default ({ loadTestFile, getService }: FtrProviderContextWithSpaces): void => { + describe('@ess timeline security and spaces enabled: trial', function () { before(async () => { await createSpaces(getService); await createUsersAndRoles( diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/ess.config.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/ess.config.ts index 58365fff896a6..21efaf9559cf6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/ess.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/trial_license_complete_tier/configs/ess.config.ts @@ -22,7 +22,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { }, testFiles: [require.resolve('../ess')], junit: { - reportName: 'Timeline Integration Tests - ESS Env - Basic License', + reportName: 'Timeline Integration Tests - ESS Env - Trial License', }, }; } diff --git a/x-pack/test/timeline/utils/delete_all_timelines.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/utils/delete_all_timelines.ts similarity index 100% rename from x-pack/test/timeline/utils/delete_all_timelines.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/utils/delete_all_timelines.ts diff --git a/x-pack/test/timeline/utils/index.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/utils/index.ts similarity index 100% rename from x-pack/test/timeline/utils/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/utils/index.ts diff --git a/x-pack/test/timeline/utils/wait_for.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/utils/wait_for.ts similarity index 100% rename from x-pack/test/timeline/utils/wait_for.ts rename to x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/utils/wait_for.ts diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_list.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_list.ts index f1edd7a45800c..ed288844959f7 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -7,14 +7,13 @@ import expect from '@kbn/expect'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { deleteMetadataStream, deleteAllDocsFromMetadataCurrentIndex, deleteAllDocsFromMetadataUnitedIndex, } from '../../../security_solution_endpoint_api_int/apis/data_stream_helper'; -import { targetTags } from '../../target_tags'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'endpoint', 'header', 'endpointPageUtils']); @@ -85,9 +84,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { return tableData; }; - describe('endpoint list', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless endpoint list', function () { let indexedData: IndexedHostsAndAlertsResponse; describe('when initially navigating to page', () => { before(async () => { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts similarity index 92% rename from x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts index afaed704786e1..615d05b9c563b 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts @@ -8,18 +8,18 @@ import expect from '@kbn/expect'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; import { SecurityRoleName } from '@kbn/security-solution-plugin/common/test'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { createUserAndRole, deleteUserAndRole } from '../../../common/services/security_solution'; -import { targetTags } from '../../target_tags'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; +import { + createUserAndRole, + deleteUserAndRole, +} from '../../../../../common/services/security_solution'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const PageObjects = getPageObjects(['security', 'endpoint', 'detections', 'hosts']); const testSubjects = getService('testSubjects'); const endpointTestResources = getService('endpointTestResources'); - describe('Endpoint permissions:', function () { - targetTags(this, ['@ess']); - + describe('@ess Endpoint permissions:', function () { let indexedData: IndexedHostsAndAlertsResponse; before(async () => { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts similarity index 93% rename from x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts index f9eb352f98328..e2dd0c1a16095 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts @@ -7,11 +7,9 @@ import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; import { TimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; -// @ts-expect-error we have to check types with "allowJs: false" for now, causing this import to fail import { kibanaPackageJson } from '@kbn/repo-info'; import { type IndexedEndpointRuleAlerts } from '@kbn/security-solution-plugin/common/endpoint/data_loaders/index_endpoint_rule_alerts'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { targetTags } from '../../target_tags'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; /** * Test suite is meant to cover usages of endpoint functionality or access to endpoint @@ -25,9 +23,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); const pageObjects = getPageObjects(['common', 'timeline']); - describe('App level Endpoint functionality', function () { - targetTags(this, ['@ess']); - + describe('@ess App level Endpoint functionality', function () { let indexedData: IndexedHostsAndAlertsResponse; let indexedAlerts: IndexedEndpointRuleAlerts; let endpointAgentId: string; diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts index e9c213e50e495..373ab34b42b34 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/endpoint_telemetry.ts @@ -6,8 +6,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { targetTags } from '../../target_tags'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); @@ -16,9 +15,7 @@ export default function ({ getService }: FtrProviderContext) { // The source of the data for these tests have changed and need to be updated // There are currently tests in the security_solution application being maintained - describe.skip('security solution endpoint telemetry', function () { - targetTags(this, ['@ess']); - + describe.skip('@ess security solution endpoint telemetry', function () { after(async () => { await kibanaServer.savedObjects.cleanStandardList(); }); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/index.ts similarity index 96% rename from x-pack/test/security_solution_endpoint/apps/endpoint/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/index.ts index 6786f82a6fabe..f4438be799e25 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/endpoint/index.ts @@ -7,7 +7,7 @@ import { getRegistryUrl as getRegistryUrlFromIngest } from '@kbn/fleet-plugin/server'; import { isServerlessKibanaFlavor } from '@kbn/security-solution-plugin/scripts/endpoint/common/stack_services'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { getRegistryUrlFromTestEnv, isRegistryEnabled, diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/artifact_entries_list.ts similarity index 68% rename from x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/artifact_entries_list.ts index 6c78dd995673f..5339bcfdd4803 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/artifact_entries_list.ts @@ -14,7 +14,7 @@ import { EXCEPTION_LIST_URL, } from '@kbn/securitysolution-list-constants'; import { ArtifactElasticsearchProperties } from '@kbn/fleet-plugin/server/services'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { ArtifactBodyType, getArtifactsListTestsData, @@ -24,7 +24,6 @@ import { MultipleArtifactActionsType, } from './mocks'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; -import { targetTags } from '../../target_tags'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'artifactEntriesList']); @@ -39,6 +38,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const toasts = getService('toasts'); const policyTestResources = getService('policyTestResources'); const unzipPromisify = promisify(unzip); + const timeout = 60000; // ms const removeAllArtifacts = async () => { for (const listId of ENDPOINT_ARTIFACT_LIST_IDS) { @@ -51,12 +51,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { .delete(`${EXCEPTION_LIST_URL}?list_id=${listId}&namespace_type=agnostic`) .set('kbn-xsrf', 'true'); }; - - describe('For each artifact list under management', function () { - // It's flaky only in Serverless - targetTags(this, ['@ess', '@serverless']); - - this.timeout(60_000 * 5); + // It's flaky only in Serverless + describe('@ess @serverless For each artifact list under management', function () { let indexedData: IndexedHostsAndAlertsResponse; let policyInfo: PolicyTestResourceInfo; @@ -225,83 +221,99 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await removeAllArtifacts(); await browser.refresh(); await pageObjects.artifactEntriesList.navigateToList(testData.urlPath); - }); + }, timeout); afterEach(async () => { await removeAllArtifacts(); if (policyInfo) { await policyInfo.cleanup(); } - }); + }, timeout); - it(`should not show page title if there is no ${testData.title} entry`, async () => { - await testSubjects.missingOrFail('header-page-title'); - }); - - it(`should be able to add a new ${testData.title} entry`, async () => { - await createArtifact(testData, { policyId: policyInfo.packagePolicy.id }); - // Check new artifact is in the list - for (const checkResult of testData.create.checkResults) { - expect(await testSubjects.getVisibleText(checkResult.selector)).to.equal( - checkResult.value - ); - } - await toasts.dismiss(); - - // Title is shown after adding an item - expect(await testSubjects.getVisibleText('header-page-title')).to.equal(testData.title); + it( + `should not show page title if there is no ${testData.title} entry`, + async () => { + await testSubjects.missingOrFail('header-page-title'); + }, + timeout + ); - // Checks if fleet artifact has been updated correctly - await checkFleetArtifacts( - testData.fleetArtifact.identifier, - testData.fleetArtifact.getExpectedUpdatedtArtifactWhenCreate(), - testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenCreate(), - policyInfo - ); - }); + it( + `should be able to add a new ${testData.title} entry`, + async () => { + await createArtifact(testData, { policyId: policyInfo.packagePolicy.id }); + // Check new artifact is in the list + for (const checkResult of testData.create.checkResults) { + expect(await testSubjects.getVisibleText(checkResult.selector)).to.equal( + checkResult.value + ); + } + await toasts.dismiss(); - it(`should be able to update an existing ${testData.title} entry`, async () => { - await createArtifact(testData); - await updateArtifact(testData, { policyId: policyInfo.packagePolicy.id }); + // Title is shown after adding an item + expect(await testSubjects.getVisibleText('header-page-title')).to.equal(testData.title); - // Check edited artifact is in the list with new values (wait for list to be updated) - await retry.waitForWithTimeout('entry is updated in list', 20000, async () => { - const currentValue = await testSubjects.getVisibleText( - `${testData.pagePrefix}-card-criteriaConditions${ - testData.pagePrefix === 'EventFiltersListPage' ? '-condition' : '' - }` + // Checks if fleet artifact has been updated correctly + await checkFleetArtifacts( + testData.fleetArtifact.identifier, + testData.fleetArtifact.getExpectedUpdatedtArtifactWhenCreate(), + testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenCreate(), + policyInfo ); - return currentValue === testData.update.waitForValue; - }); + }, + timeout + ); - for (const checkResult of testData.update.checkResults) { - expect(await testSubjects.getVisibleText(checkResult.selector)).to.equal( - checkResult.value - ); - } + it( + `should be able to update an existing ${testData.title} entry`, + async () => { + await createArtifact(testData); + await updateArtifact(testData, { policyId: policyInfo.packagePolicy.id }); + + // Check edited artifact is in the list with new values (wait for list to be updated) + await retry.waitForWithTimeout('entry is updated in list', 20000, async () => { + const currentValue = await testSubjects.getVisibleText( + `${testData.pagePrefix}-card-criteriaConditions${ + testData.pagePrefix === 'EventFiltersListPage' ? '-condition' : '' + }` + ); + return currentValue === testData.update.waitForValue; + }); + + for (const checkResult of testData.update.checkResults) { + expect(await testSubjects.getVisibleText(checkResult.selector)).to.equal( + checkResult.value + ); + } - await toasts.dismiss(); + await toasts.dismiss(); - // Title still shown after editing an item - expect(await testSubjects.getVisibleText('header-page-title')).to.equal(testData.title); + // Title still shown after editing an item + expect(await testSubjects.getVisibleText('header-page-title')).to.equal(testData.title); - // Checks if fleet artifact has been updated correctly - await checkFleetArtifacts( - testData.fleetArtifact.identifier, - testData.fleetArtifact.getExpectedUpdatedArtifactWhenUpdate(), - testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenUpdate(), - policyInfo - ); - }); + // Checks if fleet artifact has been updated correctly + await checkFleetArtifacts( + testData.fleetArtifact.identifier, + testData.fleetArtifact.getExpectedUpdatedArtifactWhenUpdate(), + testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenUpdate(), + policyInfo + ); + }, + timeout + ); - it(`should be able to delete the existing ${testData.title} entry`, async () => { - await createArtifact(testData); - await deleteArtifact(testData); - // We only expect one artifact to have been visible - await testSubjects.missingOrFail(testData.delete.card); - // Header has gone because there is no artifact - await testSubjects.missingOrFail('header-page-title'); - }); + it( + `should be able to delete the existing ${testData.title} entry`, + async () => { + await createArtifact(testData); + await deleteArtifact(testData); + // We only expect one artifact to have been visible + await testSubjects.missingOrFail(testData.delete.card); + // Header has gone because there is no artifact + await testSubjects.missingOrFail('header-page-title'); + }, + timeout + ); }); } @@ -319,7 +331,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await removeAllArtifacts(); await browser.refresh(); await pageObjects.artifactEntriesList.navigateToList(testData.urlPath); - }); + }, timeout); afterEach(async () => { await removeAllArtifacts(); @@ -329,51 +341,55 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { if (secondPolicy) { await secondPolicy.cleanup(); } - }); + }, timeout); const testData = getCreateMultipleData(); - it(`should get correct atifact when multiple entries are created`, async () => { - // Create first trusted app - await createArtifact(testData, { - policyId: firstPolicy.packagePolicy.id, - suffix: firstSuffix, - }); - await toasts.dismiss(); + it( + `should get correct atifact when multiple entries are created`, + async () => { + // Create first trusted app + await createArtifact(testData, { + policyId: firstPolicy.packagePolicy.id, + suffix: firstSuffix, + }); + await toasts.dismiss(); - // Create second trusted app - await createArtifact(testData, { - policyId: secondPolicy.packagePolicy.id, - suffix: secondSuffix, - createButton: 'pageAddButton', - }); - await toasts.dismiss(); - - // Create third trusted app - await createArtifact(testData, { suffix: thirdSuffix, createButton: 'pageAddButton' }); - await toasts.dismiss(); - - // Checks if fleet artifact has been updated correctly - await checkFleetArtifacts( - testData.fleetArtifact.identifier, - testData.fleetArtifact.getExpectedUpdatedArtifactWhenCreateMultipleFirst(), - testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenCreateMultipleFirst( - thirdSuffix, - firstSuffix - ), - firstPolicy - ); + // Create second trusted app + await createArtifact(testData, { + policyId: secondPolicy.packagePolicy.id, + suffix: secondSuffix, + createButton: 'pageAddButton', + }); + await toasts.dismiss(); - // Checks if fleet artifact has been updated correctly - await checkFleetArtifacts( - testData.fleetArtifact.identifier, - testData.fleetArtifact.getExpectedUpdatedArtifactWhenCreateMultipleSecond(), - testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenCreateMultipleSecond( - thirdSuffix, - secondSuffix - ), - secondPolicy - ); - }); + // Create third trusted app + await createArtifact(testData, { suffix: thirdSuffix, createButton: 'pageAddButton' }); + await toasts.dismiss(); + + // Checks if fleet artifact has been updated correctly + await checkFleetArtifacts( + testData.fleetArtifact.identifier, + testData.fleetArtifact.getExpectedUpdatedArtifactWhenCreateMultipleFirst(), + testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenCreateMultipleFirst( + thirdSuffix, + firstSuffix + ), + firstPolicy + ); + + // Checks if fleet artifact has been updated correctly + await checkFleetArtifacts( + testData.fleetArtifact.identifier, + testData.fleetArtifact.getExpectedUpdatedArtifactWhenCreateMultipleSecond(), + testData.fleetArtifact.getExpectedUpdatedArtifactBodyWhenCreateMultipleSecond( + thirdSuffix, + secondSuffix + ), + secondPolicy + ); + }, + timeout + ); }); }); }; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts similarity index 64% rename from x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts index 26a1d95f4efbb..a36db81c37de0 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts @@ -12,8 +12,7 @@ import { EXCEPTION_LIST_ITEM_URL } from '@kbn/securitysolution-list-constants'; import { ArtifactElasticsearchProperties } from '@kbn/fleet-plugin/server/services'; import { FoundExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { targetTags } from '../../target_tags'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'header', 'timePicker']); @@ -28,14 +27,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const unzipPromisify = promisify(unzip); const comboBox = getService('comboBox'); const toasts = getService('toasts'); + const MINUTES = 60 * 1000 * 10; - const MINUTES = 60_000; - - describe('Endpoint Exceptions', function () { - targetTags(this, ['@ess', '@serverless']); - - this.timeout(10 * MINUTES); - + describe('@ess @serverless Endpoint Exceptions', function () { const clearPrefilledEntries = async () => { const entriesContainer = await testSubjects.find('exceptionEntriesContainer'); @@ -163,89 +157,97 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; await deleteEndpointExceptions(); - }); + }, MINUTES); - it('should add `event.module=endpoint` to entry if only wildcard operator is present', async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); - await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); - - await openNewEndpointExceptionFlyout(); - await clearPrefilledEntries(); - - await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); - await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); - await testSubjects.click('exceptionsAndButton'); - await setLastEntry({ field: 'process.executable', operator: 'matches', value: 'ex*' }); - - await testSubjects.click('addExceptionConfirmButton'); - await toasts.dismiss(); - - await checkArtifact({ - entries: [ - { - type: 'simple', - entries: [ - { - field: 'file.path', - operator: 'included', - type: 'wildcard_cased', - value: '*/cheese/*', - }, - { - field: 'process.executable', - operator: 'included', - type: 'wildcard_cased', - value: 'ex*', - }, - { - // this additional entry should be added - field: 'event.module', - operator: 'included', - type: 'exact_cased', - value: 'endpoint', - }, - ], - }, - ], - }); - }); + it( + 'should add `event.module=endpoint` to entry if only wildcard operator is present', + async () => { + await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); + await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); - it('should NOT add `event.module=endpoint` to entry if there is another operator', async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); - await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); - - await openNewEndpointExceptionFlyout(); - await clearPrefilledEntries(); - - await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); - await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); - await testSubjects.click('exceptionsAndButton'); - await setLastEntry({ field: 'process.executable', operator: 'is', value: 'something' }); - - await testSubjects.click('addExceptionConfirmButton'); - await toasts.dismiss(); - - await checkArtifact({ - entries: [ - { - type: 'simple', - entries: [ - { - field: 'file.path', - operator: 'included', - type: 'wildcard_cased', - value: '*/cheese/*', - }, - { - field: 'process.executable', - operator: 'included', - type: 'exact_cased', - value: 'something', - }, - ], - }, - ], - }); - }); + await openNewEndpointExceptionFlyout(); + await clearPrefilledEntries(); + + await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); + await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); + await testSubjects.click('exceptionsAndButton'); + await setLastEntry({ field: 'process.executable', operator: 'matches', value: 'ex*' }); + + await testSubjects.click('addExceptionConfirmButton'); + await toasts.dismiss(); + + await checkArtifact({ + entries: [ + { + type: 'simple', + entries: [ + { + field: 'file.path', + operator: 'included', + type: 'wildcard_cased', + value: '*/cheese/*', + }, + { + field: 'process.executable', + operator: 'included', + type: 'wildcard_cased', + value: 'ex*', + }, + { + // this additional entry should be added + field: 'event.module', + operator: 'included', + type: 'exact_cased', + value: 'endpoint', + }, + ], + }, + ], + }); + }, + MINUTES + ); + + it( + 'should NOT add `event.module=endpoint` to entry if there is another operator', + async () => { + await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); + await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); + + await openNewEndpointExceptionFlyout(); + await clearPrefilledEntries(); + + await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); + await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); + await testSubjects.click('exceptionsAndButton'); + await setLastEntry({ field: 'process.executable', operator: 'is', value: 'something' }); + + await testSubjects.click('addExceptionConfirmButton'); + await toasts.dismiss(); + + await checkArtifact({ + entries: [ + { + type: 'simple', + entries: [ + { + field: 'file.path', + operator: 'included', + type: 'wildcard_cased', + value: '*/cheese/*', + }, + { + field: 'process.executable', + operator: 'included', + type: 'exact_cased', + value: 'something', + }, + ], + }, + ], + }); + }, + MINUTES + ); }); }; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/fleet_integrations.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/fleet_integrations.ts similarity index 90% rename from x-pack/test/security_solution_endpoint/apps/integrations/fleet_integrations.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/fleet_integrations.ts index b6255d5b9a60b..41b4141621aeb 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/fleet_integrations.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/fleet_integrations.ts @@ -4,13 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { deleteMetadataStream, deleteAllDocsFromMetadataCurrentIndex, } from '../../../security_solution_endpoint_api_int/apis/data_stream_helper'; -import { targetTags } from '../../target_tags'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const { fleetIntegrations, trustedApps } = getPageObjects(['trustedApps', 'fleetIntegrations']); @@ -19,9 +17,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - describe('When in the Fleet application', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless When in the Fleet application', function () { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/endpoint/metadata/api_feature', { useCreate: true, diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/index.ts similarity index 96% rename from x-pack/test/security_solution_endpoint/apps/integrations/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/index.ts index 1f830a06d3103..7035c07f5305f 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/index.ts @@ -7,7 +7,7 @@ import { getRegistryUrl as getRegistryUrlFromIngest } from '@kbn/fleet-plugin/server'; import { isServerlessKibanaFlavor } from '@kbn/security-solution-plugin/scripts/endpoint/common/stack_services'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { getRegistryUrlFromTestEnv, isRegistryEnabled, diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/mocks.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/mocks.ts similarity index 100% rename from x-pack/test/security_solution_endpoint/apps/integrations/mocks.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/mocks.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_details.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_details.ts new file mode 100644 index 0000000000000..5e1107e69bdbc --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_details.ts @@ -0,0 +1,460 @@ +/* + * 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 expect from '@kbn/expect'; +import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; +import { PROTECTION_NOTICE_SUPPORTED_ENDPOINT_VERSION } from '@kbn/security-solution-plugin/public/management/pages/policy/view/policy_settings_form/protection_notice_supported_endpoint_version'; +import { getPolicySettingsFormTestSubjects } from '@kbn/security-solution-plugin/public/management/pages/policy/view/policy_settings_form/mocks'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; +import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const browser = getService('browser'); + const pageObjects = getPageObjects([ + 'common', + 'endpoint', + 'policy', + 'endpointPageUtils', + 'ingestManagerCreatePackagePolicy', + 'trustedApps', + ]); + const testSubjects = getService('testSubjects'); + const policyTestResources = getService('policyTestResources'); + const endpointTestResources = getService('endpointTestResources'); + const retry = getService('retry'); + const timeout = 150000; + describe('@ess @serverless When on the Endpoint Policy Details Page', function () { + let indexedData: IndexedHostsAndAlertsResponse; + const formTestSubjects = getPolicySettingsFormTestSubjects(); + + before(async () => { + indexedData = await endpointTestResources.loadEndpointData(); + await browser.refresh(); + }); + + after(async () => { + await endpointTestResources.unloadEndpointData(indexedData); + }); + + describe('with an invalid policy id', () => { + it('should display an error', async () => { + await pageObjects.policy.navigateToPolicyDetails('invalid-id'); + await testSubjects.existOrFail('policyDetailsIdNotFoundMessage'); + expect(await testSubjects.getVisibleText('policyDetailsIdNotFoundMessage')).to.equal( + 'Package policy invalid-id not found' + ); + }); + }); + + describe('with a valid policy id', () => { + let policyInfo: PolicyTestResourceInfo; + + before(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); + }); + + after(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it( + 'should display policy view', + async () => { + await retry.waitForWithTimeout('policy title is not empty', 120_000, async () => { + return (await testSubjects.getVisibleText('header-page-title')) !== ''; + }); + expect(await testSubjects.getVisibleText('header-page-title')).to.equal( + policyInfo.packagePolicy.name + ); + }, + timeout + ); + + describe('@skipInServerless side navigation', function () { + it( + 'should not hide the side navigation', + async function () { + await testSubjects.scrollIntoView('solutionSideNavItemLink-get_started'); + // ensure center of button is visible and not hidden by sticky bottom bar + await testSubjects.click('solutionSideNavItemLink-administration', 1000, 15); + // test cleanup: go back to policy details page + await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); + }, + timeout + ); + }); + + it( + 'Should show/hide advanced section when button is clicked', + async () => { + await testSubjects.missingOrFail(formTestSubjects.advancedSection.settingsContainer); + + // Expand + await pageObjects.policy.showAdvancedSettingsSection(); + await testSubjects.existOrFail(formTestSubjects.advancedSection.settingsContainer); + + // Collapse + await pageObjects.policy.hideAdvancedSettingsSection(); + await testSubjects.missingOrFail(formTestSubjects.advancedSection.settingsContainer); + }, + timeout + ); + }); + + ['malware', 'ransomware'].forEach((protection) => { + describe(`on the ${protection} protections card`, () => { + let policyInfo: PolicyTestResourceInfo; + const cardTestSubj: + | typeof formTestSubjects['ransomware'] + | typeof formTestSubjects['malware'] = + formTestSubjects[ + protection as keyof Pick + ]; + + beforeEach(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); + }, timeout); + + afterEach(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + + // @ts-expect-error forcing to undefined + policyInfo = undefined; + } + }, timeout); + + it( + 'should show the supported Endpoint version for user notification', + async () => { + expect(await testSubjects.getVisibleText(cardTestSubj.notifySupportedVersion)).to.equal( + 'Agent version ' + + PROTECTION_NOTICE_SUPPORTED_ENDPOINT_VERSION[ + protection as keyof typeof PROTECTION_NOTICE_SUPPORTED_ENDPOINT_VERSION + ] + ); + }, + timeout + ); + + it( + 'should show the custom message text area when the Notify User checkbox is checked', + async () => { + expect(await testSubjects.isChecked(cardTestSubj.notifyUserCheckbox)).to.be(true); + await testSubjects.existOrFail(cardTestSubj.notifyCustomMessage); + }, + timeout + ); + + it( + 'should not show the custom message text area when the Notify User checkbox is unchecked', + async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox(cardTestSubj.notifyUserCheckbox); + expect(await testSubjects.isChecked(cardTestSubj.notifyUserCheckbox)).to.be(false); + await testSubjects.missingOrFail(cardTestSubj.notifyCustomMessage); + }, + timeout + ); + + it( + 'should show a sample custom message', + async () => { + expect(await testSubjects.getVisibleText(cardTestSubj.notifyCustomMessage)).equal( + 'Elastic Security {action} {filename}' + ); + }, + timeout + ); + + it( + 'should show a tooltip on hover', + async () => { + await testSubjects.moveMouseTo(cardTestSubj.notifyCustomMessageTooltipIcon); + + await retry.waitFor( + 'should show a tooltip on hover', + async () => + (await testSubjects.getVisibleText(cardTestSubj.notifyCustomMessageTooltipInfo)) === + `Selecting the user notification option will display a notification to the host user when ${protection} is prevented or detected.\nThe user notification can be customized in the text box below. Bracketed tags can be used to dynamically populate the applicable action (such as prevented or detected) and the filename.` + ); + }, + timeout + ); + + it( + 'should preserve a custom notification message upon saving', + async () => { + await testSubjects.setValue(cardTestSubj.notifyCustomMessage, '', { + clearWithKeyboard: true, + }); + await testSubjects.setValue( + cardTestSubj.notifyCustomMessage, + 'a custom notification message @$% 123', + { typeCharByChar: true } + ); + + await pageObjects.policy.confirmAndSave(); + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + expect(await testSubjects.getVisibleText(cardTestSubj.notifyCustomMessage)).to.equal( + 'a custom notification message @$% 123' + ); + }, + timeout + ); + }); + }); + + describe('and the save button is clicked', () => { + let policyInfo: PolicyTestResourceInfo; + + beforeEach(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); + }, timeout); + + afterEach(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + + // @ts-expect-error forcing to undefined + policyInfo = undefined; + } + }, timeout); + + it( + 'should display success toast on successful save', + async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.windowsEvents.dnsCheckbox + ); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + expect(await testSubjects.getVisibleText('policyDetailsSuccessMessage')).to.equal( + `Success!\nIntegration ${policyInfo.packagePolicy.name} has been updated.` + ); + }, + timeout + ); + + it( + 'should persist update on the screen', + async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.windowsEvents.processCheckbox + ); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await testSubjects.existOrFail('toastCloseButton'); + await pageObjects.endpoint.navigateToEndpointList(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); + + expect( + await ( + await testSubjects.find(formTestSubjects.windowsEvents.processCheckbox) + ).isSelected() + ).to.equal(false); + }, + timeout + ); + + it( + 'should have updated policy data in overall Agent Policy', + async () => { + // This test ensures that updates made to the Endpoint Policy are carried all the way through + // to the generated Agent Policy that is dispatch down to the Elastic Agent. + + await Promise.all([ + pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.windowsEvents.fileCheckbox + ), + pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.linuxEvents.fileCheckbox + ), + pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.macEvents.fileCheckbox + ), + ]); + + await pageObjects.policy.showAdvancedSettingsSection(); + + const advancedPolicyField = await pageObjects.policy.findAdvancedPolicyField(); + await advancedPolicyField.clearValue(); + await advancedPolicyField.click(); + await advancedPolicyField.type('true'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await testSubjects.waitForDeleted('toastCloseButton'); + + const agentFullPolicy = await policyTestResources.getFullAgentPolicy( + policyInfo.agentPolicy.id + ); + + expect(agentFullPolicy.inputs[0].id).to.eql(policyInfo.packagePolicy.id); + expect(agentFullPolicy.inputs[0].policy.linux.advanced.agent.connection_delay).to.eql( + 'true' + ); + expect(agentFullPolicy.inputs[0].policy.linux.events.file).to.eql(false); + expect(agentFullPolicy.inputs[0].policy.mac.events.file).to.eql(false); + expect(agentFullPolicy.inputs[0].policy.windows.events.file).to.eql(false); + }, + timeout + ); + + it( + 'should have cleared the advanced section when the user deletes the value', + async () => { + await pageObjects.policy.showAdvancedSettingsSection(); + + const advancedPolicyField = await pageObjects.policy.findAdvancedPolicyField(); + await advancedPolicyField.clearValue(); + await advancedPolicyField.click(); + await advancedPolicyField.type('true'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + + const agentFullPolicy = await policyTestResources.getFullAgentPolicy( + policyInfo.agentPolicy.id + ); + + expect(agentFullPolicy.inputs[0].policy.linux.advanced.agent.connection_delay).to.eql( + 'true' + ); + + // Clear the value + await advancedPolicyField.click(); + await advancedPolicyField.clearValueWithKeyboard(); + + // Make sure the toast button closes so the save button on the sticky footer is visible + await testSubjects.waitForDeleted('toastCloseButton'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + + const agentFullPolicyUpdated = await policyTestResources.getFullAgentPolicy( + policyInfo.agentPolicy.id + ); + + expect(agentFullPolicyUpdated.inputs[0].policy.linux.advanced).to.eql({ + capture_env_vars: 'LD_PRELOAD,LD_LIBRARY_PATH', + }); + }, + timeout + ); + }); + + describe('when on Ingest Policy Edit Package Policy page', async () => { + let policyInfo: PolicyTestResourceInfo; + + beforeEach(async () => { + // Create a policy and navigate to Ingest app + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.ingestManagerCreatePackagePolicy.navigateToAgentPolicyEditPackagePolicy( + policyInfo.agentPolicy.id, + policyInfo.packagePolicy.id + ); + }, timeout); + + afterEach(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }, timeout); + + it( + 'should show the endpoint policy form', + async () => { + await testSubjects.existOrFail(formTestSubjects.form); + }, + timeout + ); + + it( + 'should allow updates to policy items', + async () => { + const winDnsEventingCheckbox = await testSubjects.find( + formTestSubjects.windowsEvents.dnsCheckbox + ); + await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow( + winDnsEventingCheckbox + ); + expect(await winDnsEventingCheckbox.isSelected()).to.be(true); + await pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.windowsEvents.dnsCheckbox + ); + await pageObjects.policy.waitForCheckboxSelectionChange( + formTestSubjects.windowsEvents.dnsCheckbox, + false + ); + }, + timeout + ); + + it( + 'should include updated endpoint data when saved', + async () => { + await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow( + await testSubjects.find(formTestSubjects.windowsEvents.dnsCheckbox) + ); + await pageObjects.endpointPageUtils.clickOnEuiCheckbox( + formTestSubjects.windowsEvents.dnsCheckbox + ); + const updatedCheckboxValue = await testSubjects.isSelected( + formTestSubjects.windowsEvents.dnsCheckbox + ); + + await pageObjects.policy.waitForCheckboxSelectionChange( + formTestSubjects.windowsEvents.dnsCheckbox, + false + ); + + await (await pageObjects.ingestManagerCreatePackagePolicy.findSaveButton(true)).click(); + await pageObjects.ingestManagerCreatePackagePolicy.waitForSaveSuccessNotification(true); + + await pageObjects.ingestManagerCreatePackagePolicy.navigateToAgentPolicyEditPackagePolicy( + policyInfo.agentPolicy.id, + policyInfo.packagePolicy.id + ); + + await pageObjects.policy.waitForCheckboxSelectionChange( + formTestSubjects.windowsEvents.dnsCheckbox, + updatedCheckboxValue + ); + }, + timeout + ); + + ['trustedApps', 'eventFilters', 'blocklists', 'hostIsolationExceptions'].forEach( + (cardName) => { + it( + `should show ${cardName} card and link should go back to policy`, + async () => { + await testSubjects.existOrFail(`${cardName}-fleet-integration-card`); + + const card = await testSubjects.find(`${cardName}-fleet-integration-card`); + await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow(card); + await (await testSubjects.find(`${cardName}-link-to-exceptions`)).click(); + + await testSubjects.existOrFail('policyDetailsPage'); + + await (await testSubjects.find('policyDetailsBackLink')).click(); + await testSubjects.existOrFail('endpointIntegrationPolicyForm'); + }, + timeout + ); + } + ); + }); + }); +} diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/policy_list.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_list.ts similarity index 95% rename from x-pack/test/security_solution_endpoint/apps/integrations/policy_list.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_list.ts index 37bb6d7cebfc3..27b1ef012c1b1 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/policy_list.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/policy_list.ts @@ -7,9 +7,8 @@ import expect from '@kbn/expect'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; -import { targetTags } from '../../target_tags'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const browser = getService('browser'); @@ -25,9 +24,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const policyTestResources = getService('policyTestResources'); const endpointTestResources = getService('endpointTestResources'); - describe('When on the Endpoint Policy List Page', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless When on the Endpoint Policy List Page', function () { before(async () => { await browser.refresh(); }); diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/trusted_apps_list.ts similarity index 93% rename from x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/trusted_apps_list.ts index 9bef272a010a2..cbc983ed8691f 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations/trusted_apps_list.ts @@ -7,8 +7,7 @@ import expect from '@kbn/expect'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { targetTags } from '../../target_tags'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'trustedApps']); @@ -17,9 +16,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const endpointTestResources = getService('endpointTestResources'); const toasts = getService('toasts'); - describe('When on the Trusted Apps list', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless When on the Trusted Apps list', function () { let indexedData: IndexedHostsAndAlertsResponse; before(async () => { indexedData = await endpointTestResources.loadEndpointData(); diff --git a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts index cd5c5694c33a8..c7e442e15dd9c 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/artifact_entries_list.ts @@ -14,7 +14,7 @@ import { EXCEPTION_LIST_URL, } from '@kbn/securitysolution-list-constants'; import { ArtifactElasticsearchProperties } from '@kbn/fleet-plugin/server/services'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { ArtifactBodyType, getArtifactsListTestsData, @@ -24,7 +24,6 @@ import { MultipleArtifactActionsType, } from './mocks'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; -import { targetTags } from '../../target_tags'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'artifactEntriesList']); @@ -53,10 +52,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; // Failing: See https://github.com/elastic/kibana/issues/183860 - describe.skip('For each artifact list under management', function () { - targetTags(this, ['@ess', '@serverless']); - - this.timeout(60_000 * 5); + describe.skip('@ess @serverless For each artifact list under management', function () { let indexedData: IndexedHostsAndAlertsResponse; let policyInfo: PolicyTestResourceInfo; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts similarity index 65% rename from x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts index 5a2d798109df8..e6ffdb159813b 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/endpoint_exceptions.ts @@ -12,8 +12,7 @@ import { EXCEPTION_LIST_ITEM_URL } from '@kbn/securitysolution-list-constants'; import { ArtifactElasticsearchProperties } from '@kbn/fleet-plugin/server/services'; import { FoundExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { targetTags } from '../../target_tags'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'header']); @@ -28,13 +27,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const unzipPromisify = promisify(unzip); const comboBox = getService('comboBox'); const toasts = getService('toasts'); + const timeout = 60000 * 10; // Failing: See https://github.com/elastic/kibana/issues/184585 - describe.skip('Endpoint Exceptions', function () { - targetTags(this, ['@ess', '@serverless']); - - this.timeout(10 * 60_000); - + describe.skip('@ess @serverless Endpoint Exceptions', function () { const clearPrefilledEntries = async () => { const entriesContainer = await testSubjects.find('exceptionEntriesContainer'); @@ -160,87 +156,95 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; await deleteEndpointExceptions(); - }); + }, timeout); - it('should add `event.module=endpoint` to entry if only wildcard operator is present', async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); - - await openNewEndpointExceptionFlyout(); - await clearPrefilledEntries(); - - await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); - await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); - await testSubjects.click('exceptionsAndButton'); - await setLastEntry({ field: 'process.executable', operator: 'matches', value: 'ex*' }); - - await testSubjects.click('addExceptionConfirmButton'); - await toasts.dismiss(); - - await checkArtifact({ - entries: [ - { - type: 'simple', - entries: [ - { - field: 'file.path', - operator: 'included', - type: 'wildcard_cased', - value: '*/cheese/*', - }, - { - field: 'process.executable', - operator: 'included', - type: 'wildcard_cased', - value: 'ex*', - }, - { - // this additional entry should be added - field: 'event.module', - operator: 'included', - type: 'exact_cased', - value: 'endpoint', - }, - ], - }, - ], - }); - }); + it( + 'should add `event.module=endpoint` to entry if only wildcard operator is present', + async () => { + await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); - it('should NOT add `event.module=endpoint` to entry if there is another operator', async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); - - await openNewEndpointExceptionFlyout(); - await clearPrefilledEntries(); - - await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); - await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); - await testSubjects.click('exceptionsAndButton'); - await setLastEntry({ field: 'process.executable', operator: 'is', value: 'something' }); - - await testSubjects.click('addExceptionConfirmButton'); - await toasts.dismiss(); - - await checkArtifact({ - entries: [ - { - type: 'simple', - entries: [ - { - field: 'file.path', - operator: 'included', - type: 'wildcard_cased', - value: '*/cheese/*', - }, - { - field: 'process.executable', - operator: 'included', - type: 'exact_cased', - value: 'something', - }, - ], - }, - ], - }); - }); + await openNewEndpointExceptionFlyout(); + await clearPrefilledEntries(); + + await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); + await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); + await testSubjects.click('exceptionsAndButton'); + await setLastEntry({ field: 'process.executable', operator: 'matches', value: 'ex*' }); + + await testSubjects.click('addExceptionConfirmButton'); + await toasts.dismiss(); + + await checkArtifact({ + entries: [ + { + type: 'simple', + entries: [ + { + field: 'file.path', + operator: 'included', + type: 'wildcard_cased', + value: '*/cheese/*', + }, + { + field: 'process.executable', + operator: 'included', + type: 'wildcard_cased', + value: 'ex*', + }, + { + // this additional entry should be added + field: 'event.module', + operator: 'included', + type: 'exact_cased', + value: 'endpoint', + }, + ], + }, + ], + }); + }, + timeout + ); + + it( + 'should NOT add `event.module=endpoint` to entry if there is another operator', + async () => { + await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); + + await openNewEndpointExceptionFlyout(); + await clearPrefilledEntries(); + + await testSubjects.setValue('exceptionFlyoutNameInput', 'test exception'); + await setLastEntry({ field: 'file.path', operator: 'matches', value: '*/cheese/*' }); + await testSubjects.click('exceptionsAndButton'); + await setLastEntry({ field: 'process.executable', operator: 'is', value: 'something' }); + + await testSubjects.click('addExceptionConfirmButton'); + await toasts.dismiss(); + + await checkArtifact({ + entries: [ + { + type: 'simple', + entries: [ + { + field: 'file.path', + operator: 'included', + type: 'wildcard_cased', + value: '*/cheese/*', + }, + { + field: 'process.executable', + operator: 'included', + type: 'exact_cased', + value: 'something', + }, + ], + }, + ], + }); + }, + timeout + ); }); }; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/index.ts similarity index 96% rename from x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/index.ts index 5464cf07f02e3..2a6eb2a6d357a 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/index.ts @@ -7,7 +7,7 @@ import { getRegistryUrl as getRegistryUrlFromIngest } from '@kbn/fleet-plugin/server'; import { isServerlessKibanaFlavor } from '@kbn/security-solution-plugin/scripts/endpoint/common/stack_services'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { getRegistryUrlFromTestEnv, isRegistryEnabled, diff --git a/x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/mocks.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/mocks.ts similarity index 100% rename from x-pack/test/security_solution_endpoint/apps/integrations_feature_flag/mocks.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/apps/integrations_feature_flag/mocks.ts diff --git a/x-pack/test/security_solution_endpoint/config.base.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/config.base.ts similarity index 92% rename from x-pack/test/security_solution_endpoint/config.base.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/config.base.ts index e3be9a2a6934b..550e87cf3c191 100644 --- a/x-pack/test/security_solution_endpoint/config.base.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/config.base.ts @@ -7,12 +7,12 @@ import { Config } from '@kbn/test'; import { FtrConfigProviderContext } from '@kbn/test'; -import { pageObjects } from './page_objects'; +import { pageObjects } from '../page_objects'; import { getRegistryUrlAsArray, createEndpointDockerConfig, -} from '../security_solution_endpoint_api_int/registry'; -import type { TargetTags } from './target_tags'; +} from '../../security_solution_endpoint_api_int/registry'; +import type { TargetTags } from '../target_tags'; export const SUITE_TAGS: Record< 'ess' | 'serverless', @@ -48,7 +48,7 @@ export const generateConfig = async ({ const { readConfigFile } = ftrConfigProviderContext; const xpackFunctionalConfig = await readConfigFile( - require.resolve('../functional/config.base.js') + require.resolve('../../../../functional/config.base.js') ); return { diff --git a/x-pack/test/security_solution_endpoint/endpoint.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/endpoint.config.ts similarity index 83% rename from x-pack/test/security_solution_endpoint/endpoint.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/endpoint.config.ts index ed64b4e955c87..b84f2a498ea88 100644 --- a/x-pack/test/security_solution_endpoint/endpoint.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/endpoint.config.ts @@ -8,19 +8,19 @@ import { FtrConfigProviderContext } from '@kbn/test'; import { resolve } from 'path'; import { generateConfig } from './config.base'; -import { services } from './services'; +import { services } from '../services'; export default async function (ftrConfigProviderContext: FtrConfigProviderContext) { const { readConfigFile } = ftrConfigProviderContext; const xpackFunctionalConfig = await readConfigFile( - require.resolve('../functional/config.base.js') + require.resolve('../../../../functional/config.base.js') ); return generateConfig({ ftrConfigProviderContext, baseConfig: xpackFunctionalConfig, - testFiles: [resolve(__dirname, './apps/endpoint')], + testFiles: [resolve(__dirname, '../apps/endpoint')], junitReportName: 'X-Pack Endpoint Functional Tests on ESS', target: 'ess', services, diff --git a/x-pack/test/security_solution_endpoint/ftr_provider_context.d.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/ftr_provider_context.d.ts similarity index 82% rename from x-pack/test/security_solution_endpoint/ftr_provider_context.d.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/ftr_provider_context.d.ts index 24f5087ef7fe2..464db920156b4 100644 --- a/x-pack/test/security_solution_endpoint/ftr_provider_context.d.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/ftr_provider_context.d.ts @@ -7,7 +7,7 @@ import { GenericFtrProviderContext } from '@kbn/test'; -import { pageObjects } from './page_objects'; -import { services } from './services'; +import { pageObjects } from '../page_objects'; +import { services } from '../services'; export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/security_solution_endpoint/integrations.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations.config.ts similarity index 86% rename from x-pack/test/security_solution_endpoint/integrations.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations.config.ts index a75e329505a4e..23ae2ef3fd6ea 100644 --- a/x-pack/test/security_solution_endpoint/integrations.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations.config.ts @@ -8,19 +8,19 @@ import { resolve } from 'path'; import { FtrConfigProviderContext } from '@kbn/test'; import { generateConfig } from './config.base'; -import { services } from './services'; +import { services } from '../services'; export default async function (ftrConfigProviderContext: FtrConfigProviderContext) { const { readConfigFile } = ftrConfigProviderContext; const xpackFunctionalConfig = await readConfigFile( - require.resolve('../functional/config.base.js') + require.resolve('../../../../functional/config.base.js') ); return generateConfig({ ftrConfigProviderContext, baseConfig: xpackFunctionalConfig, - testFiles: [resolve(__dirname, './apps/integrations')], + testFiles: [resolve(__dirname, '../apps/integrations')], junitReportName: 'X-Pack Endpoint Integrations Functional Tests on ESS', target: 'ess', kbnServerArgs: [ diff --git a/x-pack/test/security_solution_endpoint/integrations_feature_flag.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations_feature_flag.config.ts similarity index 86% rename from x-pack/test/security_solution_endpoint/integrations_feature_flag.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations_feature_flag.config.ts index 275f984307bff..8f15a4781476c 100644 --- a/x-pack/test/security_solution_endpoint/integrations_feature_flag.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations_feature_flag.config.ts @@ -8,19 +8,19 @@ import { resolve } from 'path'; import { FtrConfigProviderContext } from '@kbn/test'; import { generateConfig } from './config.base'; -import { services } from './services'; +import { services } from '../services'; export default async function (ftrConfigProviderContext: FtrConfigProviderContext) { const { readConfigFile } = ftrConfigProviderContext; const xpackFunctionalConfig = await readConfigFile( - require.resolve('../functional/config.base.js') + require.resolve('../../../../functional/config.base.js') ); return generateConfig({ ftrConfigProviderContext, baseConfig: xpackFunctionalConfig, - testFiles: [resolve(__dirname, './apps/integrations_feature_flag')], + testFiles: [resolve(__dirname, '../apps/integrations_feature_flag')], junitReportName: 'X-Pack Endpoint Integrations With Feature Flags turned on Functional Tests on ESS', target: 'ess', diff --git a/x-pack/test/security_solution_endpoint/serverless.endpoint.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.endpoint.config.ts similarity index 82% rename from x-pack/test/security_solution_endpoint/serverless.endpoint.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.endpoint.config.ts index 76ce4a0d38a4b..a1e548c4cc8b6 100644 --- a/x-pack/test/security_solution_endpoint/serverless.endpoint.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.endpoint.config.ts @@ -8,19 +8,19 @@ import { FtrConfigProviderContext } from '@kbn/test'; import { resolve } from 'path'; import { generateConfig } from './config.base'; -import { svlServices } from './services'; +import { svlServices } from '../services'; export default async function (ftrConfigProviderContext: FtrConfigProviderContext) { const { readConfigFile } = ftrConfigProviderContext; const svlBaseConfig = await readConfigFile( - require.resolve('../../test_serverless/shared/config.base.ts') + require.resolve('../../../../../test_serverless/shared/config.base.ts') ); return generateConfig({ ftrConfigProviderContext, baseConfig: svlBaseConfig, - testFiles: [resolve(__dirname, './apps/endpoint')], + testFiles: [resolve(__dirname, '../apps/endpoint')], junitReportName: 'X-Pack Endpoint Functional Tests on Serverless', kbnServerArgs: ['--serverless=security'], target: 'serverless', diff --git a/x-pack/test/security_solution_endpoint/serverless.integrations.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations.config.ts similarity index 85% rename from x-pack/test/security_solution_endpoint/serverless.integrations.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations.config.ts index 52a5f523856a6..c47d8553dfbeb 100644 --- a/x-pack/test/security_solution_endpoint/serverless.integrations.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations.config.ts @@ -8,19 +8,19 @@ import { resolve } from 'path'; import { FtrConfigProviderContext } from '@kbn/test'; import { generateConfig } from './config.base'; -import { svlServices } from './services'; +import { svlServices } from '../services'; export default async function (ftrConfigProviderContext: FtrConfigProviderContext) { const { readConfigFile } = ftrConfigProviderContext; const svlBaseConfig = await readConfigFile( - require.resolve('../../test_serverless/shared/config.base.ts') + require.resolve('../../../../../test_serverless/shared/config.base.ts') ); return generateConfig({ ftrConfigProviderContext, baseConfig: svlBaseConfig, - testFiles: [resolve(__dirname, './apps/integrations')], + testFiles: [resolve(__dirname, '../apps/integrations')], junitReportName: 'X-Pack Endpoint Integrations Functional Tests on Serverless', target: 'serverless', kbnServerArgs: [ diff --git a/x-pack/test/security_solution_endpoint/serverless.integrations_feature_flag.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations_feature_flag.config.ts similarity index 85% rename from x-pack/test/security_solution_endpoint/serverless.integrations_feature_flag.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations_feature_flag.config.ts index 7ac35bbe3a101..cdbbaa587cb97 100644 --- a/x-pack/test/security_solution_endpoint/serverless.integrations_feature_flag.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations_feature_flag.config.ts @@ -8,19 +8,19 @@ import { resolve } from 'path'; import { FtrConfigProviderContext } from '@kbn/test'; import { generateConfig } from './config.base'; -import { svlServices } from './services'; +import { svlServices } from '../services'; export default async function (ftrConfigProviderContext: FtrConfigProviderContext) { const { readConfigFile } = ftrConfigProviderContext; const svlBaseConfig = await readConfigFile( - require.resolve('../../test_serverless/shared/config.base.ts') + require.resolve('../../../../../test_serverless/shared/config.base.ts') ); return generateConfig({ ftrConfigProviderContext, baseConfig: svlBaseConfig, - testFiles: [resolve(__dirname, './apps/integrations_feature_flag')], + testFiles: [resolve(__dirname, '../apps/integrations_feature_flag')], junitReportName: 'X-Pack Endpoint Integrations With Feature Flags turned on Functional Tests on ESS', target: 'serverless', diff --git a/x-pack/test/security_solution_endpoint/page_objects/artifact_entries_list_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/artifact_entries_list_page.ts similarity index 95% rename from x-pack/test/security_solution_endpoint/page_objects/artifact_entries_list_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/artifact_entries_list_page.ts index e06c56ac22f5b..99e5ed918fa48 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/artifact_entries_list_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/artifact_entries_list_page.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function ArtifactEntriesListPageProvider({ getService, diff --git a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/endpoint_page.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/endpoint_page.ts index ceea71593a95e..a11604d352b6d 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/endpoint_page.ts @@ -6,7 +6,7 @@ */ import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function EndpointPageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); diff --git a/x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/endpoint_responder.ts similarity index 96% rename from x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/endpoint_responder.ts index 00062df861e6a..e040eba871763 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/endpoint_responder.ts @@ -6,7 +6,7 @@ */ import { subj as testSubjSelector } from '@kbn/test-subj-selector'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; const TEST_SUBJ = Object.freeze({ responderPage: 'consolePageOverlay', diff --git a/x-pack/test/security_solution_endpoint/page_objects/fleet_integrations_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/fleet_integrations_page.ts similarity index 94% rename from x-pack/test/security_solution_endpoint/page_objects/fleet_integrations_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/fleet_integrations_page.ts index b068ba59940a4..b4f679212e292 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/fleet_integrations_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/fleet_integrations_page.ts @@ -9,7 +9,7 @@ import { INTEGRATIONS_PLUGIN_ID } from '@kbn/fleet-plugin/common'; // NOTE: import path below should be the deep path to the actual module - else we get CI errors import { pagePathGetters } from '@kbn/fleet-plugin/public/constants/page_paths'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function FleetIntegrations({ getService, getPageObjects }: FtrProviderContext) { const pageObjects = getPageObjects(['common']); diff --git a/x-pack/test/security_solution_endpoint/page_objects/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/index.ts similarity index 82% rename from x-pack/test/security_solution_endpoint/page_objects/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/index.ts index d7fb55608226f..ccd799a0fff63 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/index.ts @@ -5,14 +5,14 @@ * 2.0. */ -import { pageObjects as xpackFunctionalPageObjects } from '../../functional/page_objects'; +import { pageObjects as xpackFunctionalPageObjects } from '../../../../functional/page_objects'; import { EndpointPageProvider } from './endpoint_page'; import { EndpointPageUtils } from './page_utils'; import { IngestManagerCreatePackagePolicy } from './ingest_manager_create_package_policy_page'; -import { DetectionsPageObject } from '../../security_solution_ftr/page_objects/detections'; -import { HostsPageObject } from '../../security_solution_ftr/page_objects/hosts'; +import { DetectionsPageObject } from '../../../../security_solution_ftr/page_objects/detections'; +import { HostsPageObject } from '../../../../security_solution_ftr/page_objects/hosts'; import { EndpointResponderPageObjects } from './endpoint_responder'; -import { TimelinePageObject } from '../../security_solution_ftr/page_objects/timeline'; +import { TimelinePageObject } from '../../../../security_solution_ftr/page_objects/timeline'; import { EndpointPolicyPageProvider } from './policy_page'; import { TrustedAppsPageProvider } from './trusted_apps_page'; import { FleetIntegrations } from './fleet_integrations_page'; diff --git a/x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts index acdb58460cbbd..b8758237fe9c0 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts @@ -6,7 +6,7 @@ */ import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function IngestManagerCreatePackagePolicy({ getService, diff --git a/x-pack/test/security_solution_endpoint/page_objects/page_utils.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/page_utils.ts similarity index 97% rename from x-pack/test/security_solution_endpoint/page_objects/page_utils.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/page_utils.ts index d14846f8583ed..d43c15c1794f9 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/page_utils.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/page_utils.ts @@ -6,7 +6,7 @@ */ import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function EndpointPageUtils({ getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); diff --git a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/policy_page.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/page_objects/policy_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/policy_page.ts index 34f376d55b103..a18a5110bb7aa 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/policy_page.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { getPolicySettingsFormTestSubjects } from '@kbn/security-solution-plugin/public/management/pages/policy/view/policy_settings_form/mocks'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrProviderContext) { const pageObjects = getPageObjects(['common', 'header']); diff --git a/x-pack/test/security_solution_endpoint/page_objects/svl_common_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/svl_common_page.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/page_objects/svl_common_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/svl_common_page.ts index 98ea6e80984d2..c08f0b22b2078 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/svl_common_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/svl_common_page.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; /** copied from `x-pack/test_serverless/functional/page_objects` in order to be able to login when testing against serverless, * without importing from a different project diff --git a/x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/trusted_apps_page.ts similarity index 96% rename from x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/trusted_apps_page.ts index 7dc2e84358f54..f6c898ba552de 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/page_objects/trusted_apps_page.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function TrustedAppsPageProvider({ getService, getPageObjects }: FtrProviderContext) { const pageObjects = getPageObjects(['common', 'header', 'endpointPageUtils']); diff --git a/x-pack/test/security_solution_endpoint/services/endpoint.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/services/endpoint.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts index b4b5e5aef96bf..00a395fdc4b59 100644 --- a/x-pack/test/security_solution_endpoint/services/endpoint.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts @@ -35,10 +35,10 @@ import { HostInfo, HostMetadata } from '@kbn/security-solution-plugin/common/end import { EndpointDocGenerator } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; import { EndpointMetadataGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/endpoint_metadata_generator'; import { merge } from 'lodash'; -// @ts-expect-error we have to check types with "allowJs: false" for now, causing this import to fail + import { kibanaPackageJson } from '@kbn/repo-info'; import seedrandom from 'seedrandom'; -import { FtrService } from '../../functional/ftr_provider_context'; +import { FtrService } from '../../../../functional/ftr_provider_context'; // Document Generator override that uses a custom Endpoint Metadata generator and sets the // `agent.version` to the current version diff --git a/x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_artifacts.ts similarity index 98% rename from x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_artifacts.ts index 0a914226c9280..e4d24c27895f4 100644 --- a/x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_artifacts.ts @@ -19,8 +19,7 @@ import { EVENT_FILTER_LIST_DEFINITION } from '@kbn/security-solution-plugin/publ import { HOST_ISOLATION_EXCEPTIONS_LIST_DEFINITION } from '@kbn/security-solution-plugin/public/management/pages/host_isolation_exceptions/constants'; import { BLOCKLISTS_LIST_DEFINITION } from '@kbn/security-solution-plugin/public/management/pages/blocklist/constants'; import { ManifestConstants } from '@kbn/security-solution-plugin/server/endpoint/lib/artifacts'; - -import { FtrService } from '../../functional/ftr_provider_context'; +import { FtrService } from '../../../../functional/ftr_provider_context'; import { InternalManifestSchemaResponseType } from '../apps/integrations/mocks'; import { InternalUnifiedManifestSchemaResponseType } from '../apps/integrations_feature_flag/mocks'; diff --git a/x-pack/test/security_solution_endpoint/services/endpoint_policy.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_policy.ts similarity index 99% rename from x-pack/test/security_solution_endpoint/services/endpoint_policy.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_policy.ts index 9aa996a05bbc4..0628b8ceeabd6 100644 --- a/x-pack/test/security_solution_endpoint/services/endpoint_policy.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_policy.ts @@ -25,7 +25,7 @@ import { Immutable } from '@kbn/security-solution-plugin/common/endpoint/types'; // NOTE: import path below should be the deep path to the actual module - else we get CI errors import { pkgKeyFromPackageInfo } from '@kbn/fleet-plugin/public/services/pkg_key_from_package_info'; import { EndpointError } from '@kbn/security-solution-plugin/common/endpoint/errors'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; const INGEST_API_ROOT = '/api/fleet'; const INGEST_API_AGENT_POLICIES = `${INGEST_API_ROOT}/agent_policies`; diff --git a/x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_telemetry.ts similarity index 95% rename from x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_telemetry.ts index 0d04fd4e895b8..d4706595090cf 100644 --- a/x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint_telemetry.ts @@ -7,9 +7,9 @@ import fs from 'fs'; import Path from 'path'; -// @ts-expect-error we have to check types with "allowJs: false" for now, causing this import to fail + import { REPO_ROOT as KIBANA_ROOT } from '@kbn/repo-info'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; const TELEMETRY_API_ROOT = '/api/stats?extended=true'; const TELEMETRY_DATA_ROOT = Path.join( diff --git a/x-pack/test/security_solution_endpoint/services/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/index.ts similarity index 77% rename from x-pack/test/security_solution_endpoint/services/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/index.ts index 5ba317dfaea3e..d74b5913934e9 100644 --- a/x-pack/test/security_solution_endpoint/services/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/index.ts @@ -5,12 +5,12 @@ * 2.0. */ -import { services as xPackFunctionalServices } from '../../functional/services'; -import { IngestManagerProvider } from '../../common/services/ingest_manager'; +import { services as xPackFunctionalServices } from '../../../../functional/services'; +import { IngestManagerProvider } from '../../../../common/services/ingest_manager'; import { EndpointTelemetryTestResourcesProvider } from './endpoint_telemetry'; import { EndpointTestResources } from './endpoint'; -import { TimelineTestService } from '../../security_solution_ftr/services/timeline'; -import { DetectionsTestService } from '../../security_solution_ftr/services/detections'; +import { TimelineTestService } from '../../../../security_solution_ftr/services/timeline'; +import { DetectionsTestService } from '../../../../security_solution_ftr/services/detections'; import { EndpointPolicyTestResourcesProvider } from './endpoint_policy'; import { EndpointArtifactsTestResources } from './endpoint_artifacts'; import { diff --git a/x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/supertest_with_cert.ts similarity index 93% rename from x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/supertest_with_cert.ts index a23d850e3799b..432d2c2238aa2 100644 --- a/x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/supertest_with_cert.ts @@ -6,7 +6,7 @@ */ import { format as formatUrl } from 'url'; import supertest from 'supertest'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export function KibanaSupertestWithCertProvider({ getService }: FtrProviderContext) { const config = getService('config'); diff --git a/x-pack/test/security_solution_endpoint/target_tags.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/target_tags.ts similarity index 100% rename from x-pack/test/security_solution_endpoint/target_tags.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/target_tags.ts diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/data_stream_helper.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/data_stream_helper.ts similarity index 100% rename from x-pack/test/security_solution_endpoint_api_int/apis/data_stream_helper.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/data_stream_helper.ts diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts similarity index 95% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts index 5351cc22f628a..12ad4fd57a040 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts @@ -13,8 +13,7 @@ import { GLOBAL_ARTIFACT_TAG, } from '@kbn/security-solution-plugin/common/endpoint/service/artifacts'; import { ExceptionsListItemGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/exceptions_list_item_generator'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; import { ROLE } from '../../services/roles_users'; @@ -25,9 +24,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint artifacts (via lists plugin): Blocklists', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Endpoint artifacts (via lists plugin): Blocklists', function () { let fleetEndpointPolicy: PolicyTestResourceInfo; before(async () => { @@ -302,21 +299,20 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') - .send(blocklistApiCall.getBody()) + .send(blocklistApiCall.getBody() as object) .expect(200); }); } }); - describe('and user has authorization to read blocklist', function () { - targetTags(this, ['@skipInServerless']); // no such role in serverless - + // no such role in serverless + describe('@skipInServerless and user has authorization to read blocklist', function () { for (const blocklistApiCall of [...blocklistApiCalls, ...needsWritePrivilege]) { it(`should error on [${blocklistApiCall.method}] - [${blocklistApiCall.info}]`, async () => { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) .auth(ROLE.artifact_read_privileges, 'changeme') .set('kbn-xsrf', 'true') - .send(blocklistApiCall.getBody()) + .send(blocklistApiCall.getBody() as object) .expect(403); }); } @@ -326,7 +322,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) .auth(ROLE.artifact_read_privileges, 'changeme') .set('kbn-xsrf', 'true') - .send(blocklistApiCall.getBody()) + .send(blocklistApiCall.getBody() as object) .expect(200); }); } @@ -342,7 +338,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') - .send(blocklistApiCall.getBody()) + .send(blocklistApiCall.getBody() as object) .expect(403); }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts similarity index 94% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts index 5f5c75caa68f9..456010cea0756 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts @@ -14,8 +14,7 @@ import { getImportExceptionsListSchemaMock, toNdJsonString, } from '@kbn/lists-plugin/common/schemas/request/import_exceptions_schema.mock'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; import { ROLE } from '../../services/roles_users'; @@ -26,9 +25,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint artifacts (via lists plugin): Event Filters', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Endpoint artifacts (via lists plugin): Event Filters', function () { let fleetEndpointPolicy: PolicyTestResourceInfo; before(async () => { @@ -227,21 +224,19 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') - .send(eventFilterApiCall.getBody()) + .send(eventFilterApiCall.getBody() as object) .expect(200); }); } }); - describe('and user has authorization to read event filters', function () { - targetTags(this, ['@skipInServerless']); // no such role in serverless - + describe('@skipInServerless and user has authorization to read event filters', function () { for (const eventFilterApiCall of [...eventFilterCalls, ...needsWritePrivilege]) { it(`should error on [${eventFilterApiCall.method}] - [${eventFilterApiCall.info}]`, async () => { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') - .send(eventFilterApiCall.getBody()) + .send(eventFilterApiCall.getBody() as object) .expect(403); }); } @@ -251,7 +246,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') - .send(eventFilterApiCall.getBody()) + .send(eventFilterApiCall.getBody() as object) .expect(200); }); } @@ -267,7 +262,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') - .send(eventFilterApiCall.getBody()) + .send(eventFilterApiCall.getBody() as object) .expect(403); }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts similarity index 94% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts index 09616f57a68d0..427b27172bd51 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts @@ -17,8 +17,7 @@ import { toNdJsonString, } from '@kbn/lists-plugin/common/schemas/request/import_exceptions_schema.mock'; import { ExceptionsListItemGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/exceptions_list_item_generator'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; import { ROLE } from '../../services/roles_users'; @@ -29,9 +28,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint Host Isolation Exceptions artifacts (via lists plugin)', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Endpoint Host Isolation Exceptions artifacts (via lists plugin)', function () { let fleetEndpointPolicy: PolicyTestResourceInfo; let hostIsolationExceptionData: ArtifactTestData; @@ -278,15 +275,14 @@ export default function ({ getService }: FtrProviderContext) { ) .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') - .send(hostIsolationExceptionApiCall.getBody()) + .send(hostIsolationExceptionApiCall.getBody() as object) .expect(200); }); } }); - describe('and user has authorization to read host isolation exceptions', function () { - targetTags(this, ['@skipInServerless']); // no such role in serverless - + // no such role in serverless + describe('@skipInServerless and user has authorization to read host isolation exceptions', function () { for (const hostIsolationExceptionApiCall of [ ...hostIsolationExceptionCalls, ...needsWritePrivilege, @@ -297,7 +293,7 @@ export default function ({ getService }: FtrProviderContext) { ) .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') - .send(hostIsolationExceptionApiCall.getBody()) + .send(hostIsolationExceptionApiCall.getBody() as object) .expect(403); }); } @@ -309,7 +305,7 @@ export default function ({ getService }: FtrProviderContext) { ) .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') - .send(hostIsolationExceptionApiCall.getBody()) + .send(hostIsolationExceptionApiCall.getBody() as object) .expect(200); }); } @@ -327,7 +323,7 @@ export default function ({ getService }: FtrProviderContext) { ) .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') - .send(hostIsolationExceptionApiCall.getBody()) + .send(hostIsolationExceptionApiCall.getBody() as object) .expect(403); }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts similarity index 94% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts index fb844f40a8fbf..852d0c1a8529e 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts @@ -13,8 +13,7 @@ import { GLOBAL_ARTIFACT_TAG, } from '@kbn/security-solution-plugin/common/endpoint/service/artifacts'; import { ExceptionsListItemGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/exceptions_list_item_generator'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; import { ROLE } from '../../services/roles_users'; @@ -25,9 +24,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint artifacts (via lists plugin): Trusted Applications', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Endpoint artifacts (via lists plugin): Trusted Applications', function () { let fleetEndpointPolicy: PolicyTestResourceInfo; before(async () => { @@ -269,21 +266,20 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') - .send(trustedAppApiCall.getBody()) + .send(trustedAppApiCall.getBody() as object) .expect(200); }); } }); - describe('and user has authorization to read trusted apps', function () { - targetTags(this, ['@skipInServerless']); // no such role in serverless - + // no such role in serverless + describe('@skipInServerless and user has authorization to read trusted apps', function () { for (const trustedAppApiCall of [...trustedAppApiCalls, ...needsWritePrivilege]) { it(`should error on [${trustedAppApiCall.method}] - [${trustedAppApiCall.info}]`, async () => { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') - .send(trustedAppApiCall.getBody()) + .send(trustedAppApiCall.getBody() as object) .expect(403); }); } @@ -293,7 +289,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') - .send(trustedAppApiCall.getBody()) + .send(trustedAppApiCall.getBody() as object) .expect(200); }); } @@ -309,7 +305,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') - .send(trustedAppApiCall.getBody()) + .send(trustedAppApiCall.getBody() as object) .expect(403); }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_authz.ts similarity index 97% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_authz.ts index 5a13045af0ba3..3f69edf091707 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_authz.ts @@ -24,8 +24,7 @@ import { UNISOLATE_HOST_ROUTE_V2, } from '@kbn/security-solution-plugin/common/endpoint/constants'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { targetTags } from '../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; import { ROLE } from '../services/roles_users'; export default function ({ getService }: FtrProviderContext) { @@ -40,9 +39,7 @@ export default function ({ getService }: FtrProviderContext) { body: Record | undefined; } - describe('When attempting to call an endpoint api', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless When attempting to call an endpoint api', function () { let indexedData: IndexedHostsAndAlertsResponse; let actionId = ''; let agentId = ''; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts similarity index 79% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts index 87167a8926030..6631923b1f4bc 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts @@ -6,15 +6,12 @@ */ import { ISOLATE_HOST_ROUTE_V2 } from '@kbn/security-solution-plugin/common/endpoint/constants'; -import type { FtrProviderContext } from '../../ftr_provider_context'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; +import type { FtrProviderContext } from '../../configs/ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - describe('Response Actions support for sentinelOne agentType', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Response Actions support for sentinelOne agentType', function () { describe('and the "responseActionsSentinelOneV1Enabled" feature flag is enabled', () => { it('should not return feature disabled error, but a connector not found error', async () => { await supertest diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts similarity index 95% rename from x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts index 1234c45f9210f..3a41abf288427 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts @@ -8,17 +8,14 @@ import { wrapErrorAndRejectPromise } from '@kbn/security-solution-plugin/common/ import expect from '@kbn/expect'; import { EXECUTE_ROUTE } from '@kbn/security-solution-plugin/common/endpoint/constants'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { ROLE } from '../../services/roles_users'; export default function ({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const endpointTestResources = getService('endpointTestResources'); - describe('Endpoint `execute` response action', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Endpoint `execute` response action', function () { let indexedData: IndexedHostsAndAlertsResponse; let agentId = ''; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml similarity index 100% rename from x-pack/test/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/index.ts similarity index 97% rename from x-pack/test/security_solution_endpoint_api_int/apis/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/index.ts index b4f4bb4b46063..112fe140642b0 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/index.ts @@ -6,7 +6,7 @@ */ import { getRegistryUrl as getRegistryUrlFromIngest } from '@kbn/fleet-plugin/server'; import { isServerlessKibanaFlavor } from '@kbn/security-solution-plugin/scripts/endpoint/common/stack_services'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; import { getRegistryUrlFromTestEnv, isRegistryEnabled } from '../registry'; import { ROLE } from '../services/roles_users'; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.fixtures.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/metadata.fixtures.ts similarity index 100% rename from x-pack/test/security_solution_endpoint_api_int/apis/metadata.fixtures.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/metadata.fixtures.ts diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/metadata.ts similarity index 98% rename from x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/metadata.ts index db290065bfe24..7d33088fdbd61 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/metadata.ts @@ -29,7 +29,6 @@ import { EndpointSortableField, MetadataListResponse, } from '@kbn/security-solution-plugin/common/endpoint/types'; -import { targetTags } from '../../security_solution_endpoint/target_tags'; import { generateAgentDocs, generateMetadataDocs } from './metadata.fixtures'; import { bulkIndex, @@ -40,16 +39,14 @@ import { startTransform, stopTransform, } from './data_stream_helper'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const endpointTestResources = getService('endpointTestResources'); const log = getService('log'); - describe('test metadata apis', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless test metadata apis', function () { describe('list endpoints GET route', () => { const numberOfHostsInFixture = 2; let agent1Timestamp: number; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/package.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/package.ts similarity index 97% rename from x-pack/test/security_solution_endpoint_api_int/apis/package.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/package.ts index 4b6fb578bbef8..fb7232bcd6701 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/package.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/package.ts @@ -15,8 +15,7 @@ import { EndpointDocGenerator, Event, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; -import { targetTags } from '../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; import { InsertedEvents, processEventsIndex } from '../services/resolver'; import { deleteEventsStream } from './data_stream_helper'; @@ -71,9 +70,7 @@ export default function ({ getService }: FtrProviderContext) { }; // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/114885 - describe.skip('Endpoint package', function () { - targetTags(this, ['@ess']); - + describe.skip('@ess Endpoint package', function () { describe('network processors', () => { let networkIndexData: InsertedEvents; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/policy.ts similarity index 88% rename from x-pack/test/security_solution_endpoint_api_int/apis/policy.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/policy.ts index 1fe5fbda42f19..aea40c843a6dc 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/policy.ts @@ -6,16 +6,13 @@ */ import expect from '@kbn/expect'; -import { targetTags } from '../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; import { deletePolicyStream } from './data_stream_helper'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('Endpoint policy api', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Endpoint policy api', function () { describe('GET /api/endpoint/policy_response', () => { before( async () => diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/common.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/common.ts similarity index 100% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver/common.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/common.ts diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/entity.ts similarity index 90% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/entity.ts index 2a85d95f24c65..42b30ce18063f 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/entity.ts @@ -8,16 +8,13 @@ import expect from '@kbn/expect'; import { eventsIndexPattern } from '@kbn/security-solution-plugin/common/endpoint/constants'; import { ResolverEntityIndex } from '@kbn/security-solution-plugin/common/endpoint/types'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - describe('Resolver tests for the entity route', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Resolver tests for the entity route', function () { describe('winlogbeat tests', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/winlogbeat'); @@ -63,10 +60,8 @@ export default function ({ getService }: FtrProviderContext) { }); }); - describe('signals index mapping tests', function () { - // illegal_argument_exception: unknown setting [index.lifecycle.name] in before - targetTags(this, ['@brokenInServerless']); - + // illegal_argument_exception: unknown setting [index.lifecycle.name] in before + describe('@brokenInServerless signals index mapping tests', function () { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/signals'); }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/entity_id.ts similarity index 96% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/entity_id.ts index bd5bd0aeca023..69359a7003369 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/entity_id.ts @@ -19,8 +19,7 @@ import { EndpointDocGenerator, Event, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { InsertedEvents, processEventsIndex } from '../../services/resolver'; import { createAncestryArray, schemaWithAncestry } from './common'; import { HEADERS } from '../../headers'; @@ -36,9 +35,7 @@ export default function ({ getService }: FtrProviderContext) { } }; - describe('Resolver handling of entity ids', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Resolver handling of entity ids', function () { describe('entity api', () => { let origin: Event; let genData: InsertedEvents; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/events.ts similarity index 98% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/events.ts index 2c1829d2d4501..5751aad7cb1dc 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/events.ts @@ -18,8 +18,7 @@ import { Tree, RelatedEventCategory, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { Options, GeneratedTrees } from '../../services/resolver'; import { compareArrays } from './common'; import { HEADERS } from '../../headers'; @@ -50,9 +49,7 @@ export default function ({ getService }: FtrProviderContext) { ancestryArraySize: 2, }; - describe('event route', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless event route', function () { let entityIDFilterArray: JsonObject[] | undefined; let entityIDFilter: string | undefined; before(async () => { diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/index.ts similarity index 89% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/index.ts index 1876d46f2f907..482b89a533099 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; export default function (providerContext: FtrProviderContext) { const { loadTestFile } = providerContext; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/tree.ts similarity index 99% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/tree.ts index c9602243e70e3..9707b430b0182 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/apis/resolver/tree.ts @@ -16,8 +16,7 @@ import { Tree, RelatedEventCategory, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; -import { targetTags } from '../../../security_solution_endpoint/target_tags'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../../configs/ftr_provider_context'; import { Options, GeneratedTrees } from '../../services/resolver'; import { schemaWithAncestry, schemaWithName, schemaWithoutAncestry, verifyTree } from './common'; import { HEADERS } from '../../headers'; @@ -47,9 +46,7 @@ export default function ({ getService }: FtrProviderContext) { ancestryArraySize: 2, }; - describe('Resolver tree', function () { - targetTags(this, ['@ess', '@serverless']); - + describe('@ess @serverless Resolver tree', function () { before(async () => { resolverTrees = await resolver.createTrees(treeOptions); // we only requested a single alert so there's only 1 tree diff --git a/x-pack/test/security_solution_endpoint_api_int/config.base.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.base.ts similarity index 92% rename from x-pack/test/security_solution_endpoint_api_int/config.base.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.base.ts index 039030e2a2230..e02fc2fd6b8af 100644 --- a/x-pack/test/security_solution_endpoint_api_int/config.base.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.base.ts @@ -6,8 +6,8 @@ */ import { Config } from '@kbn/test'; -import { getRegistryUrlAsArray, createEndpointDockerConfig } from './registry'; -import { SUITE_TAGS } from '../security_solution_endpoint/config.base'; +import { getRegistryUrlAsArray, createEndpointDockerConfig } from '../registry'; +import { SUITE_TAGS } from '../../security_solution_endpoint/configs/config.base'; export const generateConfig = async ({ baseConfig, @@ -24,7 +24,7 @@ export const generateConfig = async ({ }): Promise => { return { ...baseConfig.getAll(), - testFiles: [require.resolve('./apis')], + testFiles: [require.resolve('../apis')], dockerServers: createEndpointDockerConfig(), services, junit: { diff --git a/x-pack/test/security_solution_endpoint_api_int/config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.ts similarity index 79% rename from x-pack/test/security_solution_endpoint_api_int/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.ts index 3789004aba497..c46c94d91cf6b 100644 --- a/x-pack/test/security_solution_endpoint_api_int/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.ts @@ -7,10 +7,12 @@ import { FtrConfigProviderContext } from '@kbn/test'; import { generateConfig } from './config.base'; -import { services } from './services'; +import { services } from '../services'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); + const xPackAPITestsConfig = await readConfigFile( + require.resolve('../../../../api_integration/config.ts') + ); return generateConfig({ baseConfig: xPackAPITestsConfig, diff --git a/x-pack/test/timeline/common/ftr_provider_context.d.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/ftr_provider_context.d.ts similarity index 90% rename from x-pack/test/timeline/common/ftr_provider_context.d.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/ftr_provider_context.d.ts index aa56557c09df8..16c2f01eb1d72 100644 --- a/x-pack/test/timeline/common/ftr_provider_context.d.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/ftr_provider_context.d.ts @@ -7,6 +7,6 @@ import { GenericFtrProviderContext } from '@kbn/test'; -import { services } from './services'; +import { services } from '../services'; export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/security_solution_endpoint_api_int/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/serverless.config.ts similarity index 86% rename from x-pack/test/security_solution_endpoint_api_int/serverless.config.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/serverless.config.ts index 262bf4dafa2f7..693987c070cd8 100644 --- a/x-pack/test/security_solution_endpoint_api_int/serverless.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/serverless.config.ts @@ -7,11 +7,11 @@ import { FtrConfigProviderContext } from '@kbn/test'; import { generateConfig } from './config.base'; -import { svlServices } from './services'; +import { svlServices } from '../services'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const serverlessTestsConfig = await readConfigFile( - require.resolve('../../test_serverless/shared/config.base.ts') + require.resolve('../../../../../test_serverless/shared/config.base.ts') ); return generateConfig({ diff --git a/x-pack/test/security_solution_endpoint_api_int/headers.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/headers.ts similarity index 100% rename from x-pack/test/security_solution_endpoint_api_int/headers.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/headers.ts diff --git a/x-pack/test/security_solution_endpoint_api_int/registry.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/registry.ts similarity index 96% rename from x-pack/test/security_solution_endpoint_api_int/registry.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/registry.ts index 86ad054356a24..fac96b8221ea9 100644 --- a/x-pack/test/security_solution_endpoint_api_int/registry.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/registry.ts @@ -8,7 +8,7 @@ import path from 'path'; import { defineDockerServersConfig } from '@kbn/test'; -import { dockerImage as ingestDockerImage } from '../fleet_api_integration/config.base'; +import { dockerImage as ingestDockerImage } from '../../../fleet_api_integration/config.base'; /** * This is used by CI to set the docker registry port diff --git a/x-pack/test/security_solution_endpoint_api_int/services/index.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/index.ts similarity index 93% rename from x-pack/test/security_solution_endpoint_api_int/services/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/index.ts index 44a4354d928f5..ff97d7e20f299 100644 --- a/x-pack/test/security_solution_endpoint_api_int/services/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/index.ts @@ -9,7 +9,7 @@ import { KibanaSupertestWithCertProvider, KibanaSupertestWithCertWithoutAuthProvider, } from '../../security_solution_endpoint/services/supertest_with_cert'; -import { services as xPackAPIServices } from '../../api_integration/services'; +import { services as xPackAPIServices } from '../../../../api_integration/services'; import { ResolverGeneratorProvider } from './resolver'; import { RolesUsersProvider } from './roles_users'; import { EndpointTestResources } from '../../security_solution_endpoint/services/endpoint'; diff --git a/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/resolver.ts similarity index 98% rename from x-pack/test/security_solution_endpoint_api_int/services/resolver.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/resolver.ts index 918b4879770d4..dd97681aff7e2 100644 --- a/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/resolver.ts @@ -12,7 +12,7 @@ import { Event, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; import { firstNonNullValue } from '@kbn/security-solution-plugin/common/endpoint/models/ecs_safety_helpers'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export const processEventsIndex = 'logs-endpoint.events.process-default'; diff --git a/x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/roles_users.ts similarity index 97% rename from x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts rename to x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/roles_users.ts index 1d9c2a353a1f6..00d3de63f237c 100644 --- a/x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/services/roles_users.ts @@ -11,7 +11,7 @@ import { getAllEndpointSecurityRoles, } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users'; -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../configs/ftr_provider_context'; export const ROLE = ENDPOINT_SECURITY_ROLE_NAMES; diff --git a/x-pack/test/security_solution_api_integration/tsconfig.json b/x-pack/test/security_solution_api_integration/tsconfig.json index 4a18f10b90dd5..269822e345de8 100644 --- a/x-pack/test/security_solution_api_integration/tsconfig.json +++ b/x-pack/test/security_solution_api_integration/tsconfig.json @@ -44,5 +44,8 @@ "@kbn/actions-plugin", "@kbn/task-manager-plugin", "@kbn/utility-types", + "@kbn/timelines-plugin", + "@kbn/ftr-common-functional-ui-services", + "@kbn/test-subj-selector", ] } diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts deleted file mode 100644 index a86ba58556060..0000000000000 --- a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts +++ /dev/null @@ -1,396 +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 expect from '@kbn/expect'; -import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { PROTECTION_NOTICE_SUPPORTED_ENDPOINT_VERSION } from '@kbn/security-solution-plugin/public/management/pages/policy/view/policy_settings_form/protection_notice_supported_endpoint_version'; -import { getPolicySettingsFormTestSubjects } from '@kbn/security-solution-plugin/public/management/pages/policy/view/policy_settings_form/mocks'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; -import { targetTags } from '../../target_tags'; - -export default function ({ getPageObjects, getService }: FtrProviderContext) { - const browser = getService('browser'); - const pageObjects = getPageObjects([ - 'common', - 'endpoint', - 'policy', - 'endpointPageUtils', - 'ingestManagerCreatePackagePolicy', - 'trustedApps', - ]); - const testSubjects = getService('testSubjects'); - const policyTestResources = getService('policyTestResources'); - const endpointTestResources = getService('endpointTestResources'); - const retry = getService('retry'); - - describe('When on the Endpoint Policy Details Page', function () { - targetTags(this, ['@ess', '@serverless']); - - let indexedData: IndexedHostsAndAlertsResponse; - const formTestSubjects = getPolicySettingsFormTestSubjects(); - - before(async () => { - indexedData = await endpointTestResources.loadEndpointData(); - await browser.refresh(); - }); - - after(async () => { - await endpointTestResources.unloadEndpointData(indexedData); - }); - - describe('with an invalid policy id', () => { - it('should display an error', async () => { - await pageObjects.policy.navigateToPolicyDetails('invalid-id'); - await testSubjects.existOrFail('policyDetailsIdNotFoundMessage'); - expect(await testSubjects.getVisibleText('policyDetailsIdNotFoundMessage')).to.equal( - 'Package policy invalid-id not found' - ); - }); - }); - - describe('with a valid policy id', () => { - let policyInfo: PolicyTestResourceInfo; - - before(async () => { - policyInfo = await policyTestResources.createPolicy(); - await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); - }); - - after(async () => { - if (policyInfo) { - await policyInfo.cleanup(); - } - }); - - it('should display policy view', async () => { - this.timeout(150_000); - await retry.waitForWithTimeout('policy title is not empty', 120_000, async () => { - return (await testSubjects.getVisibleText('header-page-title')) !== ''; - }); - expect(await testSubjects.getVisibleText('header-page-title')).to.equal( - policyInfo.packagePolicy.name - ); - }); - - describe('side navigation', function () { - targetTags(this, ['@skipInServerless']); - - it('should not hide the side navigation', async function () { - await testSubjects.scrollIntoView('solutionSideNavItemLink-get_started'); - // ensure center of button is visible and not hidden by sticky bottom bar - await testSubjects.click('solutionSideNavItemLink-administration', 1000, 15); - // test cleanup: go back to policy details page - await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); - }); - }); - - it('Should show/hide advanced section when button is clicked', async () => { - await testSubjects.missingOrFail(formTestSubjects.advancedSection.settingsContainer); - - // Expand - await pageObjects.policy.showAdvancedSettingsSection(); - await testSubjects.existOrFail(formTestSubjects.advancedSection.settingsContainer); - - // Collapse - await pageObjects.policy.hideAdvancedSettingsSection(); - await testSubjects.missingOrFail(formTestSubjects.advancedSection.settingsContainer); - }); - }); - - ['malware', 'ransomware'].forEach((protection) => { - describe(`on the ${protection} protections card`, () => { - let policyInfo: PolicyTestResourceInfo; - const cardTestSubj: - | typeof formTestSubjects['ransomware'] - | typeof formTestSubjects['malware'] = - formTestSubjects[ - protection as keyof Pick - ]; - - beforeEach(async () => { - policyInfo = await policyTestResources.createPolicy(); - await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); - }); - - afterEach(async () => { - if (policyInfo) { - await policyInfo.cleanup(); - - // @ts-expect-error forcing to undefined - policyInfo = undefined; - } - }); - - it('should show the supported Endpoint version for user notification', async () => { - expect(await testSubjects.getVisibleText(cardTestSubj.notifySupportedVersion)).to.equal( - 'Agent version ' + - PROTECTION_NOTICE_SUPPORTED_ENDPOINT_VERSION[ - protection as keyof typeof PROTECTION_NOTICE_SUPPORTED_ENDPOINT_VERSION - ] - ); - }); - - it('should show the custom message text area when the Notify User checkbox is checked', async () => { - expect(await testSubjects.isChecked(cardTestSubj.notifyUserCheckbox)).to.be(true); - await testSubjects.existOrFail(cardTestSubj.notifyCustomMessage); - }); - - it('should not show the custom message text area when the Notify User checkbox is unchecked', async () => { - await pageObjects.endpointPageUtils.clickOnEuiCheckbox(cardTestSubj.notifyUserCheckbox); - expect(await testSubjects.isChecked(cardTestSubj.notifyUserCheckbox)).to.be(false); - await testSubjects.missingOrFail(cardTestSubj.notifyCustomMessage); - }); - - it('should show a sample custom message', async () => { - expect(await testSubjects.getVisibleText(cardTestSubj.notifyCustomMessage)).equal( - 'Elastic Security {action} {filename}' - ); - }); - - it('should show a tooltip on hover', async () => { - await testSubjects.moveMouseTo(cardTestSubj.notifyCustomMessageTooltipIcon); - - await retry.waitFor( - 'should show a tooltip on hover', - async () => - (await testSubjects.getVisibleText(cardTestSubj.notifyCustomMessageTooltipInfo)) === - `Selecting the user notification option will display a notification to the host user when ${protection} is prevented or detected.\nThe user notification can be customized in the text box below. Bracketed tags can be used to dynamically populate the applicable action (such as prevented or detected) and the filename.` - ); - }); - - it('should preserve a custom notification message upon saving', async () => { - await testSubjects.setValue(cardTestSubj.notifyCustomMessage, '', { - clearWithKeyboard: true, - }); - await testSubjects.setValue( - cardTestSubj.notifyCustomMessage, - 'a custom notification message @$% 123', - { typeCharByChar: true } - ); - - await pageObjects.policy.confirmAndSave(); - await testSubjects.existOrFail('policyDetailsSuccessMessage'); - expect(await testSubjects.getVisibleText(cardTestSubj.notifyCustomMessage)).to.equal( - 'a custom notification message @$% 123' - ); - }); - }); - }); - - describe('and the save button is clicked', () => { - let policyInfo: PolicyTestResourceInfo; - - beforeEach(async () => { - policyInfo = await policyTestResources.createPolicy(); - await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); - }); - - afterEach(async () => { - if (policyInfo) { - await policyInfo.cleanup(); - - // @ts-expect-error forcing to undefined - policyInfo = undefined; - } - }); - - it('should display success toast on successful save', async () => { - await pageObjects.endpointPageUtils.clickOnEuiCheckbox( - formTestSubjects.windowsEvents.dnsCheckbox - ); - await pageObjects.policy.confirmAndSave(); - - await testSubjects.existOrFail('policyDetailsSuccessMessage'); - expect(await testSubjects.getVisibleText('policyDetailsSuccessMessage')).to.equal( - `Success!\nIntegration ${policyInfo.packagePolicy.name} has been updated.` - ); - }); - - it('should persist update on the screen', async () => { - await pageObjects.endpointPageUtils.clickOnEuiCheckbox( - formTestSubjects.windowsEvents.processCheckbox - ); - await pageObjects.policy.confirmAndSave(); - - await testSubjects.existOrFail('policyDetailsSuccessMessage'); - await testSubjects.existOrFail('toastCloseButton'); - await pageObjects.endpoint.navigateToEndpointList(); - await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); - - expect( - await ( - await testSubjects.find(formTestSubjects.windowsEvents.processCheckbox) - ).isSelected() - ).to.equal(false); - }); - - it('should have updated policy data in overall Agent Policy', async () => { - // This test ensures that updates made to the Endpoint Policy are carried all the way through - // to the generated Agent Policy that is dispatch down to the Elastic Agent. - - await Promise.all([ - pageObjects.endpointPageUtils.clickOnEuiCheckbox( - formTestSubjects.windowsEvents.fileCheckbox - ), - pageObjects.endpointPageUtils.clickOnEuiCheckbox( - formTestSubjects.linuxEvents.fileCheckbox - ), - pageObjects.endpointPageUtils.clickOnEuiCheckbox(formTestSubjects.macEvents.fileCheckbox), - ]); - - await pageObjects.policy.showAdvancedSettingsSection(); - - const advancedPolicyField = await pageObjects.policy.findAdvancedPolicyField(); - await advancedPolicyField.clearValue(); - await advancedPolicyField.click(); - await advancedPolicyField.type('true'); - await pageObjects.policy.confirmAndSave(); - - await testSubjects.existOrFail('policyDetailsSuccessMessage'); - await testSubjects.waitForDeleted('toastCloseButton'); - - const agentFullPolicy = await policyTestResources.getFullAgentPolicy( - policyInfo.agentPolicy.id - ); - - expect(agentFullPolicy.inputs[0].id).to.eql(policyInfo.packagePolicy.id); - expect(agentFullPolicy.inputs[0].policy.linux.advanced.agent.connection_delay).to.eql( - 'true' - ); - expect(agentFullPolicy.inputs[0].policy.linux.events.file).to.eql(false); - expect(agentFullPolicy.inputs[0].policy.mac.events.file).to.eql(false); - expect(agentFullPolicy.inputs[0].policy.windows.events.file).to.eql(false); - }); - - it('should have cleared the advanced section when the user deletes the value', async () => { - await pageObjects.policy.showAdvancedSettingsSection(); - - const advancedPolicyField = await pageObjects.policy.findAdvancedPolicyField(); - await advancedPolicyField.clearValue(); - await advancedPolicyField.click(); - await advancedPolicyField.type('true'); - await pageObjects.policy.confirmAndSave(); - - await testSubjects.existOrFail('policyDetailsSuccessMessage'); - - const agentFullPolicy = await policyTestResources.getFullAgentPolicy( - policyInfo.agentPolicy.id - ); - - expect(agentFullPolicy.inputs[0].policy.linux.advanced.agent.connection_delay).to.eql( - 'true' - ); - - // Clear the value - await advancedPolicyField.click(); - await advancedPolicyField.clearValueWithKeyboard(); - - // Make sure the toast button closes so the save button on the sticky footer is visible - await testSubjects.waitForDeleted('toastCloseButton'); - await pageObjects.policy.confirmAndSave(); - - await testSubjects.existOrFail('policyDetailsSuccessMessage'); - - const agentFullPolicyUpdated = await policyTestResources.getFullAgentPolicy( - policyInfo.agentPolicy.id - ); - - expect(agentFullPolicyUpdated.inputs[0].policy.linux.advanced).to.eql({ - capture_env_vars: 'LD_PRELOAD,LD_LIBRARY_PATH', - }); - }); - }); - - describe('when on Ingest Policy Edit Package Policy page', async () => { - let policyInfo: PolicyTestResourceInfo; - - beforeEach(async () => { - // Create a policy and navigate to Ingest app - policyInfo = await policyTestResources.createPolicy(); - await pageObjects.ingestManagerCreatePackagePolicy.navigateToAgentPolicyEditPackagePolicy( - policyInfo.agentPolicy.id, - policyInfo.packagePolicy.id - ); - }); - - afterEach(async () => { - if (policyInfo) { - await policyInfo.cleanup(); - } - }); - - it('should show the endpoint policy form', async () => { - await testSubjects.existOrFail(formTestSubjects.form); - }); - - it('should allow updates to policy items', async () => { - const winDnsEventingCheckbox = await testSubjects.find( - formTestSubjects.windowsEvents.dnsCheckbox - ); - await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow( - winDnsEventingCheckbox - ); - expect(await winDnsEventingCheckbox.isSelected()).to.be(true); - await pageObjects.endpointPageUtils.clickOnEuiCheckbox( - formTestSubjects.windowsEvents.dnsCheckbox - ); - await pageObjects.policy.waitForCheckboxSelectionChange( - formTestSubjects.windowsEvents.dnsCheckbox, - false - ); - }); - - it('should include updated endpoint data when saved', async () => { - await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow( - await testSubjects.find(formTestSubjects.windowsEvents.dnsCheckbox) - ); - await pageObjects.endpointPageUtils.clickOnEuiCheckbox( - formTestSubjects.windowsEvents.dnsCheckbox - ); - const updatedCheckboxValue = await testSubjects.isSelected( - formTestSubjects.windowsEvents.dnsCheckbox - ); - - await pageObjects.policy.waitForCheckboxSelectionChange( - formTestSubjects.windowsEvents.dnsCheckbox, - false - ); - - await (await pageObjects.ingestManagerCreatePackagePolicy.findSaveButton(true)).click(); - await pageObjects.ingestManagerCreatePackagePolicy.waitForSaveSuccessNotification(true); - - await pageObjects.ingestManagerCreatePackagePolicy.navigateToAgentPolicyEditPackagePolicy( - policyInfo.agentPolicy.id, - policyInfo.packagePolicy.id - ); - - await pageObjects.policy.waitForCheckboxSelectionChange( - formTestSubjects.windowsEvents.dnsCheckbox, - updatedCheckboxValue - ); - }); - - ['trustedApps', 'eventFilters', 'blocklists', 'hostIsolationExceptions'].forEach( - (cardName) => { - it(`should show ${cardName} card and link should go back to policy`, async () => { - await testSubjects.existOrFail(`${cardName}-fleet-integration-card`); - - const card = await testSubjects.find(`${cardName}-fleet-integration-card`); - await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow(card); - await (await testSubjects.find(`${cardName}-link-to-exceptions`)).click(); - - await testSubjects.existOrFail('policyDetailsPage'); - - await (await testSubjects.find('policyDetailsBackLink')).click(); - await testSubjects.existOrFail('endpointIntegrationPolicyForm'); - }); - } - ); - }); - }); -} diff --git a/x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts b/x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts deleted file mode 100644 index aa56557c09df8..0000000000000 --- a/x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts +++ /dev/null @@ -1,12 +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 { GenericFtrProviderContext } from '@kbn/test'; - -import { services } from './services'; - -export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/timeline/common/config.ts b/x-pack/test/timeline/common/config.ts deleted file mode 100644 index 9271ee9a8374f..0000000000000 --- a/x-pack/test/timeline/common/config.ts +++ /dev/null @@ -1,103 +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 { CA_CERT_PATH } from '@kbn/dev-utils'; -import { FtrConfigProviderContext } from '@kbn/test'; -import { resolve } from 'path'; - -import { getAllExternalServiceSimulatorPaths } from '@kbn/actions-simulators-plugin/server/plugin'; -import { services } from './services'; - -interface CreateTestConfigOptions { - license: string; - disabledPlugins?: string[]; - ssl?: boolean; - testFiles?: string[]; -} - -// test.not-enabled is specifically not enabled -const enabledActionTypes = [ - '.email', - '.index', - '.jira', - '.pagerduty', - '.resilient', - '.server-log', - '.servicenow', - '.servicenow-sir', - '.slack', - '.webhook', - '.case', - 'test.authorization', - 'test.failing', - 'test.index-record', - 'test.noop', - 'test.rate-limit', -]; - -export function createTestConfig(name: string, options: CreateTestConfigOptions) { - const { license = 'trial', disabledPlugins = [], ssl = false, testFiles = [] } = options; - const auditLogPath = resolve(__dirname, './audit.log'); - - return async ({ readConfigFile }: FtrConfigProviderContext) => { - const xPackApiIntegrationTestsConfig = await readConfigFile( - require.resolve('../../api_integration/config.ts') - ); - - const servers = { - ...xPackApiIntegrationTestsConfig.get('servers'), - elasticsearch: { - ...xPackApiIntegrationTestsConfig.get('servers.elasticsearch'), - protocol: ssl ? 'https' : 'http', - }, - }; - - return { - testFiles, - servers, - services, - junit: { - reportName: 'X-Pack Timeline plugin API Integration Tests', - }, - esTestCluster: { - ...xPackApiIntegrationTestsConfig.get('esTestCluster'), - license, - ssl, - serverArgs: [ - `xpack.license.self_generated.type=${license}`, - `xpack.security.enabled=${ - !disabledPlugins.includes('security') && ['trial', 'basic'].includes(license) - }`, - ], - }, - kbnTestServer: { - ...xPackApiIntegrationTestsConfig.get('kbnTestServer'), - serverArgs: [ - ...xPackApiIntegrationTestsConfig.get('kbnTestServer.serverArgs'), - `--xpack.actions.allowedHosts=${JSON.stringify(['localhost', 'some.non.existent.com'])}`, - `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, - '--xpack.eventLog.logEntries=true', - ...disabledPlugins - .filter((k) => k !== 'security') - .map((key) => `--xpack.${key}.enabled=false`), - '--xpack.ruleRegistry.write.enabled=true', - '--xpack.security.audit.enabled=true', - '--xpack.security.audit.appender.type=file', - `--xpack.security.audit.appender.fileName=${auditLogPath}`, - '--xpack.security.audit.appender.layout.type=json', - `--server.xsrf.allowlist=${JSON.stringify(getAllExternalServiceSimulatorPaths())}`, - ...(ssl - ? [ - `--elasticsearch.hosts=${servers.elasticsearch.protocol}://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, - `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, - ] - : []), - ], - }, - }; - }; -} diff --git a/x-pack/test/timeline/common/services.ts b/x-pack/test/timeline/common/services.ts deleted file mode 100644 index 7e415338c405f..0000000000000 --- a/x-pack/test/timeline/common/services.ts +++ /dev/null @@ -1,8 +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. - */ - -export { services } from '../../api_integration/services'; diff --git a/x-pack/test/timeline/security_and_spaces/config_basic.ts b/x-pack/test/timeline/security_and_spaces/config_basic.ts deleted file mode 100644 index 98b7b1abe98e7..0000000000000 --- a/x-pack/test/timeline/security_and_spaces/config_basic.ts +++ /dev/null @@ -1,15 +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 { createTestConfig } from '../common/config'; - -// eslint-disable-next-line import/no-default-export -export default createTestConfig('security_and_spaces', { - license: 'basic', - ssl: true, - testFiles: [require.resolve('./tests/basic')], -}); diff --git a/x-pack/test/timeline/security_and_spaces/config_trial.ts b/x-pack/test/timeline/security_and_spaces/config_trial.ts deleted file mode 100644 index b5328fd83c2cb..0000000000000 --- a/x-pack/test/timeline/security_and_spaces/config_trial.ts +++ /dev/null @@ -1,15 +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 { createTestConfig } from '../common/config'; - -// eslint-disable-next-line import/no-default-export -export default createTestConfig('security_and_spaces', { - license: 'trial', - ssl: true, - testFiles: [require.resolve('./tests/trial')], -}); diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 10d864d304006..d7727ec005328 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -53,7 +53,6 @@ "@kbn/index-management-plugin", "@kbn/infra-plugin", "@kbn/licensing-plugin", - "@kbn/lists-plugin", "@kbn/ml-plugin", "@kbn/monitoring-plugin", "@kbn/observability-plugin", @@ -63,7 +62,6 @@ "@kbn/spaces-plugin", "@kbn/task-manager-plugin", "@kbn/telemetry-collection-xpack-plugin", - "@kbn/timelines-plugin", "@kbn/transform-plugin", "@kbn/triggers-actions-ui-plugin", "@kbn/upgrade-assistant-plugin", @@ -77,7 +75,6 @@ "@kbn/dev-utils", "@kbn/dev-proc-runner", "@kbn/ftr-common-functional-services", - "@kbn/securitysolution-io-ts-list-types", "@kbn/securitysolution-list-constants", "@kbn/expect", "@kbn/dev-cli-errors", From 07df3b1f4813899c3477b5f5118ba7a675e2f6d7 Mon Sep 17 00:00:00 2001 From: Karen Grigoryan Date: Tue, 4 Jun 2024 15:41:58 +0200 Subject: [PATCH 40/82] =?UTF-8?q?[Security=20Solution][DQD]=20add=20nested?= =?UTF-8?q?=20field=20items=20for=20incompatible=20and=20=E2=80=A6=20(#184?= =?UTF-8?q?657)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …same family fields Addresses #184037 - Add `incompatibleFieldItems` and `sameFamilyFieldItems` as nested fields with required attributes. Steps to verify the change: 1. Bootup PR branch with local es + kibana 2. Open Kibana DevTools 3. Call `GET .kibana-data-quality-dashboard-results-default/_mapping` 4. Verify existence of properly nested `incompatibleFieldItems` and `sameFamilyFieldItems` new fields ![image](https://github.com/elastic/kibana/assets/1625373/c92a37d8-3b03-4e70-a881-975355a0c834) ![image](https://github.com/elastic/kibana/assets/1625373/ce23f8d2-0e4a-45bd-b005-3abd975fc47b) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/lib/data_stream/results_field_map.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts index a8d4fadb72ca1..8fbb3c354df8d 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/lib/data_stream/results_field_map.ts @@ -18,8 +18,19 @@ export const resultsFieldMap: FieldMap = { totalFieldCount: { type: 'long', required: true }, ecsFieldCount: { type: 'long', required: true }, customFieldCount: { type: 'long', required: true }, + incompatibleFieldItems: { type: 'nested', required: true, array: true }, + 'incompatibleFieldItems.fieldName': { type: 'keyword', required: true }, + 'incompatibleFieldItems.expectedValue': { type: 'keyword', required: true }, + 'incompatibleFieldItems.actualValue': { type: 'keyword', required: true }, + 'incompatibleFieldItems.description': { type: 'keyword', required: true }, + 'incompatibleFieldItems.reason': { type: 'keyword', required: true }, incompatibleFieldCount: { type: 'long', required: true }, sameFamilyFieldCount: { type: 'long', required: true }, + sameFamilyFieldItems: { type: 'nested', required: true, array: true }, + 'sameFamilyFieldItems.fieldName': { type: 'keyword', required: true }, + 'sameFamilyFieldItems.expectedValue': { type: 'keyword', required: true }, + 'sameFamilyFieldItems.actualValue': { type: 'keyword', required: true }, + 'sameFamilyFieldItems.description': { type: 'keyword', required: true }, sameFamilyFields: { type: 'keyword', required: true, array: true }, unallowedMappingFields: { type: 'keyword', required: true, array: true }, unallowedValueFields: { type: 'keyword', required: true, array: true }, From 9c9065d52bda99a236297d71fd0746154fec5f6b Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 4 Jun 2024 16:22:49 +0200 Subject: [PATCH 41/82] Add treeshake to react-field package (#184506) ## Summary Add treeshake to the `@kbn/react-field` package. --- packages/kbn-react-field/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kbn-react-field/package.json b/packages/kbn-react-field/package.json index c0fc936e297f1..8ff7494e0deaf 100644 --- a/packages/kbn-react-field/package.json +++ b/packages/kbn-react-field/package.json @@ -2,5 +2,6 @@ "name": "@kbn/react-field", "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "private": true + "private": true, + "sideEffects": ["*.scss"] } \ No newline at end of file From 88833a5c76c4299453094212ef11e15008127780 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Tue, 4 Jun 2024 16:23:42 +0200 Subject: [PATCH 42/82] [ML] Fix Change Point embeddable infinite re-rendering on a dashboard (#184711) ## Summary Closes https://github.com/elastic/kibana/issues/184710 Fixes embeddable rendering by preserving callback refs and memoizing component props. --- .../embeddable_change_point_chart_factory.tsx | 10 +++++++--- .../plugins/aiops/public/shared_components/index.tsx | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_change_point_chart_factory.tsx b/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_change_point_chart_factory.tsx index 937f086f8f7da..5b8345dd28d39 100644 --- a/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_change_point_chart_factory.tsx +++ b/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_change_point_chart_factory.tsx @@ -188,6 +188,10 @@ export const getChangePointChartEmbeddableFactory = ( pluginStart ); + const onLoading = (v: boolean) => dataLoading.next(v); + const onRenderComplete = () => dataLoading.next(false); + const onError = (error: Error) => blockingError.next(error); + return { api, Component: () => { @@ -242,9 +246,9 @@ export const getChangePointChartEmbeddableFactory = ( maxSeriesToPlot={maxSeriesToPlot} dataViewId={dataViewId} partitions={partitions} - onLoading={(v) => dataLoading.next(v)} - onRenderComplete={() => dataLoading.next(false)} - onError={(error) => blockingError.next(error)} + onLoading={onLoading} + onRenderComplete={onRenderComplete} + onError={onError} embeddingOrigin={embeddingOrigin} lastReloadRequestTime={lastReloadRequestTime} /> diff --git a/x-pack/plugins/aiops/public/shared_components/index.tsx b/x-pack/plugins/aiops/public/shared_components/index.tsx index acc76a5f2f065..3e19cfda3b844 100644 --- a/x-pack/plugins/aiops/public/shared_components/index.tsx +++ b/x-pack/plugins/aiops/public/shared_components/index.tsx @@ -17,9 +17,9 @@ export const getChangePointDetectionComponent = ( coreStart: CoreStart, pluginStart: AiopsPluginStartDeps ): ChangePointDetectionSharedComponent => { - return (props) => { + return React.memo((props) => { return ; - }; + }); }; export type { ChangePointDetectionSharedComponent } from './change_point_detection'; From ab133613337d0fac7a553561922d446cd66f1ea8 Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Tue, 4 Jun 2024 10:26:25 -0400 Subject: [PATCH 43/82] [Security Solution] [Detections] adds view_index_metadata to threat intelligence analyst and endpoint operations manager roles (#184547) ## Summary Ref: https://github.com/elastic/security-team/issues/7951 --- .../project_roles/security/roles.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml b/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml index 5d70bb0044fc5..e47cc78eadc33 100644 --- a/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml +++ b/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml @@ -307,13 +307,18 @@ threat_intelligence_analyst: - logstash-* privileges: - read + - names: + - .asset-criticality.asset-criticality-* + privileges: + - read + - write - names: - .lists* - .items* - - .asset-criticality.asset-criticality-* privileges: - read - write + - view_index_metadata - names: - .alerts-security* - .siem-signals-* @@ -684,13 +689,18 @@ endpoint_policy_manager: - risk-score.risk-score-* privileges: - read + - names: + - .asset-criticality.asset-criticality-* + privileges: + - read + - write - names: - .lists* - .items* - - .asset-criticality.asset-criticality-* privileges: - read - write + - view_index_metadata - names: - .alerts-security* - .siem-signals-* From a4dc9a80dcbdc7c3f57312471eca9c8ff9b5da6d Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 4 Jun 2024 07:34:53 -0700 Subject: [PATCH 44/82] [HTTP/OAS] Add descriptions for spaces APIs (#184252) --- .../plugins/spaces/server/routes/api/external/copy_to_space.ts | 2 ++ x-pack/plugins/spaces/server/routes/api/external/delete.ts | 3 +++ .../server/routes/api/external/disable_legacy_url_aliases.ts | 3 +++ x-pack/plugins/spaces/server/routes/api/external/get.ts | 3 +++ x-pack/plugins/spaces/server/routes/api/external/get_all.ts | 3 +++ .../server/routes/api/external/get_shareable_references.ts | 3 +++ x-pack/plugins/spaces/server/routes/api/external/post.ts | 3 +++ x-pack/plugins/spaces/server/routes/api/external/put.ts | 3 +++ .../spaces/server/routes/api/external/update_objects_spaces.ts | 3 +++ 9 files changed, 26 insertions(+) diff --git a/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts b/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts index e772ad389e8f9..c237c86b0b91a 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts @@ -32,6 +32,7 @@ export function initCopyToSpacesApi(deps: ExternalRouteDeps) { path: '/api/spaces/_copy_saved_objects', options: { tags: ['access:copySavedObjectsToSpaces'], + description: `Copy saved objects to spaces`, }, validate: { body: schema.object( @@ -148,6 +149,7 @@ export function initCopyToSpacesApi(deps: ExternalRouteDeps) { path: '/api/spaces/_resolve_copy_saved_objects_errors', options: { tags: ['access:copySavedObjectsToSpaces'], + description: `Resolve conflicts copying saved objects`, }, validate: { body: schema.object( diff --git a/x-pack/plugins/spaces/server/routes/api/external/delete.ts b/x-pack/plugins/spaces/server/routes/api/external/delete.ts index 63679f49847b7..30a6f85d6994b 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/delete.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/delete.ts @@ -20,6 +20,9 @@ export function initDeleteSpacesApi(deps: ExternalRouteDeps) { router.delete( { path: '/api/spaces/space/{id}', + options: { + description: `Delete a space`, + }, validate: { params: schema.object({ id: schema.string(), diff --git a/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts b/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts index d708618f43870..67bce1bfb742a 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts @@ -18,6 +18,9 @@ export function initDisableLegacyUrlAliasesApi(deps: ExternalRouteDeps) { router.post( { path: '/api/spaces/_disable_legacy_url_aliases', + options: { + description: `Disable legacy URL aliases`, + }, validate: { body: schema.object({ aliases: schema.arrayOf( diff --git a/x-pack/plugins/spaces/server/routes/api/external/get.ts b/x-pack/plugins/spaces/server/routes/api/external/get.ts index 496c3408b7d2e..99bc646994b5c 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/get.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/get.ts @@ -18,6 +18,9 @@ export function initGetSpaceApi(deps: ExternalRouteDeps) { router.get( { path: '/api/spaces/space/{id}', + options: { + description: `Get a space`, + }, validate: { params: schema.object({ id: schema.string(), diff --git a/x-pack/plugins/spaces/server/routes/api/external/get_all.ts b/x-pack/plugins/spaces/server/routes/api/external/get_all.ts index c1dc24caf151e..5b972f6491860 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/get_all.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/get_all.ts @@ -18,6 +18,9 @@ export function initGetAllSpacesApi(deps: ExternalRouteDeps) { router.get( { path: '/api/spaces/space', + options: { + description: `Get all spaces`, + }, validate: { query: schema.object({ purpose: schema.maybe( diff --git a/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts b/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts index f9b18961fae59..687a51b28f9c8 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts @@ -17,6 +17,9 @@ export function initGetShareableReferencesApi(deps: ExternalRouteDeps) { router.post( { path: '/api/spaces/_get_shareable_references', + options: { + description: `Get shareable references`, + }, validate: { body: schema.object({ objects: schema.arrayOf(schema.object({ type: schema.string(), id: schema.string() })), diff --git a/x-pack/plugins/spaces/server/routes/api/external/post.ts b/x-pack/plugins/spaces/server/routes/api/external/post.ts index 34a9c7f854dad..31dda1285f06a 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/post.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/post.ts @@ -20,6 +20,9 @@ export function initPostSpacesApi(deps: ExternalRouteDeps) { router.post( { path: '/api/spaces/space', + options: { + description: `Create a space`, + }, validate: { body: getSpaceSchema(isServerless), }, diff --git a/x-pack/plugins/spaces/server/routes/api/external/put.ts b/x-pack/plugins/spaces/server/routes/api/external/put.ts index 7d0c255392ee4..e1defabee7103 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/put.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/put.ts @@ -20,6 +20,9 @@ export function initPutSpacesApi(deps: ExternalRouteDeps) { router.put( { path: '/api/spaces/space/{id}', + options: { + description: `Update a space`, + }, validate: { params: schema.object({ id: schema.string(), diff --git a/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts b/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts index 5e610c9693ab5..8222ceba0813c 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts @@ -36,6 +36,9 @@ export function initUpdateObjectsSpacesApi(deps: ExternalRouteDeps) { router.post( { path: '/api/spaces/_update_objects_spaces', + options: { + description: `Update saved objects in spaces`, + }, validate: { body: schema.object({ objects: schema.arrayOf(schema.object({ type: schema.string(), id: schema.string() })), From 6d1a6d7f970ff42cec8a39689d6a6972a8728acb Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 4 Jun 2024 17:55:47 +0300 Subject: [PATCH 45/82] [ResponseOps][Rules] Standarize context variables between the UI and the backend (#184507) ## Summary This PR aims to provide a way to produce a TS error for the UI when adding a context variable on the backend. This way adding a new context variable will remind us to make it available to the users when configuring actions. This process revealed: - The alert UUID is not exposed in the UI. - The action subgroup of the alert is exposed in the UI but is not taken into consideration in the backend because it was [removed](https://github.com/elastic/kibana/pull/141794/files) - The rule params are not exposed in the UI for non summarized actions. Fixes: https://github.com/elastic/kibana/issues/180918 ### 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> --- .../kbn-alerting-types/action_variable.ts | 100 +++++ packages/kbn-alerting-types/index.ts | 1 + .../kbn-alerting-types/rule_type_types.ts | 9 +- .../task_runner/transform_action_params.ts | 27 +- .../translations/translations/fr-FR.json | 3 - .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - .../application/lib/action_variables.test.ts | 135 ++---- .../application/lib/action_variables.ts | 403 +++++++----------- .../plugins/triggers_actions_ui/tsconfig.json | 3 +- 10 files changed, 331 insertions(+), 356 deletions(-) create mode 100644 packages/kbn-alerting-types/action_variable.ts diff --git a/packages/kbn-alerting-types/action_variable.ts b/packages/kbn-alerting-types/action_variable.ts new file mode 100644 index 0000000000000..fdce4c5d6af16 --- /dev/null +++ b/packages/kbn-alerting-types/action_variable.ts @@ -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 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 interface ActionVariable { + name: string; + description: string; + deprecated?: boolean; + useWithTripleBracesInTemplates?: boolean; + usesPublicBaseUrl?: boolean; +} + +/** + * Returns all flattened keys from a deeply nested object as union + */ +type FlattenKeys, Key = keyof T> = Key extends string + ? T[Key] extends Record + ? `${Key}.${FlattenKeys}` + : `${Key}` + : never; + +/** + * All valid action context variables + */ +export interface ActionContextVariables { + alertId: string; + alertName: string; + alertInstanceId: string; + alertActionGroup: string; + alertActionGroupName: string; + tags?: string[]; + spaceId: string; + params: Record; + context: Record; + date: string; + state: Record; + kibanaBaseUrl?: string; + rule: { + id: string; + name: string; + spaceId: string; + type: string; + params: Record; + tags?: string[]; + url?: string; + }; + alert: { + id: string; + uuid: string; + actionGroup: string; + actionGroupName: string; + flapping: boolean; + consecutiveMatches?: number; + }; +} + +/** + * All valid summarized action context variables + */ +export type SummaryActionContextVariables = ActionContextVariables & { + alerts: { + new: { + count: number; + data: unknown[]; + }; + ongoing: { + count: number; + data: unknown[]; + }; + recovered: { + count: number; + data: unknown[]; + }; + all: { + count: number; + data: unknown[]; + }; + }; +}; + +/** + * This type takes a deep nested object and returns all flattened keys as a union. + * This is needed for the UI where the context variables are used as flattened keys. + * We need to remove params and add it ourselves because FlattenKeys + * produces `params.${string}` for the params which leads to a TS error + * in the UI when the key of the record is `params` + */ +export type ActionContextVariablesFlatten = + | FlattenKeys> + | 'params' + | 'rule.params'; + +export type SummaryActionContextVariablesFlatten = + | FlattenKeys> + | 'params' + | 'rule.params'; diff --git a/packages/kbn-alerting-types/index.ts b/packages/kbn-alerting-types/index.ts index fcfccebbae425..8d9ecf1422806 100644 --- a/packages/kbn-alerting-types/index.ts +++ b/packages/kbn-alerting-types/index.ts @@ -13,3 +13,4 @@ export * from './alert_type'; export * from './rule_notify_when_type'; export * from './r_rule_types'; export * from './rule_types'; +export * from './action_variable'; diff --git a/packages/kbn-alerting-types/rule_type_types.ts b/packages/kbn-alerting-types/rule_type_types.ts index a9f6f7c03070c..9b8fa1622b126 100644 --- a/packages/kbn-alerting-types/rule_type_types.ts +++ b/packages/kbn-alerting-types/rule_type_types.ts @@ -9,20 +9,13 @@ import type { LicenseType } from '@kbn/licensing-plugin/common/types'; import type { RecoveredActionGroupId, DefaultActionGroupId } from './builtin_action_groups_types'; import { ActionGroup } from './action_group_types'; +import { ActionVariable } from './action_variable'; interface ConsumerPrivileges { read: boolean; all: boolean; } -export interface ActionVariable { - name: string; - description: string; - deprecated?: boolean; - useWithTripleBracesInTemplates?: boolean; - usesPublicBaseUrl?: boolean; -} - export interface RuleType< ActionGroupIds extends Exclude = DefaultActionGroupId, RecoveryActionGroupId extends string = RecoveredActionGroupId diff --git a/x-pack/plugins/alerting/server/task_runner/transform_action_params.ts b/x-pack/plugins/alerting/server/task_runner/transform_action_params.ts index 65fa3dae5f89d..fb934db0ffb7d 100644 --- a/x-pack/plugins/alerting/server/task_runner/transform_action_params.ts +++ b/x-pack/plugins/alerting/server/task_runner/transform_action_params.ts @@ -6,6 +6,7 @@ */ import { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; +import { ActionContextVariables, SummaryActionContextVariables } from '@kbn/alerting-types'; import { AADAlert } from '@kbn/alerts-as-data-utils'; import { mapKeys, snakeCase } from 'lodash/fp'; import { @@ -85,7 +86,8 @@ export function transformActionParams({ // when the list of variables we pass in here changes, // the UI will need to be updated as well; see: // x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.ts - const variables = { + + const variables: ActionContextVariables = { alertId, alertName, spaceId, @@ -115,14 +117,19 @@ export function transformActionParams({ flapping, consecutiveMatches, }, + }; + + const variablesWithAADFields: Record = { ...(aadAlert ? { ...aadAlert } : {}), + // we do not want the AAD fields to overwrite the base fields + ...variables, }; return actionsPlugin.renderActionParameterTemplates( actionTypeId, actionId, actionParams, - variables + variablesWithAADFields ); } @@ -149,7 +156,11 @@ export function transformSummaryActionParams({ kibanaBaseUrl?: string; ruleUrl?: string; }): RuleActionParams { - const variables = { + // when the list of variables we pass in here changes, + // the UI will need to be updated as well; see: + // x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.ts + + const variables: SummaryActionContextVariables = { alertId: rule.id, alertName: rule.name, spaceId, @@ -192,10 +203,8 @@ export function transformSummaryActionParams({ }, alerts, }; - return actionsPlugin.renderActionParameterTemplates( - actionTypeId, - actionId, - actionParams, - variables - ); + + return actionsPlugin.renderActionParameterTemplates(actionTypeId, actionId, actionParams, { + ...variables, + }); } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c5705e66fa7fb..f232799d9e1ef 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -41809,8 +41809,6 @@ "xpack.transform.wizard.previousStepButton": "Précédent", "xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupLabel": "Cet élément a été déclassé au profit de {variable}.", "xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupNameLabel": "Cet élément a été déclassé au profit de {variable}.", - "xpack.triggersActionsUI.actionVariables.legacyAlertActionSubGroupLabel": "Cet élément a été déclassé au profit de {variable}.", - "xpack.triggersActionsUI.actionVariables.legacyAlertIdLabel": "Cet élément a été déclassé au profit de {variable}.", "xpack.triggersActionsUI.actionVariables.legacyAlertInstanceIdLabel": "Cet élément a été déclassé au profit de {variable}.", "xpack.triggersActionsUI.actionVariables.legacyAlertNameLabel": "Cet élément a été déclassé au profit de {variable}.", "xpack.triggersActionsUI.actionVariables.legacyParamsLabel": "Cet élément a été déclassé au profit de {variable}.", @@ -41971,7 +41969,6 @@ "xpack.triggersActionsUI.updateApiKeyConfirmModal.failureMessage": "Impossible de mettre à jour {idsToUpdate, plural, one {la clé} other {les clés}} de l'API", "xpack.triggersActionsUI.actionVariables.alertActionGroupLabel": "Groupe d'actions de l'alerte ayant programmé les actions pour la règle.", "xpack.triggersActionsUI.actionVariables.alertActionGroupNameLabel": "Nom lisible par l'utilisateur du groupe d'actions de l'alerte ayant programmé les actions pour la règle.", - "xpack.triggersActionsUI.actionVariables.alertActionSubgroupLabel": "Sous-groupe d'actions de l'alerte ayant programmé les actions pour la règle.", "xpack.triggersActionsUI.actionVariables.alertFlappingLabel": "Indicateur sur l'alerte spécifiant si le statut de l'alerte change fréquemment.", "xpack.triggersActionsUI.actionVariables.alertIdLabel": "ID de l'alerte ayant programmé les actions pour la règle.", "xpack.triggersActionsUI.actionVariables.allAlertsCountLabel": "Décompte de toutes les alertes.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 61f627ceea468..c900fb526b19e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -41781,8 +41781,6 @@ "xpack.transform.wizard.previousStepButton": "前へ", "xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupLabel": "{variable}の導入により、これは廃止される予定です。", "xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupNameLabel": "{variable}の導入により、これは廃止される予定です。", - "xpack.triggersActionsUI.actionVariables.legacyAlertActionSubGroupLabel": "{variable}の導入により、これは廃止される予定です。", - "xpack.triggersActionsUI.actionVariables.legacyAlertIdLabel": "{variable}の導入により、これは廃止される予定です。", "xpack.triggersActionsUI.actionVariables.legacyAlertInstanceIdLabel": "{variable}の導入により、これは廃止される予定です。", "xpack.triggersActionsUI.actionVariables.legacyAlertNameLabel": "{variable}の導入により、これは廃止される予定です。", "xpack.triggersActionsUI.actionVariables.legacyParamsLabel": "{variable}の導入により、これは廃止される予定です。", @@ -41941,7 +41939,6 @@ "xpack.triggersActionsUI.updateApiKeyConfirmModal.failureMessage": "API {idsToUpdate, plural, other {キー}}を更新できませんでした", "xpack.triggersActionsUI.actionVariables.alertActionGroupLabel": "ルールのアクションをスケジュールしたアラートのアクショングループ。", "xpack.triggersActionsUI.actionVariables.alertActionGroupNameLabel": "ルールのアクションをスケジュールしたアラートのアクショングループの人間が読み取れる名前。", - "xpack.triggersActionsUI.actionVariables.alertActionSubgroupLabel": "ルールのアクションをスケジュールしたアラートのアクションサブグループ。", "xpack.triggersActionsUI.actionVariables.alertFlappingLabel": "アラートの状態が繰り返し変化しているかどうかを示すアラートのフラグ。", "xpack.triggersActionsUI.actionVariables.alertIdLabel": "ルールのアクションをスケジュールしたアラートのID。", "xpack.triggersActionsUI.actionVariables.allAlertsCountLabel": "すべてのアラートのカウント。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 1af015aa40bd2..895881c1758ec 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -41828,8 +41828,6 @@ "xpack.transform.wizard.previousStepButton": "上一步", "xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupLabel": "其已弃用,将由 {variable} 替代。", "xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupNameLabel": "其已弃用,将由 {variable} 替代。", - "xpack.triggersActionsUI.actionVariables.legacyAlertActionSubGroupLabel": "其已弃用,将由 {variable} 替代。", - "xpack.triggersActionsUI.actionVariables.legacyAlertIdLabel": "其已弃用,将由 {variable} 替代。", "xpack.triggersActionsUI.actionVariables.legacyAlertInstanceIdLabel": "其已弃用,将由 {variable} 替代。", "xpack.triggersActionsUI.actionVariables.legacyAlertNameLabel": "其已弃用,将由 {variable} 替代。", "xpack.triggersActionsUI.actionVariables.legacyParamsLabel": "其已弃用,将由 {variable} 替代。", @@ -41989,7 +41987,6 @@ "xpack.triggersActionsUI.updateApiKeyConfirmModal.failureMessage": "无法更新 API {idsToUpdate, plural, other {密钥}}", "xpack.triggersActionsUI.actionVariables.alertActionGroupLabel": "已为规则计划操作的告警的操作组。", "xpack.triggersActionsUI.actionVariables.alertActionGroupNameLabel": "已为规则计划操作的告警的操作组的可人工读取名称。", - "xpack.triggersActionsUI.actionVariables.alertActionSubgroupLabel": "已为规则计划操作的告警的操作子组。", "xpack.triggersActionsUI.actionVariables.alertFlappingLabel": "告警上指示告警状态是否重复更改的标志。", "xpack.triggersActionsUI.actionVariables.alertIdLabel": "已为规则计划操作的告警的 ID。", "xpack.triggersActionsUI.actionVariables.allAlertsCountLabel": "所有告警的计数。", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.test.ts index ac9f64ee7eae7..ef1c6f531848a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.test.ts @@ -38,45 +38,6 @@ const mockParamsVariables = (withBraces: boolean = false) => [ ]; const expectedTransformResult = [ - { description: 'The ID of the rule.', name: 'rule.id' }, - { description: 'The name of the rule.', name: 'rule.name' }, - { description: 'The space ID of the rule.', name: 'rule.spaceId' }, - { description: 'The tags of the rule.', name: 'rule.tags' }, - { description: 'The type of rule.', name: 'rule.type' }, - { - description: - 'The URL to the rule that generated the alert. This will be an empty string if the server.publicBaseUrl is not configured.', - name: 'rule.url', - usesPublicBaseUrl: true, - }, - { description: 'The date the rule scheduled the action.', name: 'date' }, - { description: 'The ID of the alert that scheduled actions for the rule.', name: 'alert.id' }, - { - description: 'The action group of the alert that scheduled actions for the rule.', - name: 'alert.actionGroup', - }, - { - description: 'The action subgroup of the alert that scheduled actions for the rule.', - name: 'alert.actionSubgroup', - }, - { - description: - 'The human readable name of the action group of the alert that scheduled actions for the rule.', - name: 'alert.actionGroupName', - }, - { - description: - 'A flag on the alert that indicates whether the alert status is changing repeatedly.', - name: 'alert.flapping', - }, - { - description: 'The number of consecutive runs that meet the rule conditions.', - name: 'alert.consecutiveMatches', - }, - { - description: 'The configured server.publicBaseUrl value or empty string if not configured.', - name: 'kibanaBaseUrl', - }, { deprecated: true, description: 'This has been deprecated in favor of rule.id.', @@ -104,24 +65,59 @@ const expectedTransformResult = [ }, { deprecated: true, - description: 'This has been deprecated in favor of alert.actionSubgroup.', - name: 'alertActionSubgroup', + description: 'This has been deprecated in favor of rule.tags.', + name: 'tags', }, { deprecated: true, description: 'This has been deprecated in favor of rule.spaceId.', name: 'spaceId', }, - { - deprecated: true, - description: 'This has been deprecated in favor of rule.tags.', - name: 'tags', - }, { deprecated: true, description: 'This has been deprecated in favor of rule.params.', name: 'params', }, + { description: 'The date the rule scheduled the action.', name: 'date' }, + { + description: 'The configured server.publicBaseUrl value or empty string if not configured.', + name: 'kibanaBaseUrl', + }, + { description: 'The ID of the rule.', name: 'rule.id' }, + { description: 'The name of the rule.', name: 'rule.name' }, + { description: 'The space ID of the rule.', name: 'rule.spaceId' }, + { description: 'The type of rule.', name: 'rule.type' }, + { description: 'The tags of the rule.', name: 'rule.tags' }, + { + description: 'The parameters of the rule.', + name: 'rule.params', + }, + { + description: + 'The URL to the rule that generated the alert. This will be an empty string if the server.publicBaseUrl is not configured.', + name: 'rule.url', + usesPublicBaseUrl: true, + }, + { description: 'The ID of the alert that scheduled actions for the rule.', name: 'alert.id' }, + { description: 'The UUID of the alert that scheduled actions for the rule.', name: 'alert.uuid' }, + { + description: 'The action group of the alert that scheduled actions for the rule.', + name: 'alert.actionGroup', + }, + { + description: + 'The human readable name of the action group of the alert that scheduled actions for the rule.', + name: 'alert.actionGroupName', + }, + { + description: + 'A flag on the alert that indicates whether the alert status is changing repeatedly.', + name: 'alert.flapping', + }, + { + description: 'The number of consecutive runs that meet the rule conditions.', + name: 'alert.consecutiveMatches', + }, ]; const expectedContextTransformResult = (withBraces: boolean = false) => [ @@ -154,43 +150,14 @@ const expectedParamsTransformResult = (withBraces: boolean = false) => [ ]; const expectedSummaryTransformResult = [ + ...expectedTransformResult, { - description: 'The configured server.publicBaseUrl value or empty string if not configured.', - name: 'kibanaBaseUrl', - }, - { - description: 'The date the rule scheduled the action.', - name: 'date', - }, - { - description: 'The params of the rule.', - name: 'rule.params', - }, - { - description: 'The ID of the rule.', - name: 'rule.id', - }, - { - description: 'The name of the rule.', - name: 'rule.name', - }, - { - description: 'The type of rule.', - name: 'rule.type', - }, - { - description: - 'The URL to the rule that generated the alert. This will be an empty string if the server.publicBaseUrl is not configured.', - name: 'rule.url', - usesPublicBaseUrl: true, - }, - { - description: 'The tags of the rule.', - name: 'rule.tags', + description: 'The count of all alerts.', + name: 'alerts.all.count', }, { - description: 'The space ID of the rule.', - name: 'rule.spaceId', + description: 'An array of objects for all alerts.', + name: 'alerts.all.data', }, { description: 'The count of new alerts.', @@ -216,14 +183,6 @@ const expectedSummaryTransformResult = [ description: 'An array of objects for recovered alerts.', name: 'alerts.recovered.data', }, - { - description: 'The count of all alerts.', - name: 'alerts.all.count', - }, - { - description: 'An array of objects for all alerts.', - name: 'alerts.all.data', - }, ]; describe('transformActionVariables', () => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.ts index 4385db7521e22..38194c28195db 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_variables.ts @@ -8,6 +8,10 @@ import { i18n } from '@kbn/i18n'; import { pick } from 'lodash'; import { ActionVariable } from '@kbn/alerting-plugin/common'; +import { + ActionContextVariablesFlatten, + SummaryActionContextVariablesFlatten, +} from '@kbn/alerting-types'; import { ActionVariables, REQUIRED_ACTION_VARIABLES, CONTEXT_ACTION_VARIABLES } from '../../types'; export type OmitMessageVariablesType = 'all' | 'keepContext'; @@ -71,6 +75,7 @@ export enum AlertProvidedActionVariables { ruleParams = 'rule.params', date = 'date', alertId = 'alert.id', + alertUuid = 'alert.uuid', alertActionGroup = 'alert.actionGroup', alertActionGroupName = 'alert.actionGroupName', alertActionSubgroup = 'alert.actionSubgroup', @@ -92,7 +97,6 @@ export enum LegacyAlertProvidedActionVariables { } export enum SummaryAlertProvidedActionVariables { - ruleParams = 'rule.params', newAlertsCount = 'alerts.new.count', newAlertsData = 'alerts.new.data', ongoingAlertsCount = 'alerts.ongoing.count', @@ -103,153 +107,22 @@ export enum SummaryAlertProvidedActionVariables { allAlertsData = 'alerts.all.data', } -const AlertProvidedActionVariableDescriptions = { - [AlertProvidedActionVariables.ruleId]: { - name: AlertProvidedActionVariables.ruleId, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleIdLabel', { - defaultMessage: 'The ID of the rule.', - }), - }, - [AlertProvidedActionVariables.ruleName]: { - name: AlertProvidedActionVariables.ruleName, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleNameLabel', { - defaultMessage: 'The name of the rule.', - }), - }, - [AlertProvidedActionVariables.ruleSpaceId]: { - name: AlertProvidedActionVariables.ruleSpaceId, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleSpaceIdLabel', { - defaultMessage: 'The space ID of the rule.', - }), - }, - [AlertProvidedActionVariables.ruleTags]: { - name: AlertProvidedActionVariables.ruleTags, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleTagsLabel', { - defaultMessage: 'The tags of the rule.', - }), - }, - [AlertProvidedActionVariables.ruleType]: { - name: AlertProvidedActionVariables.ruleType, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleTypeLabel', { - defaultMessage: 'The type of rule.', - }), - }, - [AlertProvidedActionVariables.ruleUrl]: { - name: AlertProvidedActionVariables.ruleUrl, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleUrlLabel', { - defaultMessage: - 'The URL to the rule that generated the alert. This will be an empty string if the server.publicBaseUrl is not configured.', - }), - usesPublicBaseUrl: true, - }, - [AlertProvidedActionVariables.date]: { - name: AlertProvidedActionVariables.date, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.dateLabel', { - defaultMessage: 'The date the rule scheduled the action.', - }), - }, - [AlertProvidedActionVariables.kibanaBaseUrl]: { - name: AlertProvidedActionVariables.kibanaBaseUrl, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.kibanaBaseUrlLabel', { - defaultMessage: - 'The configured server.publicBaseUrl value or empty string if not configured.', - }), - }, -}; - -function prefixKeys(actionVariables: ActionVariable[], prefix: string): ActionVariable[] { - return actionVariables.map((actionVariable) => { - return { ...actionVariable, name: `${prefix}${actionVariable.name}` }; - }); -} +type ActionVariablesWithoutName = Omit; -// this list should be the same as in: -// x-pack/plugins/alerting/server/task_runner/transform_action_params.ts -function getAlwaysProvidedActionVariables(): ActionVariable[] { - const result: ActionVariable[] = []; - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleId]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleName]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleSpaceId]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleTags]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleType]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleUrl]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.date]); - - result.push({ - name: AlertProvidedActionVariables.alertId, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertIdLabel', { - defaultMessage: 'The ID of the alert that scheduled actions for the rule.', - }), - }); - - result.push({ - name: AlertProvidedActionVariables.alertActionGroup, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertActionGroupLabel', { - defaultMessage: 'The action group of the alert that scheduled actions for the rule.', - }), - }); - - result.push({ - name: AlertProvidedActionVariables.alertActionSubgroup, - description: i18n.translate( - 'xpack.triggersActionsUI.actionVariables.alertActionSubgroupLabel', - { - defaultMessage: 'The action subgroup of the alert that scheduled actions for the rule.', - } - ), - }); - - result.push({ - name: AlertProvidedActionVariables.alertActionGroupName, - description: i18n.translate( - 'xpack.triggersActionsUI.actionVariables.alertActionGroupNameLabel', - { - defaultMessage: - 'The human readable name of the action group of the alert that scheduled actions for the rule.', - } - ), - }); - - result.push({ - name: AlertProvidedActionVariables.alertFlapping, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertFlappingLabel', { - defaultMessage: - 'A flag on the alert that indicates whether the alert status is changing repeatedly.', - }), - }); - - result.push({ - name: AlertProvidedActionVariables.alertConsecutiveMatches, - description: i18n.translate( - 'xpack.triggersActionsUI.actionVariables.alertConsecutiveMatchesLabel', - { - defaultMessage: 'The number of consecutive runs that meet the rule conditions.', - } - ), - }); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.kibanaBaseUrl]); - - result.push({ - name: LegacyAlertProvidedActionVariables.alertId, - deprecated: true, +const AlertProvidedActionVariableDescriptions: Record< + ActionContextVariablesFlatten, + ActionVariablesWithoutName +> = Object.freeze({ + [LegacyAlertProvidedActionVariables.alertId]: { description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacyAlertIdLabel', { defaultMessage: 'This has been deprecated in favor of {variable}.', values: { variable: AlertProvidedActionVariables.ruleId, }, }), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.alertName, + deprecated: true, + }, + [LegacyAlertProvidedActionVariables.alertName]: { deprecated: true, description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacyAlertNameLabel', { defaultMessage: 'This has been deprecated in favor of {variable}.', @@ -257,10 +130,8 @@ function getAlwaysProvidedActionVariables(): ActionVariable[] { variable: AlertProvidedActionVariables.ruleName, }, }), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.alertInstanceId, + }, + [LegacyAlertProvidedActionVariables.alertInstanceId]: { deprecated: true, description: i18n.translate( 'xpack.triggersActionsUI.actionVariables.legacyAlertInstanceIdLabel', @@ -271,10 +142,8 @@ function getAlwaysProvidedActionVariables(): ActionVariable[] { }, } ), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.alertActionGroup, + }, + [LegacyAlertProvidedActionVariables.alertActionGroup]: { deprecated: true, description: i18n.translate( 'xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupLabel', @@ -285,10 +154,8 @@ function getAlwaysProvidedActionVariables(): ActionVariable[] { }, } ), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.alertActionGroupName, + }, + [LegacyAlertProvidedActionVariables.alertActionGroupName]: { deprecated: true, description: i18n.translate( 'xpack.triggersActionsUI.actionVariables.legacyAlertActionGroupNameLabel', @@ -299,46 +166,26 @@ function getAlwaysProvidedActionVariables(): ActionVariable[] { }, } ), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.alertActionSubgroup, - deprecated: true, - description: i18n.translate( - 'xpack.triggersActionsUI.actionVariables.legacyAlertActionSubGroupLabel', - { - defaultMessage: 'This has been deprecated in favor of {variable}.', - values: { - variable: AlertProvidedActionVariables.alertActionSubgroup, - }, - } - ), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.spaceId, + }, + [LegacyAlertProvidedActionVariables.tags]: { deprecated: true, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacySpaceIdLabel', { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacyTagsLabel', { defaultMessage: 'This has been deprecated in favor of {variable}.', values: { - variable: AlertProvidedActionVariables.ruleSpaceId, + variable: AlertProvidedActionVariables.ruleTags, }, }), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.tags, + }, + [LegacyAlertProvidedActionVariables.spaceId]: { deprecated: true, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacyTagsLabel', { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacySpaceIdLabel', { defaultMessage: 'This has been deprecated in favor of {variable}.', values: { - variable: AlertProvidedActionVariables.ruleTags, + variable: AlertProvidedActionVariables.ruleSpaceId, }, }), - }); - - result.push({ - name: LegacyAlertProvidedActionVariables.params, + }, + [LegacyAlertProvidedActionVariables.params]: { deprecated: true, description: i18n.translate('xpack.triggersActionsUI.actionVariables.legacyParamsLabel', { defaultMessage: 'This has been deprecated in favor of {variable}.', @@ -346,89 +193,163 @@ function getAlwaysProvidedActionVariables(): ActionVariable[] { variable: AlertProvidedActionVariables.ruleParams, }, }), - }); - - return result; -} -function getSummaryAlertActionVariables(): ActionVariable[] { - const result: ActionVariable[] = []; - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.kibanaBaseUrl]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.date]); - - result.push({ - name: SummaryAlertProvidedActionVariables.ruleParams, + }, + [AlertProvidedActionVariables.date]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.dateLabel', { + defaultMessage: 'The date the rule scheduled the action.', + }), + }, + [AlertProvidedActionVariables.kibanaBaseUrl]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.kibanaBaseUrlLabel', { + defaultMessage: + 'The configured server.publicBaseUrl value or empty string if not configured.', + }), + }, + [AlertProvidedActionVariables.ruleId]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleIdLabel', { + defaultMessage: 'The ID of the rule.', + }), + }, + [AlertProvidedActionVariables.ruleName]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleNameLabel', { + defaultMessage: 'The name of the rule.', + }), + }, + [AlertProvidedActionVariables.ruleSpaceId]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleSpaceIdLabel', { + defaultMessage: 'The space ID of the rule.', + }), + }, + [AlertProvidedActionVariables.ruleType]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleTypeLabel', { + defaultMessage: 'The type of rule.', + }), + }, + [AlertProvidedActionVariables.ruleTags]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleTagsLabel', { + defaultMessage: 'The tags of the rule.', + }), + }, + [AlertProvidedActionVariables.ruleParams]: { description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleParamsLabel', { - defaultMessage: 'The params of the rule.', + defaultMessage: 'The parameters of the rule.', }), - }); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleId]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleName]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleType]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleUrl]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleTags]); - - result.push(AlertProvidedActionVariableDescriptions[AlertProvidedActionVariables.ruleSpaceId]); - - result.push({ - name: SummaryAlertProvidedActionVariables.newAlertsCount, + }, + [AlertProvidedActionVariables.ruleUrl]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.ruleUrlLabel', { + defaultMessage: + 'The URL to the rule that generated the alert. This will be an empty string if the server.publicBaseUrl is not configured.', + }), + usesPublicBaseUrl: true, + }, + [AlertProvidedActionVariables.alertId]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertIdLabel', { + defaultMessage: 'The ID of the alert that scheduled actions for the rule.', + }), + }, + [AlertProvidedActionVariables.alertUuid]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertUuidLabel', { + defaultMessage: 'The UUID of the alert that scheduled actions for the rule.', + }), + }, + [AlertProvidedActionVariables.alertActionGroup]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertActionGroupLabel', { + defaultMessage: 'The action group of the alert that scheduled actions for the rule.', + }), + }, + [AlertProvidedActionVariables.alertActionGroupName]: { + description: i18n.translate( + 'xpack.triggersActionsUI.actionVariables.alertActionGroupNameLabel', + { + defaultMessage: + 'The human readable name of the action group of the alert that scheduled actions for the rule.', + } + ), + }, + [AlertProvidedActionVariables.alertFlapping]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.alertFlappingLabel', { + defaultMessage: + 'A flag on the alert that indicates whether the alert status is changing repeatedly.', + }), + }, + [AlertProvidedActionVariables.alertConsecutiveMatches]: { + description: i18n.translate( + 'xpack.triggersActionsUI.actionVariables.alertConsecutiveMatchesLabel', + { + defaultMessage: 'The number of consecutive runs that meet the rule conditions.', + } + ), + }, +}); + +const SummarizedAlertProvidedActionVariableDescriptions: Record< + SummaryActionContextVariablesFlatten, + Omit +> = Object.freeze({ + ...AlertProvidedActionVariableDescriptions, + [SummaryAlertProvidedActionVariables.allAlertsCount]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.allAlertsCountLabel', { + defaultMessage: 'The count of all alerts.', + }), + }, + [SummaryAlertProvidedActionVariables.allAlertsData]: { + description: i18n.translate('xpack.triggersActionsUI.actionVariables.allAlertsDataLabel', { + defaultMessage: 'An array of objects for all alerts.', + }), + }, + [SummaryAlertProvidedActionVariables.newAlertsCount]: { description: i18n.translate('xpack.triggersActionsUI.actionVariables.newAlertsCountLabel', { defaultMessage: 'The count of new alerts.', }), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.newAlertsData, + }, + [SummaryAlertProvidedActionVariables.newAlertsData]: { description: i18n.translate('xpack.triggersActionsUI.actionVariables.newAlertsDataLabel', { defaultMessage: 'An array of objects for new alerts.', }), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.ongoingAlertsCount, + }, + [SummaryAlertProvidedActionVariables.ongoingAlertsCount]: { description: i18n.translate('xpack.triggersActionsUI.actionVariables.ongoingAlertsCountLabel', { defaultMessage: 'The count of ongoing alerts.', }), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.ongoingAlertsData, + }, + [SummaryAlertProvidedActionVariables.ongoingAlertsData]: { description: i18n.translate('xpack.triggersActionsUI.actionVariables.ongoingAlertsDataLabel', { defaultMessage: 'An array of objects for ongoing alerts.', }), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.recoveredAlertsCount, + }, + [SummaryAlertProvidedActionVariables.recoveredAlertsCount]: { description: i18n.translate( 'xpack.triggersActionsUI.actionVariables.recoveredAlertsCountLabel', { defaultMessage: 'The count of recovered alerts.', } ), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.recoveredAlertsData, + }, + [SummaryAlertProvidedActionVariables.recoveredAlertsData]: { description: i18n.translate( 'xpack.triggersActionsUI.actionVariables.recoveredAlertsDataLabel', { defaultMessage: 'An array of objects for recovered alerts.', } ), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.allAlertsCount, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.allAlertsCountLabel', { - defaultMessage: 'The count of all alerts.', - }), - }); - result.push({ - name: SummaryAlertProvidedActionVariables.allAlertsData, - description: i18n.translate('xpack.triggersActionsUI.actionVariables.allAlertsDataLabel', { - defaultMessage: 'An array of objects for all alerts.', - }), - }); + }, +}); - return result; +function prefixKeys(actionVariables: ActionVariable[], prefix: string): ActionVariable[] { + return actionVariables.map((actionVariable) => { + return { ...actionVariable, name: `${prefix}${actionVariable.name}` }; + }); } + +const transformContextVariables = ( + variables: Record +): ActionVariable[] => + Object.entries(variables).map(([key, variable]) => ({ ...variable, name: key })); + +export const getAlwaysProvidedActionVariables = (): ActionVariable[] => { + return transformContextVariables(AlertProvidedActionVariableDescriptions); +}; + +export const getSummaryAlertActionVariables = (): ActionVariable[] => { + return transformContextVariables(SummarizedAlertProvidedActionVariableDescriptions); +}; diff --git a/x-pack/plugins/triggers_actions_ui/tsconfig.json b/x-pack/plugins/triggers_actions_ui/tsconfig.json index bb6ad80dd27c9..363c6bc1b2312 100644 --- a/x-pack/plugins/triggers_actions_ui/tsconfig.json +++ b/x-pack/plugins/triggers_actions_ui/tsconfig.json @@ -67,7 +67,8 @@ "@kbn/react-kibana-context-theme", "@kbn/controls-plugin", "@kbn/search-types", - "@kbn/alerting-comparators" + "@kbn/alerting-comparators", + "@kbn/alerting-types" ], "exclude": ["target/**/*"] } From d2c30baab049fbf8a8a0e02f4bb8db757bff9052 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 4 Jun 2024 07:57:36 -0700 Subject: [PATCH 46/82] [UII] On serverless, remove `manage_service_account` and `read_cross_cluster` privileges (#184688) ## Summary Resolves [#181909](https://github.com/elastic/kibana/issues/181909). For serverless, some privileges are not supported. This PR: - Removes `manage_service_account` as a required cluster privilege for accessing Fleet - Removes `read_cross_cluster` from the list of index/data stream privileges that is generated for an agent policy ### 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 --- x-pack/plugins/fleet/server/mocks/index.ts | 14 +++++++- .../plugins/fleet/server/routes/app/index.ts | 9 +++-- .../server/services/package_policy.test.ts | 36 +++++++++++++++++++ .../fleet/server/services/package_policy.ts | 18 +++++----- 4 files changed, 64 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index bf363fa591238..9e84626455b1b 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -17,6 +17,7 @@ import { dataPluginMock } from '@kbn/data-plugin/server/mocks'; import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; import { securityMock } from '@kbn/security-plugin/server/mocks'; +import { cloudMock } from '@kbn/cloud-plugin/public/mocks'; import type { PackagePolicyClient } from '../services/package_policy_service'; import type { AgentPolicyServiceInterface } from '../services'; @@ -55,7 +56,8 @@ export interface MockedFleetAppContext extends FleetAppContext { } export const createAppContextStartContractMock = ( - configOverrides: Partial = {} + configOverrides: Partial = {}, + isServerless: boolean = false ): MockedFleetAppContext => { const config = { agents: { enabled: true, elasticsearch: {} }, @@ -93,6 +95,16 @@ export const createAppContextStartContractMock = ( bulkActionsResolver: {} as any, messageSigningService: createMessageSigningServiceMock(), uninstallTokenService: createUninstallTokenServiceMock(), + ...(isServerless + ? { + cloud: { + ...cloudMock.createSetup(), + apm: {}, + isCloudEnabled: true, + isServerlessEnabled: true, + }, + } + : {}), }; }; diff --git a/x-pack/plugins/fleet/server/routes/app/index.ts b/x-pack/plugins/fleet/server/routes/app/index.ts index 71f528454f29b..db1b86c12243b 100644 --- a/x-pack/plugins/fleet/server/routes/app/index.ts +++ b/x-pack/plugins/fleet/server/routes/app/index.ts @@ -28,6 +28,7 @@ export const getCheckPermissionsHandler: FleetRequestHandler< error: 'MISSING_SECURITY', }; + const isServerless = appContextService.getCloud()?.isServerlessEnabled; const isSubfeaturePrivilegesEnabled = appContextService.getExperimentalFeatures().subfeaturePrivileges ?? false; @@ -47,7 +48,9 @@ export const getCheckPermissionsHandler: FleetRequestHandler< error: 'MISSING_PRIVILEGES', } as CheckPermissionsResponse, }); - } else if (request.query.fleetServerSetup) { + } + // check the manage_service_account cluster privilege only on stateful + else if (request.query.fleetServerSetup && !isServerless) { const esClient = (await context.core).elasticsearch.client.asCurrentUser; const { has_all_requested: hasAllPrivileges } = await esClient.security.hasPrivileges({ body: { cluster: ['manage_service_account'] }, @@ -74,8 +77,8 @@ export const getCheckPermissionsHandler: FleetRequestHandler< } as CheckPermissionsResponse, }); } - // check the manage_service_account cluster privilege - else if (request.query.fleetServerSetup) { + // check the manage_service_account cluster privilege only on stateful + else if (request.query.fleetServerSetup && !isServerless) { const esClient = (await context.core).elasticsearch.client.asCurrentUser; const { has_all_requested: hasAllPrivileges } = await esClient.security.hasPrivileges({ body: { cluster: ['manage_service_account'] }, diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 9d288049f67df..ba7ea659a1d05 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -5196,6 +5196,14 @@ describe('_applyIndexPrivileges()', () => { }; } + beforeEach(() => { + appContextService.start(createAppContextStartContractMock()); + }); + + afterEach(() => { + appContextService.stop(); + }); + it('should do nothing if packageStream has no privileges', () => { const packageStream = createPackageStream(); const inputStream = createInputStream(); @@ -5306,6 +5314,34 @@ describe('_applyIndexPrivileges()', () => { const streamOut = _applyIndexPrivileges(packageStream, inputStream); expect(streamOut).toEqual(expectedStream); }); + + it('should apply correct privileges for serverless', () => { + appContextService.start(createAppContextStartContractMock({}, true)); + const mixedPrivileges = [ + 'create_doc', + 'auto_configure', + 'read_cross_cluster', + 'idontexist', + 'delete', + ]; + + const packageStream = createPackageStream(mixedPrivileges); + const inputStream = createInputStream(); + const expectedStream = { + ...inputStream, + data_stream: { + ...inputStream.data_stream, + elasticsearch: { + privileges: { + indices: ['create_doc', 'auto_configure'], + }, + }, + }, + }; + + const streamOut = _applyIndexPrivileges(packageStream, inputStream); + expect(streamOut).toEqual(expectedStream); + }); }); describe('_validateRestrictedFieldsNotModifiedOrThrow()', () => { diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index 890e5adcbf55a..3b53768ce06f0 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -172,15 +172,6 @@ async function getPkgInfoAssetsMap({ return packageInfosandAssetsMap; } -export const DATA_STREAM_ALLOWED_INDEX_PRIVILEGES = new Set([ - 'auto_configure', - 'create_doc', - 'maintenance', - 'monitor', - 'read', - 'read_cross_cluster', -]); - class PackagePolicyClientImpl implements PackagePolicyClient { public async create( soClient: SavedObjectsClientContract, @@ -2204,6 +2195,15 @@ export function _applyIndexPrivileges( return streamOut; } + const isServerless = appContextService.getCloud()?.isServerlessEnabled; + const DATA_STREAM_ALLOWED_INDEX_PRIVILEGES = new Set([ + 'auto_configure', + 'create_doc', + 'maintenance', + 'monitor', + 'read', + ...(isServerless ? [] : ['read_cross_cluster']), + ]); const [valid, invalid] = partition(indexPrivileges, (permission) => DATA_STREAM_ALLOWED_INDEX_PRIVILEGES.has(permission) ); From 506ff4cbb62e0508377cf63aed85d22d1f217ee7 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Tue, 4 Jun 2024 10:04:19 -0500 Subject: [PATCH 47/82] [Security Solution][Expandable flyout] - replace advanced settings with feature flag (#184169) --- .../settings/setting_ids/index.ts | 3 - .../settings/security_project/index.ts | 1 - .../server/collectors/management/schema.ts | 4 - .../server/collectors/management/types.ts | 1 - src/plugins/telemetry/schema/oss_plugins.json | 6 - .../security_solution/common/constants.ts | 3 - .../common/experimental_features.ts | 27 +-- .../public/cases/pages/index.tsx | 15 +- .../control_columns/row_action/index.test.tsx | 25 ++- .../control_columns/row_action/index.tsx | 24 +-- .../hooks/flyout/use_init_flyout_url_param.ts | 19 +- .../hooks/flyout/use_sync_flyout_url_param.ts | 10 +- .../alerts/alert_details_redirect.test.tsx | 8 +- .../pages/alerts/alert_details_redirect.tsx | 12 +- .../public/detections/pages/alerts/utils.ts | 6 +- .../users/observed_details/index.tsx | 6 +- .../right/hooks/use_flyout_is_expandable.ts | 11 +- .../cypress/e2e/policy/policy_details.cy.ts | 17 +- ...olicy_experimental_features_disabled.cy.ts | 13 +- .../cypress/e2e/policy/policy_list.cy.ts | 9 +- .../e2e/response_actions/isolate.cy.ts | 13 +- .../isolate_mocked_data.cy.ts | 10 +- .../cypress/e2e/sentinelone/isolate.cy.ts | 12 +- .../public/management/cypress/tasks/common.ts | 10 - .../open_timeline/note_previews/index.tsx | 12 +- .../hooks/use_detail_panel.test.tsx | 23 ++- .../side_panel/hooks/use_detail_panel.tsx | 13 +- .../timeline/body/events/stateful_event.tsx | 13 +- .../components/timeline/body/index.test.tsx | 60 +++--- .../body/renderers/host_name.test.tsx | 12 +- .../timeline/body/renderers/host_name.tsx | 25 +-- .../body/renderers/user_name.test.tsx | 12 +- .../timeline/body/renderers/user_name.tsx | 26 +-- .../unified_components/data_table/index.tsx | 17 +- ...nified_timeline_expandable_flyout.test.tsx | 41 ++-- ...use_unified_timeline_expandable_flyout.tsx | 10 +- .../security_solution/server/ui_settings.ts | 18 -- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../alert_threat_enrichments.cy.ts | 87 +++++---- .../e2e/entity_analytics/enrichments.cy.ts | 176 ++++++++++-------- .../e2e/explore/guided_onboarding/tour.cy.ts | 2 - .../alerts/alerts_details.cy.ts | 9 +- .../alerts/investigate_in_timeline.cy.ts | 168 +++++++++-------- .../cypress/screens/alerts_details.ts | 18 +- .../alert_details_right_panel_overview_tab.ts | 2 + .../alert_details_right_panel_table_tab.ts | 3 + .../cypress/screens/timeline.ts | 4 +- .../cypress/tasks/alerts_details.ts | 39 ---- .../api_calls/kibana_advanced_settings.ts | 9 +- ...ert_details_left_panel_correlations_tab.ts | 28 ++- ...alert_details_left_panel_prevalence_tab.ts | 12 +- .../alert_details_right_panel_overview_tab.ts | 8 + 54 files changed, 462 insertions(+), 656 deletions(-) diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index 0602ee6390629..32df8ac3240c4 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -174,9 +174,6 @@ export const SECURITY_SOLUTION_ENABLE_CCS_WARNING_ID = 'securitySolution:enableC export const SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID = 'securitySolution:showRelatedIntegrations'; export const SECURITY_SOLUTION_DEFAULT_ALERT_TAGS_KEY = 'securitySolution:alertTags' as const; -/** This Kibana Advanced Setting allows users to enable/disable the Expandable Flyout */ -export const SECURITY_SOLUTION_ENABLE_EXPANDABLE_FLYOUT_SETTING = - 'securitySolution:enableExpandableFlyout' as const; /** This Kibana Advanced Setting allows users to enable/disable querying cold and frozen data tiers in analyzer */ export const SECURITY_SOLUTION_EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER = 'securitySolution:excludeColdAndFrozenTiersInAnalyzer' as const; diff --git a/packages/serverless/settings/security_project/index.ts b/packages/serverless/settings/security_project/index.ts index 70b2305610aea..98dbaac5303a6 100644 --- a/packages/serverless/settings/security_project/index.ts +++ b/packages/serverless/settings/security_project/index.ts @@ -23,7 +23,6 @@ export const SECURITY_PROJECT_SETTINGS = [ settings.SECURITY_SOLUTION_NEWS_FEED_URL_ID, settings.SECURITY_SOLUTION_ENABLE_NEWS_FEED_ID, settings.SECURITY_SOLUTION_DEFAULT_ALERT_TAGS_KEY, - settings.SECURITY_SOLUTION_ENABLE_EXPANDABLE_FLYOUT_SETTING, settings.SECURITY_SOLUTION_ENABLE_ASSET_CRITICALITY_SETTING, settings.SECURITY_SOLUTION_EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER, ]; diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 3a81a37dba189..cf62f45ce3156 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -110,10 +110,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, - 'securitySolution:enableExpandableFlyout': { - type: 'boolean', - _meta: { description: 'Non-default value of setting.' }, - }, 'securitySolution:enableAssetCriticality': { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index 82f31eb629a89..6a5983df9ccfd 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -73,7 +73,6 @@ export interface UsageStats { 'securitySolution:defaultAnomalyScore': number; 'securitySolution:refreshIntervalDefaults': string; 'securitySolution:enableNewsFeed': boolean; - 'securitySolution:enableExpandableFlyout': boolean; 'securitySolution:enableAssetCriticality': boolean; 'securitySolution:excludeColdAndFrozenTiersInAnalyzer': boolean; 'securitySolution:enableCcsWarning': boolean; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 991536dd61078..417a59ad71bf7 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -9630,12 +9630,6 @@ "description": "Non-default value of setting." } }, - "securitySolution:enableExpandableFlyout": { - "type": "boolean", - "_meta": { - "description": "Non-default value of setting." - } - }, "securitySolution:enableAssetCriticality": { "type": "boolean", "_meta": { diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index c477a069c9c2e..1822e6be5cb81 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -168,9 +168,6 @@ export const DEFAULT_INDEX_PATTERN = [...INCLUDE_INDEX_PATTERN, ...EXCLUDE_ELAST /** This Kibana Advanced Setting enables the `Security news` feed widget */ export const ENABLE_NEWS_FEED_SETTING = 'securitySolution:enableNewsFeed' as const; -/** This Kibana Advanced Setting allows users to enable/disable the Expandable Flyout */ -export const ENABLE_EXPANDABLE_FLYOUT_SETTING = 'securitySolution:enableExpandableFlyout' as const; - /** This Kibana Advanced Setting allows users to enable/disable querying cold and frozen data tiers in analyzer */ export const EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER = 'securitySolution:excludeColdAndFrozenTiersInAnalyzer' as const; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index a3248bc4374ba..0e0065e6823ea 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -110,20 +110,9 @@ export const allowedExperimentalValues = Object.freeze({ alertTypeEnabled: false, /** - * Enables expandable flyout in create rule page, alert preview + * Disables expandable flyout */ - expandableFlyoutInCreateRuleEnabled: true, - - /** - * Enables expandable flyout for event type documents - */ - expandableEventFlyoutEnabled: true, - - /** - * Enables expandable flyout in timeline - */ - expandableTimelineFlyoutEnabled: true, - /* + expandableFlyoutDisabled: false, /** * Enables the Assistant Model Evaluation advanced setting and API endpoint, introduced in `8.11.0`. @@ -135,22 +124,12 @@ export const allowedExperimentalValues = Object.freeze({ */ assistantKnowledgeBaseByDefault: false, - /** - * Enables the new user details flyout displayed on the Alerts table. - */ - newUserDetailsFlyout: true, - /** * Enables the Managed User section inside the new user details flyout. - * To see this section you also need newUserDetailsFlyout flag enabled. + * To see this section you also need expandableFlyoutDisabled flag set to false. */ newUserDetailsFlyoutManagedUser: false, - /** - * Enables the new host details flyout displayed on the Alerts table. - */ - newHostDetailsFlyout: true, - /** * Enable risk engine client and initialisation of datastream, component templates and mappings */ diff --git a/x-pack/plugins/security_solution/public/cases/pages/index.tsx b/x-pack/plugins/security_solution/public/cases/pages/index.tsx index 7f242e5968811..e3eb2290e6e77 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/index.tsx @@ -9,8 +9,8 @@ import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { useDispatch } from 'react-redux'; import type { CaseViewRefreshPropInterface } from '@kbn/cases-plugin/common'; import { CaseMetricsFeature } from '@kbn/cases-plugin/common'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { DocumentDetailsRightPanelKey } from '../../flyout/document_details/shared/constants/panel_keys'; import { useTourContext } from '../../common/components/guided_onboarding_tour'; import { @@ -22,12 +22,7 @@ import { TimelineId } from '../../../common/types/timeline'; import { getRuleDetailsUrl, useFormatUrl } from '../../common/components/link_to'; import { useKibana, useNavigation } from '../../common/lib/kibana'; -import { - APP_ID, - CASES_PATH, - ENABLE_EXPANDABLE_FLYOUT_SETTING, - SecurityPageName, -} from '../../../common/constants'; +import { APP_ID, CASES_PATH, SecurityPageName } from '../../../common/constants'; import { timelineActions } from '../../timelines/store'; import { useSourcererDataView } from '../../sourcerer/containers'; import { SourcererScopeName } from '../../sourcerer/store/model'; @@ -63,7 +58,7 @@ const CaseContainerComponent: React.FC = () => { SecurityPageName.rules ); const { openFlyout } = useExpandableFlyoutApi(); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const getDetectionsRuleDetailsHref = useCallback( (ruleId) => detectionsFormatUrl(getRuleDetailsUrl(ruleId ?? '', detectionsUrlSearch)), @@ -74,7 +69,7 @@ const CaseContainerComponent: React.FC = () => { const showAlertDetails = useCallback( (alertId: string, index: string) => { - if (isSecurityFlyoutEnabled) { + if (!expandableFlyoutDisabled) { openFlyout({ right: { id: DocumentDetailsRightPanelKey, @@ -105,7 +100,7 @@ const CaseContainerComponent: React.FC = () => { ); } }, - [dispatch, isSecurityFlyoutEnabled, openFlyout, telemetry] + [dispatch, expandableFlyoutDisabled, openFlyout, telemetry] ); const endpointDetailsHref = (endpointId: string) => diff --git a/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.test.tsx index a6500a2ba5d10..a680590d3752a 100644 --- a/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.test.tsx @@ -15,6 +15,7 @@ import { useRouteSpy } from '../../../utils/route/use_route_spy'; import type { RouteSpyState } from '../../../utils/route/types'; import { SecurityPageName } from '@kbn/deeplinks-security'; import { createTelemetryServiceMock } from '../../../lib/telemetry/telemetry_service.mock'; +import { DocumentDetailsRightPanelKey } from '../../../../flyout/document_details/shared/constants/panel_keys'; const mockDispatch = jest.fn(); jest.mock('react-redux', () => { @@ -114,18 +115,7 @@ describe('RowAction', () => { expect(wrapper.getAllByTestId('expand-event')).not.toBeNull(); }); - test('Uses the old flyout when the experimental feature returns false', () => { - const wrapper = render( - - - - ); - fireEvent.click(wrapper.getByTestId('expand-event')); - expect(mockDispatch).toHaveBeenCalled(); - expect(mockOpenFlyout).not.toHaveBeenCalled(); - }); - - test('Uses the new flyout when the experimental feature returns false but the page is attackDiscovery', () => { + test('should always show expandable flyout if the page is attackDiscovery', () => { (useRouteSpy as jest.Mock).mockReturnValue([ { ...mockRouteSpy, pageName: SecurityPageName.attackDiscovery }, ]); @@ -136,6 +126,15 @@ describe('RowAction', () => { ); fireEvent.click(wrapper.getByTestId('expand-event')); expect(mockDispatch).not.toHaveBeenCalled(); - expect(mockOpenFlyout).toHaveBeenCalled(); + expect(mockOpenFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, + params: { + id: '1', + indexName: undefined, + scopeId: 'table-test', + }, + }, + }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx b/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx index 181b707e88d2d..c586e887ce5e7 100644 --- a/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx @@ -10,14 +10,10 @@ import React, { useCallback, useMemo } from 'react'; import { useDispatch } from 'react-redux'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { dataTableActions, TableId } from '@kbn/securitysolution-data-table'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useRouteSpy } from '../../../utils/route/use_route_spy'; import { useKibana } from '../../../lib/kibana'; import { timelineActions } from '../../../../timelines/store'; -import { - ENABLE_EXPANDABLE_FLYOUT_SETTING, - SecurityPageName, -} from '../../../../../common/constants'; +import { SecurityPageName } from '../../../../../common/constants'; import { DocumentDetailsRightPanelKey } from '../../../../flyout/document_details/shared/constants/panel_keys'; import type { SetEventsDeleted, @@ -81,10 +77,6 @@ const RowActionComponent = ({ const dispatch = useDispatch(); const [{ pageName }] = useRouteSpy(); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); - const isExpandableFlyoutInCreateRuleEnabled = useIsExperimentalFeatureEnabled( - 'expandableFlyoutInCreateRuleEnabled' - ); const { activeStep, isTourShown } = useTourContext(); const shouldFocusOnOverviewTab = (activeStep === AlertsCasesTourSteps.expandEvent || @@ -106,16 +98,10 @@ const RowActionComponent = ({ [columnHeaders, timelineNonEcsData] ); - let showExpandableFlyout: boolean; - - // disable the old flyout on attack discovery page - if (pageName === SecurityPageName.attackDiscovery) { - showExpandableFlyout = true; - } else if (tableId === TableId.rulePreview) { - showExpandableFlyout = isSecurityFlyoutEnabled && isExpandableFlyoutInCreateRuleEnabled; - } else { - showExpandableFlyout = isSecurityFlyoutEnabled; - } + // TODO remove when https://github.com/elastic/security-team/issues/7462 is merged + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); + const showExpandableFlyout = + pageName === SecurityPageName.attackDiscovery ? true : !expandableFlyoutDisabled; const handleOnEventDetailPanelOpened = useCallback(() => { const updatedExpandedDetail: ExpandedDetailType = { diff --git a/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts b/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts index 81d7e9e906ba8..659fc15ca5ea5 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts @@ -14,12 +14,11 @@ import { tableDefaults, dataTableActions, } from '@kbn/securitysolution-data-table'; -import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../common/constants'; +import { useIsExperimentalFeatureEnabled } from '../use_experimental_features'; import { useInitializeUrlParam } from '../../utils/global_query_string'; import { URL_PARAM_KEY } from '../use_url_state'; import type { FlyoutUrlState } from './types'; import { useShallowEqualSelector } from '../use_selector'; -import { useUiSetting$ } from '../../lib/kibana'; import { getQueryStringKeyValue } from '../timeline/use_query_timeline_by_id_on_url_change'; /** @@ -31,7 +30,7 @@ import { getQueryStringKeyValue } from '../timeline/use_query_timeline_by_id_on_ export const useInitFlyoutFromUrlParam = () => { const { search } = useLocation(); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const [urlDetails, setUrlDetails] = useState(null); const [hasLoadedUrlDetails, updateHasLoadedUrlDetails] = useState(false); const dispatch = useDispatch(); @@ -45,15 +44,15 @@ export const useInitFlyoutFromUrlParam = () => { const onInitialize = useCallback( (initialState: FlyoutUrlState | null) => { - if (!isSecurityFlyoutEnabled && initialState != null && initialState.panelView) { + if (expandableFlyoutDisabled && initialState != null && initialState.panelView) { setUrlDetails(initialState); } }, - [isSecurityFlyoutEnabled] + [expandableFlyoutDisabled] ); const loadExpandedDetailFromUrl = useCallback(() => { - if (isSecurityFlyoutEnabled) return; + if (!expandableFlyoutDisabled) return; const { initialized, isLoading, totalCount, additionalFilters } = dataTableCurrent; const isTableLoaded = initialized && !isLoading && totalCount > 0; @@ -78,21 +77,21 @@ export const useInitFlyoutFromUrlParam = () => { ); } } - }, [dataTableCurrent, dispatch, isSecurityFlyoutEnabled, urlDetails]); + }, [dataTableCurrent, dispatch, expandableFlyoutDisabled, urlDetails]); // The alert page creates a default dataTable slice in redux initially that is later overriden when data is retrieved // We use the below to store the urlDetails on app load, and then set it when the table is done loading and has data useEffect(() => { - if (!isSecurityFlyoutEnabled && !hasLoadedUrlDetails) { + if (expandableFlyoutDisabled && !hasLoadedUrlDetails) { loadExpandedDetailFromUrl(); } - }, [hasLoadedUrlDetails, isSecurityFlyoutEnabled, loadExpandedDetailFromUrl]); + }, [hasLoadedUrlDetails, expandableFlyoutDisabled, loadExpandedDetailFromUrl]); // We check the url for the presence of the old `evenFlyout` parameter. If it exists replace it with the new `flyout` key. const eventFlyoutKey = getQueryStringKeyValue({ urlKey: URL_PARAM_KEY.eventFlyout, search }); let currentKey = ''; let newKey = ''; - if (!isSecurityFlyoutEnabled) { + if (expandableFlyoutDisabled) { if (eventFlyoutKey) { currentKey = URL_PARAM_KEY.eventFlyout; newKey = URL_PARAM_KEY.flyout; diff --git a/x-pack/plugins/security_solution/public/common/hooks/flyout/use_sync_flyout_url_param.ts b/x-pack/plugins/security_solution/public/common/hooks/flyout/use_sync_flyout_url_param.ts index 45b55a3106eef..a6f4904d37cd9 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/flyout/use_sync_flyout_url_param.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/flyout/use_sync_flyout_url_param.ts @@ -14,8 +14,8 @@ import { tableDefaults, TableId, } from '@kbn/securitysolution-data-table'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; -import { ALERTS_PATH, ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../common/constants'; +import { useIsExperimentalFeatureEnabled } from '../use_experimental_features'; +import { ALERTS_PATH } from '../../../../common/constants'; import { useUpdateUrlParam } from '../../utils/global_query_string'; import { useShallowEqualSelector } from '../use_selector'; import { URL_PARAM_KEY } from '../use_url_state'; @@ -28,7 +28,7 @@ import type { FlyoutUrlState } from './types'; * // TODO remove this hook entirely when we delete the old flyout code */ export const useSyncFlyoutUrlParam = () => { - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const updateUrlParam = useUpdateUrlParam(URL_PARAM_KEY.flyout); const { pathname } = useLocation(); const dispatch = useDispatch(); @@ -40,7 +40,7 @@ export const useSyncFlyoutUrlParam = () => { ); useEffect(() => { - if (isSecurityFlyoutEnabled) return; + if (!expandableFlyoutDisabled) return; const isOnAlertsPage = pathname === ALERTS_PATH; if (isOnAlertsPage && expandedDetail != null && expandedDetail?.query) { @@ -55,5 +55,5 @@ export const useSyncFlyoutUrlParam = () => { // Clear the reference from the url updateUrlParam(null); } - }, [dispatch, expandedDetail, isSecurityFlyoutEnabled, pathname, updateUrlParam]); + }, [dispatch, expandedDetail, expandableFlyoutDisabled, pathname, updateUrlParam]); }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx index 57b170913ef0b..509d59338fe4d 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx @@ -60,7 +60,8 @@ describe('AlertDetailsRedirect', () => { "(global:(linkTo:!(timeline,socTrends),timerange:(from:'2023-04-20T12:00:00.000Z',kind:absolute,to:'2023-04-20T12:05:00.000Z')),timeline:(linkTo:!(global,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now/d,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now/d)))", pageFilters: '!((exclude:!f,existsSelected:!f,fieldName:kibana.alert.workflow_status,hideActionBar:!f,selectedOptions:!(),title:Status))', - flyout: '(panelView:eventDetail,params:(eventId:test-alert-id,indexName:.someTestIndex))', + flyout: + '(preview:!(),right:(id:document-details-right,params:(id:test-alert-id,indexName:.someTestIndex,scopeId:alerts-page)))', }); expect(historyMock.replace).toHaveBeenCalledWith({ @@ -98,7 +99,8 @@ describe('AlertDetailsRedirect', () => { "(global:(linkTo:!(timeline,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',kind:absolute,to:'2020-07-08T08:25:18.966Z')),timeline:(linkTo:!(global,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now/d,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now/d)))", pageFilters: '!((exclude:!f,existsSelected:!f,fieldName:kibana.alert.workflow_status,hideActionBar:!f,selectedOptions:!(),title:Status))', - flyout: '(panelView:eventDetail,params:(eventId:test-alert-id,indexName:.someTestIndex))', + flyout: + '(preview:!(),right:(id:document-details-right,params:(id:test-alert-id,indexName:.someTestIndex,scopeId:alerts-page)))', }); expect(historyMock.replace).toHaveBeenCalledWith({ @@ -136,7 +138,7 @@ describe('AlertDetailsRedirect', () => { pageFilters: '!((exclude:!f,existsSelected:!f,fieldName:kibana.alert.workflow_status,hideActionBar:!f,selectedOptions:!(),title:Status))', flyout: - '(panelView:eventDetail,params:(eventId:test-alert-id,indexName:.internal.alerts-security.alerts-default))', + '(preview:!(),right:(id:document-details-right,params:(id:test-alert-id,indexName:.internal.alerts-security.alerts-default,scopeId:alerts-page)))', }); expect(historyMock.replace).toHaveBeenCalledWith({ diff --git a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx index eebc8c4408759..9655e6fb84f92 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx @@ -12,13 +12,9 @@ import { Redirect, useLocation, useParams } from 'react-router-dom'; import moment from 'moment'; import { encode } from '@kbn/rison'; import { ALERT_WORKFLOW_STATUS } from '@kbn/rule-data-utils'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import type { FilterControlConfig } from '@kbn/alerts-ui-shared'; -import { - ALERTS_PATH, - DEFAULT_ALERTS_INDEX, - ENABLE_EXPANDABLE_FLYOUT_SETTING, -} from '../../../../common/constants'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import { ALERTS_PATH, DEFAULT_ALERTS_INDEX } from '../../../../common/constants'; import { URL_PARAM_KEY } from '../../../common/hooks/use_url_state'; import { inputsSelectors } from '../../../common/store'; import { formatPageFilterSearchParam } from '../../../../common/utils/format_page_filter_search_param'; @@ -73,14 +69,14 @@ export const AlertDetailsRedirect = () => { const currentFlyoutParams = searchParams.get(URL_PARAM_KEY.flyout); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const urlParams = new URLSearchParams({ [URL_PARAM_KEY.appQuery]: kqlAppQuery, [URL_PARAM_KEY.timerange]: timerange, [URL_PARAM_KEY.pageFilter]: pageFiltersQuery, [URL_PARAM_KEY.flyout]: resolveFlyoutParams( - { index, alertId, isSecurityFlyoutEnabled }, + { index, alertId, expandableFlyoutDisabled }, currentFlyoutParams ), }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/alerts/utils.ts b/x-pack/plugins/security_solution/public/detections/pages/alerts/utils.ts index fbc9c2723d45a..ac1d2a862b92c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/alerts/utils.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/alerts/utils.ts @@ -11,7 +11,7 @@ import { expandableFlyoutStateFromEventMeta } from '../../../flyout/document_det export interface ResolveFlyoutParamsConfig { index: string; alertId: string; - isSecurityFlyoutEnabled: boolean; + expandableFlyoutDisabled: boolean; } /** @@ -21,10 +21,10 @@ export interface ResolveFlyoutParamsConfig { * with Share Button on the Expandable Flyout */ export const resolveFlyoutParams = ( - { index, alertId, isSecurityFlyoutEnabled }: ResolveFlyoutParamsConfig, + { index, alertId, expandableFlyoutDisabled }: ResolveFlyoutParamsConfig, currentParamsString: string | null ) => { - if (!isSecurityFlyoutEnabled) { + if (expandableFlyoutDisabled) { const legacyFlyoutString = encode({ panelView: 'eventDetail', params: { diff --git a/x-pack/plugins/security_solution/public/explore/users/containers/users/observed_details/index.tsx b/x-pack/plugins/security_solution/public/explore/users/containers/users/observed_details/index.tsx index 12e6e583c9a41..d1148af03a41a 100644 --- a/x-pack/plugins/security_solution/public/explore/users/containers/users/observed_details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/containers/users/observed_details/index.tsx @@ -43,7 +43,7 @@ export const useObservedUserDetails = ({ skip = false, startDate, }: UseUserDetails): [boolean, UserDetailsArgs] => { - const isNewUserDetailsFlyoutEnabled = useIsExperimentalFeatureEnabled('newUserDetailsFlyout'); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const { loading, result: response, @@ -81,9 +81,9 @@ export const useObservedUserDetails = ({ from: startDate, to: endDate, }, - filterQuery: isNewUserDetailsFlyoutEnabled ? NOT_EVENT_KIND_ASSET_FILTER : undefined, + filterQuery: !expandableFlyoutDisabled ? NOT_EVENT_KIND_ASSET_FILTER : undefined, }), - [endDate, indexNames, startDate, userName, isNewUserDetailsFlyoutEnabled] + [endDate, indexNames, startDate, userName, expandableFlyoutDisabled] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.ts index 8e465b31ce8e0..f1f762fa9abdb 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.ts @@ -12,7 +12,6 @@ import type { GetFieldsData } from '../../../../common/hooks/use_get_fields_data import { getRowRenderer } from '../../../../timelines/components/timeline/body/renderers/get_row_renderer'; import { defaultRowRenderers } from '../../../../timelines/components/timeline/body/renderers'; import { isEcsAllowedValue } from '../utils/event_utils'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { EventKind } from '../../shared/constants/event_kinds'; export interface UseShowEventOverviewParams { @@ -45,24 +44,16 @@ export const useFlyoutIsExpandable = ({ isEcsAllowedValue('event.category', category) ); - const expandableEventFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'expandableEventFlyoutEnabled' - ); - return useMemo(() => { // alert document: always show overview if (eventKind === EventKind.signal) { return true; } - // do not show overview for non-alert if feature flag is disabled - if (!expandableEventFlyoutEnabled) { - return false; - } // event document: show overview when event category is ecs compliant or event renderer is available if (eventKind === EventKind.event) { return eventCategoryInECS || renderer != null; } // non-event document: show overview when event kind is ecs compliant or event renderer is available return eventKindInECS || renderer != null; - }, [expandableEventFlyoutEnabled, eventKind, eventCategoryInECS, eventKindInECS, renderer]); + }, [eventKind, eventCategoryInECS, eventKindInECS, renderer]); }; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts index c587c9b9cf8e2..a46cc515ce7fc 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts @@ -14,19 +14,12 @@ import { setCustomProtectionUpdatesNote, } from '../../tasks/endpoint_policy'; import { login, ROLE } from '../../tasks/login'; -import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; +import { loadPage } from '../../tasks/common'; describe( 'Policy Details', { - tags: [ - '@ess', - '@serverless', - // Not supported in serverless! - // The `disableExpandableFlyoutAdvancedSettings()` fails because the API - // `internal/kibana/settings` is not accessible in serverless - '@brokenInServerless', - ], + tags: ['@ess', '@serverless'], env: { ftrConfig: { kbnServerArgs: [ @@ -63,7 +56,6 @@ describe( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { indexedPolicy = data; @@ -171,7 +163,6 @@ describe( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { indexedPolicy = data; @@ -225,7 +216,6 @@ describe( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { indexedPolicy = data; @@ -275,7 +265,6 @@ describe( beforeEach(() => { login(ROLE.t3_analyst); - disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { indexedPolicy = data; @@ -323,7 +312,6 @@ describe( beforeEach(() => { login(ROLE.t3_analyst); - disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { indexedPolicy = data; @@ -374,7 +362,6 @@ describe( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { indexedPolicy = data; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts index 2e791b23f0d46..49b2ef8d44df4 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts @@ -6,7 +6,7 @@ */ import type { PolicyData } from '../../../../../common/endpoint/types'; -import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; +import { loadPage } from '../../tasks/common'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import { login } from '../../tasks/login'; @@ -16,14 +16,7 @@ import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../task describe.skip( 'Disabled experimental features on: ', { - tags: [ - '@ess', - '@serverless', - // Not supported in serverless! - // The `disableExpandableFlyoutAdvancedSettings()` fails because the API - // `internal/kibana/settings` is not accessible in serverless - '@brokenInServerless', - ], + tags: ['@ess', '@serverless'], }, () => { describe('Policy list', () => { @@ -32,7 +25,6 @@ describe.skip( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); }); before(() => { @@ -71,7 +63,6 @@ describe.skip( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); }); before(() => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts index aae3a1f289a6f..fb258bc04efa8 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts @@ -7,7 +7,7 @@ import moment from 'moment'; import { setCustomProtectionUpdatesManifestVersion } from '../../tasks/endpoint_policy'; -import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; +import { loadPage } from '../../tasks/common'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import { login } from '../../tasks/login'; @@ -16,10 +16,7 @@ import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../task describe( 'Policy List', { - // Not supported in serverless! - // The `disableExpandableFlyoutAdvancedSettings()` fails because the API - // `internal/kibana/settings` is not accessible in serverless - tags: ['@ess', '@serverless', '@brokenInServerless'], + tags: ['@ess', '@serverless'], env: { ftrConfig: { kbnServerArgs: [ @@ -46,7 +43,6 @@ describe( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); }); before(() => { @@ -85,7 +81,6 @@ describe( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); }); before(() => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts index a81a921c39702..8c93be6680e10 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts @@ -23,7 +23,7 @@ import { } from '../../tasks/isolate'; import { cleanupCase, cleanupRule, loadCase, loadRule } from '../../tasks/api_fixtures'; import { login } from '../../tasks/login'; -import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; +import { loadPage } from '../../tasks/common'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; import type { CreateAndEnrollEndpointHostResponse } from '../../../../../scripts/endpoint/common/endpoint_host_services'; @@ -34,15 +34,7 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; describe.skip( 'Isolate command', { - tags: [ - '@ess', - '@serverless', - - // Not supported in serverless! - // The `disableExpandableFlyoutAdvancedSettings()` fails because the API - // `internal/kibana/settings` is not accessible in serverless - '@brokenInServerless', - ], + tags: ['@ess', '@serverless'], }, () => { let isolateComment: string; @@ -85,7 +77,6 @@ describe.skip( beforeEach(() => { login(); - disableExpandableFlyoutAdvancedSettings(); }); describe('From manage', () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts index 33a45c17cdadf..9af118eb1de47 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts @@ -24,7 +24,7 @@ import type { ReturnTypeFromChainable } from '../../types'; import { addAlertsToCase } from '../../tasks/add_alerts_to_case'; import { APP_ALERTS_PATH, APP_CASES_PATH, APP_PATH } from '../../../../../common/constants'; import { login } from '../../tasks/login'; -import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; +import { loadPage } from '../../tasks/common'; import { indexNewCase } from '../../tasks/index_new_case'; import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts'; @@ -92,9 +92,6 @@ describe('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless describe.skip( 'from Alerts', { - // Not supported in serverless! - // The `disableExpandableFlyoutAdvancedSettings()` fails because the API - // `internal/kibana/settings` is not accessible in serverless tags: ['@brokenInServerless'], }, () => { @@ -103,7 +100,6 @@ describe('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless let hostname: string; before(() => { - disableExpandableFlyoutAdvancedSettings(); indexEndpointHosts({ withResponseActions: false, isolation: false }).then( (indexEndpoints) => { endpointData = indexEndpoints; @@ -201,7 +197,8 @@ describe('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless } ); - describe('from Cases', () => { + // TODO re-enable when https://github.com/elastic/security-team/issues/9625 is merged + describe.skip('from Cases', () => { let endpointData: ReturnTypeFromChainable | undefined; let caseData: ReturnTypeFromChainable | undefined; let alertData: ReturnTypeFromChainable | undefined; @@ -211,7 +208,6 @@ describe('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless let hostname: string; before(() => { - disableExpandableFlyoutAdvancedSettings(); indexNewCase().then((indexCase) => { caseData = indexCase; caseUrlPath = `${APP_CASES_PATH}/${indexCase.data.id}`; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/sentinelone/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/sentinelone/isolate.cy.ts index 216d85f0b4516..6605df6403e2c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/sentinelone/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/sentinelone/isolate.cy.ts @@ -11,21 +11,12 @@ import { closeAllToasts } from '../../tasks/toasts'; import { toggleRuleOffAndOn, visitRuleAlerts } from '../../tasks/isolate'; import { cleanupRule, loadRule } from '../../tasks/api_fixtures'; import { ROLE, login } from '../../tasks/login'; -import { disableExpandableFlyoutAdvancedSettings } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/alerts'; describe.skip( 'Isolate command', { - tags: [ - '@ess', - '@serverless', - - // Not supported in serverless! - // The `disableExpandableFlyoutAdvancedSettings()` fails because the API - // `internal/kibana/settings` is not accessible in serverless - '@brokenInServerless', - ], + tags: ['@ess', '@serverless'], env: { ftrConfig: { kbnServerArgs: [ @@ -77,7 +68,6 @@ describe.skip( beforeEach(() => { login(ROLE.soc_manager); - disableExpandableFlyoutAdvancedSettings(); }); describe('From alerts', () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts index ceba06f142f35..da6a197d9ed99 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/common.ts @@ -45,13 +45,3 @@ export const rootRequest = ( headers: API_HEADERS, ...options, }); - -export const disableExpandableFlyoutAdvancedSettings = () => { - const body = { changes: { 'securitySolution:enableExpandableFlyout': false } }; - rootRequest({ - method: 'POST', - url: 'internal/kibana/settings', - body, - headers: { 'kbn-xsrf': 'cypress-creds' }, - }); -}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx index 305bf3daa1f76..116cddf36f5f5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx @@ -20,7 +20,6 @@ import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; import { useDispatch } from 'react-redux'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useKibana } from '../../../../common/lib/kibana'; import { DocumentDetailsRightPanelKey } from '../../../../flyout/document_details/shared/constants/panel_keys'; @@ -36,7 +35,6 @@ import { SourcererScopeName } from '../../../../sourcerer/store/model'; import { useSourcererDataView } from '../../../../sourcerer/containers'; import { useDeleteNote } from './hooks/use_delete_note'; import { getTimelineNoteSelector } from '../../timeline/tabs/notes/selectors'; -import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../../common/constants'; export const NotePreviewsContainer = styled.section` padding-top: ${({ theme }) => `${theme.eui.euiSizeS}`}; @@ -58,15 +56,12 @@ const ToggleEventDetailsButtonComponent: React.FC const { telemetry } = useKibana().services; const { openFlyout } = useExpandableFlyoutApi(); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); - const expandableTimelineFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'expandableTimelineFlyoutEnabled' - ); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const handleClick = useCallback(() => { const indexName = selectedPatterns.join(','); - if (isSecurityFlyoutEnabled && expandableTimelineFlyoutEnabled) { + if (!expandableFlyoutDisabled) { openFlyout({ right: { id: DocumentDetailsRightPanelKey, @@ -97,8 +92,7 @@ const ToggleEventDetailsButtonComponent: React.FC }, [ dispatch, eventId, - expandableTimelineFlyoutEnabled, - isSecurityFlyoutEnabled, + expandableFlyoutDisabled, openFlyout, selectedPatterns, telemetry, diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.test.tsx index 4defbdc683254..f0b22e4f48359 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.test.tsx @@ -14,11 +14,26 @@ import { SourcererScopeName } from '../../../../sourcerer/store/model'; import { TimelineId, TimelineTabs } from '../../../../../common/types/timeline'; import { ExpandableFlyoutProvider } from '@kbn/expandable-flyout'; import { TestProviders } from '../../../../common/mock'; +import { createTelemetryServiceMock } from '../../../../common/lib/telemetry/telemetry_service.mock'; -const mockDispatch = jest.fn(); -jest.mock('../../../../common/lib/kibana'); +const mockedTelemetry = createTelemetryServiceMock(); +jest.mock('../../../../common/lib/kibana', () => { + const original = jest.requireActual('../../../../common/lib/kibana'); + return { + ...original, + useKibana: () => ({ + ...original.useKibana(), + services: { + ...original.useKibana().services, + telemetry: mockedTelemetry, + }, + }), + }; +}); jest.mock('../../../../common/hooks/use_selector'); jest.mock('../../../store'); + +const mockDispatch = jest.fn(); jest.mock('react-redux', () => { const original = jest.requireActual('react-redux'); return { @@ -80,8 +95,8 @@ describe('useDetailPanel', () => { result.current?.openEventDetailsPanel('123'); - expect(mockDispatch).toHaveBeenCalled(); - expect(timelineActions.toggleDetailPanel).toHaveBeenCalled(); + expect(mockDispatch).not.toHaveBeenCalled(); + expect(timelineActions.toggleDetailPanel).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx index f09462eb8e096..d66053c1128e4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx @@ -10,7 +10,7 @@ import { useDispatch } from 'react-redux'; import type { EntityType } from '@kbn/timelines-plugin/common'; import { dataTableSelectors } from '@kbn/securitysolution-data-table'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useKibana } from '../../../../common/lib/kibana'; import type { ExpandedDetailType } from '../../../../../common/types'; import { getScopedActions, isInTableScope, isTimelineScope } from '../../../../helpers'; @@ -21,7 +21,6 @@ import { TimelineTabs } from '../../../../../common/types/timeline'; import { timelineDefaults } from '../../../store/defaults'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import { DetailsPanel as DetailsPanelComponent } from '..'; -import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../../common/constants'; import { DocumentDetailsRightPanelKey } from '../../../../flyout/document_details/shared/constants/panel_keys'; export interface UseDetailPanelConfig { @@ -49,7 +48,7 @@ export const useDetailPanel = ({ const dispatch = useDispatch(); const { openFlyout } = useExpandableFlyoutApi(); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const getScope = useMemo(() => { if (isTimelineScope(scopeId)) { @@ -98,7 +97,7 @@ export const useDetailPanel = ({ const openEventDetailsPanel = useCallback( (eventId?: string, onClose?: () => void) => { - if (isSecurityFlyoutEnabled) { + if (!expandableFlyoutDisabled) { openFlyout({ right: { id: DocumentDetailsRightPanelKey, @@ -121,16 +120,16 @@ export const useDetailPanel = ({ onPanelClose.current = onClose ?? noopPanelClose; } }, - [isSecurityFlyoutEnabled, openFlyout, eventDetailsIndex, scopeId, telemetry, loadDetailsPanel] + [expandableFlyoutDisabled, openFlyout, eventDetailsIndex, scopeId, telemetry, loadDetailsPanel] ); const handleOnDetailsPanelClosed = useCallback(() => { - if (isSecurityFlyoutEnabled) return; + if (!expandableFlyoutDisabled) return; if (onPanelClose.current) onPanelClose.current(); if (scopedActions) { dispatch(scopedActions.toggleDetailPanel({ tabType, id: scopeId })); } - }, [isSecurityFlyoutEnabled, scopedActions, dispatch, tabType, scopeId]); + }, [expandableFlyoutDisabled, scopedActions, dispatch, tabType, scopeId]); const DetailsPanel = useMemo( () => diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx index 4c9c40712d719..8d46d5438dcbc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx @@ -10,11 +10,9 @@ import type { PropsWithChildren } from 'react'; import React, { useCallback, useMemo, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import { isEventBuildingBlockType } from '@kbn/securitysolution-data-table'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; import { DocumentDetailsRightPanelKey } from '../../../../../flyout/document_details/shared/constants/panel_keys'; -import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../../../common/constants'; import { useDeepEqualSelector } from '../../../../../common/hooks/use_selector'; import type { ColumnHeaderOptions, @@ -111,12 +109,8 @@ const StatefulEventComponent: React.FC = ({ const trGroupRef = useRef(null); const dispatch = useDispatch(); - const expandableTimelineFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'expandableTimelineFlyoutEnabled' - ); - + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const { openFlyout } = useExpandableFlyoutApi(); - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); // Store context in state rather than creating object in provider value={} to prevent re-renders caused by a new object being created const [activeStatefulEventContext] = useState({ @@ -213,7 +207,7 @@ const StatefulEventComponent: React.FC = ({ }, }; - if (isSecurityFlyoutEnabled && expandableTimelineFlyoutEnabled) { + if (!expandableFlyoutDisabled) { openFlyout({ right: { id: DocumentDetailsRightPanelKey, @@ -238,8 +232,7 @@ const StatefulEventComponent: React.FC = ({ dispatch, eventId, event._index, - expandableTimelineFlyoutEnabled, - isSecurityFlyoutEnabled, + expandableFlyoutDisabled, openFlyout, refetch, tabType, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx index eb8aa54168461..77bc18fe05802 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx @@ -38,6 +38,7 @@ import type { DroppableProvided, DroppableStateSnapshot, } from '@hello-pangea/dnd'; +import { DocumentDetailsRightPanelKey } from '../../../../flyout/document_details/shared/constants/panel_keys'; jest.mock('../../../../common/hooks/use_app_toasts'); jest.mock('../../../../common/components/guided_onboarding_tour/tour_step'); @@ -97,6 +98,13 @@ jest.mock('react-redux', () => { }; }); +const mockOpenFlyout = jest.fn(); +jest.mock('@kbn/expandable-flyout', () => { + return { + useExpandableFlyoutApi: () => ({ openFlyout: mockOpenFlyout }), + }; +}); + jest.mock('../../../../common/components/link_to', () => { const originalModule = jest.requireActual('../../../../common/components/link_to'); return { @@ -415,66 +423,58 @@ describe('Body', () => { beforeEach(() => { mockDispatch.mockReset(); }); - test('call the right reduce action to show event details for query tab', async () => { + + test('open the expandable flyout to show event details for query tab', async () => { const wrapper = await getWrapper(); wrapper.find(`[data-test-subj="expand-event"]`).first().simulate('click'); wrapper.update(); - expect(mockDispatch).toBeCalledTimes(1); - expect(mockDispatch.mock.calls[0][0]).toEqual({ - payload: { - id: 'timeline-test', - panelView: 'eventDetail', + expect(mockDispatch).not.toHaveBeenCalled(); + expect(mockOpenFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, params: { - eventId: '1', + id: '1', indexName: undefined, - refetch: mockRefetch, + scopeId: 'timeline-test', }, - tabType: 'query', }, - type: 'x-pack/security_solution/local/timeline/TOGGLE_DETAIL_PANEL', }); }); - test('call the right reduce action to show event details for pinned tab', async () => { + test('open the expandable flyout to show event details for pinned tab', async () => { const wrapper = await getWrapper(); wrapper.find(`[data-test-subj="expand-event"]`).first().simulate('click'); wrapper.update(); - expect(mockDispatch).toBeCalledTimes(1); - expect(mockDispatch.mock.calls[0][0]).toEqual({ - payload: { - id: 'timeline-test', - panelView: 'eventDetail', + expect(mockDispatch).not.toHaveBeenCalled(); + expect(mockOpenFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, params: { - eventId: '1', + id: '1', indexName: undefined, - refetch: mockRefetch, + scopeId: 'timeline-test', }, - tabType: 'pinned', }, - type: 'x-pack/security_solution/local/timeline/TOGGLE_DETAIL_PANEL', }); }); - test('call the right reduce action to show event details for notes tab', async () => { + test('open the expandable flyout to show event details for notes tab', async () => { const wrapper = await getWrapper(); wrapper.find(`[data-test-subj="expand-event"]`).first().simulate('click'); wrapper.update(); - expect(mockDispatch).toBeCalledTimes(1); - expect(mockDispatch.mock.calls[0][0]).toEqual({ - payload: { - id: 'timeline-test', - panelView: 'eventDetail', + expect(mockDispatch).not.toHaveBeenCalled(); + expect(mockOpenFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, params: { - eventId: '1', + id: '1', indexName: undefined, - refetch: mockRefetch, + scopeId: 'timeline-test', }, - tabType: 'notes', }, - type: 'x-pack/security_solution/local/timeline/TOGGLE_DETAIL_PANEL', }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx index 4514409184ba5..0a9c53a88d689 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx @@ -185,8 +185,7 @@ describe('HostName', () => { test('should open old flyout on table', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newHostDetailsFlyout') return false; - if (feature === 'expandableTimelineFlyoutEnabled') return false; + if (feature === 'expandableFlyoutDisabled') return true; }); const context = { enableHostDetailsFlyout: true, @@ -219,8 +218,7 @@ describe('HostName', () => { test('should open old flyout in timeline', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newHostDetailsFlyout') return false; - if (feature === 'expandableTimelineFlyoutEnabled') return false; + if (feature === 'expandableFlyoutDisabled') return true; }); const context = { enableHostDetailsFlyout: true, @@ -253,8 +251,7 @@ describe('HostName', () => { test('should open expandable flyout on table', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newHostDetailsFlyout') return true; - if (feature === 'expandableTimelineFlyoutEnabled') return false; + if (feature === 'expandableFlyoutDisabled') return false; }); const context = { enableHostDetailsFlyout: true, @@ -288,8 +285,7 @@ describe('HostName', () => { test('should open expandable flyout in timeline', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newHostDetailsFlyout') return true; - if (feature === 'expandableTimelineFlyoutEnabled') return true; + if (feature === 'expandableFlyoutDisabled') return false; }); const context = { enableHostDetailsFlyout: true, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx index 69e0b34b4b3d3..42c5344c7445c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx @@ -14,7 +14,7 @@ import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use import { HostPanelKey } from '../../../../../flyout/entity_details/host_right'; import type { ExpandedDetailType } from '../../../../../../common/types'; import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; -import { getScopedActions, isTimelineScope } from '../../../../../helpers'; +import { getScopedActions } from '../../../../../helpers'; import { HostDetailsLink } from '../../../../../common/components/links'; import type { TimelineTabs } from '../../../../../../common/types/timeline'; import { DefaultDraggable } from '../../../../../common/components/draggables'; @@ -48,10 +48,7 @@ const HostNameComponent: React.FC = ({ title, value, }) => { - const isNewHostDetailsFlyoutEnabled = useIsExperimentalFeatureEnabled('newHostDetailsFlyout'); - const expandableTimelineFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'expandableTimelineFlyoutEnabled' - ); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const { openRightPanel } = useExpandableFlyoutApi(); const dispatch = useDispatch(); @@ -74,7 +71,7 @@ const HostNameComponent: React.FC = ({ const { timelineID, tabType } = eventContext; - const openNewFlyout = () => + if (!expandableFlyoutDisabled) { openRightPanel({ id: HostPanelKey, params: { @@ -84,7 +81,7 @@ const HostNameComponent: React.FC = ({ isDraggable, }, }); - const openOldFlyout = () => { + } else { const updatedExpandedDetail: ExpandedDetailType = { panelView: 'hostDetail', params: { @@ -101,28 +98,16 @@ const HostNameComponent: React.FC = ({ }) ); } - }; - - if ( - (isTimelineScope(timelineID) && - isNewHostDetailsFlyoutEnabled && - expandableTimelineFlyoutEnabled) || - isNewHostDetailsFlyoutEnabled - ) { - openNewFlyout(); - } else { - openOldFlyout(); } }, [ contextId, dispatch, eventContext, - expandableTimelineFlyoutEnabled, + expandableFlyoutDisabled, hostName, isDraggable, isInTimelineContext, - isNewHostDetailsFlyoutEnabled, onClick, openRightPanel, ] diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx index 426839056e51a..16f881fe90130 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx @@ -159,8 +159,7 @@ describe('UserName', () => { test('should open old flyout on table', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newUserDetailsFlyout') return false; - if (feature === 'expandableTimelineFlyoutEnabled') return false; + if (feature === 'expandableFlyoutDisabled') return true; }); const context = { enableHostDetailsFlyout: true, @@ -193,8 +192,7 @@ describe('UserName', () => { test('should open old flyout in timeline', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newUserDetailsFlyout') return false; - if (feature === 'expandableTimelineFlyoutEnabled') return false; + if (feature === 'expandableFlyoutDisabled') return true; }); const context = { enableHostDetailsFlyout: true, @@ -227,8 +225,7 @@ describe('UserName', () => { test('should open expandable flyout on table', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newUserDetailsFlyout') return true; - if (feature === 'expandableTimelineFlyoutEnabled') return false; + if (feature === 'expandableFlyoutDisabled') return false; }); const context = { enableHostDetailsFlyout: true, @@ -262,8 +259,7 @@ describe('UserName', () => { test('should open expandable flyout in timeline', async () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation((feature: string) => { - if (feature === 'newUserDetailsFlyout') return true; - if (feature === 'expandableTimelineFlyoutEnabled') return true; + if (feature === 'expandableFlyoutDisabled') return false; }); const context = { enableHostDetailsFlyout: true, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx index 39069fc7320bb..78d9ad9c3bdfd 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx @@ -14,7 +14,7 @@ import { UserPanelKey } from '../../../../../flyout/entity_details/user_right'; import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; import type { ExpandedDetailType } from '../../../../../../common/types'; -import { getScopedActions, isTimelineScope } from '../../../../../helpers'; +import { getScopedActions } from '../../../../../helpers'; import type { TimelineTabs } from '../../../../../../common/types/timeline'; import { DefaultDraggable } from '../../../../../common/components/draggables'; import { getEmptyTagValue } from '../../../../../common/components/empty_value'; @@ -50,10 +50,7 @@ const UserNameComponent: React.FC = ({ }) => { const dispatch = useDispatch(); const eventContext = useContext(StatefulEventContext); - const isNewUserDetailsFlyoutEnable = useIsExperimentalFeatureEnabled('newUserDetailsFlyout'); - const expandableTimelineFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'expandableTimelineFlyoutEnabled' - ); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const userName = `${value}`; const isInTimelineContext = userName && eventContext?.timelineID; const { openRightPanel } = useExpandableFlyoutApi(); @@ -72,7 +69,7 @@ const UserNameComponent: React.FC = ({ const { timelineID, tabType } = eventContext; - const openNewFlyout = () => + if (!expandableFlyoutDisabled) { openRightPanel({ id: UserPanelKey, params: { @@ -82,8 +79,7 @@ const UserNameComponent: React.FC = ({ isDraggable, }, }); - - const openOldFlyout = () => { + } else { const updatedExpandedDetail: ExpandedDetailType = { panelView: 'userDetail', params: { @@ -100,27 +96,15 @@ const UserNameComponent: React.FC = ({ }) ); } - }; - - if ( - (isTimelineScope(timelineID) && - isNewUserDetailsFlyoutEnable && - expandableTimelineFlyoutEnabled) || - isNewUserDetailsFlyoutEnable - ) { - openNewFlyout(); - } else { - openOldFlyout(); } }, [ contextId, dispatch, eventContext, - expandableTimelineFlyoutEnabled, + expandableFlyoutDisabled, isDraggable, isInTimelineContext, - isNewUserDetailsFlyoutEnable, onClick, openRightPanel, userName, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.tsx index 6095429b2a942..d7e22f116511a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.tsx @@ -149,10 +149,11 @@ export const TimelineDataTableComponent: React.FC = memo( setExpandedDoc((prev) => (!prev ? prev : undefined)); }, []); - const { openFlyout, closeFlyout, isTimelineExpandableFlyoutEnabled } = - useUnifiedTableExpandableFlyout({ + const { openFlyout, closeFlyout, isExpandableFlyoutDisabled } = useUnifiedTableExpandableFlyout( + { onClose: onCloseExpandableFlyout, - }); + } + ); const { browserFields, runtimeMappings } = useSourcererDataView(SourcererScopeName.timeline); @@ -178,7 +179,7 @@ export const TimelineDataTableComponent: React.FC = memo( }, }; - if (isTimelineExpandableFlyoutEnabled) { + if (!isExpandableFlyoutDisabled) { openFlyout({ right: { id: DocumentDetailsRightPanelKey, @@ -201,7 +202,7 @@ export const TimelineDataTableComponent: React.FC = memo( activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); }, - [activeTab, dispatch, refetch, timelineId, isTimelineExpandableFlyoutEnabled, openFlyout] + [activeTab, dispatch, refetch, timelineId, isExpandableFlyoutDisabled, openFlyout] ); const onTimelineLegacyFlyoutClose = useCallback(() => { @@ -225,7 +226,7 @@ export const TimelineDataTableComponent: React.FC = memo( handleOnEventDetailPanelOpened(timelineDoc); } } else { - if (isTimelineExpandableFlyoutEnabled) { + if (!isExpandableFlyoutDisabled) { closeFlyout(); return; } @@ -237,7 +238,7 @@ export const TimelineDataTableComponent: React.FC = memo( handleOnEventDetailPanelOpened, onTimelineLegacyFlyoutClose, closeFlyout, - isTimelineExpandableFlyoutEnabled, + isExpandableFlyoutDisabled, ] ); @@ -462,7 +463,7 @@ export const TimelineDataTableComponent: React.FC = memo( externalControlColumns={leadingControlColumns} cellContext={cellContext} /> - {showExpandedDetails && !isTimelineExpandableFlyoutEnabled && ( + {showExpandedDetails && isExpandableFlyoutDisabled && ( { - beforeEach(() => { + it('should disable expandable flyout when expandableFlyoutDisabled flag is true', () => { (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); - (useUiSetting$ as jest.Mock).mockReturnValue([true, jest.fn()]); (useLocation as jest.Mock).mockReturnValue({ search: `?${URL_PARAM_KEY.timelineFlyout}=(test:value)`, }); @@ -35,33 +33,25 @@ describe('useUnifiedTimelineExpandableFlyout', () => { openFlyout: jest.fn(), closeFlyout: jest.fn(), }); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - it('should have expandable flyout disabled when flyout is disabled in Advanced Settings', () => { - (useUiSetting$ as jest.Mock).mockReturnValue([false, jest.fn()]); const { result } = renderHook(() => useUnifiedTableExpandableFlyout({ onClose: onFlyoutCloseMock, }) ); - expect(result.current.isTimelineExpandableFlyoutEnabled).toBe(false); + expect(result.current.isExpandableFlyoutDisabled).toBe(true); }); - it('should have expandable flyout disabled when flyout is disabled in Experimental Features', () => { - (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(false); - const { result } = renderHook(() => - useUnifiedTableExpandableFlyout({ - onClose: onFlyoutCloseMock, - }) - ); - expect(result.current.isTimelineExpandableFlyoutEnabled).toBe(false); - }); - describe('when flyout is enabled', () => { + describe('when expandable flyout is enabled', () => { + beforeEach(() => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(false); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + it('should mark flyout as closed when location is empty', () => { (useLocation as jest.Mock).mockReturnValue({ search: '', @@ -73,20 +63,21 @@ describe('useUnifiedTimelineExpandableFlyout', () => { }) ); - expect(result.current.isTimelineExpandableFlyoutOpen).toBe(false); + expect(result.current.isExpandableFlyoutDisabled).toBe(false); }); it('should mark flyout as open when location has `timelineFlyout`', () => { (useLocation as jest.Mock).mockReturnValue({ search: `${URL_PARAM_KEY.timelineFlyout}=(test:value)`, }); + const { result } = renderHook(() => useUnifiedTableExpandableFlyout({ onClose: onFlyoutCloseMock, }) ); - expect(result.current.isTimelineExpandableFlyoutOpen).toBe(true); + expect(result.current.isExpandableFlyoutDisabled).toBe(false); }); it('should mark flyout as close when location has empty `timelineFlyout`', () => { @@ -95,7 +86,8 @@ describe('useUnifiedTimelineExpandableFlyout', () => { onClose: onFlyoutCloseMock, }) ); - expect(result.current.isTimelineExpandableFlyoutOpen).toBe(true); + + expect(result.current.isExpandableFlyoutDisabled).toBe(false); (useLocation as jest.Mock).mockReturnValue({ search: `${URL_PARAM_KEY.timelineFlyout}=()`, @@ -115,6 +107,7 @@ describe('useUnifiedTimelineExpandableFlyout', () => { ); result.current.closeFlyout(); + expect(onFlyoutCloseMock).toHaveBeenCalledTimes(1); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/hooks/use_unified_timeline_expandable_flyout.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/hooks/use_unified_timeline_expandable_flyout.tsx index 31433d54a5cd0..83050110eb090 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/hooks/use_unified_timeline_expandable_flyout.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/hooks/use_unified_timeline_expandable_flyout.tsx @@ -6,11 +6,9 @@ */ import { useCallback, useEffect, useMemo, useState } from 'react'; -import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { useLocation } from 'react-router-dom'; import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; -import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../../../common/constants'; import { URL_PARAM_KEY } from '../../../../../common/hooks/use_url_state'; const EMPTY_TIMELINE_FLYOUT_SEARCH_PARAMS = '()'; @@ -22,11 +20,7 @@ interface UseUnifiedTableExpandableFlyoutArgs { export const useUnifiedTableExpandableFlyout = ({ onClose, }: UseUnifiedTableExpandableFlyoutArgs) => { - const expandableTimelineFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'expandableTimelineFlyoutEnabled' - ); - - const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const expandableFlyoutDisabled = useIsExperimentalFeatureEnabled('expandableFlyoutDisabled'); const location = useLocation(); @@ -77,6 +71,6 @@ export const useUnifiedTableExpandableFlyout = ({ isTimelineExpandableFlyoutOpen, openFlyout, closeFlyout: closeFlyoutWithEffect, - isTimelineExpandableFlyoutEnabled: expandableTimelineFlyoutEnabled && isSecurityFlyoutEnabled, + isExpandableFlyoutDisabled: expandableFlyoutDisabled, }; }; diff --git a/x-pack/plugins/security_solution/server/ui_settings.ts b/x-pack/plugins/security_solution/server/ui_settings.ts index 238fb1655728a..1c946ec2cefdd 100644 --- a/x-pack/plugins/security_solution/server/ui_settings.ts +++ b/x-pack/plugins/security_solution/server/ui_settings.ts @@ -36,7 +36,6 @@ import { EXTENDED_RULE_EXECUTION_LOGGING_MIN_LEVEL_SETTING, DEFAULT_ALERT_TAGS_KEY, DEFAULT_ALERT_TAGS_VALUE, - ENABLE_EXPANDABLE_FLYOUT_SETTING, EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER, ENABLE_ASSET_CRITICALITY_SETTING, } from '../common/constants'; @@ -177,23 +176,6 @@ export const initUiSettings = ( requiresPageReload: true, schema: schema.boolean(), }, - [ENABLE_EXPANDABLE_FLYOUT_SETTING]: { - name: i18n.translate('xpack.securitySolution.uiSettings.enableExpandableFlyoutLabel', { - defaultMessage: 'Expandable flyout', - }), - value: true, - description: i18n.translate( - 'xpack.securitySolution.uiSettings.enableExpandableFlyoutDescription', - { - defaultMessage: '

    Enables the expandable flyout

    ', - values: { p: (chunks) => `

    ${chunks}

    ` }, - } - ), - type: 'boolean', - category: [APP_ID], - requiresPageReload: true, - schema: schema.boolean(), - }, [ENABLE_ASSET_CRITICALITY_SETTING]: { name: i18n.translate('xpack.securitySolution.uiSettings.enableAssetCriticalityTitle', { defaultMessage: 'Asset Criticality', diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f232799d9e1ef..11ed11bd9a763 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -33198,7 +33198,6 @@ "xpack.securitySolution.uiSettings.defaultTimeRangeDescription": "

    Période de temps par défaut dans le filtre de temps Security.

    ", "xpack.securitySolution.uiSettings.enableAssetCriticalityDescription": "

    Permet des flux de travail pour l'affectation de l'état critique des actifs et ses contributions au risque de l'entité

    ", "xpack.securitySolution.uiSettings.enableCcsWarningDescription": "

    Active les avertissements de vérification des privilèges dans les règles relatives aux index CCS

    ", - "xpack.securitySolution.uiSettings.enableExpandableFlyoutDescription": "

    Active le menu déroulant

    ", "xpack.securitySolution.uiSettings.enableNewsFeedDescription": "

    Active le fil d'actualités

    ", "xpack.securitySolution.uiSettings.excludeColdAndFrozenTiersInAnalyzerDescription": "

    Lorsque cette option est activée, les niveaux \"cold\" et \"frozen\" sont ignorés dans les requêtes de l'analyseur

    ", "xpack.securitySolution.uiSettings.extendedRuleExecutionLoggingEnabledDescription": "

    Active l'exécution de règle étendue pour le logging dans les index .kibana-event-log-*. Affiche les événements d'exécution simples sur la page Détails de la règle.

    ", @@ -37844,7 +37843,6 @@ "xpack.securitySolution.uiSettings.defaultTimeRangeLabel": "Période du filtre de temps", "xpack.securitySolution.uiSettings.enableAssetCriticalityTitle": "Criticité des ressources", "xpack.securitySolution.uiSettings.enableCcsReadWarningLabel": "Avertissement lié aux privilèges de la règle CCS", - "xpack.securitySolution.uiSettings.enableExpandableFlyoutLabel": "Menu volant déroulant", "xpack.securitySolution.uiSettings.enableNewsFeedLabel": "Fil d'actualités", "xpack.securitySolution.uiSettings.excludeColdAndFrozenTiersInAnalyzer": "Exclure les niveaux froids de l'analyseur", "xpack.securitySolution.uiSettings.extendedRuleExecutionLoggingEnabledLabel": "Logging étendu de l’exécution des règles", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c900fb526b19e..1875ea6d86efc 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -33169,7 +33169,6 @@ "xpack.securitySolution.uiSettings.defaultTimeRangeDescription": "

    セキュリティ時間フィルダーのデフォルトの期間です。

    ", "xpack.securitySolution.uiSettings.enableAssetCriticalityDescription": "

    アセット重要度割り当てワークフローとエンティティリスクへの寄与を有効化します

    ", "xpack.securitySolution.uiSettings.enableCcsWarningDescription": "

    CCSインデックスのルールで権限チェック警告を有効にします

    ", - "xpack.securitySolution.uiSettings.enableExpandableFlyoutDescription": "

    展開可能なフライアウトを有効にします

    ", "xpack.securitySolution.uiSettings.enableNewsFeedDescription": "

    ニュースフィードを有効にします

    ", "xpack.securitySolution.uiSettings.excludeColdAndFrozenTiersInAnalyzerDescription": "

    有効にすると、アナライザークエリでコールドティアとフローズンティアがスキップされます

    ", "xpack.securitySolution.uiSettings.extendedRuleExecutionLoggingEnabledDescription": "

    .kibana-event-log-*インデックスへの拡張ルール実行ログを有効にします。[ルール詳細]ページでプレーン実行イベントが表示されます。

    ", @@ -37815,7 +37814,6 @@ "xpack.securitySolution.uiSettings.defaultTimeRangeLabel": "時間フィルターの期間", "xpack.securitySolution.uiSettings.enableAssetCriticalityTitle": "アセット重要度", "xpack.securitySolution.uiSettings.enableCcsReadWarningLabel": "CCSルール権限警告", - "xpack.securitySolution.uiSettings.enableExpandableFlyoutLabel": "展開可能なフライアウト", "xpack.securitySolution.uiSettings.enableNewsFeedLabel": "ニュースフィード", "xpack.securitySolution.uiSettings.excludeColdAndFrozenTiersInAnalyzer": "アナライザーでコールドティアとフローズンティアを除外", "xpack.securitySolution.uiSettings.extendedRuleExecutionLoggingEnabledLabel": "拡張ルール実行ログ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 895881c1758ec..95b7203e9d1dc 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -33212,7 +33212,6 @@ "xpack.securitySolution.uiSettings.defaultTimeRangeDescription": "

    Security 时间筛选中的默认时段。

    ", "xpack.securitySolution.uiSettings.enableAssetCriticalityDescription": "

    启用资产关键度分配工作流及其对实体风险的贡献率

    ", "xpack.securitySolution.uiSettings.enableCcsWarningDescription": "

    在规则中为 CCS 索引启用权限检查警告

    ", - "xpack.securitySolution.uiSettings.enableExpandableFlyoutDescription": "

    启用可展开的浮出控件

    ", "xpack.securitySolution.uiSettings.enableNewsFeedDescription": "

    启用新闻源

    ", "xpack.securitySolution.uiSettings.excludeColdAndFrozenTiersInAnalyzerDescription": "

    启用后,将在分析器查询中跳过冷层和冻结层

    ", "xpack.securitySolution.uiSettings.extendedRuleExecutionLoggingEnabledDescription": "

    对 .kibana-event-log-* 索引启用扩展规则执行日志记录。在“规则详情”页面上显示纯执行事件。

    ", @@ -37858,7 +37857,6 @@ "xpack.securitySolution.uiSettings.defaultTimeRangeLabel": "时间筛选时段", "xpack.securitySolution.uiSettings.enableAssetCriticalityTitle": "资产关键度", "xpack.securitySolution.uiSettings.enableCcsReadWarningLabel": "CCS 规则权限警告", - "xpack.securitySolution.uiSettings.enableExpandableFlyoutLabel": "可展开的浮出控件", "xpack.securitySolution.uiSettings.enableNewsFeedLabel": "新闻源", "xpack.securitySolution.uiSettings.excludeColdAndFrozenTiersInAnalyzer": "在分析器中排除冷层和冻结层", "xpack.securitySolution.uiSettings.extendedRuleExecutionLoggingEnabledLabel": "扩展规则执行日志记录", diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/enrichments/alert_threat_enrichments.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/enrichments/alert_threat_enrichments.cy.ts index 383abd2e12d42..71dd0387a6451 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/enrichments/alert_threat_enrichments.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/detection_alerts/enrichments/alert_threat_enrichments.cy.ts @@ -5,28 +5,28 @@ * 2.0. */ -import { disableExpandableFlyout } from '../../../../../tasks/api_calls/kibana_advanced_settings'; import { getNewThreatIndicatorRule, indicatorRuleMatchingDoc } from '../../../../../objects/rule'; import { login } from '../../../../../tasks/login'; import { - JSON_TEXT, TABLE_CELL, TABLE_ROWS, THREAT_DETAILS_VIEW, - ENRICHMENT_COUNT_NOTIFICATION, INDICATOR_MATCH_ENRICHMENT_SECTION, INVESTIGATION_TIME_ENRICHMENT_SECTION, THREAT_DETAILS_ACCORDION, } from '../../../../../screens/alerts_details'; import { TIMELINE_FIELD } from '../../../../../screens/rule_details'; -import { - expandFirstAlert, - setEnrichmentDates, - viewThreatIntelTab, -} from '../../../../../tasks/alerts'; +import { expandFirstAlert, setEnrichmentDates } from '../../../../../tasks/alerts'; import { createRule } from '../../../../../tasks/api_calls/rules'; -import { openJsonView, openThreatIndicatorDetails } from '../../../../../tasks/alerts_details'; import { addsFieldsToTimeline, visitRuleDetailsPage } from '../../../../../tasks/rule_details'; +import { + expandDocumentDetailsExpandableFlyoutLeftSection, + openTableTab, +} from '../../../../../tasks/expandable_flyout/alert_details_right_panel'; +import { filterTableTabTable } from '../../../../../tasks/expandable_flyout/alert_details_right_panel_table_tab'; +import { DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_THREAT_ENRICHMENTS } from '../../../../../screens/expandable_flyout/alert_details_right_panel_table_tab'; +import { openThreatIntelligenceTab } from '../../../../../tasks/expandable_flyout/alert_details_left_panel_threat_intelligence_tab'; +import { openInsightsTab } from '../../../../../tasks/expandable_flyout/alert_details_left_panel'; // TODO: https://github.com/elastic/kibana/issues/161539 describe('Threat Match Enrichment', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { @@ -35,8 +35,6 @@ describe('Threat Match Enrichment', { tags: ['@ess', '@serverless', '@skipInServ cy.task('esArchiverLoad', { archiveName: 'threat_indicator' }); cy.task('esArchiverLoad', { archiveName: 'suspicious_source_event' }); login(); - - disableExpandableFlyout(); }); after(() => { @@ -71,39 +69,37 @@ describe('Threat Match Enrichment', { tags: ['@ess', '@serverless', '@skipInServ }); }); - it('Displays persisted enrichments on the JSON view', () => { - const expectedEnrichment = [ - { - 'indicator.file.hash.md5': ['9b6c3518a91d23ed77504b5416bfb5b3'], - 'matched.index': ['logs-ti_abusech.malware'], - 'indicator.file.type': ['elf'], - 'indicator.file.hash.tlsh': [ - '6D7312E017B517CC1371A8353BED205E9128223972AE35302E97528DF957703BAB2DBE', - ], - 'feed.name': ['AbuseCH malware'], - 'indicator.file.hash.ssdeep': [ - '1536:87vbq1lGAXSEYQjbChaAU2yU23M51DjZgSQAvcYkFtZTjzBht5:8D+CAXFYQChaAUk5ljnQssL', - ], - 'indicator.file.hash.sha256': [ - 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', - ], - 'indicator.first_seen': ['2021-03-10T08:02:14.000Z'], - 'matched.field': ['myhash.mysha256'], - 'indicator.type': ['file'], - 'matched.type': ['indicator_match_rule'], - 'matched.id': ['84cf452c1e0375c3d4412cb550bd1783358468a3b3b777da4829d72c7d6fb74f'], - 'matched.atomic': ['a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3'], - 'indicator.file.size': [80280], - }, - ]; + it('Displays persisted enrichments on the Table tab', () => { + const expectedEnrichment = { + 'indicator.file.hash.md5': ['9b6c3518a91d23ed77504b5416bfb5b3'], + 'matched.index': ['logs-ti_abusech.malware'], + 'indicator.file.type': ['elf'], + 'indicator.file.hash.tlsh': [ + '6D7312E017B517CC1371A8353BED205E9128223972AE35302E97528DF957703BAB2DBE', + ], + 'feed.name': ['AbuseCH malware'], + 'indicator.file.hash.ssdeep': [ + '1536:87vbq1lGAXSEYQjbChaAU2yU23M51DjZgSQAvcYkFtZTjzBht5:8D+CAXFYQChaAUk5ljnQssL', + ], + 'indicator.file.hash.sha256': [ + 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', + ], + 'indicator.first_seen': ['2021-03-10T08:02:14.000Z'], + 'matched.field': ['myhash.mysha256'], + 'indicator.type': ['file'], + 'matched.type': ['indicator_match_rule'], + 'matched.id': ['84cf452c1e0375c3d4412cb550bd1783358468a3b3b777da4829d72c7d6fb74f'], + 'matched.atomic': ['a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3'], + 'indicator.file.size': [80280], + }; expandFirstAlert(); - openJsonView(); + openTableTab(); + filterTableTabTable('threat.enrichments'); - cy.get(JSON_TEXT).then((x) => { - const parsed = JSON.parse(x.text()); - expect(parsed.fields['threat.enrichments']).to.deep.equal(expectedEnrichment); - }); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_THREAT_ENRICHMENTS).contains( + JSON.stringify(expectedEnrichment) + ); }); it('Displays threat indicator details on the threat intel tab', () => { @@ -140,9 +136,10 @@ describe('Threat Match Enrichment', { tags: ['@ess', '@serverless', '@skipInServ ]; expandFirstAlert(); - openThreatIndicatorDetails(); + expandDocumentDetailsExpandableFlyoutLeftSection(); + openInsightsTab(); + openThreatIntelligenceTab(); - cy.get(ENRICHMENT_COUNT_NOTIFICATION).should('have.text', '1'); cy.get(THREAT_DETAILS_VIEW).within(() => { cy.get(TABLE_ROWS).should('have.length', expectedThreatIndicatorData.length); expectedThreatIndicatorData.forEach((row, index) => { @@ -178,7 +175,9 @@ describe('Threat Match Enrichment', { tags: ['@ess', '@serverless', '@skipInServ }; expandFirstAlert(); - viewThreatIntelTab(); + expandDocumentDetailsExpandableFlyoutLeftSection(); + openInsightsTab(); + openThreatIntelligenceTab(); setEnrichmentDates('08/05/2018 10:00 AM'); cy.get(`${INDICATOR_MATCH_ENRICHMENT_SECTION} ${THREAT_DETAILS_ACCORDION}`) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts index 3bd09ee00000f..aff9307111beb 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts @@ -23,7 +23,6 @@ import { scrollAlertTableColumnIntoView, closeAlertFlyout, } from '../../tasks/alerts'; -import { disableExpandableFlyout } from '../../tasks/api_calls/kibana_advanced_settings'; import { login } from '../../tasks/login'; import { visitWithTimeRange } from '../../tasks/navigation'; @@ -34,96 +33,109 @@ import { mockRiskEngineEnabled } from '../../tasks/entity_analytics'; const CURRENT_HOST_RISK_LEVEL = 'Current host risk level'; const ORIGINAL_HOST_RISK_LEVEL = 'Original host risk level'; -describe('Enrichment', { tags: ['@ess', '@serverless'] }, () => { - before(() => { - cy.task('esArchiverUnload', { archiveName: 'risk_scores_new' }); - cy.task('esArchiverUnload', { archiveName: 'risk_scores_new_updated' }); - cy.task('esArchiverLoad', { archiveName: 'risk_users' }); - }); +describe( + 'Enrichment', + { + tags: ['@ess', '@serverless'], + env: { + ftrConfig: { + kbnServerArgs: [ + `--xpack.securitySolution.enableExperimental=${JSON.stringify([ + 'expandableFlyoutDisabled', + ])}`, + ], + }, + }, + }, + () => { + before(() => { + cy.task('esArchiverUnload', { archiveName: 'risk_scores_new' }); + cy.task('esArchiverUnload', { archiveName: 'risk_scores_new_updated' }); + cy.task('esArchiverLoad', { archiveName: 'risk_users' }); + }); - after(() => { - cy.task('esArchiverUnload', { archiveName: 'risk_users' }); - }); + after(() => { + cy.task('esArchiverUnload', { archiveName: 'risk_users' }); + }); - describe('Custom query rule', () => { - // FLAKY: https://github.com/elastic/kibana/issues/176965 - describe.skip('from legacy risk scores', () => { - beforeEach(() => { - disableExpandableFlyout(); - cy.task('esArchiverLoad', { archiveName: 'risk_hosts' }); - deleteAlertsAndRules(); - createRule(getNewRule({ rule_id: 'rule1' })); - login(); - visitWithTimeRange(ALERTS_URL); - waitForAlertsToPopulate(); - }); + describe('Custom query rule', () => { + // FLAKY: https://github.com/elastic/kibana/issues/176965 + describe.skip('from legacy risk scores', () => { + beforeEach(() => { + cy.task('esArchiverLoad', { archiveName: 'risk_hosts' }); + deleteAlertsAndRules(); + createRule(getNewRule({ rule_id: 'rule1' })); + login(); + visitWithTimeRange(ALERTS_URL); + waitForAlertsToPopulate(); + }); - afterEach(() => { - cy.task('esArchiverUnload', { archiveName: 'risk_hosts' }); - cy.task('esArchiverUnload', { archiveName: 'risk_hosts_updated' }); - }); + afterEach(() => { + cy.task('esArchiverUnload', { archiveName: 'risk_hosts' }); + cy.task('esArchiverUnload', { archiveName: 'risk_hosts_updated' }); + }); - it('Should has enrichment fields from legacy risk', function () { - cy.get(HOST_RISK_HEADER_COLUMN).contains('Host Risk Level'); - cy.get(USER_RISK_HEADER_COLUMN).contains('User Risk Level'); - scrollAlertTableColumnIntoView(HOST_RISK_COLUMN); - cy.get(HOST_RISK_COLUMN).contains('Low'); - scrollAlertTableColumnIntoView(USER_RISK_COLUMN); - cy.get(USER_RISK_COLUMN).contains('Low'); - scrollAlertTableColumnIntoView(ACTION_COLUMN); - expandFirstAlert(); - cy.get(ENRICHED_DATA_ROW).contains('Low'); - cy.get(ENRICHED_DATA_ROW).contains(CURRENT_HOST_RISK_LEVEL); - cy.get(ENRICHED_DATA_ROW).contains('Critical').should('not.exist'); - cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL).should('not.exist'); + it('Should has enrichment fields from legacy risk', function () { + cy.get(HOST_RISK_HEADER_COLUMN).contains('Host Risk Level'); + cy.get(USER_RISK_HEADER_COLUMN).contains('User Risk Level'); + scrollAlertTableColumnIntoView(HOST_RISK_COLUMN); + cy.get(HOST_RISK_COLUMN).contains('Low'); + scrollAlertTableColumnIntoView(USER_RISK_COLUMN); + cy.get(USER_RISK_COLUMN).contains('Low'); + scrollAlertTableColumnIntoView(ACTION_COLUMN); + expandFirstAlert(); + cy.get(ENRICHED_DATA_ROW).contains('Low'); + cy.get(ENRICHED_DATA_ROW).contains(CURRENT_HOST_RISK_LEVEL); + cy.get(ENRICHED_DATA_ROW).contains('Critical').should('not.exist'); + cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL).should('not.exist'); - closeAlertFlyout(); - cy.task('esArchiverUnload', { archiveName: 'risk_hosts' }); - cy.task('esArchiverLoad', { archiveName: 'risk_hosts_updated' }); - expandFirstAlert(); - cy.get(ENRICHED_DATA_ROW).contains('Critical'); - cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL); + closeAlertFlyout(); + cy.task('esArchiverUnload', { archiveName: 'risk_hosts' }); + cy.task('esArchiverLoad', { archiveName: 'risk_hosts_updated' }); + expandFirstAlert(); + cy.get(ENRICHED_DATA_ROW).contains('Critical'); + cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL); + }); }); - }); - describe('from new risk scores', () => { - beforeEach(() => { - disableExpandableFlyout(); - cy.task('esArchiverLoad', { archiveName: 'risk_scores_new' }); - deleteAlertsAndRules(); - createRule(getNewRule({ rule_id: 'rule1' })); - login(); - mockRiskEngineEnabled(); - visitWithTimeRange(ALERTS_URL); - waitForAlertsToPopulate(); - }); + describe('from new risk scores', () => { + beforeEach(() => { + cy.task('esArchiverLoad', { archiveName: 'risk_scores_new' }); + deleteAlertsAndRules(); + createRule(getNewRule({ rule_id: 'rule1' })); + login(); + mockRiskEngineEnabled(); + visitWithTimeRange(ALERTS_URL); + waitForAlertsToPopulate(); + }); - afterEach(() => { - cy.task('esArchiverUnload', { archiveName: 'risk_scores_new' }); - cy.task('esArchiverUnload', { archiveName: 'risk_scores_new_updated' }); - }); + afterEach(() => { + cy.task('esArchiverUnload', { archiveName: 'risk_scores_new' }); + cy.task('esArchiverUnload', { archiveName: 'risk_scores_new_updated' }); + }); - it('Should has enrichment fields from legacy risk', function () { - cy.get(HOST_RISK_HEADER_COLUMN).contains('Host Risk Level'); - cy.get(USER_RISK_HEADER_COLUMN).contains('User Risk Level'); - scrollAlertTableColumnIntoView(HOST_RISK_COLUMN); - cy.get(HOST_RISK_COLUMN).contains('Critical'); - scrollAlertTableColumnIntoView(USER_RISK_COLUMN); - cy.get(USER_RISK_COLUMN).contains('High'); - scrollAlertTableColumnIntoView(ACTION_COLUMN); - expandFirstAlert(); - cy.get(ENRICHED_DATA_ROW).contains('Critical'); - cy.get(ENRICHED_DATA_ROW).contains(CURRENT_HOST_RISK_LEVEL); - cy.get(ENRICHED_DATA_ROW).contains('Low').should('not.exist'); - cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL).should('not.exist'); + it('Should has enrichment fields from legacy risk', function () { + cy.get(HOST_RISK_HEADER_COLUMN).contains('Host Risk Level'); + cy.get(USER_RISK_HEADER_COLUMN).contains('User Risk Level'); + scrollAlertTableColumnIntoView(HOST_RISK_COLUMN); + cy.get(HOST_RISK_COLUMN).contains('Critical'); + scrollAlertTableColumnIntoView(USER_RISK_COLUMN); + cy.get(USER_RISK_COLUMN).contains('High'); + scrollAlertTableColumnIntoView(ACTION_COLUMN); + expandFirstAlert(); + cy.get(ENRICHED_DATA_ROW).contains('Critical'); + cy.get(ENRICHED_DATA_ROW).contains(CURRENT_HOST_RISK_LEVEL); + cy.get(ENRICHED_DATA_ROW).contains('Low').should('not.exist'); + cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL).should('not.exist'); - closeAlertFlyout(); - cy.task('esArchiverUnload', { archiveName: 'risk_scores_new' }); - cy.task('esArchiverLoad', { archiveName: 'risk_scores_new_updated' }); - expandFirstAlert(); - cy.get(ENRICHED_DATA_ROW).contains('Low'); - cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL); + closeAlertFlyout(); + cy.task('esArchiverUnload', { archiveName: 'risk_scores_new' }); + cy.task('esArchiverLoad', { archiveName: 'risk_scores_new_updated' }); + expandFirstAlert(); + cy.get(ENRICHED_DATA_ROW).contains('Low'); + cy.get(ENRICHED_DATA_ROW).contains(ORIGINAL_HOST_RISK_LEVEL); + }); }); }); - }); -}); + } +); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/guided_onboarding/tour.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/guided_onboarding/tour.cy.ts index cebc67a78d2ef..39dd027bdd86d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/guided_onboarding/tour.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/guided_onboarding/tour.cy.ts @@ -6,7 +6,6 @@ */ import { AlertsCasesTourSteps } from '@kbn/security-solution-plugin/public/common/components/guided_onboarding_tour/tour_config'; -import { disableExpandableFlyout } from '../../../tasks/api_calls/kibana_advanced_settings'; import { navigateFromHeaderTo } from '../../../tasks/security_header'; import { ALERTS, TIMELINES } from '../../../screens/security_header'; import { closeAlertFlyout, expandFirstAlert } from '../../../tasks/alerts'; @@ -35,7 +34,6 @@ describe('Guided onboarding tour', { tags: ['@ess'] }, () => { deleteAlertsAndRules(); createRule(getNewRule({ query: 'user.name:*' })); login(); - disableExpandableFlyout(); startAlertsCasesTour(); visit(ALERTS_URL); waitForAlertsToPopulate(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts index 241add1703248..b9655de8eab03 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { disableExpandableFlyout } from '../../../tasks/api_calls/kibana_advanced_settings'; import { ALERT_FLYOUT, CELL_TEXT, @@ -38,13 +37,14 @@ import { waitForPageToBeLoaded as waitForRuleDetailsPageToBeLoaded, } from '../../../tasks/rule_details'; -describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { +// this functionality is now not used anymore (though still accessible if customers turn the `expandableFlyoutDisabled` feature flag on +// the code will be removed entirely for `8.16 (see https://github.com/elastic/security-team/issues/7462) +describe.skip('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { describe('Basic functions', () => { beforeEach(() => { deleteAlertsAndRules(); createRule(getNewRule()); login(); - disableExpandableFlyout(); visit(ALERTS_URL); waitForAlertsToPopulate(); expandFirstAlert(); @@ -70,7 +70,6 @@ describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { deleteAlertsAndRules(); createRule({ ...getUnmappedRule(), investigation_fields: { field_names: ['event.kind'] } }); login(); - disableExpandableFlyout(); visit(ALERTS_URL); waitForAlertsToPopulate(); expandFirstAlert(); @@ -143,7 +142,6 @@ describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { deleteAlertsAndRules(); createRule(getNewRule()); login(); - disableExpandableFlyout(); visitWithTimeRange(ALERTS_URL); waitForAlertsToPopulate(); expandFirstAlert(); @@ -196,7 +194,6 @@ describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { createRule(getNewRule()); login(); - disableExpandableFlyout(); visitWithTimeRange(ALERTS_URL); waitForAlertsToPopulate(); expandFirstAlert(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/investigate_in_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/investigate_in_timeline.cy.ts index dcff07d7d9ced..b763260f4da3e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/investigate_in_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/investigate_in_timeline.cy.ts @@ -5,105 +5,123 @@ * 2.0. */ -import { disableExpandableFlyout } from '../../../tasks/api_calls/kibana_advanced_settings'; import { getNewRule } from '../../../objects/rule'; import { + ANALYZER_GRAPH_TAB_BUTTON, PROVIDER_BADGE, QUERY_TAB_BUTTON, - TIMELINE_FILTER_BADGE, TIMELINE_TITLE, } from '../../../screens/timeline'; - -import { expandFirstAlert, investigateFirstAlertInTimeline } from '../../../tasks/alerts'; +import { closeTimeline } from '../../../tasks/timeline'; +import { investigateFirstAlertInTimeline } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; - import { ALERTS_URL } from '../../../urls/navigation'; -import { - ALERT_FLYOUT, - INSIGHTS_INVESTIGATE_ANCESTRY_ALERTS_IN_TIMELINE_BUTTON, - INSIGHTS_INVESTIGATE_IN_TIMELINE_BUTTON, - INSIGHTS_RELATED_ALERTS_BY_ANCESTRY, - INSIGHTS_RELATED_ALERTS_BY_SESSION, - SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON, -} from '../../../screens/alerts_details'; -import { verifyInsightCount } from '../../../tasks/alerts_details'; import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; +import { expandAlertAtIndexExpandableFlyout } from '../../../tasks/expandable_flyout/common'; +import { + clickAnalyzerPreviewTitleToOpenTimeline, + toggleOverviewTabAboutSection, + toggleOverviewTabInvestigationSection, + toggleOverviewTabVisualizationsSection, +} from '../../../tasks/expandable_flyout/alert_details_right_panel_overview_tab'; +import { + expandDocumentDetailsExpandableFlyoutLeftSection, + openTakeActionButton, + selectTakeActionItem, +} from '../../../tasks/expandable_flyout/alert_details_right_panel'; +import { DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE } from '../../../screens/expandable_flyout/alert_details_right_panel'; +import { + openTimelineFromPrevalenceTableCell, + openPrevalenceTab, +} from '../../../tasks/expandable_flyout/alert_details_left_panel_prevalence_tab'; +import { + openCorrelationsTab, + openTimelineFromRelatedByAncestry, + openTimelineFromRelatedBySession, + openTimelineFromRelatedSourceEvent, +} from '../../../tasks/expandable_flyout/alert_details_left_panel_correlations_tab'; -describe('Investigate in timeline', { tags: ['@ess', '@serverless'] }, () => { - beforeEach(() => { - deleteAlertsAndRules(); - createRule(getNewRule()); - }); - - describe('From alerts table', () => { +describe( + 'Investigate in timeline', + { + tags: ['@ess', '@serverless'], + }, + () => { beforeEach(() => { + deleteAlertsAndRules(); + createRule(getNewRule()); login(); visitWithTimeRange(ALERTS_URL); waitForAlertsToPopulate(); }); - it('should open new timeline from alerts table', () => { - investigateFirstAlertInTimeline(); - cy.get(PROVIDER_BADGE) - .first() - .invoke('text') - .then((eventId) => { - cy.get(PROVIDER_BADGE).filter(':visible').should('have.text', eventId); - }); + describe('From alerts table', () => { + it('should open new timeline from alerts table', () => { + investigateFirstAlertInTimeline(); + cy.get(PROVIDER_BADGE) + .first() + .invoke('text') + .then((eventId) => { + cy.get(PROVIDER_BADGE).filter(':visible').should('have.text', eventId); + }); + }); }); - }); - describe('From alerts details flyout', () => { - beforeEach(() => { - login(); - disableExpandableFlyout(); - visitWithTimeRange(ALERTS_URL); - waitForAlertsToPopulate(); - expandFirstAlert(); - }); + describe('From alerts details flyout', () => { + beforeEach(() => { + expandAlertAtIndexExpandableFlyout(); + }); - it('should open a new timeline from a prevalence field', () => { - // Only one alert matches the exact process args in this case - const alertCount = 1; - - // Click on the last button that lets us investigate in timeline. - // We expect this to be the `process.args` row. - cy.get(ALERT_FLYOUT).find(SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON).eq(5).scrollIntoView(); - cy.get(ALERT_FLYOUT) - .find(SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON) - .eq(5) - .should('be.visible') - .and('have.text', alertCount) - .click(); - - // Make sure a new timeline is created and opened - cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); - - // The alert count in this timeline should match the count shown on the alert flyout - cy.get(QUERY_TAB_BUTTON).should('contain.text', alertCount); - - // The correct filter is applied to the timeline query - cy.get(TIMELINE_FILTER_BADGE).should( - 'have.text', - ' {"bool":{"must":[{"term":{"process.args":"-zsh"}},{"term":{"process.args":"unique"}}]}}' - ); - }); + it('should open a new timeline from take action button', () => { + openTakeActionButton(); + selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE); - it('should open a new timeline from an insights module', () => { - verifyInsightCount({ - tableSelector: INSIGHTS_RELATED_ALERTS_BY_SESSION, - investigateSelector: INSIGHTS_INVESTIGATE_IN_TIMELINE_BUTTON, + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); + cy.get(QUERY_TAB_BUTTON).should('have.class', 'euiTab-isSelected'); }); - }); - it('should open a new timeline with alert ids from the process ancestry', () => { - verifyInsightCount({ - tableSelector: INSIGHTS_RELATED_ALERTS_BY_ANCESTRY, - investigateSelector: INSIGHTS_INVESTIGATE_ANCESTRY_ALERTS_IN_TIMELINE_BUTTON, + it('should open a new timeline from analyzer graph preview', () => { + toggleOverviewTabAboutSection(); + toggleOverviewTabInvestigationSection(); + toggleOverviewTabVisualizationsSection(); + clickAnalyzerPreviewTitleToOpenTimeline(); + + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); + cy.get(ANALYZER_GRAPH_TAB_BUTTON).should('have.class', 'euiTab-isSelected'); + }); + + it('should open a new timeline from the prevalence detail table', () => { + expandDocumentDetailsExpandableFlyoutLeftSection(); + openPrevalenceTab(); + openTimelineFromPrevalenceTableCell(); + + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); + cy.get(QUERY_TAB_BUTTON).should('have.class', 'euiTab-isSelected'); + }); + + it('should open a new timeline from the correlations tab', () => { + expandDocumentDetailsExpandableFlyoutLeftSection(); + openCorrelationsTab(); + openTimelineFromRelatedSourceEvent(); + + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); + cy.get(QUERY_TAB_BUTTON).should('have.class', 'euiTab-isSelected'); + + closeTimeline(); + openTimelineFromRelatedBySession(); + + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); + cy.get(QUERY_TAB_BUTTON).should('have.class', 'euiTab-isSelected'); + + closeTimeline(); + openTimelineFromRelatedByAncestry(); + + cy.get(TIMELINE_TITLE).should('have.text', 'Untitled timeline'); + cy.get(QUERY_TAB_BUTTON).should('have.class', 'euiTab-isSelected'); }); }); - }); -}); + } +); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts b/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts index 70f43b35d1211..6f9ee7b4aea77 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts @@ -9,8 +9,6 @@ export const ALERT_FLYOUT = '[data-test-subj="timeline:details-panel:flyout"]'; export const CELL_TEXT = '.euiText'; -export const ENRICHMENT_COUNT_NOTIFICATION = '[data-test-subj="enrichment-count-notification"]'; - export const ENRICHMENT_QUERY_RANGE_PICKER = '[data-test-subj="enrichment-query-range-picker"]'; export const ENRICHMENT_QUERY_START_INPUT = '.start-picker'; @@ -26,7 +24,7 @@ export const INVESTIGATION_TIME_ENRICHMENT_SECTION = export const JSON_VIEW_TAB = '[data-test-subj="jsonViewTab"]'; -export const JSON_TEXT = '[data-test-subj="jsonView"]'; +export const JSON_TEXT = '[data-test-subj="kibanaCodeEditor"]'; export const OVERVIEW_RULE = '[data-test-subj="eventDetails"] [data-test-subj="ruleName"]'; @@ -41,10 +39,6 @@ export const TABLE_CELL = '.euiTableRowCell'; export const CELL_EXPAND_VALUE = '[data-test-subj="euiDataGridCellExpandButton"]'; -export const CELL_EXPANSION_POPOVER = '[data-test-subj="euiDataGridExpansionPopover"]'; - -export const USER_DETAILS_LINK = '[data-test-subj="users-link-anchor"]'; - export const TABLE_TAB = '[data-test-subj="tableTab"]'; export const TABLE_CONTAINER = '[data-test-subj="event-fields-browser"]'; @@ -59,16 +53,6 @@ export const THREAT_INTEL_TAB = '[data-test-subj="threatIntelTab"]'; export const UPDATE_ENRICHMENT_RANGE_BUTTON = '[data-test-subj="enrichment-button"]'; -export const SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON = `${SUMMARY_VIEW} [aria-label='Investigate in timeline']`; - -export const INSIGHTS_RELATED_ALERTS_BY_SESSION = `[data-test-subj='related-alerts-by-session']`; - -export const INSIGHTS_INVESTIGATE_IN_TIMELINE_BUTTON = `${INSIGHTS_RELATED_ALERTS_BY_SESSION} [aria-label='Investigate in timeline']`; - -export const INSIGHTS_RELATED_ALERTS_BY_ANCESTRY = `[data-test-subj='related-alerts-by-ancestry']`; - -export const INSIGHTS_INVESTIGATE_ANCESTRY_ALERTS_IN_TIMELINE_BUTTON = `[data-test-subj='investigate-ancestry-in-timeline']`; - export const ENRICHED_DATA_ROW = `[data-test-subj='EnrichedDataRow']`; export const COPY_ALERT_FLYOUT_LINK = `[data-test-subj="copy-alert-flyout-link"]`; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts index 0a0a7e0edbe38..33e625d1db89a 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_overview_tab.ts @@ -104,6 +104,8 @@ export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_VISUALIZATIONS_SECTION_HEADER getDataTestSubjectSelector('securitySolutionFlyoutVisualizationsHeader'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_VISUALIZATIONS_SECTION_CONTENT = getDataTestSubjectSelector('securitySolutionFlyoutVisualizationsContent'); +export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_ANALYZER_PREVIEW_TITLE_LINK = + getDataTestSubjectSelector('securitySolutionFlyoutAnalyzerPreviewTitleLink'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_ANALYZER_PREVIEW_CONTAINER = getDataTestSubjectSelector('securitySolutionFlyoutAnalyzerPreviewContent'); export const DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_SESSION_PREVIEW_CONTAINER = diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts index 18c0bd9029ff6..3a0eec9391437 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts @@ -19,6 +19,9 @@ export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ID_ROW = getDataTestSubjectSelect export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_HOST_OS_BUILD_ROW = getDataTestSubjectSelector( 'event-fields-table-row-host.os.build' ); +export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_THREAT_ENRICHMENTS = getDataTestSubjectSelector( + 'event-fields-table-row-threat.enrichments' +); const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_ACTIONS = 'actionItem-security-detailsFlyout-cellActions-'; export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_FILTER_IN = getDataTestSubjectSelector( diff --git a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts index 8d24d64a38cd6..cac84384ed8d1 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts @@ -106,6 +106,8 @@ export const INDICATOR_MATCH_ROW_RENDER = '[data-test-subj="threat-match-row"]'; export const QUERY_TAB_BUTTON = '[data-test-subj="timelineTabs-query"]'; +export const ANALYZER_GRAPH_TAB_BUTTON = getDataTestSubjectSelector('timelineTabs-graph'); + export const SERVER_SIDE_EVENT_COUNT = '[data-test-subj="server-side-event-count"]'; export const ALERTS_TABLE_COUNT = `[data-test-subj="toolbar-alerts-count"]`; @@ -303,8 +305,6 @@ export const TIMELINE_DATE_PICKER_CONTAINER = getDataTestSubjectSelector( 'timeline-date-picker-container' ); -export const TIMELINE_FILTER_BADGE = `[data-test-subj^='timeline-filters-container'] [data-test-subj^="filter-badge"]`; - export const NEW_TIMELINE_ACTION = getDataTestSubjectSelector( 'timeline-modal-new-timeline-dropdown-button' ); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/alerts_details.ts b/x-pack/test/security_solution_cypress/cypress/tasks/alerts_details.ts index 7444f7580186c..3806c2c6e3af9 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/alerts_details.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/alerts_details.ts @@ -7,15 +7,12 @@ import { CLOSE_ALERT_BTN, MARK_ALERT_ACKNOWLEDGED_BTN, OPEN_ALERT_BTN } from '../screens/alerts'; import { - ALERT_FLYOUT, - ENRICHMENT_COUNT_NOTIFICATION, JSON_VIEW_TAB, TABLE_TAB, FILTER_INPUT, OVERVIEW_STATUS, EVENT_DETAILS_ALERT_STATUS_POPOVER, } from '../screens/alerts_details'; -import { TIMELINE_TITLE, QUERY_TAB_BUTTON } from '../screens/timeline'; export const filterBy = (value: string) => { cy.get(FILTER_INPUT).type(value); @@ -29,42 +26,6 @@ export const openTable = () => { cy.get(TABLE_TAB).click(); }; -export const openThreatIndicatorDetails = () => { - cy.get(ENRICHMENT_COUNT_NOTIFICATION).click(); -}; - -export const verifyInsightCount = ({ - tableSelector, - investigateSelector, -}: { - tableSelector: string; - investigateSelector: string; -}) => { - cy.get(tableSelector).click(); - - // Make sure the table containing data has loaded before parsing the text for the alert count - cy.get(investigateSelector); - cy.get(tableSelector) - .invoke('text') - .then((relatedAlertsByAncestryText) => { - // Extract the count from the text - const alertCount = relatedAlertsByAncestryText.match(/(\d)/); - const actualCount = alertCount && alertCount[0]; - - // Make sure we can see the table - cy.contains('New Rule Test').should('be.visible'); - - // Click on the first button that lets us investigate in timeline - cy.get(ALERT_FLYOUT).find(investigateSelector).click(); - - // Make sure a new timeline is created and opened - cy.get(TIMELINE_TITLE).should('contain.text', 'Untitled timeline'); - - // The alert count in this timeline should match the count shown on the alert flyout - cy.get(QUERY_TAB_BUTTON).should('contain.text', actualCount); - }); -}; - export const changeAlertStatusTo = (status: 'open' | 'closed' | 'acknowledged') => { cy.get(OVERVIEW_STATUS).click(); cy.get(EVENT_DETAILS_ALERT_STATUS_POPOVER).should('be.visible'); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts index e5b905f163666..7307fa2418b68 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts @@ -6,10 +6,7 @@ */ import { SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID } from '@kbn/management-settings-ids'; -import { - ENABLE_ASSET_CRITICALITY_SETTING, - ENABLE_EXPANDABLE_FLYOUT_SETTING, -} from '@kbn/security-solution-plugin/common/constants'; +import { ENABLE_ASSET_CRITICALITY_SETTING } from '@kbn/security-solution-plugin/common/constants'; import { rootRequest } from './common'; export const setKibanaSetting = (key: string, value: boolean | number | string) => { @@ -28,10 +25,6 @@ export const disableRelatedIntegrations = () => { setKibanaSetting(SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID, false); }; -export const disableExpandableFlyout = () => { - setKibanaSetting(ENABLE_EXPANDABLE_FLYOUT_SETTING, false); -}; - export const enableAssetCriticality = () => { setKibanaSetting(ENABLE_ASSET_CRITICALITY_SETTING, true); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts index 8900e86a4524e..a86f9a74b18d0 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts @@ -5,7 +5,12 @@ * 2.0. */ -import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON } from '../../screens/expandable_flyout/alert_details_left_panel_correlations_tab'; +import { + CORRELATIONS_ANCESTRY_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON, + CORRELATIONS_SESSION_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON, + CORRELATIONS_SOURCE_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON, + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON, +} from '../../screens/expandable_flyout/alert_details_left_panel_correlations_tab'; /** * Open the Correlations tab under the Visuablize tab in the document details expandable flyout left section @@ -13,3 +18,24 @@ import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON } from '../../ export const openCorrelationsTab = () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON).click(); }; + +/** + * Open timeline from the related by source event + */ +export const openTimelineFromRelatedSourceEvent = () => { + cy.get(CORRELATIONS_SOURCE_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).click(); +}; + +/** + * Open timeline from the related by source event + */ +export const openTimelineFromRelatedByAncestry = () => { + cy.get(CORRELATIONS_ANCESTRY_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).click(); +}; + +/** + * Open timeline from the related by source event + */ +export const openTimelineFromRelatedBySession = () => { + cy.get(CORRELATIONS_SESSION_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).click(); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_prevalence_tab.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_prevalence_tab.ts index a81a7d8031855..f24a673e75a0e 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_prevalence_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_prevalence_tab.ts @@ -5,7 +5,10 @@ * 2.0. */ -import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON } from '../../screens/expandable_flyout/alert_details_left_panel_prevalence_tab'; +import { + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON, + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_TYPE_CELL, +} from '../../screens/expandable_flyout/alert_details_left_panel_prevalence_tab'; /** * Open the Prevalence tab under the Visualize tab in the document details expandable flyout left section @@ -13,3 +16,10 @@ import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON } from '../../sc export const openPrevalenceTab = () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON).click(); }; + +/** + * Open timeline from a prevalence detail table cell + */ +export const openTimelineFromPrevalenceTableCell = () => { + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_TYPE_CELL).first().click(); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_overview_tab.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_overview_tab.ts index aade383f2d846..be9b29a842e0e 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_overview_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_overview_tab.ts @@ -21,6 +21,7 @@ import { DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_ENTITIES_HEADER, DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_PREVALENCE_HEADER, DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_RESPONSE_BUTTON, + DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_ANALYZER_PREVIEW_TITLE_LINK, } from '../../screens/expandable_flyout/alert_details_right_panel_overview_tab'; /* About section */ @@ -125,3 +126,10 @@ export const clickAlertReasonButton = () => { export const navigateToResponseDetails = () => { cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_RESPONSE_BUTTON).should('be.visible').click(); }; + +/** + * Click the Response button to open the response detail tab in the left section + */ +export const clickAnalyzerPreviewTitleToOpenTimeline = () => { + cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_ANALYZER_PREVIEW_TITLE_LINK).click(); +}; From c89ee65c7034ba26006e2d426156a6de11b3505f Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:06:17 +0100 Subject: [PATCH 48/82] [Security Solution][Detection engine] fixes flaky query rule execution test (#184597) ## Summary - `should query and get back expected alert structure when it is a alert on a alert` test was flaky as it asserted index name with a current date. If it runs near midnight, when date changes it could lead to failed index name assertions. Converted that tests to use regexp, so date won't be asserted. - migrated query test file from kibana expect to jest expect - addresses flaky tests issue - https://github.com/elastic/kibana/issues/174805 - https://github.com/elastic/kibana/issues/177101 - https://github.com/elastic/kibana/issues/173342 --- .../execution_logic/custom_query.ts | 391 +++++++++--------- 1 file changed, 196 insertions(+), 195 deletions(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/custom_query.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/custom_query.ts index a3ff1cf2909ff..e2009873d4af6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/custom_query.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/custom_query.ts @@ -5,7 +5,7 @@ * 2.0. */ -import expect from '@kbn/expect'; +import expect from 'expect'; import { ALERT_RISK_SCORE, ALERT_RULE_PARAMETERS, @@ -46,7 +46,6 @@ import { ENABLE_ASSET_CRITICALITY_SETTING, } from '@kbn/security-solution-plugin/common/constants'; import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; -import moment from 'moment'; import { deleteAllExceptions } from '../../../../../lists_and_exception_lists/utils'; import { createExceptionList, @@ -127,8 +126,8 @@ export default ({ getService }: FtrProviderContext) => { }; const createdRule = await createRule(supertest, log, rule); const alerts = await getAlerts(supertest, log, es, createdRule); - expect(alerts.hits.hits.length).greaterThan(0); - expect(alerts.hits.hits[0]._source?.['kibana.alert.ancestors'][0].id).eql(ID); + expect(alerts.hits.hits.length).toBeGreaterThan(0); + expect(alerts.hits.hits[0]._source?.['kibana.alert.ancestors'][0].id).toEqual(ID); }); it('generates max alerts warning when circuit breaker is hit', async () => { @@ -136,7 +135,7 @@ export default ({ getService }: FtrProviderContext) => { ...getRuleForAlertTesting(['auditbeat-*']), }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).contain(getMaxAlertsWarning()); + expect(logs[0].warnings).toContain(getMaxAlertsWarning()); }); it("doesn't generate max alerts warning when circuit breaker is met but not exceeded", async () => { @@ -146,7 +145,7 @@ export default ({ getService }: FtrProviderContext) => { max_signals: 10, }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).not.contain(getMaxAlertsWarning()); + expect(logs[0].warnings).not.toContain(getMaxAlertsWarning()); }); it('should abide by max_signals > 100', async () => { @@ -158,7 +157,7 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); // Search for 2x max_signals to make sure we aren't making more than max_signals const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxAlerts * 2 }); - expect(previewAlerts.length).equal(maxAlerts); + expect(previewAlerts.length).toEqual(maxAlerts); }); it('should have recorded the rule_id within the alert', async () => { @@ -168,7 +167,7 @@ export default ({ getService }: FtrProviderContext) => { }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]._source?.[ALERT_RULE_RULE_ID]).eql(getSimpleRule().rule_id); + expect(previewAlerts[0]._source?.[ALERT_RULE_RULE_ID]).toEqual(getSimpleRule().rule_id); }); it('should query and get back expected alert structure using a basic KQL query', async () => { @@ -180,7 +179,7 @@ export default ({ getService }: FtrProviderContext) => { const previewAlerts = await getPreviewAlerts({ es, previewId }); const alert = previewAlerts[0]._source; - expect(alert).eql({ + expect(alert).toEqual({ ...alert, [ALERT_ANCESTORS]: [ { @@ -202,8 +201,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177101 - it.skip('should query and get back expected alert structure when it is a alert on a alert', async () => { + it('should query and get back expected alert structure when it is a alert on a alert', async () => { const alertId = 'eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1'; const rule: QueryRuleCreateProps = { ...getRuleForAlertTesting([`.alerts-security.alerts-default*`]), @@ -214,19 +212,18 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts.length).to.eql(1); + expect(previewAlerts.length).toEqual(1); const alert = previewAlerts[0]._source; if (!alert) { - return expect(alert).to.be.ok(); + return expect(alert).toBeTruthy(); } - const date = moment(); - const formattedDate = date.format('YYYY.MM.DD'); const alertAncestorIndex = isServerless - ? `.ds-.alerts-security.alerts-default-${formattedDate}-000001` + ? /^\.ds-\.alerts-security\.alerts-default-[0-9\.]*-000001$/ : '.internal.alerts-security.alerts-default-000001'; - expect(alert[ALERT_ANCESTORS]).eql([ + + expect(alert[ALERT_ANCESTORS]).toEqual([ { id: 'vT9cwocBh3b8EMpD8lsi', type: 'event', @@ -237,18 +234,19 @@ export default ({ getService }: FtrProviderContext) => { rule: '7015a3e2-e4ea-11ed-8c11-49608884878f', id: alertId, type: 'signal', - index: alertAncestorIndex, + index: expect.any(String), depth: 1, }, ]); - expect(alert[ALERT_WORKFLOW_STATUS]).eql('open'); - expect(alert[ALERT_DEPTH]).eql(2); - - expect(alert[ALERT_ORIGINAL_TIME]).eql('2023-04-27T11:03:57.906Z'); - expect(alert[`${ALERT_ORIGINAL_EVENT}.agent_id_status`]).eql('auth_metadata_missing'); - expect(alert[`${ALERT_ORIGINAL_EVENT}.ingested`]).eql('2023-04-27T10:58:03Z'); - expect(alert[`${ALERT_ORIGINAL_EVENT}.dataset`]).eql('endpoint'); - expect(alert[`${ALERT_ORIGINAL_EVENT}.ingested`]).eql('2023-04-27T10:58:03Z'); + expect(alert[ALERT_ANCESTORS][1].index).toMatch(alertAncestorIndex); + expect(alert[ALERT_WORKFLOW_STATUS]).toEqual('open'); + expect(alert[ALERT_DEPTH]).toEqual(2); + + expect(alert[ALERT_ORIGINAL_TIME]).toEqual('2023-04-27T11:03:57.906Z'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.agent_id_status`]).toEqual('auth_metadata_missing'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.ingested`]).toEqual('2023-04-27T10:58:03Z'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.dataset`]).toEqual('endpoint'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.ingested`]).toEqual('2023-04-27T10:58:03Z'); }); it('should not have risk score fields without risk indices', async () => { @@ -258,8 +256,8 @@ export default ({ getService }: FtrProviderContext) => { }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]?._source?.host?.risk).to.eql(undefined); - expect(previewAlerts[0]?._source?.user?.risk).to.eql(undefined); + expect(previewAlerts[0]?._source?.host?.risk).toEqual(undefined); + expect(previewAlerts[0]?._source?.user?.risk).toEqual(undefined); }); describe('with host and user risk indices', () => { @@ -279,10 +277,10 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]?._source?.host?.risk?.calculated_level).to.eql('Critical'); - expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).to.eql(96); - expect(previewAlerts[0]?._source?.user?.risk?.calculated_level).to.eql('Low'); - expect(previewAlerts[0]?._source?.user?.risk?.calculated_score_norm).to.eql(11); + expect(previewAlerts[0]?._source?.host?.risk?.calculated_level).toEqual('Critical'); + expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).toEqual(96); + expect(previewAlerts[0]?._source?.user?.risk?.calculated_level).toEqual('Low'); + expect(previewAlerts[0]?._source?.user?.risk?.calculated_score_norm).toEqual(11); }); it('should have host and user risk score fields when suppression enabled on interval', async () => { @@ -300,10 +298,10 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]?._source?.host?.risk?.calculated_level).to.eql('Critical'); - expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).to.eql(96); - expect(previewAlerts[0]?._source?.user?.risk?.calculated_level).to.eql('Low'); - expect(previewAlerts[0]?._source?.user?.risk?.calculated_score_norm).to.eql(11); + expect(previewAlerts[0]?._source?.host?.risk?.calculated_level).toEqual('Critical'); + expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).toEqual(96); + expect(previewAlerts[0]?._source?.user?.risk?.calculated_level).toEqual('Low'); + expect(previewAlerts[0]?._source?.user?.risk?.calculated_score_norm).toEqual(11); }); it('should have host and user risk score fields when suppression enabled on rule execution only', async () => { @@ -317,10 +315,10 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]?._source?.host?.risk?.calculated_level).to.eql('Critical'); - expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).to.eql(96); - expect(previewAlerts[0]?._source?.user?.risk?.calculated_level).to.eql('Low'); - expect(previewAlerts[0]?._source?.user?.risk?.calculated_score_norm).to.eql(11); + expect(previewAlerts[0]?._source?.host?.risk?.calculated_level).toEqual('Critical'); + expect(previewAlerts[0]?._source?.host?.risk?.calculated_score_norm).toEqual(96); + expect(previewAlerts[0]?._source?.user?.risk?.calculated_level).toEqual('Low'); + expect(previewAlerts[0]?._source?.user?.risk?.calculated_score_norm).toEqual(11); }); }); @@ -343,8 +341,8 @@ export default ({ getService }: FtrProviderContext) => { }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]?._source?.['host.asset.criticality']).to.eql('high_impact'); - expect(previewAlerts[0]?._source?.['user.asset.criticality']).to.eql('extreme_impact'); + expect(previewAlerts[0]?._source?.['host.asset.criticality']).toEqual('high_impact'); + expect(previewAlerts[0]?._source?.['user.asset.criticality']).toEqual('extreme_impact'); }); it('should be enriched alert with criticality_level when suppression enabled', async () => { @@ -361,8 +359,8 @@ export default ({ getService }: FtrProviderContext) => { }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts[0]?._source?.['host.asset.criticality']).to.eql('high_impact'); - expect(previewAlerts[0]?._source?.['user.asset.criticality']).to.eql('extreme_impact'); + expect(previewAlerts[0]?._source?.['host.asset.criticality']).toEqual('high_impact'); + expect(previewAlerts[0]?._source?.['user.asset.criticality']).toEqual('extreme_impact'); }); }); @@ -381,13 +379,13 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts.length).equal(4); + expect(previewAlerts.length).toEqual(4); previewAlerts.forEach((alert) => { - expect(alert._source?.[ALERT_SEVERITY]).equal('medium'); - expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).eql([]); + expect(alert._source?.[ALERT_SEVERITY]).toEqual('medium'); + expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).toEqual([]); - expect(alert._source?.[ALERT_RISK_SCORE]).equal(75); - expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).eql([]); + expect(alert._source?.[ALERT_RISK_SCORE]).toEqual(75); + expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).toEqual([]); }); }); @@ -410,8 +408,8 @@ export default ({ getService }: FtrProviderContext) => { value: alert._source?.[ALERT_SEVERITY], })); - expect(alertsOrderedByParentId.length).equal(4); - expect(severities).eql([ + expect(alertsOrderedByParentId.length).toEqual(4); + expect(severities).toEqual([ { id: '1', value: 'high' }, { id: '2', value: 'critical' }, { id: '3', value: 'critical' }, @@ -419,9 +417,9 @@ export default ({ getService }: FtrProviderContext) => { ]); alertsOrderedByParentId.forEach((alert) => { - expect(alert._source?.[ALERT_RISK_SCORE]).equal(75); - expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).eql([]); - expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).eql([ + expect(alert._source?.[ALERT_RISK_SCORE]).toEqual(75); + expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).toEqual([]); + expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).toEqual([ { field: 'my_severity', operator: 'equals', value: 'sev_900', severity: 'high' }, { field: 'my_severity', operator: 'equals', value: 'sev_max', severity: 'critical' }, ]); @@ -446,8 +444,8 @@ export default ({ getService }: FtrProviderContext) => { value: alert._source?.[ALERT_RISK_SCORE], })); - expect(alertsOrderedByParentId.length).equal(4); - expect(riskScores).eql([ + expect(alertsOrderedByParentId.length).toEqual(4); + expect(riskScores).toEqual([ { id: '1', value: 31.14 }, { id: '2', value: 32.14 }, { id: '3', value: 33.14 }, @@ -455,9 +453,9 @@ export default ({ getService }: FtrProviderContext) => { ]); alertsOrderedByParentId.forEach((alert) => { - expect(alert._source?.[ALERT_SEVERITY]).equal('medium'); - expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).eql([]); - expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).eql([ + expect(alert._source?.[ALERT_SEVERITY]).toEqual('medium'); + expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).toEqual([]); + expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).toEqual([ { field: 'my_risk', operator: 'equals', value: '' }, ]); }); @@ -486,8 +484,8 @@ export default ({ getService }: FtrProviderContext) => { risk: alert._source?.[ALERT_RISK_SCORE], })); - expect(alertsOrderedByParentId.length).equal(4); - expect(values).eql([ + expect(alertsOrderedByParentId.length).toEqual(4); + expect(values).toEqual([ { id: '1', severity: 'high', risk: 31.14 }, { id: '2', severity: 'critical', risk: 32.14 }, { id: '3', severity: 'critical', risk: 33.14 }, @@ -495,11 +493,11 @@ export default ({ getService }: FtrProviderContext) => { ]); alertsOrderedByParentId.forEach((alert) => { - expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).eql([ + expect(alert._source?.[ALERT_RULE_PARAMETERS].severity_mapping).toEqual([ { field: 'my_severity', operator: 'equals', value: 'sev_900', severity: 'high' }, { field: 'my_severity', operator: 'equals', value: 'sev_max', severity: 'critical' }, ]); - expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).eql([ + expect(alert._source?.[ALERT_RULE_PARAMETERS].risk_score_mapping).toEqual([ { field: 'my_risk', operator: 'equals', value: '' }, ]); }); @@ -516,10 +514,10 @@ export default ({ getService }: FtrProviderContext) => { const previewAlerts = await getPreviewAlerts({ es, previewId }); const fullAlert = previewAlerts[0]; if (!fullAlert) { - return expect(fullAlert).to.be.ok(); + return expect(fullAlert).toBeTruthy(); } - expect(previewAlerts[0]._source?.['kibana.alert.rule.name']).to.eql('boot'); + expect(previewAlerts[0]._source?.['kibana.alert.rule.name']).toEqual('boot'); }); it('should not generate duplicate alerts', async () => { @@ -530,7 +528,7 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule, invocationCount: 2 }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts.length).to.eql(1); + expect(previewAlerts.length).toEqual(1); }); describe('with suppression enabled', async () => { @@ -559,8 +557,8 @@ export default ({ getService }: FtrProviderContext) => { timeframeEnd: new Date('2020-10-28T05:30:00.000Z'), }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts.length).to.eql(1); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(1); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -592,15 +590,15 @@ export default ({ getService }: FtrProviderContext) => { timeframeEnd: new Date('2020-10-28T05:30:00.000Z'), }); const previewAlerts = await getPreviewAlerts({ es, previewId, size: 1000 }); - expect(previewAlerts.length).to.eql(3); + expect(previewAlerts.length).toEqual(3); previewAlerts.sort((a, b) => (a._source?.host?.name ?? '0') > (b._source?.host?.name ?? '0') ? 1 : -1 ); const hostNames = previewAlerts.map((alert) => alert._source?.host?.name); - expect(hostNames).to.eql(['host-0', 'host-1', 'host-2']); - expect(previewAlerts[0]._source).to.eql({ + expect(hostNames).toEqual(['host-0', 'host-1', 'host-2']); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -637,9 +635,9 @@ export default ({ getService }: FtrProviderContext) => { size: 1000, sort: ['host.name', 'source.ip'], }); - expect(previewAlerts.length).to.eql(6); + expect(previewAlerts.length).toEqual(6); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -684,9 +682,9 @@ export default ({ getService }: FtrProviderContext) => { size: 1000, sort: ['host.name', 'source.ip', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(12); + expect(previewAlerts.length).toEqual(12); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -704,7 +702,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_DOCS_COUNT]: 2, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -748,9 +746,9 @@ export default ({ getService }: FtrProviderContext) => { size: 1000, sort: ['destination.ip'], }); - expect(previewAlerts.length).to.eql(3); + expect(previewAlerts.length).toEqual(3); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -765,7 +763,7 @@ export default ({ getService }: FtrProviderContext) => { }); // We also expect to have a separate group for documents that don't populate the groupBy field - expect(previewAlerts[2]._source).to.eql({ + expect(previewAlerts[2]._source).toEqual({ ...previewAlerts[2]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -806,10 +804,10 @@ export default ({ getService }: FtrProviderContext) => { size: 1000, sort: ['destination.ip'], }); - expect(previewAlerts.length).to.eql(3); + expect(previewAlerts.length).toEqual(3); // We also expect to have a separate group for documents that don't populate the groupBy field - expect(previewAlerts[2]._source).to.eql({ + expect(previewAlerts[2]._source).toEqual({ ...previewAlerts[2]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -869,8 +867,8 @@ export default ({ getService }: FtrProviderContext) => { }; const createdRule = await createRule(supertest, log, rule); const alerts = await getAlerts(supertest, log, es, createdRule); - expect(alerts.hits.hits.length).eql(1); - expect(alerts.hits.hits[0]._source).to.eql({ + expect(alerts.hits.hits.length).toEqual(1); + expect(alerts.hits.hits[0]._source).toEqual({ ...alerts.hits.hits[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -907,8 +905,8 @@ export default ({ getService }: FtrProviderContext) => { undefined, afterTimestamp ); - expect(secondAlerts.hits.hits.length).eql(1); - expect(secondAlerts.hits.hits[0]._source).to.eql({ + expect(secondAlerts.hits.hits.length).toEqual(1); + expect(secondAlerts.hits.hits[0]._source).toEqual({ ...secondAlerts.hits.hits[0]._source, [TIMESTAMP]: secondAlerts.hits.hits[0]._source?.[TIMESTAMP], [ALERT_SUPPRESSION_TERMS]: [ @@ -983,8 +981,8 @@ export default ({ getService }: FtrProviderContext) => { undefined, afterTimestamp ); - expect(secondAlerts.hits.hits.length).eql(2); - expect(secondAlerts.hits.hits[0]._source).to.eql({ + expect(secondAlerts.hits.hits.length).toEqual(2); + expect(secondAlerts.hits.hits[0]._source).toEqual({ ...secondAlerts.hits.hits[0]._source, [TIMESTAMP]: secondAlerts.hits.hits[0]._source?.[TIMESTAMP], [ALERT_SUPPRESSION_TERMS]: [ @@ -999,7 +997,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: firstTimestamp, [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(secondAlerts.hits.hits[1]._source).to.eql({ + expect(secondAlerts.hits.hits[1]._source).toEqual({ ...secondAlerts.hits.hits[1]._source, [TIMESTAMP]: secondAlerts.hits.hits[1]._source?.[TIMESTAMP], [ALERT_SUPPRESSION_TERMS]: [ @@ -1042,8 +1040,8 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: [ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(2); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(2); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1058,7 +1056,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: '2020-10-28T05:00:02.000Z', [ALERT_SUPPRESSION_DOCS_COUNT]: 5, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1101,8 +1099,8 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: [ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(1); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(1); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1145,8 +1143,8 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: ['host.name', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(3); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(3); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1161,7 +1159,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: '2020-10-28T06:00:02.000Z', [ALERT_SUPPRESSION_DOCS_COUNT]: 11, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1176,7 +1174,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: '2020-10-28T06:00:02.000Z', [ALERT_SUPPRESSION_DOCS_COUNT]: 11, }); - expect(previewAlerts[2]._source).to.eql({ + expect(previewAlerts[2]._source).toEqual({ ...previewAlerts[2]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1219,8 +1217,8 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: ['destination.ip', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(3); - expect(previewAlerts[2]._source).to.eql({ + expect(previewAlerts.length).toEqual(3); + expect(previewAlerts[2]._source).toEqual({ ...previewAlerts[2]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1285,8 +1283,8 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: ['agent.name', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(1); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(1); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1349,8 +1347,8 @@ export default ({ getService }: FtrProviderContext) => { size: 1000, sort: ['agent.name', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(150); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(150); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1363,7 +1361,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: laterTimestamp, [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(previewAlerts[149]._source).to.eql({ + expect(previewAlerts[149]._source).toEqual({ ...previewAlerts[149]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1436,8 +1434,8 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(2); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(2); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1450,7 +1448,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: laterTimestamp, [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1464,7 +1462,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_DOCS_COUNT]: 0, }); for (const logEntry of logs) { - expect(logEntry.errors.length).to.eql(0); + expect(logEntry.errors.length).toEqual(0); } }); @@ -1503,8 +1501,8 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: [ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(1); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts.length).toEqual(1); + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1519,8 +1517,8 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_END]: '2020-10-28T06:00:02.000Z', [ALERT_SUPPRESSION_DOCS_COUNT]: 5, }); - expect(previewAlerts[0]._source?.host?.risk?.calculated_level).to.eql('Low'); - expect(previewAlerts[0]._source?.host?.risk?.calculated_score_norm).to.eql(1); + expect(previewAlerts[0]._source?.host?.risk?.calculated_level).toEqual('Low'); + expect(previewAlerts[0]._source?.host?.risk?.calculated_score_norm).toEqual(1); }); }); }); @@ -1591,9 +1589,9 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(4); + expect(previewAlerts.length).toEqual(4); // first alert should be suppressed - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1608,20 +1606,20 @@ export default ({ getService }: FtrProviderContext) => { }); // alert is not suppressed and do not have suppress properties - expect(previewAlerts[1]._source).to.have.property('id', id); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(previewAlerts[1]._source).toHaveProperty('id', id); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); // rest of alerts are not suppressed and do not have suppress properties previewAlerts.slice(2).forEach((previewAlert) => { const source = previewAlert._source; - expect(source).to.have.property('id', id); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); }); }); @@ -1662,23 +1660,23 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(4); + expect(previewAlerts.length).toEqual(4); // alert is not suppressed and do not have suppress properties - expect(previewAlerts[1]._source).to.have.property('id', id); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(previewAlerts[1]._source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(previewAlerts[1]._source).toHaveProperty('id', id); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(previewAlerts[1]._source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); // rest of alerts are not suppressed and do not have suppress properties previewAlerts.slice(2).forEach((previewAlert) => { const source = previewAlert._source; - expect(source).to.have.property('id', id); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); }); }); @@ -1717,9 +1715,9 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(1); + expect(previewAlerts.length).toEqual(1); // first alert should be suppressed - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1773,9 +1771,9 @@ export default ({ getService }: FtrProviderContext) => { sort: ['agent.name'], }); // alerts number should be still at 100 - expect(previewAlerts.length).to.eql(100); + expect(previewAlerts.length).toEqual(100); // first alert should be suppressed - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -1792,11 +1790,11 @@ export default ({ getService }: FtrProviderContext) => { // rest of alerts are not suppressed and do not have suppress properties previewAlerts.slice(1).forEach((previewAlert) => { const source = previewAlert._source; - expect(source).to.have.property('id', id); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); }); }); @@ -1870,9 +1868,9 @@ export default ({ getService }: FtrProviderContext) => { sort: ['agent.name', 'agent.version'], }); // total 8 alerts = 3 suppressed alerts + 5 unsuppressed (from docs with at least one missing field) - expect(previewAlerts.length).to.eql(8); + expect(previewAlerts.length).toEqual(8); // first 3 alerts should be suppressed - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { field: 'agent.name', value: 'agent-0' }, @@ -1881,7 +1879,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { field: 'agent.name', value: 'agent-0' }, @@ -1890,7 +1888,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_SUPPRESSION_DOCS_COUNT]: 0, }); - expect(previewAlerts[2]._source).to.eql({ + expect(previewAlerts[2]._source).toEqual({ ...previewAlerts[2]._source, [ALERT_SUPPRESSION_TERMS]: [ { field: 'agent.name', value: 'agent-1' }, @@ -1902,11 +1900,11 @@ export default ({ getService }: FtrProviderContext) => { // rest of alerts are not suppressed and do not have suppress properties previewAlerts.slice(3).forEach((previewAlert) => { const source = previewAlert._source; - expect(source).to.have.property('id', id); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); }); }); @@ -1949,16 +1947,16 @@ export default ({ getService }: FtrProviderContext) => { sort: ['agent.name', 'agent.version'], }); // total 6 alerts = 6 unsuppressed (from docs with at least one missing field) - expect(previewAlerts.length).to.eql(6); + expect(previewAlerts.length).toEqual(6); // all alerts are not suppressed and do not have suppress properties previewAlerts.forEach((previewAlert) => { const source = previewAlert._source; - expect(source).to.have.property('id', id); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); }); }); @@ -2021,9 +2019,9 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(3); + expect(previewAlerts.length).toEqual(3); - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -2033,7 +2031,7 @@ export default ({ getService }: FtrProviderContext) => { ], [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -2043,7 +2041,7 @@ export default ({ getService }: FtrProviderContext) => { ], [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(previewAlerts[2]._source).to.eql({ + expect(previewAlerts[2]._source).toEqual({ ...previewAlerts[2]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -2055,7 +2053,7 @@ export default ({ getService }: FtrProviderContext) => { }); for (const logEntry of logs) { - expect(logEntry.errors.length).to.eql(0); + expect(logEntry.errors.length).toEqual(0); } }); @@ -2087,10 +2085,10 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name', ALERT_ORIGINAL_TIME], }); - expect(previewAlerts.length).to.eql(5); + expect(previewAlerts.length).toEqual(5); // first alerts expected to be suppressed - expect(previewAlerts[0]._source).to.eql({ + expect(previewAlerts[0]._source).toEqual({ ...previewAlerts[0]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -2100,7 +2098,7 @@ export default ({ getService }: FtrProviderContext) => { ], [ALERT_SUPPRESSION_DOCS_COUNT]: 1, }); - expect(previewAlerts[1]._source).to.eql({ + expect(previewAlerts[1]._source).toEqual({ ...previewAlerts[1]._source, [ALERT_SUPPRESSION_TERMS]: [ { @@ -2112,24 +2110,24 @@ export default ({ getService }: FtrProviderContext) => { }); // third alert is not suppressed and do not have suppress properties - expect(previewAlerts[2]._source).to.have.property('id', id); - expect(previewAlerts[2]._source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(previewAlerts[2]._source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(previewAlerts[2]._source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(previewAlerts[2]._source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(previewAlerts[2]._source).toHaveProperty('id', id); + expect(previewAlerts[2]._source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(previewAlerts[2]._source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(previewAlerts[2]._source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(previewAlerts[2]._source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); // rest of alerts are not suppressed and do not have suppress properties previewAlerts.slice(3).forEach((previewAlert) => { const source = previewAlert._source; - expect(source).to.have.property('id', id); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); - expect(source).not.to.have.property(ALERT_SUPPRESSION_END); - expect(source).not.to.have.property(ALERT_SUPPRESSION_TERMS); - expect(source).not.to.have.property(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); }); for (const logEntry of logs) { - expect(logEntry.errors.length).to.eql(0); + expect(logEntry.errors.length).toEqual(0); } }); }); @@ -2180,7 +2178,7 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts.length).equal(2); + expect(previewAlerts.length).toEqual(2); }); it('should correctly evaluate exceptions with expiration time in the future', async () => { @@ -2223,7 +2221,7 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - expect(previewAlerts.length).equal(1); + expect(previewAlerts.length).toEqual(1); }); }); @@ -2269,11 +2267,11 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(2); + expect(previewAlerts.length).toEqual(2); // both alerts should have agent.name "test-1" as per rule query - expect(previewAlerts[0]._source?.agent).to.have.property('name', 'test-1'); - expect(previewAlerts[1]._source?.agent).to.have.property('name', 'test-1'); + expect(previewAlerts[0]._source?.agent).toHaveProperty('name', 'test-1'); + expect(previewAlerts[1]._source?.agent).toHaveProperty('name', 'test-1'); }); it('should return correct documents with negation wildcard field query', async () => { @@ -2296,10 +2294,10 @@ export default ({ getService }: FtrProviderContext) => { previewId, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(1); + expect(previewAlerts.length).toEqual(1); // alert should not have agent.name "test-1" as per rule query - expect(previewAlerts[0]._source?.agent).to.have.property('name', 'test-2'); + expect(previewAlerts[0]._source?.agent).toHaveProperty('name', 'test-2'); }); it('should return correct documents with wildcard field query across multiple different fields', async () => { @@ -2327,13 +2325,13 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(2); + expect(previewAlerts.length).toEqual(2); // alert should have agent.name "test-1" as per rule query - expect(previewAlerts[0]._source?.agent).to.have.property('name', 'test-1'); + expect(previewAlerts[0]._source?.agent).toHaveProperty('name', 'test-1'); // alert should have agent.name "test-a" and agent.version "test-1" as per rule query - expect(previewAlerts[1]._source?.agent).to.have.property('version', 'test-1'); - expect(previewAlerts[1]._source?.agent).to.have.property('name', 'test-3'); + expect(previewAlerts[1]._source?.agent).toHaveProperty('version', 'test-1'); + expect(previewAlerts[1]._source?.agent).toHaveProperty('name', 'test-3'); }); it('should return correct documents with wildcard field query across multiple different fields for lucene language', async () => { @@ -2362,13 +2360,13 @@ export default ({ getService }: FtrProviderContext) => { size: 10, sort: ['agent.name'], }); - expect(previewAlerts.length).to.eql(2); + expect(previewAlerts.length).toEqual(2); // alert should have agent.name "test-1" as per rule query - expect(previewAlerts[0]._source?.agent).to.have.property('name', 'test-1'); + expect(previewAlerts[0]._source?.agent).toHaveProperty('name', 'test-1'); // alert should have agent.name "test-a" and agent.version "test-1" as per rule query - expect(previewAlerts[1]._source?.agent).to.have.property('version', 'test-1'); - expect(previewAlerts[1]._source?.agent).to.have.property('name', 'test-3'); + expect(previewAlerts[1]._source?.agent).toHaveProperty('version', 'test-1'); + expect(previewAlerts[1]._source?.agent).toHaveProperty('name', 'test-3'); }); }); @@ -2403,7 +2401,10 @@ export default ({ getService }: FtrProviderContext) => { hits: [{ _source: ruleSO }], }, } = await getRuleSOById(es, ruleWithLegacyInvestigationField.id); - expect(ruleSO?.alert?.params?.investigationFields).to.eql(['client.address', 'agent.name']); + expect(ruleSO?.alert?.params?.investigationFields).toEqual([ + 'client.address', + 'agent.name', + ]); // fetch rule for format needed to pass into const { body: ruleBody } = await supertest @@ -2415,7 +2416,7 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); const alertsAfterEnable = await getAlerts(supertest, log, es, ruleBody, 'succeeded'); - expect(alertsAfterEnable.hits.hits.length > 0).eql(true); + expect(alertsAfterEnable.hits.hits.length > 0).toEqual(true); }); }); }); From 5fd4795b77a3553afc0f71e43cb13841dddee647 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 4 Jun 2024 17:45:12 +0200 Subject: [PATCH 49/82] [OAS] Support tags (#184320) --- oas_docs/bundle.json | 6 +- .../__snapshots__/generate_oas.test.ts.snap | 170 +++++++++++++++++- .../src/generate_oas.test.ts | 59 +++++- .../src/generate_oas.test.util.ts | 43 +++-- .../src/generate_oas.ts | 4 +- .../src/process_router.ts | 38 ++-- .../src/process_versioned_router.ts | 37 ++-- .../src/util.test.ts | 109 ++++++++++- .../kbn-router-to-openapispec/src/util.ts | 46 ++++- 9 files changed, 447 insertions(+), 65 deletions(-) diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index 481bd3901e340..cdd86729d7f8e 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -521,7 +521,8 @@ "description": "Get Kibana's current status." } }, - "summary": "Get Kibana's current status." + "summary": "Get Kibana's current status.", + "tags": [] } } }, @@ -534,5 +535,6 @@ { "url": "http://localhost:5622" } - ] + ], + "tags": [] } \ No newline at end of file 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 e893c636f760f..2c6186ff56984 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 @@ -89,6 +89,7 @@ Object { }, }, "summary": "", + "tags": Array [], }, }, }, @@ -102,7 +103,7 @@ Object { "url": "https://test.oas", }, ], - "tags": undefined, + "tags": Array [], } `; @@ -213,6 +214,9 @@ Object { }, }, "summary": "versioned route", + "tags": Array [ + "versioned", + ], }, }, "/foo/{id}/{path*}": Object { @@ -357,6 +361,154 @@ Object { }, }, "summary": "route", + "tags": Array [ + "bar", + ], + }, + "post": Object { + "operationId": "/foo/{id}/{path*}#1", + "parameters": Array [ + Object { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": Object { + "default": "2023-10-31", + "enum": Array [ + "2023-10-31", + ], + "type": "string", + }, + }, + Object { + "description": "id", + "in": "path", + "name": "id", + "required": true, + "schema": Object { + "maxLength": 36, + "type": "string", + }, + }, + Object { + "description": "path", + "in": "path", + "name": "path", + "required": true, + "schema": Object { + "maxLength": 36, + "type": "string", + }, + }, + Object { + "description": "page", + "in": "query", + "name": "page", + "required": false, + "schema": Object { + "default": 1, + "maximum": 999, + "minimum": 1, + "type": "number", + }, + }, + ], + "requestBody": Object { + "content": Object { + "application/json; Elastic-Api-Version=2023-10-31": Object { + "schema": Object { + "additionalProperties": false, + "properties": Object { + "any": Object {}, + "booleanDefault": Object { + "default": true, + "description": "defaults to to true", + "type": "boolean", + }, + "ipType": Object { + "format": "ipv4", + "type": "string", + }, + "literalType": Object { + "enum": Array [ + "literallythis", + ], + "type": "string", + }, + "map": Object { + "additionalProperties": Object { + "type": "string", + }, + "type": "object", + }, + "maybeNumber": Object { + "maximum": 1000, + "minimum": 1, + "type": "number", + }, + "record": Object { + "additionalProperties": Object { + "type": "string", + }, + "type": "object", + }, + "string": Object { + "maxLength": 10, + "minLength": 1, + "type": "string", + }, + "union": Object { + "anyOf": Array [ + Object { + "description": "Union string", + "maxLength": 1, + "type": "string", + }, + Object { + "description": "Union number", + "minimum": 0, + "type": "number", + }, + ], + }, + "uri": Object { + "default": "prototest://something", + "format": "uri", + "type": "string", + }, + }, + "required": Array [ + "string", + "ipType", + "literalType", + "map", + "record", + "union", + "any", + ], + "type": "object", + }, + }, + }, + }, + "responses": Object { + "200": Object { + "content": Object { + "application/json; Elastic-Api-Version=2023-10-31": Object { + "schema": Object { + "maxLength": 10, + "minLength": 1, + "type": "string", + }, + }, + }, + "description": "route", + }, + }, + "summary": "route", + "tags": Array [ + "bar", + ], }, }, }, @@ -370,7 +522,14 @@ Object { "url": "https://test.oas", }, ], - "tags": undefined, + "tags": Array [ + Object { + "name": "bar", + }, + Object { + "name": "versioned", + }, + ], } `; @@ -456,6 +615,7 @@ Object { }, }, "summary": "", + "tags": Array [], }, }, }, @@ -469,7 +629,7 @@ Object { "url": "https://test.oas", }, ], - "tags": undefined, + "tags": Array [], } `; @@ -532,6 +692,7 @@ Object { }, }, "summary": "", + "tags": Array [], }, }, "/test": Object { @@ -568,6 +729,7 @@ Object { }, }, "summary": "", + "tags": Array [], }, }, }, @@ -581,6 +743,6 @@ Object { "url": "https://test.oas", }, ], - "tags": undefined, + "tags": Array [], } `; diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts index 9311faf88dec9..f37ba1dc87ef4 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts @@ -18,7 +18,10 @@ interface RecursiveType { describe('generateOpenApiDocument', () => { describe('@kbn/config-schema', () => { it('generates the expected OpenAPI document', () => { - const [routers, versionedRouters] = createTestRouters(); + const [routers, versionedRouters] = createTestRouters({ + routers: { testRouter: { routes: [{ method: 'get' }, { method: 'post' }] } }, + versionedRouters: { testVersionedRouter: { routes: [{}] } }, + }); expect( generateOpenApiDocument( { @@ -185,4 +188,58 @@ describe('generateOpenApiDocument', () => { ).toMatchSnapshot(); }); }); + + describe('tags', () => { + it('handles tags as expected', () => { + const [routers, versionedRouters] = createTestRouters({ + routers: { + testRouter1: { + routes: [ + { path: '/1-1/{id}/{path*}', options: { tags: ['oas-tag:1', 'oas-tag:2', 'foo'] } }, + { path: '/1-2/{id}/{path*}', options: { tags: ['oas-tag:1', 'foo'] } }, + ], + }, + testRouter2: { routes: [{ path: '/2-1/{id}/{path*}', options: { tags: undefined } }] }, + }, + versionedRouters: { + testVersionedRouter1: { + routes: [ + { path: '/v1-1', options: { access: 'public', options: { tags: ['oas-tag:v1'] } } }, + { + path: '/v1-2', + options: { + access: 'public', + options: { tags: ['foo', 'bar', 'oas-tag:v2', 'oas-tag:v3'] }, + }, + }, + ], + }, + testVersionedRouter2: { + routes: [ + { path: '/v2-1', options: { access: 'public', options: { tags: undefined } } }, + ], + }, + }, + }); + const result = generateOpenApiDocument( + { + routers, + versionedRouters, + }, + { + title: 'test', + baseUrl: 'https://test.oas', + version: '99.99.99', + } + ); + // router paths + expect(result.paths['/1-1/{id}/{path*}']!.get!.tags).toEqual(['1', '2']); + expect(result.paths['/1-2/{id}/{path*}']!.get!.tags).toEqual(['1']); + expect(result.paths['/2-1/{id}/{path*}']!.get!.tags).toEqual([]); + // versioned router paths + expect(result.paths['/v1-1']!.get!.tags).toEqual(['v1']); + expect(result.paths['/v1-2']!.get!.tags).toEqual(['v2', 'v3']); + expect(result.paths['/v2-1']!.get!.tags).toEqual([]); + }); + }); }); 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 f2274ccb7cb87..b4e273b3a5b7b 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 @@ -35,26 +35,26 @@ export const testSchema = schema.object({ any: schema.any({ meta: { description: 'any type' } }), }); -type RouterMeta = ReturnType[number]; -type VersionedRouterMeta = ReturnType[number]; +type RoutesMeta = ReturnType[number]; +type VersionedRoutesMeta = ReturnType[number]; -export const createRouter = (args: { routes: RouterMeta[] }) => { +export const createRouter = (args: { routes: RoutesMeta[] }) => { return { getRoutes: () => args.routes, } as unknown as Router; }; -export const createVersionedRouter = (args: { routes: VersionedRouterMeta[] }) => { +export const createVersionedRouter = (args: { routes: VersionedRoutesMeta[] }) => { return { getRoutes: () => args.routes, } as unknown as CoreVersionedRouter; }; -const getRouterDefaults = () => ({ +export const getRouterDefaults = () => ({ isVersioned: false, path: '/foo/{id}/{path*}', method: 'get', options: { - tags: ['foo'], + tags: ['foo', 'oas-tag:bar'], description: 'route', }, validationSchemas: { @@ -78,12 +78,15 @@ const getRouterDefaults = () => ({ handler: jest.fn(), }); -const getVersionedRouterDefaults = () => ({ +export const getVersionedRouterDefaults = () => ({ method: 'get', path: '/bar', options: { description: 'versioned route', access: 'public', + options: { + tags: ['ignore-me', 'oas-tag:versioned'], + }, }, handlers: [ { @@ -130,25 +133,29 @@ const getVersionedRouterDefaults = () => ({ ], }); +interface CreatTestRouterArgs { + routers?: { [routerId: string]: { routes: Array> } }; + versionedRouters?: { + [routerId: string]: { routes: Array> }; + }; +} + export const createTestRouters = ( - { - routers = [], - versionedRouters = [], - }: { - routers?: Array>>; - versionedRouters?: Array>>; - } = { routers: [[{}]], versionedRouters: [[{}]] } + { routers = {}, versionedRouters = {} }: CreatTestRouterArgs = { + routers: { testRouter: { routes: [{}] } }, + versionedRouters: { testVersionedRouter: { routes: [{}] } }, + } ): [routers: Router[], versionedRouters: CoreVersionedRouter[]] => { return [ [ - ...routers.map((rs) => - createRouter({ routes: rs.map((r) => Object.assign(getRouterDefaults(), r)) }) + ...Object.values(routers).map((rs) => + createRouter({ routes: rs.routes.map((r) => Object.assign(getRouterDefaults(), r)) }) ), ], [ - ...versionedRouters.map((rs) => + ...Object.values(versionedRouters).map((rs) => createVersionedRouter({ - routes: rs.map((r) => Object.assign(getVersionedRouterDefaults(), r)), + routes: rs.routes.map((r) => Object.assign(getVersionedRouterDefaults(), r)), }) ), ], diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.ts b/packages/kbn-router-to-openapispec/src/generate_oas.ts index 26be6b450e4f5..0d69c942bf071 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.ts @@ -12,6 +12,7 @@ import { OasConverter } from './oas_converter'; import { createOperationIdCounter } from './operation_id_counter'; import { processRouter } from './process_router'; import { processVersionedRouter } from './process_versioned_router'; +import { buildGlobalTags } from './util'; export const openApiVersion = '3.0.0'; @@ -48,6 +49,7 @@ export const generateOpenApiDocument = ( const result = processVersionedRouter(router, converter, getOpId, filters); Object.assign(paths, result.paths); } + const tags = buildGlobalTags(paths, opts.tags); return { openapi: openApiVersion, info: { @@ -76,7 +78,7 @@ export const generateOpenApiDocument = ( }, }, security: [{ basicAuth: [] }], - tags: opts.tags?.map((tag) => ({ name: tag })), + tags, externalDocs: opts.docsUrl ? { url: opts.docsUrl } : undefined, }; }; diff --git a/packages/kbn-router-to-openapispec/src/process_router.ts b/packages/kbn-router-to-openapispec/src/process_router.ts index 52f65b6a394df..ce9486b140dc4 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.ts @@ -12,8 +12,9 @@ import { ALLOWED_PUBLIC_VERSION as SERVERLESS_VERSION_2023_10_31 } from '@kbn/co import type { OpenAPIV3 } from 'openapi-types'; import type { OasConverter } from './oas_converter'; import { - assignToPathsObject, + assignToPaths, extractContentType, + extractTags, extractValidationSchemaFromRoute, getPathParameters, getVersionedContentTypeString, @@ -58,24 +59,27 @@ export const processRouter = ( ]; } - const path: OpenAPIV3.PathItemObject = { - [route.method]: { - summary: route.options.description ?? '', - requestBody: !!validationSchemas?.body - ? { - content: { - [getVersionedContentTypeString(SERVERLESS_VERSION_2023_10_31, contentType)]: { - schema: converter.convert(validationSchemas.body), - }, + const operation: OpenAPIV3.OperationObject = { + summary: route.options.description ?? '', + tags: route.options.tags ? extractTags(route.options.tags) : [], + requestBody: !!validationSchemas?.body + ? { + content: { + [getVersionedContentTypeString(SERVERLESS_VERSION_2023_10_31, contentType)]: { + schema: converter.convert(validationSchemas.body), }, - } - : undefined, - responses: extractResponses(route, converter), - parameters, - operationId: getOpId(route.path), - }, + }, + } + : undefined, + responses: extractResponses(route, converter), + parameters, + operationId: getOpId(route.path), + }; + + const path: OpenAPIV3.PathItemObject = { + [route.method]: operation, }; - assignToPathsObject(paths, route.path, path); + assignToPaths(paths, route.path, path); } catch (e) { // Enrich the error message with a bit more context e.message = `Error generating OpenAPI for route '${route.path}': ${e.message}`; diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts index 4fbc49ef9a063..85246a5164306 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts @@ -20,9 +20,10 @@ import { prepareRoutes, getPathParameters, extractContentType, - assignToPathsObject, + assignToPaths, getVersionedHeaderParam, getVersionedContentTypeString, + extractTags, } from './util'; export const processVersionedRouter = ( @@ -82,25 +83,27 @@ export const processVersionedRouter = ( const hasBody = Boolean(extractValidationSchemaFromVersionedHandler(handler)?.request?.body); const contentType = extractContentType(route.options.options?.body); const hasVersionFilter = Boolean(filters?.version); + const operation: OpenAPIV3.OperationObject = { + summary: route.options.description ?? '', + tags: route.options.options?.tags ? extractTags(route.options.options.tags) : [], + requestBody: hasBody + ? { + content: hasVersionFilter + ? extractVersionedRequestBody(handler, converter, contentType) + : extractVersionedRequestBodies(route, converter, contentType), + } + : undefined, + responses: hasVersionFilter + ? extractVersionedResponse(handler, converter, contentType) + : extractVersionedResponses(route, converter, contentType), + parameters, + operationId: getOpId(route.path), + }; const path: OpenAPIV3.PathItemObject = { - [route.method]: { - summary: route.options.description ?? '', - requestBody: hasBody - ? { - content: hasVersionFilter - ? extractVersionedRequestBody(handler, converter, contentType) - : extractVersionedRequestBodies(route, converter, contentType), - } - : undefined, - responses: hasVersionFilter - ? extractVersionedResponse(handler, converter, contentType) - : extractVersionedResponses(route, converter, contentType), - parameters, - operationId: getOpId(route.path), - }, + [route.method]: operation, }; - assignToPathsObject(paths, route.path, path); + assignToPaths(paths, route.path, path); } catch (e) { // Enrich the error message with a bit more context e.message = `Error generating OpenAPI for route '${route.path}' using newest version '${version}': ${e.message}`; diff --git a/packages/kbn-router-to-openapispec/src/util.test.ts b/packages/kbn-router-to-openapispec/src/util.test.ts index ef624cf07dfa3..b4008249fed88 100644 --- a/packages/kbn-router-to-openapispec/src/util.test.ts +++ b/packages/kbn-router-to-openapispec/src/util.test.ts @@ -6,12 +6,115 @@ * Side Public License, v 1. */ -import { prepareRoutes } from './util'; +import { OpenAPIV3 } from 'openapi-types'; +import { buildGlobalTags, prepareRoutes } from './util'; +import { assignToPaths, extractTags } from './util'; -const internal = 'internal' as const; -const pub = 'public' as const; +describe('extractTags', () => { + test.each([ + [[], []], + [['a', 'b', 'c'], []], + [ + ['oas-tag:foo', 'b', 'oas-tag:bar'], + ['foo', 'bar'], + ], + ])('given %s returns %s', (input, output) => { + expect(extractTags(input)).toEqual(output); + }); +}); + +describe('buildGlobalTags', () => { + test.each([ + { + name: 'base case', + paths: {}, + additionalTags: [], + output: [], + }, + { + name: 'all methods', + paths: { + '/foo': { + get: { tags: ['get'] }, + put: { tags: ['put'] }, + post: { tags: ['post'] }, + patch: { tags: ['patch'] }, + delete: { tags: ['delete'] }, + options: { tags: ['options'] }, + head: { tags: ['head'] }, + trace: { tags: ['trace'] }, + }, + }, + additionalTags: [], + output: [ + { name: 'delete' }, + { name: 'get' }, + { name: 'head' }, + { name: 'options' }, + { name: 'patch' }, + { name: 'post' }, + { name: 'put' }, + { name: 'trace' }, + ], + }, + { + name: 'unknown method', + paths: { + '/foo': { + unknown: { tags: ['not-included'] }, + }, + '/bar': { + post: { tags: ['bar'] }, + }, + }, + additionalTags: [], + output: [{ name: 'bar' }], + }, + { + name: 'dedup', + paths: { + '/foo': { + get: { tags: ['foo'] }, + patch: { tags: ['foo'] }, + }, + '/bar': { + get: { tags: ['foo'] }, + post: { tags: ['foo'] }, + }, + }, + additionalTags: [], + output: [{ name: 'foo' }], + }, + { + name: 'dedups with additional tags', + paths: { + '/foo': { get: { tags: ['foo'] } }, + '/baz': { patch: { tags: ['foo'] } }, + '/bar': { patch: { tags: ['bar'] } }, + }, + additionalTags: ['foo', 'bar', 'baz'], + output: [{ name: 'bar' }, { name: 'baz' }, { name: 'foo' }], + }, + ])('$name', ({ paths, additionalTags, output }) => { + expect(buildGlobalTags(paths as OpenAPIV3.PathsObject, additionalTags)).toEqual(output); + }); +}); + +describe('assignToPaths', () => { + it('should transform path names', () => { + const paths = {}; + assignToPaths(paths, '/foo', {}); + assignToPaths(paths, '/bar/{id?}', {}); + expect(paths).toEqual({ + '/foo': {}, + '/bar/{id}': {}, + }); + }); +}); describe('prepareRoutes', () => { + const internal = 'internal' as const; + const pub = 'public' as const; test.each([ { input: [{ path: '/api/foo', options: { access: internal } }], diff --git a/packages/kbn-router-to-openapispec/src/util.ts b/packages/kbn-router-to-openapispec/src/util.ts index af7124d8b71ff..315b1478d4504 100644 --- a/packages/kbn-router-to-openapispec/src/util.ts +++ b/packages/kbn-router-to-openapispec/src/util.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import type { OpenAPIV3 } from 'openapi-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { OpenAPIV3 } from 'openapi-types'; import { getRequestValidation, type RouteConfigOptionsBody, @@ -16,6 +17,47 @@ import { import { KnownParameters } from './type'; import type { GenerateOpenApiDocumentOptionsFilters } from './generate_oas'; +const tagPrefix = 'oas-tag:'; +const extractTag = (tag: string) => { + if (tag.startsWith(tagPrefix)) { + return tag.slice(tagPrefix.length); + } +}; +/** + * Given an array of tags ([oas-tag:beep, oas-tag:boop]) will return a new array + * with the tag prefix removed. + */ +export const extractTags = (tags?: readonly string[]) => { + if (!tags) return []; + return tags.flatMap((tag) => { + const value = extractTag(tag); + if (value) { + return value; + } + return []; + }); +}; + +/** + * Build the top-level tags entry based on the paths we extracted. We could + * handle this while we are iterating over the routes, but this approach allows + * us to keep this as a global document concern at the expense of some extra + * processing. + */ +export const buildGlobalTags = (paths: OpenAPIV3.PathsObject, additionalTags: string[] = []) => { + const tags = new Set(additionalTags); + for (const path of Object.values(paths)) { + for (const method of Object.values(OpenAPIV3.HttpMethods)) { + if (path?.[method]?.tags) { + path[method]!.tags!.forEach((tag) => tags.add(tag)); + } + } + } + return Array.from(tags) + .sort((a, b) => a.localeCompare(b)) + .map((name) => ({ name })); +}; + export const getPathParameters = (path: string): KnownParameters => { return Array.from(path.matchAll(/\{(.+?)\}/g)).reduce((acc, [_, key]) => { const optional = key.endsWith('?'); @@ -81,7 +123,7 @@ export const prepareRoutes = < }); }; -export const assignToPathsObject = ( +export const assignToPaths = ( paths: OpenAPIV3.PathsObject, path: string, pathObject: OpenAPIV3.PathItemObject From 05825b60be3f9e928edd533e9ce19fae725aa68c Mon Sep 17 00:00:00 2001 From: Elastic Machine Date: Wed, 5 Jun 2024 02:17:30 +1000 Subject: [PATCH 50/82] [main] Sync bundled packages with Package Storage (#184748) Automated by https://buildkite.com/elastic/package-storage-infra-kibana-discover-release-branches/builds/796 --- fleet_packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fleet_packages.json b/fleet_packages.json index 2aa25a23b84e3..1ffa4bae4d6a6 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -30,7 +30,7 @@ }, { "name": "elastic_agent", - "version": "1.19.1" + "version": "1.19.2" }, { "name": "endpoint", From 59bc79c1700f4785908bfb28598c3a6797912738 Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Tue, 4 Jun 2024 18:43:43 +0200 Subject: [PATCH 51/82] [Dataset Quality]Add logic to display spark plot on degraded fields (#184514) ## Summary Closes: https://github.com/elastic/kibana/issues/183604 The PR adds a Spark Plot to the Degraded Fields Table in the Dataset Quality Flyout ## Screenshot image --- .../dataset_quality/common/api_types.ts | 6 + .../dataset_quality/common/translations.ts | 2 +- .../dataset_quality/common/types/common.ts | 15 ++ .../dataset_quality/common/types/index.ts | 3 +- .../flyout/degraded_fields/columns.tsx | 17 +- .../flyout/degraded_fields/spark_plot.tsx | 101 +++++++++++ .../flyout/degraded_fields/table.tsx | 2 +- .../src/state_machine.ts | 9 +- .../get_degraded_fields/get_interval.ts | 25 +++ .../data_streams/get_degraded_fields/index.ts | 17 ++ .../dataset_quality/tsconfig.json | 12 +- .../data_streams/degraded_fields.spec.ts | 25 +++ .../dataset_quality/dataset_quality_flyout.ts | 167 +++++++++++------- .../page_objects/dataset_quality.ts | 3 +- .../dataset_quality/dataset_quality_flyout.ts | 167 +++++++++++------- 15 files changed, 425 insertions(+), 146 deletions(-) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/common/types/common.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/spark_plot.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/get_interval.ts 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 0827329f4ceb8..ec725d573dbd4 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 @@ -82,6 +82,12 @@ export const degradedFieldRt = rt.type({ name: rt.string, count: rt.number, lastOccurrence: rt.union([rt.null, rt.number]), + timeSeries: rt.array( + rt.type({ + x: rt.number, + y: rt.number, + }) + ), }); export type DegradedField = rt.TypeOf; 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 53e0e47f8f794..3e411930ae9d4 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts @@ -147,7 +147,7 @@ export const flyoutShowAllText = i18n.translate('xpack.datasetQuality.flyoutShow export const flyoutImprovementText = i18n.translate( 'xpack.datasetQuality.flyoutDegradedFieldsSectionTitle', { - defaultMessage: 'Degraded Fields', + defaultMessage: 'Degraded fields', } ); diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/types/common.ts b/x-pack/plugins/observability_solution/dataset_quality/common/types/common.ts new file mode 100644 index 0000000000000..d7e5c4d78bbef --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/common/types/common.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type SortDirection = 'asc' | 'desc'; + +export type Maybe = T | null | undefined; + +export interface Coordinate { + x: number; + y: Maybe; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts b/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts index bbdac062fde8d..4aec783300a8c 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts @@ -7,5 +7,4 @@ export * from './dataset_types'; export * from './quality_types'; - -export type SortDirection = 'asc' | 'desc'; +export * from './common'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx index 10b30fe855aa2..1d7e79b3c0b36 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx @@ -5,31 +5,37 @@ * 2.0. */ +import React from 'react'; +import { i18n } from '@kbn/i18n'; import { EuiBasicTableColumn } from '@elastic/eui'; import { FieldFormat } from '@kbn/field-formats-plugin/common'; -import { i18n } from '@kbn/i18n'; +import { formatNumber } from '@elastic/eui'; import { DegradedField } from '../../../../common/api_types'; +import { SparkPlot } from './spark_plot'; +import { NUMBER_FORMAT } from '../../../../common/constants'; const fieldColumnName = i18n.translate('xpack.datasetQuality.flyout.degradedField.field', { defaultMessage: 'Field', }); const countColumnName = i18n.translate('xpack.datasetQuality.flyout.degradedField.count', { - defaultMessage: 'Count', + defaultMessage: 'Docs count', }); const lastOccurrenceColumnName = i18n.translate( 'xpack.datasetQuality.flyout.degradedField.lastOccurrence', { - defaultMessage: 'Last Occurrence', + defaultMessage: 'Last occurrence', } ); export const getDegradedFieldsColumns = ({ dateFormatter, + isLoading, }: { dateFormatter: FieldFormat; + isLoading: boolean; }): Array> => [ { name: fieldColumnName, @@ -39,7 +45,10 @@ export const getDegradedFieldsColumns = ({ name: countColumnName, sortable: true, field: 'count', - truncateText: true, + render: (_, { count, timeSeries }) => { + const countValue = formatNumber(count, NUMBER_FORMAT); + return ; + }, }, { name: lastOccurrenceColumnName, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/spark_plot.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/spark_plot.tsx new file mode 100644 index 0000000000000..964c3ee434f45 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/spark_plot.tsx @@ -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 { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLoadingChart, + euiPaletteColorBlind, + useEuiTheme, +} from '@elastic/eui'; +import React from 'react'; +import { ScaleType, Settings, Tooltip, Chart, BarSeries } from '@elastic/charts'; +import { i18n } from '@kbn/i18n'; +import { Coordinate } from '../../../../common/types'; + +export function SparkPlot({ + valueLabel, + isLoading, + series, +}: { + valueLabel: React.ReactNode; + isLoading: boolean; + series?: Coordinate[] | null; +}) { + return ( + + + + + {valueLabel} + + ); +} + +function SparkPlotItem({ + isLoading, + series, +}: { + isLoading: boolean; + series?: Coordinate[] | null; +}) { + const { euiTheme } = useEuiTheme(); + const chartSize = { + height: euiTheme.size.l, + width: '80px', + }; + + const commonStyle = { + ...chartSize, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }; + const palette = euiPaletteColorBlind({ rotations: 2 }); + + if (isLoading) { + return ( +
    + +
    + ); + } + + if (hasValidTimeSeries(series)) { + return ( +
    + + + + + +
    + ); + } + + return ( +
    + +
    + ); +} + +function hasValidTimeSeries(series?: Coordinate[] | null): series is Coordinate[] { + return !!series?.some((point) => point.y !== 0); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx index b14bc6dbf57f2..9820e1722d0fc 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx @@ -21,7 +21,7 @@ export const DegradedFieldTable = () => { const dateFormatter = fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.DATE, [ ES_FIELD_TYPES.DATE, ]); - const columns = getDegradedFieldsColumns({ dateFormatter }); + const columns = getDegradedFieldsColumns({ dateFormatter, isLoading }); return ( { + const duration = moment.duration(end - start, 'ms'); + + return Math.max(calculateAuto.near(buckets, duration)?.asSeconds() ?? 0, minIntervalSeconds); +}; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts index 92a1565afb9bc..2949a3aa99d68 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts @@ -11,6 +11,7 @@ import { DegradedFieldResponse } from '../../../../common/api_types'; import { MAX_DEGRADED_FIELDS } from '../../../../common/constants'; import { createDatasetQualityESClient } from '../../../utils'; import { _IGNORED, TIMESTAMP } from '../../../../common/es_fields'; +import { getFieldIntervalInSeconds } from './get_interval'; export async function getDegradedFields({ esClient, @@ -23,6 +24,7 @@ export async function getDegradedFields({ end: number; dataStream: string; }): Promise { + const fieldInterval = getFieldIntervalInSeconds({ start, end }); const datasetQualityESClient = createDatasetQualityESClient(esClient); const filterQuery = [...rangeQuery(start, end)]; @@ -41,6 +43,17 @@ export async function getDegradedFields({ field: TIMESTAMP, }, }, + timeSeries: { + date_histogram: { + field: TIMESTAMP, + fixed_interval: `${fieldInterval}s`, + min_doc_count: 0, + extended_bounds: { + min: start, + max: end, + }, + }, + }, }, }, }; @@ -63,6 +76,10 @@ export async function getDegradedFields({ name: bucket.key as string, count: bucket.doc_count, lastOccurrence: bucket.lastOccurrence.value, + timeSeries: bucket.timeSeries.buckets.map((timeSeriesBucket) => ({ + x: timeSeriesBucket.key, + y: timeSeriesBucket.doc_count, + })), })) ?? [], }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json b/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json index 631e44b121a97..564a1e4216847 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json +++ b/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json @@ -3,7 +3,12 @@ "compilerOptions": { "outDir": "target/types" }, - "include": ["common/**/*", "public/**/*", "server/**/*", "../../../../typings/**/*"], + "include": [ + "common/**/*", + "public/**/*", + "server/**/*", + "../../../../typings/**/*" + ], "kbn_references": [ "@kbn/core", "@kbn/core-plugins-server", @@ -42,8 +47,11 @@ "@kbn/core-elasticsearch-server", "@kbn/ui-actions-plugin", "@kbn/metrics-data-access-plugin", + "@kbn/calculate-auto", "@kbn/discover-plugin", "@kbn/shared-ux-prompt-no-data-views-types" ], - "exclude": ["target/**/*"] + "exclude": [ + "target/**/*" + ] } diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts index fb2edfcc56efd..1f00722f57e15 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts @@ -102,6 +102,31 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(resp.body.degradedFields.length).to.be(2); expect(degradedFields).to.eql(expectedDegradedFields); }); + + it('returns proper timeSeries data for degraded fields', async () => { + const logsTimeSeriesData = [ + { x: 1716357600000, y: 60 }, + { x: 1716368400000, y: 180 }, + { x: 1716379200000, y: 180 }, + { x: 1716390000000, y: 180 }, + { x: 1716400800000, y: 180 }, + { x: 1716411600000, y: 180 }, + { x: 1716422400000, y: 180 }, + { x: 1716433200000, y: 180 }, + { x: 1716444000000, y: 122 }, + ]; + + const resp = await callApiAs( + 'datasetQualityLogsUser', + `${type}-${degradedFieldDataset}-${namespace}` + ); + + const logLevelTimeSeries = resp.body.degradedFields.find( + (dFields) => dFields.name === 'log.level' + )?.timeSeries; + + expect(logLevelTimeSeries).to.eql(logsTimeSeriesData); + }); }); }); } 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 3bd17373123ee..09e6c9abc44be 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 @@ -458,94 +458,135 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const goodDatasetName = 'good'; const degradedDatasetName = 'degraded'; const today = new Date().toISOString(); - before(async () => { - await synthtrace.index([ - getLogsForDataset({ - to: today, - count: 2, - dataset: goodDatasetName, - isMalformed: false, - }), - createDegradedFieldsRecord({ - to: today, - count: 2, - dataset: degradedDatasetName, - }), - ]); - await PageObjects.datasetQuality.navigateTo(); - }); - after(async () => { - await synthtrace.clean(); - }); + describe('Degraded Fields Table with common data', () => { + before(async () => { + await synthtrace.index([ + getLogsForDataset({ + to: today, + count: 2, + dataset: goodDatasetName, + isMalformed: false, + }), + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.datasetQuality.navigateTo(); + }); - it('shows the degraded fields table with no data when no degraded fields are present', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(goodDatasetName); + after(async () => { + await synthtrace.clean(); + }); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedTableNoData - ); + it('shows the degraded fields table with no data when no degraded fields are present', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(goodDatasetName); - await PageObjects.datasetQuality.closeFlyout(); - }); + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedTableNoData + ); - it('should load the degraded fields table with data', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + await PageObjects.datasetQuality.closeFlyout(); + }); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable - ); + it('should load the degraded fields table with data', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable + ); - const rows = - await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); + const rows = + await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); - expect(rows.length).to.eql(2); + expect(rows.length).to.eql(2); - await PageObjects.datasetQuality.closeFlyout(); - }); + await PageObjects.datasetQuality.closeFlyout(); + }); - it('should sort the table when the count table header is clicked', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + it('should display Spark Plot for every row of degraded fields', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + const rows = + await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); - const countColumn = table.Count; - const cellTexts = await countColumn.getCellTexts(); + const sparkPlots = await testSubjects.findAll( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualitySparkPlot + ); - await countColumn.sort('ascending'); - const sortedCellTexts = await countColumn.getCellTexts(); + expect(rows.length).to.be(sparkPlots.length); - expect(cellTexts.reverse()).to.eql(sortedCellTexts); + await PageObjects.datasetQuality.closeFlyout(); + }); - await PageObjects.datasetQuality.closeFlyout(); + it('should sort the table when the count table header is clicked', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + + const countColumn = table['Docs count']; + const cellTexts = await countColumn.getCellTexts(); + + await countColumn.sort('ascending'); + const sortedCellTexts = await countColumn.getCellTexts(); + + expect(cellTexts.reverse()).to.eql(sortedCellTexts); + + await PageObjects.datasetQuality.closeFlyout(); + }); }); - it('should update the table when new data is ingested and the flyout is refreshed using the time selector', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + describe('Degraded Fields Table with data ingestion', () => { + before(async () => { + await synthtrace.index([ + getLogsForDataset({ + to: today, + count: 2, + dataset: goodDatasetName, + isMalformed: false, + }), + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.datasetQuality.navigateTo(); + }); - const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + after(async () => { + await synthtrace.clean(); + }); - const countColumn = table.Count; - const cellTexts = await countColumn.getCellTexts(); + it('should update the table when new data is ingested and the flyout is refreshed using the time selector', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - await synthtrace.index([ - createDegradedFieldsRecord({ - to: today, - count: 2, - dataset: degradedDatasetName, - }), - ]); + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - await PageObjects.datasetQuality.refreshFlyout(); + const countColumn = table['Docs count']; + const cellTexts = await countColumn.getCellTexts(); - const updatedCellTexts = await countColumn.getCellTexts(); + await synthtrace.index([ + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); - const singleValuePreviously = parseInt(cellTexts[0], 10); - const singleValueNow = parseInt(updatedCellTexts[0], 10); + await PageObjects.datasetQuality.refreshFlyout(); - expect(singleValueNow).to.be(singleValuePreviously * 2); + const updatedCellTexts = await countColumn.getCellTexts(); - await PageObjects.datasetQuality.closeFlyout(); + const singleValuePreviously = parseInt(cellTexts[0], 10); + const singleValueNow = parseInt(updatedCellTexts[0], 10); + + expect(singleValueNow).to.be(singleValuePreviously * 2); + + await PageObjects.datasetQuality.closeFlyout(); + }); }); }); }); diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index 3a7911696b1b9..3ccccc0e97986 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -77,6 +77,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv datasetQualityFlyoutTitle: 'datasetQualityFlyoutTitle', datasetQualityFlyoutDegradedFieldTable: 'datasetQualityFlyoutDegradedFieldTable', datasetQualityFlyoutDegradedTableNoData: 'datasetQualityFlyoutDegradedTableNoData', + datasetQualitySparkPlot: 'datasetQualitySparkPlot', datasetQualityHeaderButton: 'datasetQualityHeaderButton', datasetQualityFlyoutFieldValue: 'datasetQualityFlyoutFieldValue', datasetQualityFlyoutIntegrationActionsButton: 'datasetQualityFlyoutIntegrationActionsButton', @@ -226,7 +227,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv async parseDegradedFieldTable() { const table = await this.getDatasetQualityFlyoutDegradedFieldTable(); - return parseDatasetTable(table, ['Field', 'Count', 'Last Occurrence']); + return parseDatasetTable(table, ['Field', 'Docs count', 'Last Occurrence']); }, async filterForIntegrations(integrations: string[]) { 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 a88c3881a4746..a08037a5e810a 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 @@ -479,95 +479,134 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const goodDatasetName = 'good'; const degradedDatasetName = 'degraded'; const today = new Date().toISOString(); - before(async () => { - await PageObjects.svlCommonPage.loginWithRole('admin'); - await synthtrace.index([ - getLogsForDataset({ - to: today, - count: 2, - dataset: goodDatasetName, - isMalformed: false, - }), - createDegradedFieldsRecord({ - to: today, - count: 2, - dataset: degradedDatasetName, - }), - ]); - await PageObjects.datasetQuality.navigateTo(); - }); + describe('Degraded Fields Table with common data', () => { + before(async () => { + await PageObjects.svlCommonPage.loginWithRole('admin'); + await synthtrace.index([ + getLogsForDataset({ + to: today, + count: 2, + dataset: goodDatasetName, + isMalformed: false, + }), + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.datasetQuality.navigateTo(); + }); - after(async () => { - await synthtrace.clean(); - }); + after(async () => { + await synthtrace.clean(); + }); + it('shows the degraded fields table with no data when no degraded fields are present', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(goodDatasetName); - it('shows the degraded fields table with no data when no degraded fields are present', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(goodDatasetName); + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedTableNoData + ); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedTableNoData - ); + await PageObjects.datasetQuality.closeFlyout(); + }); - await PageObjects.datasetQuality.closeFlyout(); - }); + it('should load the degraded fields table with data', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable + ); - it('should load the degraded fields table with data', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + const rows = + await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable - ); + expect(rows.length).to.eql(2); - const rows = - await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); + await PageObjects.datasetQuality.closeFlyout(); + }); - expect(rows.length).to.eql(2); + it('should display Spark Plot for every row of degraded fields', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - await PageObjects.datasetQuality.closeFlyout(); - }); + const rows = + await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); - it('should sort the table when the count table header is clicked', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + const sparkPlots = await testSubjects.findAll( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualitySparkPlot + ); - const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + expect(rows.length).to.be(sparkPlots.length); - const countColumn = table.Count; - const cellTexts = await countColumn.getCellTexts(); + await PageObjects.datasetQuality.closeFlyout(); + }); - await countColumn.sort('ascending'); - const sortedCellTexts = await countColumn.getCellTexts(); + it('should sort the table when the count table header is clicked', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - expect(cellTexts.reverse()).to.eql(sortedCellTexts); + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - await PageObjects.datasetQuality.closeFlyout(); + const countColumn = table['Docs count']; + const cellTexts = await countColumn.getCellTexts(); + + await countColumn.sort('ascending'); + const sortedCellTexts = await countColumn.getCellTexts(); + + expect(cellTexts.reverse()).to.eql(sortedCellTexts); + + await PageObjects.datasetQuality.closeFlyout(); + }); }); - it('should update the table when new data is ingested and the flyout is refreshed using the time selector', async () => { - await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + describe('Degraded Fields Table with data ingestion', () => { + before(async () => { + await PageObjects.svlCommonPage.loginWithRole('admin'); + await synthtrace.index([ + getLogsForDataset({ + to: today, + count: 2, + dataset: goodDatasetName, + isMalformed: false, + }), + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.datasetQuality.navigateTo(); + }); + + after(async () => { + await synthtrace.clean(); + }); + it('should update the table when new data is ingested and the flyout is refreshed using the time selector', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - const countColumn = table.Count; - const cellTexts = await countColumn.getCellTexts(); + const countColumn = table['Docs count']; + const cellTexts = await countColumn.getCellTexts(); + const singleValuePreviously = parseInt(cellTexts[0], 10); - await synthtrace.index([ - createDegradedFieldsRecord({ - to: today, - count: 2, - dataset: degradedDatasetName, - }), - ]); + await synthtrace.index([ + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); - await PageObjects.datasetQuality.refreshFlyout(); + await PageObjects.datasetQuality.refreshFlyout(); - const updatedCellTexts = await countColumn.getCellTexts(); + const updatedCellTexts = await countColumn.getCellTexts(); - const singleValuePreviously = parseInt(cellTexts[0], 10); - const singleValueNow = parseInt(updatedCellTexts[0], 10); + const singleValueNow = parseInt(updatedCellTexts[0], 10); - expect(singleValueNow).to.be(singleValuePreviously * 2); + expect(singleValueNow).to.be(singleValuePreviously * 2); - await PageObjects.datasetQuality.closeFlyout(); + await PageObjects.datasetQuality.closeFlyout(); + }); }); }); }); From 695aa81b44b928e959a6389261bfcb7fe375a97d Mon Sep 17 00:00:00 2001 From: Joe McElroy Date: Tue, 4 Jun 2024 19:11:05 +0100 Subject: [PATCH 52/82] [Search] [Playground] increase conversational chain tests timeout (#184754) ## Summary Increase conversational chain test timeout to 10 secs whilst I investigate why these tests take a while to run on CI. ### 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 - [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 - [ ] [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) --- .../server/lib/conversational_chain.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts b/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts index c865526115db1..12b3a6f62c32c 100644 --- a/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts +++ b/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts @@ -172,7 +172,7 @@ describe('conversational chain', () => { }, ], }); - }); + }, 10000); it('should be able to create a conversational chain with nested field', async () => { await createTestChain({ @@ -207,7 +207,7 @@ describe('conversational chain', () => { ], contentField: { index: 'field', website: 'metadata.source' }, }); - }); + }, 10000); it('asking with chat history should re-write the question', async () => { await createTestChain({ @@ -251,7 +251,7 @@ describe('conversational chain', () => { }, ], }); - }); + }, 10000); it('should cope with quotes in the query', async () => { await createTestChain({ @@ -295,7 +295,7 @@ describe('conversational chain', () => { }, ], }); - }); + }, 10000); it('should work with an LLM based model', async () => { await createTestChain({ @@ -340,7 +340,7 @@ describe('conversational chain', () => { ], isChatModel: false, }); - }); + }, 10000); it('should clip the conversation', async () => { await createTestChain({ @@ -407,7 +407,7 @@ describe('conversational chain', () => { ], isChatModel: false, }); - }); + }, 10000); describe('clipContext', () => { const prompt = ChatPromptTemplate.fromTemplate( From d0383b4214d11dab22962fa462de4ae3e9bd40f2 Mon Sep 17 00:00:00 2001 From: Nick Peihl Date: Tue, 4 Jun 2024 14:20:45 -0400 Subject: [PATCH 53/82] [Embeddables] Fix missing panel references when Duplicate, Copy to Dashboard, or Save as new dashboard (#183778) Fixes missing references on React embeddables on Duplicate, Copy to Dashboard, and Save as new dashboard. --- .../interfaces/serialized_state.ts | 4 +++ .../common/dashboard_container/types.ts | 5 ++++ src/plugins/dashboard/common/index.ts | 2 ++ .../common/lib/dashboard_panel_converters.ts | 15 ++++++++-- .../copy_to_dashboard_modal.tsx | 1 + .../api/duplicate_dashboard_panel.ts | 18 ++++-------- .../embeddable/api/run_save_functions.tsx | 7 +++-- .../embeddable/create/create_dashboard.ts | 6 ++++ .../embeddable/dashboard_container.tsx | 4 ++- .../lib/save_dashboard_state.test.ts | 28 +++++++++++++++++++ .../lib/save_dashboard_state.ts | 12 ++++++-- .../public/lib/state_transfer/types.ts | 12 ++++++++ src/plugins/embeddable/tsconfig.json | 3 +- 13 files changed, 95 insertions(+), 22 deletions(-) diff --git a/packages/presentation/presentation_containers/interfaces/serialized_state.ts b/packages/presentation/presentation_containers/interfaces/serialized_state.ts index 9678e5a1faeca..593362ab6a7e1 100644 --- a/packages/presentation/presentation_containers/interfaces/serialized_state.ts +++ b/packages/presentation/presentation_containers/interfaces/serialized_state.ts @@ -37,3 +37,7 @@ export interface HasSnapshottableState { */ snapshotRuntimeState: () => RuntimeState; } + +export const apiHasSnapshottableState = (api: unknown | null): api is HasSnapshottableState => { + return Boolean((api as HasSnapshottableState)?.snapshotRuntimeState); +}; diff --git a/src/plugins/dashboard/common/dashboard_container/types.ts b/src/plugins/dashboard/common/dashboard_container/types.ts index f25d8bb026bc8..3983d4112c5da 100644 --- a/src/plugins/dashboard/common/dashboard_container/types.ts +++ b/src/plugins/dashboard/common/dashboard_container/types.ts @@ -13,6 +13,7 @@ import { SavedObjectEmbeddableInput, } from '@kbn/embeddable-plugin/common'; import { Filter, Query, TimeRange } from '@kbn/es-query'; +import { Reference } from '@kbn/content-management-utils'; import { RefreshInterval } from '@kbn/data-plugin/common'; import { KibanaExecutionContext } from '@kbn/core-execution-context-common'; @@ -35,6 +36,10 @@ export interface DashboardPanelState< * embeddable's input. This key is needed for BWC, but its value will be removed on Dashboard save. */ version?: string; + /** + * React embeddables are serialized and may pass references that are later used in factory's deserialize method. + */ + references?: Reference[]; } export type DashboardContainerByReferenceInput = SavedObjectEmbeddableInput; diff --git a/src/plugins/dashboard/common/index.ts b/src/plugins/dashboard/common/index.ts index bdc692af18246..07bf085e7fded 100644 --- a/src/plugins/dashboard/common/index.ts +++ b/src/plugins/dashboard/common/index.ts @@ -27,6 +27,8 @@ export { createExtract, } from './dashboard_container/persistable_state/dashboard_container_references'; +export { prefixReferencesFromPanel } from './dashboard_container/persistable_state/dashboard_container_references'; + export { convertPanelStateToSavedDashboardPanel, convertSavedDashboardPanelToPanelState, diff --git a/src/plugins/dashboard/common/lib/dashboard_panel_converters.ts b/src/plugins/dashboard/common/lib/dashboard_panel_converters.ts index edb24e31e09cc..ed13140e0afb5 100644 --- a/src/plugins/dashboard/common/lib/dashboard_panel_converters.ts +++ b/src/plugins/dashboard/common/lib/dashboard_panel_converters.ts @@ -10,8 +10,13 @@ import { v4 } from 'uuid'; import { omit } from 'lodash'; import { EmbeddableInput, SavedObjectEmbeddableInput } from '@kbn/embeddable-plugin/common'; +import { Reference } from '@kbn/content-management-utils'; import { DashboardPanelMap, DashboardPanelState } from '..'; import { SavedDashboardPanel } from '../content_management'; +import { + getReferencesForPanelId, + prefixReferencesFromPanel, +} from '../dashboard_container/persistable_state/dashboard_container_references'; export function convertSavedDashboardPanelToPanelState< TEmbeddableInput extends EmbeddableInput | SavedObjectEmbeddableInput = SavedObjectEmbeddableInput @@ -80,15 +85,19 @@ export const convertPanelMapToSavedPanels = ( * When saving a dashboard as a copy, we should generate new IDs for all panels so that they are * properly refreshed when navigating between Dashboards */ -export const generateNewPanelIds = (panels: DashboardPanelMap) => { +export const generateNewPanelIds = (panels: DashboardPanelMap, references?: Reference[]) => { const newPanelsMap: DashboardPanelMap = {}; - for (const panel of Object.values(panels)) { + const newReferences: Reference[] = []; + for (const [oldId, panel] of Object.entries(panels)) { const newId = v4(); newPanelsMap[newId] = { ...panel, gridData: { ...panel.gridData, i: newId }, explicitInput: { ...panel.explicitInput, id: newId }, }; + newReferences.push( + ...prefixReferencesFromPanel(newId, getReferencesForPanelId(oldId, references ?? [])) + ); } - return newPanelsMap; + return { panels: newPanelsMap, references: newReferences }; }; diff --git a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx index 2eef7b6cdbaf6..e1c71ef9a4719 100644 --- a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx @@ -65,6 +65,7 @@ export function CopyToDashboardModal({ api, closeModal }: CopyToDashboardModalPr width: panelToCopy.gridData.w, height: panelToCopy.gridData.h, }, + references: panelToCopy.references, }; const path = diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.ts index 7dd3feabb89c7..225e89109639a 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.ts @@ -6,16 +6,11 @@ * Side Public License, v 1. */ -import { - isReferenceOrValueEmbeddable, - PanelIncompatibleError, - PanelNotFoundError, -} from '@kbn/embeddable-plugin/public'; -import { apiHasSerializableState } from '@kbn/presentation-containers'; +import { isReferenceOrValueEmbeddable, PanelNotFoundError } from '@kbn/embeddable-plugin/public'; import { apiPublishesPanelTitle, getPanelTitle } from '@kbn/presentation-publishing'; import { filter, map, max } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { DashboardPanelState } from '../../../../common'; +import { DashboardPanelState, prefixReferencesFromPanel } from '../../../../common'; import { dashboardClonePanelActionStrings } from '../../../dashboard_actions/_dashboard_actions_strings'; import { pluginServices } from '../../../services/plugin_services'; import { placeClonePanel } from '../../panel_placement'; @@ -58,17 +53,16 @@ const duplicateReactEmbeddableInput = async ( idToDuplicate: string ) => { const child = dashboard.children$.value[idToDuplicate]; - if (!child || !apiHasSerializableState(child)) throw new PanelIncompatibleError(); - const lastTitle = apiPublishesPanelTitle(child) ? getPanelTitle(child) ?? '' : ''; const newTitle = await incrementPanelTitle(dashboard, lastTitle); const id = uuidv4(); - const serializedState = await child.serializeState(); + if (panelToClone.references) { + dashboard.savedObjectReferences.push(...prefixReferencesFromPanel(id, panelToClone.references)); + } return { type: panelToClone.type, explicitInput: { ...panelToClone.explicitInput, - ...serializedState.rawState, title: newTitle, id, }, @@ -80,7 +74,7 @@ export async function duplicateDashboardPanel(this: DashboardContainer, idToDupl notifications: { toasts }, embeddable: { reactEmbeddableRegistryHasKey }, } = pluginServices.getServices(); - const panelToClone = this.getInput().panels[idToDuplicate] as DashboardPanelState; + const panelToClone = await this.getDashboardPanelFromId(idToDuplicate); const duplicatedPanelState = reactEmbeddableRegistryHasKey(panelToClone.type) ? await duplicateReactEmbeddableInput(this, panelToClone, idToDuplicate) diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx index c1ef52ec72e2c..fe2a383291f7c 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx @@ -20,8 +20,11 @@ import { cloneDeep } from 'lodash'; import React from 'react'; import { batch } from 'react-redux'; import { i18n } from '@kbn/i18n'; -import { DashboardContainerInput, DashboardPanelMap } from '../../../../common'; -import { prefixReferencesFromPanel } from '../../../../common/dashboard_container/persistable_state/dashboard_container_references'; +import { + DashboardContainerInput, + DashboardPanelMap, + prefixReferencesFromPanel, +} from '../../../../common'; import { DASHBOARD_CONTENT_ID, SAVED_OBJECT_POST_TIME } from '../../../dashboard_constants'; import { SaveDashboardReturn, diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index eb32bdc8057b2..a39d07a9296bc 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -37,6 +37,7 @@ import { DashboardContainerInput, DashboardPanelMap, DashboardPanelState, + prefixReferencesFromPanel, } from '../../../../common'; import { DEFAULT_DASHBOARD_INPUT, @@ -431,6 +432,11 @@ export const initializeDashboard = async ({ i: embeddableId, }, }; + if (incomingEmbeddable.references) { + container.savedObjectReferences.push( + ...prefixReferencesFromPanel(embeddableId, incomingEmbeddable.references) + ); + } container.updateInput({ panels: { ...container.getInput().panels, diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 8d9c41be0094b..f5f465545dda1 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -40,7 +40,7 @@ import { HasSerializedChildState, TrackContentfulRender, } from '@kbn/presentation-containers'; -import { apiHasSerializableState, PanelPackage } from '@kbn/presentation-containers'; +import { PanelPackage } from '@kbn/presentation-containers'; import { ReduxEmbeddableTools, ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; import { LocatorPublic } from '@kbn/share-plugin/common'; import { ExitFullScreenButtonKibanaProvider } from '@kbn/shared-ux-button-exit-full-screen'; @@ -52,6 +52,7 @@ import { batch } from 'react-redux'; import { BehaviorSubject, Subject, Subscription } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs'; import { v4 } from 'uuid'; +import { apiHasSerializableState } from '@kbn/presentation-containers/interfaces/serialized_state'; import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; import { DashboardContainerInput, DashboardPanelState } from '../../../common'; import { getReferencesForPanelId } from '../../../common/dashboard_container/persistable_state/dashboard_container_references'; @@ -593,6 +594,7 @@ export class DashboardContainer type: panel.type, explicitInput: { ...panel.explicitInput, ...serialized.rawState }, gridData: panel.gridData, + references: serialized.references, }; } return panel; diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.test.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.test.ts index 5783c463deea9..8e3c3525550c6 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.test.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.test.ts @@ -127,6 +127,34 @@ describe('Save dashboard state', () => { ); }); + it('should update prefixes on references when save as copy is true', async () => { + const result = await saveDashboardState({ + currentState: { + ...getSampleDashboardInput(), + title: 'BooFour', + panels: { idOne: { type: 'boop' } }, + } as unknown as DashboardContainerInput, + panelReferences: [{ name: 'idOne:panel_idOne', type: 'boop', id: 'idOne' }], + lastSavedId: 'Boogatoonie', + saveOptions: { saveAsCopy: true }, + ...allServices, + }); + + expect(result.id).toBe('newlyGeneratedId'); + expect(allServices.contentManagement.client.create).toHaveBeenCalledWith( + expect.objectContaining({ + options: expect.objectContaining({ + references: expect.arrayContaining([ + expect.objectContaining({ + id: 'idOne', + name: expect.not.stringContaining('idOne:panel_idOne'), + }), + ]), + }), + }) + ); + }); + it('should return an error when the save fails.', async () => { contentManagement.client.create = jest.fn().mockRejectedValue('Whoops'); const result = await saveDashboardState({ diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts index 68de7ab9f5349..c69f7fa065a7b 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts @@ -20,7 +20,6 @@ import { isFilterPinned } from '@kbn/es-query'; import { convertPanelMapToSavedPanels, extractReferences } from '../../../../common'; import { DashboardAttributes, DashboardCrudTypes } from '../../../../common/content_management'; -import { generateNewPanelIds } from '../../../../common/lib/dashboard_panel_converters'; import { DASHBOARD_CONTENT_ID } from '../../../dashboard_constants'; import { LATEST_DASHBOARD_CONTAINER_VERSION } from '../../../dashboard_container'; import { dashboardSaveToastStrings } from '../../../dashboard_container/_dashboard_container_strings'; @@ -33,6 +32,7 @@ import { SavedDashboardInput, } from '../types'; import { convertDashboardVersionToNumber } from './dashboard_versioning'; +import { generateNewPanelIds } from '../../../../common/lib/dashboard_panel_converters'; export const serializeControlGroupInput = ( controlGroupInput: SavedDashboardInput['controlGroupInput'] @@ -103,8 +103,14 @@ export const saveDashboardState = async ({ } = currentState; let { panels, controlGroupInput } = currentState; + let prefixedPanelReferences = panelReferences; if (saveOptions.saveAsCopy) { - panels = generateNewPanelIds(panels); + const { panels: newPanels, references: newPanelReferences } = generateNewPanelIds( + panels, + panelReferences + ); + panels = newPanels; + prefixedPanelReferences = newPanelReferences; controlGroupInput = generateNewControlIds(controlGroupInput); } @@ -180,7 +186,7 @@ export const saveDashboardState = async ({ ? savedObjectsTagging.updateTagsReferences(dashboardReferences, tags) : dashboardReferences; - const allReferences = [...references, ...(panelReferences ?? [])]; + const allReferences = [...references, ...(prefixedPanelReferences ?? [])]; /** * Save the saved object using the content management diff --git a/src/plugins/embeddable/public/lib/state_transfer/types.ts b/src/plugins/embeddable/public/lib/state_transfer/types.ts index 00d6a087292d3..d9de670973d62 100644 --- a/src/plugins/embeddable/public/lib/state_transfer/types.ts +++ b/src/plugins/embeddable/public/lib/state_transfer/types.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import { Reference } from '@kbn/content-management-utils'; + export const EMBEDDABLE_EDITOR_STATE_KEY = 'embeddable_editor_state'; /** @@ -43,6 +45,16 @@ export interface EmbeddablePackageState { width?: number; height?: number; }; + /** + * Copy dashboard panel transfers serialized panel state for React embeddables. + * The rawState will be passed into the input and references are passed separately + * so the container can update its references array and the updated references + * are correctly passed to the factory's deserialize method. + * + * Legacy embeddables have already injected the references + * into the input state, so they will not pass references. + */ + references?: Reference[]; /** * Pass current search session id when navigating to an editor, diff --git a/src/plugins/embeddable/tsconfig.json b/src/plugins/embeddable/tsconfig.json index 737034ebe1719..a306e128f58f4 100644 --- a/src/plugins/embeddable/tsconfig.json +++ b/src/plugins/embeddable/tsconfig.json @@ -29,7 +29,8 @@ "@kbn/presentation-publishing", "@kbn/presentation-containers", "@kbn/react-kibana-mount", - "@kbn/analytics" + "@kbn/analytics", + "@kbn/content-management-utils" ], "exclude": ["target/**/*"] } From e3f8817007daea09aeb3cacc5ee11c4e99f8a0c4 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Tue, 4 Jun 2024 14:27:52 -0400 Subject: [PATCH 54/82] [Dashboard] Resolve flaky telemetry, track load type (#184061) Resolves Dashboard telemetry flakiness and tracks the type of dashboard load. --- .../presentation_containers/index.ts | 3 +- ...tful_render.ts => performance_trackers.ts} | 7 + .../interfaces/presentation_container.ts | 21 ++ .../presentation_containers/mocks.ts | 1 + .../component/grid/dashboard_grid.tsx | 8 +- .../component/grid/dashboard_grid_item.tsx | 6 +- .../use_dashboard_performance_tracker.tsx | 62 ----- .../embeddable/create/create_dashboard.ts | 10 + .../query_performance_tracking.test.ts | 238 ++++++++++++++++++ .../performance/query_performance_tracking.ts | 107 ++++++++ .../embeddable/dashboard_container.tsx | 48 ++-- .../public/dashboard_container/types.ts | 5 + .../embeddable_panel/embeddable_panel.tsx | 1 + .../public/lib/containers/container.ts | 4 + .../presentation_panel_internal.tsx | 16 +- .../public/panel_component/types.ts | 3 - 16 files changed, 414 insertions(+), 126 deletions(-) rename packages/presentation/presentation_containers/interfaces/{track_contentful_render.ts => performance_trackers.ts} (81%) delete mode 100644 src/plugins/dashboard/public/dashboard_container/component/grid/use_dashboard_performance_tracker.tsx create mode 100644 src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.test.ts create mode 100644 src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.ts diff --git a/packages/presentation/presentation_containers/index.ts b/packages/presentation/presentation_containers/index.ts index 89b327801d289..0c55ae715eb98 100644 --- a/packages/presentation/presentation_containers/index.ts +++ b/packages/presentation/presentation_containers/index.ts @@ -40,4 +40,5 @@ export { tracksOverlays, type TracksOverlays } from './interfaces/tracks_overlay export { canTrackContentfulRender, type TrackContentfulRender, -} from './interfaces/track_contentful_render'; + type TracksQueryPerformance, +} from './interfaces/performance_trackers'; diff --git a/packages/presentation/presentation_containers/interfaces/track_contentful_render.ts b/packages/presentation/presentation_containers/interfaces/performance_trackers.ts similarity index 81% rename from packages/presentation/presentation_containers/interfaces/track_contentful_render.ts rename to packages/presentation/presentation_containers/interfaces/performance_trackers.ts index c5f42c0f99cd4..96558a783f846 100644 --- a/packages/presentation/presentation_containers/interfaces/track_contentful_render.ts +++ b/packages/presentation/presentation_containers/interfaces/performance_trackers.ts @@ -16,3 +16,10 @@ export interface TrackContentfulRender { export const canTrackContentfulRender = (root: unknown): root is TrackContentfulRender => { return root !== null && typeof root === 'object' && 'trackContentfulRender' in root; }; + +export interface TracksQueryPerformance { + firstLoad: boolean; + creationStartTime?: number; + creationEndTime?: number; + lastLoadStartTime?: number; +} diff --git a/packages/presentation/presentation_containers/interfaces/presentation_container.ts b/packages/presentation/presentation_containers/interfaces/presentation_container.ts index 92c69c6a8aa82..be39c1a5c8be3 100644 --- a/packages/presentation/presentation_containers/interfaces/presentation_container.ts +++ b/packages/presentation/presentation_containers/interfaces/presentation_container.ts @@ -23,13 +23,34 @@ export interface PanelPackage { export interface PresentationContainer extends Partial, CanAddNewPanel { + /** + * Removes a panel from the container. + */ removePanel: (panelId: string) => void; + + /** + * Determines whether or not a container is capable of removing panels. + */ canRemovePanels?: () => boolean; + + /** + * Replaces a panel in the container with a new panel. + */ replacePanel: ( idToRemove: string, newPanel: PanelPackage ) => Promise; + /** + * Returns the number of panels in the container. + */ + getPanelCount: () => number; + + /** + * A publishing subject containing the child APIs of the container. Note that + * children are created asynchronously. This means that the children$ observable might + * contain fewer children than the actual number of panels in the container. + */ children$: PublishingSubject<{ [key: string]: unknown }>; } diff --git a/packages/presentation/presentation_containers/mocks.ts b/packages/presentation/presentation_containers/mocks.ts index 1240cd1dd796f..b4289454cb026 100644 --- a/packages/presentation/presentation_containers/mocks.ts +++ b/packages/presentation/presentation_containers/mocks.ts @@ -14,6 +14,7 @@ export const getMockPresentationContainer = (): PresentationContainer => { removePanel: jest.fn(), addNewPanel: jest.fn(), replacePanel: jest.fn(), + getPanelCount: jest.fn(), children$: new BehaviorSubject<{ [key: string]: unknown }>({}), }; }; diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx index 868bd3d535aa1..0dbfb3a3e8714 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx @@ -20,7 +20,6 @@ import { DashboardPanelState } from '../../../../common'; import { DashboardGridItem } from './dashboard_grid_item'; import { useDashboardGridSettings } from './use_dashboard_grid_settings'; import { useDashboardContainer } from '../../embeddable/dashboard_container'; -import { useDashboardPerformanceTracker } from './use_dashboard_performance_tracker'; import { getPanelLayoutsAreEqual } from '../../state/diffing/dashboard_diffing_utils'; import { DASHBOARD_GRID_HEIGHT, DASHBOARD_MARGIN_SIZE } from '../../../dashboard_constants'; @@ -48,10 +47,6 @@ export const DashboardGrid = ({ viewportWidth }: { viewportWidth: number }) => { } }, [expandedPanelId]); - const { onPanelStatusChange } = useDashboardPerformanceTracker({ - panelCount: Object.keys(panels).length, - }); - const panelsInOrder: string[] = useMemo(() => { return Object.keys(panels).sort((embeddableIdA, embeddableIdB) => { const panelA = panels[embeddableIdA]; @@ -80,11 +75,10 @@ export const DashboardGrid = ({ viewportWidth }: { viewportWidth: number }) => { type={type} expandedPanelId={expandedPanelId} focusedPanelId={focusedPanelId} - onPanelStatusChange={onPanelStatusChange} /> ); }); - }, [expandedPanelId, onPanelStatusChange, panels, panelsInOrder, focusedPanelId]); + }, [expandedPanelId, panels, panelsInOrder, focusedPanelId]); const onLayoutChange = useCallback( (newLayout: Array) => { diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx index 583a867351b3b..7d4a87f7209e1 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx @@ -9,7 +9,6 @@ import { EuiLoadingChart } from '@elastic/eui'; import { css } from '@emotion/react'; import { EmbeddablePanel, ReactEmbeddableRenderer, ViewMode } from '@kbn/embeddable-plugin/public'; -import { PhaseEvent } from '@kbn/presentation-publishing'; import classNames from 'classnames'; import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { DashboardPanelState } from '../../../../common'; @@ -26,7 +25,6 @@ export interface Props extends DivProps { focusedPanelId?: string; key: string; isRenderable?: boolean; - onPanelStatusChange?: (info: PhaseEvent) => void; } export const Item = React.forwardRef( @@ -37,7 +35,6 @@ export const Item = React.forwardRef( id, index, type, - onPanelStatusChange, isRenderable = true, // The props below are passed from ReactGridLayoutn and need to be merged with their counterparts. // https://github.com/react-grid-layout/react-grid-layout/issues/1241#issuecomment-658306889 @@ -103,7 +100,6 @@ export const Item = React.forwardRef( showBorder: useMargins, showNotifications: true, showShadow: false, - onPanelStatusChange, }; // render React embeddable @@ -128,7 +124,7 @@ export const Item = React.forwardRef( {...panelProps} /> ); - }, [id, container, type, index, useMargins, onPanelStatusChange]); + }, [id, container, type, index, useMargins]); return (
    >; - status: DashboardLoadedEventStatus; - doneCount: number; -}; - -const getDefaultPerformanceTracker: () => DashboardRenderPerformanceTracker = () => ({ - panelsRenderStartTime: performance.now(), - panelsRenderDoneTime: 0, - lastTimeToData: 0, - - panelIds: {}, - doneCount: 0, - status: 'done', -}); - -export const useDashboardPerformanceTracker = ({ panelCount }: { panelCount: number }) => { - const dashboard = useDashboardContainer(); - - // reset performance tracker on each render. - const performanceRefs = useRef(getDefaultPerformanceTracker()); - performanceRefs.current = getDefaultPerformanceTracker(); - - const onPanelStatusChange = useCallback( - (info: PhaseEvent) => { - if (performanceRefs.current.panelIds[info.id] === undefined || info.status === 'loading') { - performanceRefs.current.panelIds[info.id] = {}; - } else if (info.status === 'error') { - performanceRefs.current.status = 'error'; - } else if (info.status === 'loaded') { - performanceRefs.current.lastTimeToData = performance.now(); - } - - performanceRefs.current.panelIds[info.id][info.status] = performance.now(); - - if (info.status === 'error' || info.status === 'rendered') { - performanceRefs.current.doneCount++; - if (performanceRefs.current.doneCount === panelCount) { - performanceRefs.current.panelsRenderDoneTime = performance.now(); - dashboard.reportPerformanceMetrics(performanceRefs.current); - } - } - }, - [dashboard, panelCount] - ); - - return { onPanelStatusChange }; -}; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index a39d07a9296bc..8f7e8bdb21bb5 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -60,6 +60,7 @@ import { startSyncingDashboardControlGroup } from './controls/dashboard_control_ import { startSyncingDashboardDataViews } from './data_views/sync_dashboard_data_views'; import { startDashboardSearchSessionIntegration } from './search_sessions/start_dashboard_search_session_integration'; import { syncUnifiedSearchState } from './unified_search/sync_dashboard_unified_search_state'; +import { startQueryPerformanceTracking } from './performance/query_performance_tracking'; /** * Builds a new Dashboard from scratch. @@ -509,6 +510,15 @@ export const initializeDashboard = async ({ ); }); + // -------------------------------------------------------------------------------------- + // Start performance tracker + // -------------------------------------------------------------------------------------- + untilDashboardReady().then((dashboardContainer) => + dashboardContainer.integrationSubscriptions.add( + startQueryPerformanceTracking(dashboardContainer) + ) + ); + // -------------------------------------------------------------------------------------- // Start animating panel transforms 500 ms after dashboard is created. // -------------------------------------------------------------------------------------- diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.test.ts new file mode 100644 index 0000000000000..1771c5b6453f4 --- /dev/null +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.test.ts @@ -0,0 +1,238 @@ +/* + * 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 { PerformanceMetricEvent } from '@kbn/ebt-tools'; +import { PresentationContainer, TracksQueryPerformance } from '@kbn/presentation-containers'; +import { getMockPresentationContainer } from '@kbn/presentation-containers/mocks'; +import { apiPublishesPhaseEvents, PhaseEvent, PhaseEventType } from '@kbn/presentation-publishing'; +import { waitFor } from '@testing-library/react'; +import { BehaviorSubject } from 'rxjs'; +import { DashboardAnalyticsService } from '../../../../services/analytics/types'; +import { startQueryPerformanceTracking } from './query_performance_tracking'; + +const mockMetricEvent = jest.fn(); +jest.mock('@kbn/ebt-tools', () => ({ + reportPerformanceMetricEvent: (_: DashboardAnalyticsService, args: PerformanceMetricEvent) => { + mockMetricEvent(args); + }, +})); + +const mockDashboard = ( + children: {} = {} +): { + dashboard: PresentationContainer & TracksQueryPerformance; + children$: BehaviorSubject<{ [key: string]: unknown }>; +} => { + const children$ = new BehaviorSubject<{ [key: string]: unknown }>(children); + return { + dashboard: { + ...getMockPresentationContainer(), + children$, + getPanelCount: () => Object.keys(children$.value).length, + firstLoad: true, + creationStartTime: Date.now(), + }, + children$, + }; +}; + +describe('startQueryPerformanceTracking', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + const setChildrenStatus = (children: {}, status: PhaseEventType) => { + for (const child of Object.values(children)) { + if (apiPublishesPhaseEvents(child)) { + (child.phase$ as BehaviorSubject).next({ + status, + id: '', + timeToEvent: 0, + }); + } + } + }; + + it('sets last load start time when loading begins', async () => { + const children = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel2: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + }; + const { dashboard } = mockDashboard(children); + startQueryPerformanceTracking(dashboard); + + expect(dashboard.lastLoadStartTime).toBeDefined(); + }); + + it('sets creation end time when no children are present', async () => { + const { dashboard } = mockDashboard(); + startQueryPerformanceTracking(dashboard); + expect(dashboard.creationEndTime).toBeDefined(); + }); + + it('sets creation end time when all panels with phase event reporting have rendered', async () => { + const children = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel2: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + }; + const { dashboard } = mockDashboard(children); + startQueryPerformanceTracking(dashboard); + setChildrenStatus(children, 'rendered'); + await waitFor(() => { + expect(dashboard.creationEndTime).toBeDefined(); + }); + }); + + it('Reports a metric event when all panels with phase event reporting have rendered', async () => { + const children = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel2: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + }; + const { dashboard } = mockDashboard(children); + startQueryPerformanceTracking(dashboard); + + expect(mockMetricEvent).not.toHaveBeenCalled(); + setChildrenStatus(children, 'rendered'); + + expect(mockMetricEvent).toHaveBeenCalledWith( + expect.objectContaining({ + eventName: 'dashboard_loaded', + key1: 'time_to_data', + value1: expect.any(Number), + key2: 'num_of_panels', + value2: 2, + key4: 'load_type', + value4: 1, // dashboard first load + }) + ); + }); + + it('ignores panels that do not publish phase events', async () => { + const children = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel2: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel3: { wow: 'wow' }, + panel4: { wow: 'wow' }, + }; + const { dashboard } = mockDashboard(children); + startQueryPerformanceTracking(dashboard); + setChildrenStatus(children, 'rendered'); + + expect(mockMetricEvent).toHaveBeenCalledWith( + expect.objectContaining({ + eventName: 'dashboard_loaded', + key1: 'time_to_data', + value1: expect.any(Number), + key2: 'num_of_panels', + value2: 4, + key4: 'load_type', + value4: 1, // dashboard first load + }) + ); + }); + + it('reports initial and subsequent loads', async () => { + const children = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel2: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + panel3: { wow: 'wow' }, + panel4: { wow: 'wow' }, + }; + const { dashboard } = mockDashboard(children); + startQueryPerformanceTracking(dashboard); + setChildrenStatus(children, 'rendered'); + + await waitFor(() => { + expect(mockMetricEvent).toHaveBeenCalledWith( + expect.objectContaining({ + value4: 1, // dashboard first load + }) + ); + }); + + setChildrenStatus(children, 'loading'); + await new Promise((r) => setTimeout(r, 1)); + setChildrenStatus(children, 'rendered'); + + expect(mockMetricEvent).toHaveBeenCalledWith( + expect.objectContaining({ + value4: 2, // dashboard subsequent load + }) + ); + }); + + it('subscribes to newly added panels', async () => { + const children: { [key: string]: unknown } = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + }; + const { dashboard, children$ } = mockDashboard(children); + startQueryPerformanceTracking(dashboard); + setChildrenStatus(children, 'rendered'); + expect(mockMetricEvent).toHaveBeenCalledTimes(1); + + // add a new panel + children.panel2 = { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }; + children$.next(children); + setChildrenStatus(children, 'rendered'); + + expect(mockMetricEvent).toHaveBeenCalledTimes(2); + expect(mockMetricEvent).toHaveBeenCalledWith( + expect.objectContaining({ + key2: 'num_of_panels', + value2: 2, + key4: 'load_type', + value4: 2, // dashboard subsequent load + }) + ); + }); + + it('ensures the duration is at least as long as the time to data', async () => { + // start an empty Dashboard. This will set the creation end time to some short value + const { dashboard, children$ } = mockDashboard(); + startQueryPerformanceTracking(dashboard); + expect(dashboard.creationEndTime).toBeDefined(); + + // add a panel that takes a long time to load + const children = { + panel1: { + phase$: new BehaviorSubject({ status: 'loading', id: '', timeToEvent: 0 }), + }, + }; + children$.next(children); + await new Promise((r) => setTimeout(r, 10)); + setChildrenStatus(children, 'rendered'); + + expect(mockMetricEvent.mock.calls[0][0].duration).toBeGreaterThanOrEqual( + mockMetricEvent.mock.calls[0][0].value1 + ); + }); +}); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.ts new file mode 100644 index 0000000000000..cade170fd6539 --- /dev/null +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/performance/query_performance_tracking.ts @@ -0,0 +1,107 @@ +/* + * 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 { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; +import { PresentationContainer, TracksQueryPerformance } from '@kbn/presentation-containers'; +import { apiPublishesPhaseEvents, PublishesPhaseEvents } from '@kbn/presentation-publishing'; +import { combineLatest, map, of, pairwise, startWith, switchMap } from 'rxjs'; +import { DASHBOARD_LOADED_EVENT } from '../../../../dashboard_constants'; +import { pluginServices } from '../../../../services/plugin_services'; +import { DashboardLoadType } from '../../../types'; + +let isFirstDashboardLoadOfSession = true; + +const loadTypesMapping: { [key in DashboardLoadType]: number } = { + sessionFirstLoad: 0, + dashboardFirstLoad: 1, + dashboardSubsequentLoad: 2, +}; + +export const startQueryPerformanceTracking = ( + dashboard: PresentationContainer & TracksQueryPerformance +) => { + const { analytics } = pluginServices.getServices(); + const reportPerformanceMetrics = ({ + timeToData, + panelCount, + totalLoadTime, + loadType, + }: { + timeToData: number; + panelCount: number; + totalLoadTime: number; + loadType: DashboardLoadType; + }) => { + const duration = + loadType === 'dashboardSubsequentLoad' ? timeToData : Math.max(timeToData, totalLoadTime); + + reportPerformanceMetricEvent(analytics, { + eventName: DASHBOARD_LOADED_EVENT, + duration, + key1: 'time_to_data', + value1: timeToData, + key2: 'num_of_panels', + value2: panelCount, + key4: 'load_type', + value4: loadTypesMapping[loadType], + }); + }; + + return dashboard.children$ + .pipe( + switchMap((children) => { + const childPhaseEventTrackers: PublishesPhaseEvents[] = []; + for (const child of Object.values(children)) { + if (apiPublishesPhaseEvents(child)) childPhaseEventTrackers.push(child); + } + if (childPhaseEventTrackers.length === 0) return of([]); + return combineLatest(childPhaseEventTrackers.map((child) => child.phase$)); + }), + map((latestPhaseEvents) => + latestPhaseEvents.some((phaseEvent) => phaseEvent && phaseEvent.status !== 'rendered') + ), + startWith(false), + pairwise() + ) + .subscribe(([lastLoading, currentLoading]) => { + const panelCount = dashboard.getPanelCount(); + const now = performance.now(); + const loadType: DashboardLoadType = isFirstDashboardLoadOfSession + ? 'sessionFirstLoad' + : dashboard.firstLoad + ? 'dashboardFirstLoad' + : 'dashboardSubsequentLoad'; + + const queryHasStarted = !lastLoading && currentLoading; + const queryHasFinished = lastLoading && !currentLoading; + + if (dashboard.firstLoad && (panelCount === 0 || queryHasFinished)) { + /** + * we consider the Dashboard creation to be finished when all the panels are loaded. + */ + dashboard.creationEndTime = now; + isFirstDashboardLoadOfSession = false; + dashboard.firstLoad = false; + } + if (queryHasStarted) { + dashboard.lastLoadStartTime = now; + return; + } + if (queryHasFinished) { + const timeToData = now - (dashboard.lastLoadStartTime ?? now); + const completeLoadDuration = + (dashboard.creationEndTime ?? now) - (dashboard.creationStartTime ?? now); + reportPerformanceMetrics({ + timeToData, + panelCount, + totalLoadTime: completeLoadDuration, + loadType, + }); + } + }); +}; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index f5f465545dda1..a0190b3baee04 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -18,7 +18,6 @@ import { } from '@kbn/presentation-publishing'; import { RefreshInterval } from '@kbn/data-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; -import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; import { Container, DefaultEmbeddableApi, @@ -39,6 +38,7 @@ import { HasSaveNotification, HasSerializedChildState, TrackContentfulRender, + TracksQueryPerformance, } from '@kbn/presentation-containers'; import { PanelPackage } from '@kbn/presentation-containers'; import { ReduxEmbeddableTools, ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; @@ -58,7 +58,6 @@ import { DashboardContainerInput, DashboardPanelState } from '../../../common'; import { getReferencesForPanelId } from '../../../common/dashboard_container/persistable_state/dashboard_container_references'; import { DASHBOARD_APP_ID, - DASHBOARD_LOADED_EVENT, DASHBOARD_UI_METRIC_ID, DEFAULT_PANEL_HEIGHT, DEFAULT_PANEL_WIDTH, @@ -74,12 +73,7 @@ import { DashboardExternallyAccessibleApi } from '../external_api/dashboard_api' import { getDashboardPanelPlacementSetting } from '../panel_placement/panel_placement_registry'; import { dashboardContainerReducers } from '../state/dashboard_container_reducers'; import { getDiffingMiddleware } from '../state/diffing/dashboard_diffing_integration'; -import { - DashboardPublicState, - DashboardReduxState, - DashboardRenderPerformanceStats, - UnsavedPanelState, -} from '../types'; +import { DashboardPublicState, DashboardReduxState, UnsavedPanelState } from '../types'; import { addFromLibrary, addOrUpdateEmbeddable, @@ -132,6 +126,7 @@ export class DashboardContainer implements DashboardExternallyAccessibleApi, TrackContentfulRender, + TracksQueryPerformance, HasSaveNotification, HasRuntimeChildState, HasSerializedChildState @@ -161,18 +156,21 @@ export class DashboardContainer public readonly executionContext: KibanaExecutionContext; - // cleanup - public stopSyncingWithUnifiedSearch?: () => void; - private cleanupStateTools: () => void; - - // performance monitoring - private dashboardCreationStartTime?: number; - private domNode?: HTMLElement; private overlayRef?: OverlayRef; private allDataViews: DataView[] = []; + + // performance monitoring + public lastLoadStartTime?: number; + public creationStartTime?: number; + public creationEndTime?: number; + public firstLoad: boolean = true; private hadContentfulRender = false; + // cleanup + public stopSyncingWithUnifiedSearch?: () => void; + private cleanupStateTools: () => void; + // Services that are used in the Dashboard container code private creationOptions?: DashboardCreationOptions; private analyticsService: DashboardAnalyticsService; @@ -233,7 +231,7 @@ export class DashboardContainer this.creationOptions = creationOptions; this.searchSessionId = initialSessionId; this.searchSessionId$.next(initialSessionId); - this.dashboardCreationStartTime = dashboardCreationStartTime; + this.creationStartTime = dashboardCreationStartTime; // start diffing dashboard state const diffingMiddleware = getDiffingMiddleware.bind(this)(); @@ -325,23 +323,6 @@ export class DashboardContainer return this.getState().componentState.lastSavedId; } - public reportPerformanceMetrics(stats: DashboardRenderPerformanceStats) { - if (this.analyticsService && this.dashboardCreationStartTime) { - const panelCount = Object.keys(this.getState().explicitInput.panels).length; - const totalDuration = stats.panelsRenderDoneTime - this.dashboardCreationStartTime; - reportPerformanceMetricEvent(this.analyticsService, { - eventName: DASHBOARD_LOADED_EVENT, - duration: totalDuration, - key1: 'time_to_data', - value1: (stats.lastTimeToData || stats.panelsRenderDoneTime) - stats.panelsRenderStartTime, - key2: 'num_of_panels', - value2: panelCount, - key3: 'total_load_time', - value3: totalDuration, - }); - } - } - protected createNewPanelState< TEmbeddableInput extends EmbeddableInput, TEmbeddable extends IEmbeddable @@ -699,6 +680,7 @@ export class DashboardContainer this.dispatch.setLastSavedId(newSavedObjectId); this.setExpandedPanelId(undefined); }); + this.firstLoad = true; this.updateInput(newInput); dashboardContainerReady$.next(this); }; diff --git a/src/plugins/dashboard/public/dashboard_container/types.ts b/src/plugins/dashboard/public/dashboard_container/types.ts index f3287494c7b66..c2c7cfb8aa083 100644 --- a/src/plugins/dashboard/public/dashboard_container/types.ts +++ b/src/plugins/dashboard/public/dashboard_container/types.ts @@ -54,6 +54,11 @@ export interface DashboardPublicState { focusedPanelId?: string; } +export type DashboardLoadType = + | 'sessionFirstLoad' + | 'dashboardFirstLoad' + | 'dashboardSubsequentLoad'; + export interface DashboardRenderPerformanceStats { lastTimeToData: number; panelsRenderDoneTime: number; diff --git a/src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx b/src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx index 01a63f6171d93..0f36c6990cec4 100644 --- a/src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx +++ b/src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx @@ -58,6 +58,7 @@ const getComponentFromEmbeddable = async ( }; /** + * @deprecated * Loads and renders a legacy embeddable. * * Ancestry chain must use 'key' attribute to reset DOM and state when embeddable changes diff --git a/src/plugins/embeddable/public/lib/containers/container.ts b/src/plugins/embeddable/public/lib/containers/container.ts index d7b5f56b2202b..cac385dd2c86d 100644 --- a/src/plugins/embeddable/public/lib/containers/container.ts +++ b/src/plugins/embeddable/public/lib/containers/container.ts @@ -119,6 +119,10 @@ export abstract class Container< ); } + public getPanelCount() { + return Object.keys(this.getInput().panels).length; + } + public removePanel(id: string) { this.removeEmbeddable(id); } diff --git a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx index d910d2b063afc..0dc7ee6e3b1d6 100644 --- a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx +++ b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx @@ -9,14 +9,12 @@ import { EuiErrorBoundary, EuiFlexGroup, EuiPanel, htmlIdGenerator } from '@elastic/eui'; import { PanelLoader } from '@kbn/panel-loader'; import { - apiPublishesPhaseEvents, apiHasParentApi, apiPublishesViewMode, useBatchedOptionalPublishingSubjects, } from '@kbn/presentation-publishing'; import classNames from 'classnames'; -import React, { useEffect, useMemo, useState } from 'react'; -import { Subscription } from 'rxjs'; +import React, { useMemo, useState } from 'react'; import { PresentationPanelHeader } from './panel_header/presentation_panel_header'; import { PresentationPanelError } from './presentation_panel_error'; import { DefaultPresentationPanelApi, PresentationPanelInternalProps } from './types'; @@ -37,8 +35,6 @@ export const PresentationPanelInternal = < Component, componentProps, - - onPanelStatusChange, }: PresentationPanelInternalProps) => { const [api, setApi] = useState(null); const headerId = useMemo(() => htmlIdGenerator()(), []); @@ -81,16 +77,6 @@ export const PresentationPanelInternal = < Boolean(parentHidePanelTitle) || (viewMode === 'view' && !Boolean(panelTitle ?? defaultPanelTitle)); - useEffect(() => { - let subscription: Subscription; - if (api && onPanelStatusChange && apiPublishesPhaseEvents(api)) { - subscription = api.phase$.subscribe((phase) => { - if (phase) onPanelStatusChange(phase); - }); - } - return () => subscription?.unsubscribe(); - }, [api, onPanelStatusChange]); - const contentAttrs = useMemo(() => { const attrs: { [key: string]: boolean } = {}; if (dataLoading) { diff --git a/src/plugins/presentation_panel/public/panel_component/types.ts b/src/plugins/presentation_panel/public/panel_component/types.ts index 4836cf6d40610..69e3e24c5bd55 100644 --- a/src/plugins/presentation_panel/public/panel_component/types.ts +++ b/src/plugins/presentation_panel/public/panel_component/types.ts @@ -10,7 +10,6 @@ import { PresentationContainer } from '@kbn/presentation-containers'; import { HasParentApi, HasUniqueId, - PhaseEvent, PublishesBlockingError, PublishesDataLoading, PublishesDisabledActionIds, @@ -44,8 +43,6 @@ export interface PresentationPanelInternalProps< hideHeader?: boolean; hideInspector?: boolean; - onPanelStatusChange?: (info: PhaseEvent) => void; - // TODO remove these in favour of a more generic action management system actionPredicate?: (actionId: string) => boolean; getActions?: UiActionsService['getTriggerCompatibleActions']; From 5315fb177a1535d601b04e1486207ad4498131d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Tue, 4 Jun 2024 21:45:03 +0200 Subject: [PATCH 55/82] Fix Bedrock connector Security AI assistant auto title functionality (#184064) ## Summary Fixes an issue with auto title functionality while using Bedrock connector, the issue was in using `assistant` role, which is not supported as first message ``` [2024-05-22T16:04:55.149+00:00][ERROR][plugins.actions.bedrock] Error: Status code: 400. Message: API Error: Bad Request - messages: first message must use the "user" role at BedrockConnector.request (sub_action_connector.ts:198:15) at processTicksAndRejections (node:internal/process/task_queues:95:5) at BedrockConnector.runApiLatest (bedrock.ts:195:22) at BedrockConnector.invokeAI (bedrock.ts:311:17) at Object.executor (executor.ts:87:18) at action_executor.ts:492:23 at ActionExecutor.execute (action_executor.ts:147:12) at executeAction (executor.ts:55:24) at Object.fn (post_actions_connector_execute.ts:196:36) at core_versioned_route.ts:189:22 at Router.handle (router.ts:267:30) at handler (router.ts:195:13) at exports.Manager.execute (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/toolkit.js:60:28) at Object.internals.handler (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/handler.js:46:20) at exports.execute (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/handler.js:31:20) at Request._lifecycle (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/request.js:371:32) at Request._execute (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/request.js:281:9) {"tags":[".bedrock","bedrock","action-run-failed"],"error":{"stack_trace":"Error: Status code: 400. Message: API Error: Bad Request - messages: first message must use the \"user\" role\n at BedrockConnector.request (sub_action_connector.ts:198:15)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at BedrockConnector.runApiLatest (bedrock.ts:195:22)\n at BedrockConnector.invokeAI (bedrock.ts:311:17)\n at Object.executor (executor.ts:87:18)\n at action_executor.ts:492:23\n at ActionExecutor.execute (action_executor.ts:147:12)\n at executeAction (executor.ts:55:24)\n at Object.fn (post_actions_connector_execute.ts:196:36)\n at core_versioned_route.ts:189:22\n at Router.handle (router.ts:267:30)\n at handler (router.ts:195:13)\n at exports.Manager.execute (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/toolkit.js:60:28)\n at Object.internals.handler (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/handler.js:46:20)\n at exports.execute (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/handler.js:31:20)\n at Request._lifecycle (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/request.js:371:32)\n at Request._execute (/Users/patrykkopycinski/Projects/kibana/node_modules/@hapi/hapi/lib/request.js:281:9)"},"service":{"node":{"roles":["background_tasks","ui"]}}} ``` --- .../impl/assistant/index.tsx | 21 ++++++++++--------- .../connector_selector/index.tsx | 2 +- .../routes/post_actions_connector_execute.ts | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx index 18f2c6be2a863..dd96b4883c969 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -331,7 +331,7 @@ const AssistantComponent: React.FC = ({ // Show missing connector callout if no connectors are configured const showMissingConnectorCallout = useMemo(() => { - if (!isLoading && areConnectorsFetched) { + if (!isLoading && areConnectorsFetched && currentConversation?.id !== '') { if (!currentConversation?.apiConfig?.connectorId) { return true; } @@ -342,7 +342,13 @@ const AssistantComponent: React.FC = ({ } return false; - }, [areConnectorsFetched, connectors, currentConversation?.apiConfig?.connectorId, isLoading]); + }, [ + areConnectorsFetched, + connectors, + currentConversation?.apiConfig?.connectorId, + currentConversation?.id, + isLoading, + ]); const isSendingDisabled = useMemo(() => { return isDisabled || showMissingConnectorCallout; @@ -698,8 +704,8 @@ const AssistantComponent: React.FC = ({ conversation: payload, apiConfig: { ...payload?.apiConfig, - connectorId: defaultConnector?.id as string, - actionTypeId: defaultConnector?.actionTypeId as string, + connectorId: (defaultConnector?.id as string) ?? '', + actionTypeId: (defaultConnector?.actionTypeId as string) ?? '.gen-ai', provider: apiConfig?.apiProvider, model: apiConfig?.defaultModel, }, @@ -720,12 +726,7 @@ const AssistantComponent: React.FC = ({ useEffect(() => { (async () => { - if ( - showMissingConnectorCallout && - areConnectorsFetched && - defaultConnector && - currentConversation - ) { + if (areConnectorsFetched && currentConversation?.id === '') { const conversation = await mutateAsync(currentConversation); if (currentConversation.id === '' && conversation) { setCurrentConversationId(conversation.id); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx index 7ab6324052d01..a6070bc05a97a 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx @@ -161,7 +161,7 @@ export const ConnectorSelector: React.FC = React.memo( return ( <> - {isFlyoutMode && !connectorExists ? ( + {isFlyoutMode && !connectorExists && !connectorOptions.length ? ( Date: Tue, 4 Jun 2024 13:11:50 -0700 Subject: [PATCH 56/82] [Reporting] Serverless API/Functional tests: fix to delete all reports (#184616) I was looking at proxy logs for an API integration test in serverless, and I noticed that when called on ES to delete all reports, we are using the "old" index pattern, which should have been updated when we switched Reporting to use a data stream. We sometimes need to delete all of the reports from storage for testing, because we validate that a certain list of reports will appear in the list of reports will be returned from the "listing" API. Flaky test run: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6206 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/test_serverless/shared/services/svl_reporting.ts | 5 ++++- x-pack/test_serverless/tsconfig.json | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/test_serverless/shared/services/svl_reporting.ts b/x-pack/test_serverless/shared/services/svl_reporting.ts index d404b4e8e0c7f..4a1a2535aeced 100644 --- a/x-pack/test_serverless/shared/services/svl_reporting.ts +++ b/x-pack/test_serverless/shared/services/svl_reporting.ts @@ -9,6 +9,7 @@ import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import expect from '@kbn/expect'; import { INTERNAL_ROUTES } from '@kbn/reporting-common'; import type { ReportingJobResponse } from '@kbn/reporting-plugin/server/types'; +import { REPORTING_DATA_STREAM_WILDCARD_WITH_LEGACY } from '@kbn/reporting-server'; import rison from '@kbn/rison'; import { FtrProviderContext } from '../../functional/ftr_provider_context'; @@ -118,7 +119,9 @@ export function SvlReportingServiceProvider({ getService }: FtrProviderContext) // ignores 409 errs and keeps retrying await retry.tryForTime(5000, async () => { - await supertest.post('/.reporting*/_delete_by_query').send({ query: { match_all: {} } }); + await supertest + .post(`/${REPORTING_DATA_STREAM_WILDCARD_WITH_LEGACY}/_delete_by_query`) + .send({ query: { match_all: {} } }); }); }, }; diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index 639a092b6f45d..5dff8ab3431fd 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -100,6 +100,7 @@ "@kbn/synthetics-plugin", "@kbn/dataset-quality-plugin", "@kbn/alerting-comparators", - "@kbn/search-types" + "@kbn/search-types", + "@kbn/reporting-server" ] } From d750aca73f4885eb8a8c4cb5319f57148920102b Mon Sep 17 00:00:00 2001 From: Mashhur <99575341+mashhurs@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:49:56 -0700 Subject: [PATCH 57/82] Telemetry collection support for Logstash agent driven monitoring. (#184480) ## Summary Telemetry collection support for Logstash agent driven monitoring. This change also guarantees to collect metricbeat monitoring metrics when no cluster UUID found in the event. Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/monitoring/common/constants.ts | 9 +- .../use_derived_index_pattern.tsx | 4 +- .../lib/get_stack_products_usage.ts | 4 +- .../server/lib/cluster/get_index_patterns.ts | 4 +- .../check/internal_monitoring.ts | 8 +- ...h_state_agent_monitoring_results_1n1p.json | 361 +++++++++ ...h_state_agent_monitoring_results_1nmp.json | 233 ++++++ ...h_state_agent_monitoring_results_mnmp.json | 359 +++++++++ ...te_metricbeat_monitoring_results_1nmp.json | 20 + ...te_metricbeat_monitoring_results_mnmp.json | 85 ++ ...gstash_stats_agent_monitoring_results.json | 393 +++++++++ ...ogstash_stats_self_monitoring_results.json | 3 - .../get_all_stats.test.ts | 30 +- .../telemetry_collection/get_all_stats.ts | 28 +- .../get_high_level_stats.ts | 6 +- .../get_logstash_stats.test.ts | 758 ++---------------- .../get_logstash_stats.ts | 578 ++----------- .../logstash_agent_monitoring.test.ts | 582 ++++++++++++++ .../logstash_agent_monitoring.ts | 310 +++++++ .../logstash_metricbeat_monitoring.test.ts | 628 +++++++++++++++ .../logstash_metricbeat_monitoring.ts | 375 +++++++++ .../logstash_monitoring.ts | 202 +++++ .../logstash_self_monitoring.test.ts | 551 +++++++++++++ .../logstash_self_monitoring.ts | 358 +++++++++ ...egister_monitoring_telemetry_collection.ts | 3 +- x-pack/plugins/monitoring/tsconfig.json | 1 + .../schema/xpack_monitoring.json | 3 + .../apis/telemetry/fixtures/multicluster.json | 70 +- .../apis/telemetry/telemetry.ts | 23 +- 29 files changed, 4726 insertions(+), 1263 deletions(-) create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1n1p.json create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1nmp.json create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_mnmp.json create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_agent_monitoring_results.json create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.test.ts create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.ts create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.test.ts create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.ts create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_monitoring.ts create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.test.ts create mode 100644 x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.ts diff --git a/x-pack/plugins/monitoring/common/constants.ts b/x-pack/plugins/monitoring/common/constants.ts index d8c442f7c7bc2..25b22722a33b4 100644 --- a/x-pack/plugins/monitoring/common/constants.ts +++ b/x-pack/plugins/monitoring/common/constants.ts @@ -127,7 +127,14 @@ export const STANDALONE_CLUSTER_CLUSTER_UUID = '__standalone_cluster__'; export const CCS_REMOTE_PATTERN = '*'; export const INDEX_PATTERN = '.monitoring-*'; export const INDEX_PATTERN_KIBANA = '.monitoring-kibana-*'; -export const INDEX_PATTERN_LOGSTASH = '.monitoring-logstash-*'; +export const INDEX_PATTERN_LOGSTASH = '*-logstash*'; +export const INDEX_PATTERN_LOGSTASH_MONITORING = '.monitoring-logstash-*'; +export const INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATE = + '.ds-metrics-logstash.stack_monitoring.node-*'; +export const INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATS = + '.ds-metrics-logstash.stack_monitoring.node_stats-*'; +export const INDEX_PATTERN_LOGSTASH_METRICS_NODE = '.ds-metrics-logstash.node-*'; +export const INDEX_PATTERN_LOGSTASH_METRICS_PLUGINS = '.ds-metrics-logstash.plugins-*'; export const INDEX_PATTERN_BEATS = '.monitoring-beats-*'; export const INDEX_ALERTS = '.monitoring-alerts-*'; export const INDEX_PATTERN_ELASTICSEARCH = '.monitoring-es-*'; diff --git a/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx b/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx index c24543e269cb6..4cf1f8b58427a 100644 --- a/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx +++ b/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx @@ -13,11 +13,11 @@ import { INDEX_PATTERN_BEATS, INDEX_PATTERN_ELASTICSEARCH, INDEX_PATTERN_KIBANA, - INDEX_PATTERN_LOGSTASH, + INDEX_PATTERN_LOGSTASH_MONITORING, } from '../../../../common/constants'; import { MonitoringConfig } from '../../../types'; -const INDEX_PATTERNS = `${INDEX_PATTERN_ELASTICSEARCH},${INDEX_PATTERN_KIBANA},${INDEX_PATTERN_LOGSTASH},${INDEX_PATTERN_BEATS}`; +const INDEX_PATTERNS = `${INDEX_PATTERN_ELASTICSEARCH},${INDEX_PATTERN_KIBANA},${INDEX_PATTERN_LOGSTASH_MONITORING},${INDEX_PATTERN_BEATS}`; export const useDerivedIndexPattern = ( dataViews: DataViewsPublicPluginStart, diff --git a/x-pack/plugins/monitoring/server/kibana_monitoring/collectors/lib/get_stack_products_usage.ts b/x-pack/plugins/monitoring/server/kibana_monitoring/collectors/lib/get_stack_products_usage.ts index 093d9144f2a6f..ff3a78754b8d6 100644 --- a/x-pack/plugins/monitoring/server/kibana_monitoring/collectors/lib/get_stack_products_usage.ts +++ b/x-pack/plugins/monitoring/server/kibana_monitoring/collectors/lib/get_stack_products_usage.ts @@ -12,7 +12,7 @@ import { MonitoringConfig } from '../../../config'; import { INDEX_PATTERN_ELASTICSEARCH, INDEX_PATTERN_KIBANA, - INDEX_PATTERN_LOGSTASH, + INDEX_PATTERN_LOGSTASH_MONITORING, INDEX_PATTERN_BEATS, } from '../../../../common/constants'; import { fetchStackProductUsage } from './fetch_stack_product_usage'; @@ -31,7 +31,7 @@ export const getStackProductsUsage = async ( > => { const elasticsearchIndex = getCcsIndexPattern(INDEX_PATTERN_ELASTICSEARCH, availableCcs); const kibanaIndex = getCcsIndexPattern(INDEX_PATTERN_KIBANA, availableCcs); - const logstashIndex = getCcsIndexPattern(INDEX_PATTERN_LOGSTASH, availableCcs); + const logstashIndex = getCcsIndexPattern(INDEX_PATTERN_LOGSTASH_MONITORING, availableCcs); const beatsIndex = getCcsIndexPattern(INDEX_PATTERN_BEATS, availableCcs); const [elasticsearch, kibana, logstash, beats, apm] = await Promise.all([ fetchESUsage(callCluster, clusterUuid, elasticsearchIndex), diff --git a/x-pack/plugins/monitoring/server/lib/cluster/get_index_patterns.ts b/x-pack/plugins/monitoring/server/lib/cluster/get_index_patterns.ts index 1af9397027803..4f293baf613bf 100644 --- a/x-pack/plugins/monitoring/server/lib/cluster/get_index_patterns.ts +++ b/x-pack/plugins/monitoring/server/lib/cluster/get_index_patterns.ts @@ -10,7 +10,7 @@ import { INDEX_PATTERN_ELASTICSEARCH, INDEX_PATTERN_ELASTICSEARCH_ECS, INDEX_PATTERN_KIBANA, - INDEX_PATTERN_LOGSTASH, + INDEX_PATTERN_LOGSTASH_MONITORING, INDEX_PATTERN_BEATS, DS_INDEX_PATTERN_LOGS, DS_INDEX_PATTERN_METRICS, @@ -63,7 +63,7 @@ export function getLegacyIndexPattern({ indexPattern = INDEX_PATTERN_KIBANA; break; case 'logstash': - indexPattern = INDEX_PATTERN_LOGSTASH; + indexPattern = INDEX_PATTERN_LOGSTASH_MONITORING; break; case 'apm': case 'beats': diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts index f8742144b28f8..192d5b995e10c 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts @@ -11,7 +11,7 @@ import { prefixIndexPatternWithCcs } from '../../../../../../common/ccs_utils'; import { INDEX_PATTERN_ELASTICSEARCH, INDEX_PATTERN_KIBANA, - INDEX_PATTERN_LOGSTASH, + INDEX_PATTERN_LOGSTASH_MONITORING, } from '../../../../../../common/constants'; import { postElasticsearchSettingsInternalMonitoringRequestPayloadRT, @@ -95,7 +95,11 @@ export function internalMonitoringCheckRoute(server: MonitoringCore, npRoute: Ro const { ccs } = request.body; const esIndexPattern = prefixIndexPatternWithCcs(config, INDEX_PATTERN_ELASTICSEARCH, ccs); const kbnIndexPattern = prefixIndexPatternWithCcs(config, INDEX_PATTERN_KIBANA, ccs); - const lsIndexPattern = prefixIndexPatternWithCcs(config, INDEX_PATTERN_LOGSTASH, ccs); + const lsIndexPattern = prefixIndexPatternWithCcs( + config, + INDEX_PATTERN_LOGSTASH_MONITORING, + ccs + ); const indexCounts = await Promise.all([ checkLatestMonitoringIsLegacy(context, esIndexPattern), checkLatestMonitoringIsLegacy(context, kbnIndexPattern), diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1n1p.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1n1p.json new file mode 100644 index 0000000000000..cd323f2d26c73 --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1n1p.json @@ -0,0 +1,361 @@ +[ + { + "hits": { + "hits": [ + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "HhiXFJ2P-SgCWlwiAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "type": "filebeat", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "1n1p" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a3bf686e789a4fbb312192cf2f27667831f9c56b7c9394c1f2d8b933fe5c3ddc", + "name": "test", + "plugin": { + "input": { + "events": { + "out": 2284 + }, + "flow": { + "throughput": { + "current": 0.996, + "last_1_minute": 0.998 + } + }, + "id": "0fbbcc99c0d3c4f98b4e9b0c18444f5c5e35af87e85333d37c72016fe5e4fd69", + "name": "generator", + "source": { + "column": "9", + "id": "config_string", + "line": 1, + "protocol": "string" + }, + "time": { + "queue_push_duration": { + "ms": 2291305 + } + } + }, + "type": "input" + } + } + } + }, + "sort": [ + 1717435170221 + ] + }, + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "ZcSDHAOEF2fIqTjgAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "1n1p" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a2acd1139178b1bcac1c6b716462d504553d5295fc887930efa031fdc3126c83", + "name": "another_test", + "plugin": { + "input": { + "events": { + "out": 2286 + }, + "flow": { + "throughput": { + "current": 0.996, + "last_1_minute": 0.998 + } + }, + "id": "a0ae5c8de68c84e836256c337eb815ce73f3ec03c70b298958319bdbbe4c52b2", + "name": "heartbeat", + "source": { + "column": "5", + "id": "/Users/mashhur/Dev/elastic/logstash/config/simple.conf", + "line": 2, + "protocol": "file" + }, + "time": { + "queue_push_duration": { + "ms": 945 + } + } + }, + "type": "input" + } + } + } + }, + "sort": [ + 1717435170221 + ] + }, + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "Up_iA7xmQOSt7LGdAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "type": "filebeat", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "1n1p" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a3bf686e789a4fbb312192cf2f27667831f9c56b7c9394c1f2d8b933fe5c3ddc", + "name": "test", + "plugin": { + "codec": { + "decode": { + "duration": { + "ms": 0 + }, + "in": 0, + "out": 0 + }, + "encode": { + "duration": { + "ms": 394 + }, + "in": 2281 + }, + "id": "dots_035e9b95-4fd5-449d-9be1-2ea92eeca1d4", + "name": "dots" + }, + "type": "codec" + } + } + } + }, + "sort": [ + 1717435170221 + ] + } + ] + } + } +] diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1nmp.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1nmp.json new file mode 100644 index 0000000000000..d2b8305c8a5ad --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_1nmp.json @@ -0,0 +1,233 @@ +[ + { + "hits" : { + "hits" : [ + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "6EMlJsVNKzn4Y3TAAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "1nmp" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a3bf686e789a4fbb312192cf2f27667831f9c56b7c9394c1f2d8b933fe5c3ddc", + "name": "test", + "plugin": { + "codec": { + "decode": { + "duration": { + "ms": 2292616 + }, + "in": 2284, + "out": 2284 + }, + "encode": { + "duration": { + "ms": 0 + }, + "in": 0 + }, + "id": "plain_5fea2751-110a-4919-b777-94791da43bb9", + "name": "plain" + }, + "type": "codec" + } + } + } + }, + "sort": [ + 1717435170221 + ] + }, + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "Owe4Rq9c7dsJjf_XAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "1nmp" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a2acd1139178b1bcac1c6b716462d504553d5295fc887930efa031fdc3126c83", + "name": "another_test", + "plugin": { + "codec": { + "decode": { + "duration": { + "ms": 0 + }, + "in": 0, + "out": 0 + }, + "encode": { + "duration": { + "ms": 0 + }, + "in": 0 + }, + "id": "plain_a9b27bb6-f9dd-4c54-bb93-c61f1b9001b3", + "name": "plain" + }, + "type": "codec" + } + } + } + }, + "sort": [ + 1717435170221 + ] + } + ] + } + }] diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_mnmp.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_mnmp.json new file mode 100644 index 0000000000000..45f15ce166f8b --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_agent_monitoring_results_mnmp.json @@ -0,0 +1,359 @@ +[ + { + "hits": { + "hits": [ + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "J8oAnuIIe2zBYQGpAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "type": "filebeat", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a2acd1139178b1bcac1c6b716462d504553d5295fc887930efa031fdc3126c83", + "name": "another_test", + "plugin": { + "codec": { + "decode": { + "duration": { + "ms": 0 + }, + "in": 0, + "out": 0 + }, + "encode": { + "duration": { + "ms": 0 + }, + "in": 0 + }, + "id": "plain_2c8a8f0b-f3a2-48a2-b835-21ea67302a3b", + "name": "plain" + }, + "type": "codec" + } + } + } + }, + "sort": [ + 1717435170221 + ] + }, + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "14mHJFH_SEc7Mq-fAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a2acd1139178b1bcac1c6b716462d504553d5295fc887930efa031fdc3126c83", + "name": "another_test", + "plugin": { + "codec": { + "decode": { + "duration": { + "ms": 0 + }, + "in": 0, + "out": 0 + }, + "encode": { + "duration": { + "ms": 5500 + }, + "in": 2286 + }, + "id": "rubydebug_ccce8eeb-10ce-4565-8642-7d8986d41995", + "name": "rubydebug" + }, + "type": "codec" + } + } + } + }, + "sort": [ + 1717435170221 + ] + }, + { + "_index": ".ds-metrics-logstash.plugins-default-2024.06.03-000001", + "_id": "Csohjtytgt1uKi_vAAABj98c_a0", + "_score": null, + "_source": { + "@timestamp": "2024-06-03T17:19:30.221Z", + "agent": { + "name": "Mashhurs-MacBook-Pro.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "data_stream": { + "dataset": "logstash.plugins", + "namespace": "default", + "type": "metrics" + }, + "ecs": { + "version": "8.0.0" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "event": { + "agent_id_status": "auth_metadata_missing", + "dataset": "logstash.plugins", + "ingested": "2024-06-03T17:19:40Z" + }, + "host": { + "architecture": "x86_64", + "hostname": "mashhurs-macbook-pro.local", + "id": "6F56EC02-BC0B-50C7-A3C4-A414CB348C79", + "ip": [ + "10.236.165.121", + "fe80::1848:3d0c:b1c8:47aa", + "fe80::957e:345:d271:b978", + "fe80::9b2a:96c0:39a4:d7ca", + "fe80::ac34:f7ff:fe89:8259", + "fe80::b010:4f46:40d5:9d21", + "fe80::ce81:b1c:bd2c:69e", + "fe80::f4d4:88ff:fe6a:a6b2" + ], + "mac": [ + "36-73-F9-F5-80-80", + "36-73-F9-F5-80-84", + "36-73-F9-F5-80-88", + "AE-34-F7-89-82-59", + "F2-39-B9-E9-DB-17", + "F2-39-B9-E9-DB-18", + "F2-39-B9-E9-DB-19", + "F2-39-B9-E9-DB-F7", + "F2-39-B9-E9-DB-F8", + "F2-39-B9-E9-DB-F9", + "F4-D4-88-6A-A6-B2", + "F6-D4-88-6A-A6-B2" + ], + "name": "mashhurs-macbook-pro.local", + "os": { + "build": "23F79", + "family": "darwin", + "kernel": "23.5.0", + "name": "macOS", + "platform": "darwin", + "type": "macos", + "version": "14.5" + } + }, + "input": { + "type": "cel" + }, + "logstash": { + "pipeline": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, + "host": { + "address": "127.0.0.1:9600", + "name": "Mashhurs-MacBook-Pro.local" + }, + "id": "a3bf686e789a4fbb312192cf2f27667831f9c56b7c9394c1f2d8b933fe5c3ddc", + "name": "test", + "plugin": { + "output": { + "events": { + "in": 2281, + "out": 2281 + }, + "flow": { + "worker_millis_per_event": { + "current": 0.636, + "last_1_minute": 0.41 + }, + "worker_utilization": { + "current": 0.063, + "last_1_minute": 0.041 + } + }, + "id": "0cd257dc85333d8d8e627ca21d9065b34d279e95f8c17f317addb3f3f731d3e0", + "name": "stdout", + "source": { + "column": "64", + "id": "config_string", + "line": 1, + "protocol": "string" + }, + "time": { + "duration": { + "ms": 1510 + } + } + }, + "type": "output" + } + } + } + }, + "sort": [ + 1717435170221 + ] + } + ] + } + } +] diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_1nmp.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_1nmp.json index d50bb1c0b7483..11e724eacd31d 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_1nmp.json +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_1nmp.json @@ -40,6 +40,11 @@ "workers" : 12 } } + }, + "elasticsearch": { + "cluster": { + "id": "1nmp" + } } }, "metricset": { @@ -95,6 +100,11 @@ "workers" : 1 } } + }, + "elasticsearch": { + "cluster": { + "id": "1nmp" + } } }, "metricset": { @@ -150,6 +160,11 @@ "workers" : 44 } } + }, + "elasticsearch": { + "cluster": { + "id": "1nmp" + } } }, "metricset": { @@ -205,6 +220,11 @@ "workers" : 12 } } + }, + "elasticsearch": { + "cluster": { + "id": "1nmp" + } } }, "metricset": { diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_mnmp.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_mnmp.json index fb2fe2d8462e5..c90deb4db737c 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_mnmp.json +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_mnmp.json @@ -49,6 +49,11 @@ "workers" : 1 } } + }, + "elasticsearch": { + "cluster": { + "id": "mnmp" + } } }, "metricset": { @@ -113,6 +118,11 @@ } } } + }, + "elasticsearch": { + "cluster": { + "id": "mnmp" + } } }, "metricset": { @@ -137,6 +147,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -201,6 +216,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -265,6 +285,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -329,6 +354,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -393,6 +423,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -457,6 +492,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -521,6 +561,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -585,6 +630,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -649,6 +699,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -713,6 +768,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -777,6 +837,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -841,6 +906,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -905,6 +975,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -969,6 +1044,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { @@ -1033,6 +1113,11 @@ "_score" : 0.0, "_source" : { "logstash": { + "elasticsearch": { + "cluster": { + "id": "mnmp" + } + }, "node": { "state": { "pipeline" : { diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_agent_monitoring_results.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_agent_monitoring_results.json new file mode 100644 index 0000000000000..de9a138ab524e --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_agent_monitoring_results.json @@ -0,0 +1,393 @@ +[ + { + "hits" : { + "hits": [ + { + "_index": ".ds-metrics-logstash.node-default-2024.06.03-000001", + "_id": "0NAH348BglF7bSquK97A", + "_source": { + "logstash": { + "node": { + "stats": { + "logstash": { + "pipeline": { + "batch_delay": 50, + "batch_size": 125, + "workers": 10 + }, + "pipelines": [ + "another_test", + "test" + ], + "http_address": "127.0.0.1:9600", + "host": "Mashhurs-MacBook-Pro.local", + "name": "Mashhurs-MacBook-Pro.local", + "ephemeral_id": "224e3687-15b2-4e91-84bb-dbb785742c73", + "uuid": "a755552f-9ef8-4f01-abae-394a59352f2d", + "version": "8.15.0", + "status": "green" + } + } + }, + "elasticsearch": { + "cluster": { + "id": [ + "1n1p" + ] + } + } + }, + "input": { + "type": "cel" + }, + "agent": { + "name": "Mashhurs.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "@timestamp": "2024-06-03T16:55:30.213Z", + "ecs": { + "version": "8.0.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "logstash.node" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "host": { + "id": "cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5" + } + } + }, + { + "_index": ".ds-metrics-logstash.node-default-2024.06.03-000001", + "_id": "1NAH348BglF7bSquK97A", + "_source": { + "logstash": { + "node": { + "stats": { + "logstash": { + "pipeline": { + "batch_delay": 50, + "batch_size": 125, + "workers": 10 + }, + "pipelines": [ + "another_test", + "test" + ], + "http_address": "127.0.0.1:9600", + "host": "Mashhurs-MacBook-Pro.local", + "name": "Mashhurs-MacBook-Pro.local", + "ephemeral_id": "224e3687-15b2-4e91-84bb-dbb785742c73", + "uuid": "a755552f-9ef8-4f01-abae-394a59352f2d", + "version": "8.15.0", + "status": "green" + } + } + }, + "elasticsearch": { + "cluster": { + "id": [ + "1nmp" + ] + } + } + }, + "input": { + "type": "cel" + }, + "agent": { + "name": "Mashhurs.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "@timestamp": "2024-06-03T16:55:30.213Z", + "ecs": { + "version": "8.0.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "logstash.node" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "host": { + "id": "47a70feb-3cb5-4618-8670-2c0bada61acd" + } + } + }, + { + "_index": ".ds-metrics-logstash.node-default-2024.06.03-000001", + "_id": "2NAH348BglF7bSquK97A", + "_source": { + "logstash": { + "node": { + "stats": { + "logstash": { + "pipeline": { + "batch_delay": 50, + "batch_size": 125, + "workers": 10 + }, + "pipelines": [ + "another_test", + "test" + ], + "http_address": "127.0.0.1:9600", + "host": "Mashhurs-MacBook-Pro.local", + "name": "Mashhurs-MacBook-Pro.local", + "ephemeral_id": "224e3687-15b2-4e91-84bb-dbb785742c73", + "uuid": "a755552f-9ef8-4f01-abae-394a59352f2d", + "version": "8.15.0", + "status": "green" + } + } + }, + "elasticsearch": { + "cluster": { + "id": [ + "1nmp" + ] + } + } + }, + "input": { + "type": "cel" + }, + "agent": { + "name": "Mashhurs.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "@timestamp": "2024-06-03T16:55:30.213Z", + "ecs": { + "version": "8.0.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "logstash.node" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "host": { + "id": "5a65d966-0330-4bd7-82f2-ee81040c13cf" + } + } + }, + { + "_index": ".ds-metrics-logstash.node-default-2024.06.03-000001", + "_id": "3NAH348BglF7bSquK97A", + "_source": { + "logstash": { + "node": { + "stats": { + "logstash": { + "pipeline": { + "batch_delay": 50, + "batch_size": 125, + "workers": 10 + }, + "pipelines": [ + "another_test", + "test" + ], + "http_address": "127.0.0.1:9600", + "host": "Mashhurs-MacBook-Pro.local", + "name": "Mashhurs-MacBook-Pro.local", + "ephemeral_id": "224e3687-15b2-4e91-84bb-dbb785742c73", + "uuid": "a755552f-9ef8-4f01-abae-394a59352f2d", + "version": "8.15.0", + "status": "green" + } + } + }, + "elasticsearch": { + "cluster": { + "id": [ + "mnmp" + ] + } + } + }, + "input": { + "type": "cel" + }, + "agent": { + "name": "Mashhurs.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "@timestamp": "2024-06-03T16:55:30.213Z", + "ecs": { + "version": "8.0.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "logstash.node" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "host": { + "id": "2fcd4161-e08f-4eea-818b-703ea3ec6389" + } + } + }, + { + "_index": ".ds-metrics-logstash.node-default-2024.06.03-000001", + "_id": "4NAH348BglF7bSquK97A", + "_source": { + "logstash": { + "node": { + "stats": { + "logstash": { + "pipeline": { + "batch_delay": 50, + "batch_size": 125, + "workers": 10 + }, + "pipelines": [ + "another_test", + "test" + ], + "http_address": "127.0.0.1:9600", + "host": "Mashhurs-MacBook-Pro.local", + "name": "Mashhurs-MacBook-Pro.local", + "ephemeral_id": "224e3687-15b2-4e91-84bb-dbb785742c73", + "uuid": "a755552f-9ef8-4f01-abae-394a59352f2d", + "version": "8.15.0", + "status": "green" + } + } + }, + "elasticsearch": { + "cluster": { + "id": [ + "mnmp" + ] + } + } + }, + "input": { + "type": "cel" + }, + "agent": { + "name": "Mashhurs.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "@timestamp": "2024-06-03T16:55:30.213Z", + "ecs": { + "version": "8.0.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "logstash.node" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "host": { + "id": "c6785d63-6e5f-42c2-839d-5edf139b7c19" + } + } + }, + { + "_index": ".ds-metrics-logstash.node-default-2024.06.03-000001", + "_id": "5NAH348BglF7bSquK97A", + "_source": { + "logstash": { + "node": { + "stats": { + "logstash": { + "pipeline": { + "batch_delay": 50, + "batch_size": 125, + "workers": 10 + }, + "pipelines": [ + "another_test", + "test" + ], + "http_address": "127.0.0.1:9600", + "host": "Mashhurs-MacBook-Pro.local", + "name": "Mashhurs-MacBook-Pro.local", + "ephemeral_id": "224e3687-15b2-4e91-84bb-dbb785742c73", + "uuid": "a755552f-9ef8-4f01-abae-394a59352f2d", + "version": "8.15.0", + "status": "green" + } + } + }, + "elasticsearch": { + "cluster": { + "id": [ + "mnmp" + ] + } + } + }, + "input": { + "type": "cel" + }, + "agent": { + "name": "Mashhurs.local", + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "ephemeral_id": "893247f4-d8da-4d3d-a9bf-5c7e2831a47b", + "type": "filebeat", + "version": "8.13.4" + }, + "@timestamp": "2024-06-03T16:55:30.213Z", + "ecs": { + "version": "8.0.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "logstash.node" + }, + "elastic_agent": { + "id": "ef37141b-605e-4b6e-a69f-ec525f8dcdd4", + "version": "8.13.4", + "snapshot": false + }, + "host": { + "id": "bc6ef6f2-ecce-4328-96a2-002de41a144d" + } + } + } + ] + } + } +] + diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_self_monitoring_results.json b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_self_monitoring_results.json index f9b54f62100dc..adac9a5bed5f9 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_self_monitoring_results.json +++ b/x-pack/plugins/monitoring/server/telemetry_collection/__mocks__/fixtures/logstash_stats_self_monitoring_results.json @@ -43,9 +43,6 @@ "_id" : "rC2jSncB1VO1nvgvsKx6", "_score" : null, "_source" : { - "agent" : { - "type" : "metricbeat" - }, "logstash_stats" : { "logstash" : { "version" : "7.8.0", diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts index 3b426b38fb241..0186db92720e4 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts @@ -10,12 +10,26 @@ import sinon from 'sinon'; import { getStackStats, getAllStats, handleAllStats } from './get_all_stats'; import { ESClusterStats } from './get_es_stats'; import { KibanaStats } from './get_kibana_stats'; -import { LogstashStatsByClusterUuid } from './get_logstash_stats'; +import { LogstashStatsByClusterUuid } from './logstash_monitoring'; +import { CatIndicesResponse } from '@elastic/elasticsearch/lib/api/types'; describe('get_all_stats', () => { const timestamp = Date.now(); const searchMock = sinon.stub(); - const callCluster = { search: searchMock } as unknown as ElasticsearchClient; + const infoMock = sinon.stub().returns({ cluster_uuid: 'cluster-uuid-1' }); + const catIndicesMock = { indices: sinon.stub() }; + const records: CatIndicesResponse = [ + { + index: 'monitoring-logstash-8-test', + }, + ]; + catIndicesMock.indices.returns(Promise.resolve(records)); + + const callCluster = { + search: searchMock, + info: infoMock, + cat: catIndicesMock, + } as unknown as ElasticsearchClient; afterEach(() => { searchMock.reset(); }); @@ -160,6 +174,7 @@ describe('get_all_stats', () => { collection_types: { internal_collection: 1, }, + monitoringClusterUuid: 'cluster-uuid-1', pipelines: {}, plugins: [], }, @@ -174,16 +189,13 @@ describe('get_all_stats', () => { .onCall(1) .returns(Promise.resolve(kibanaStatsResponse)) .onCall(2) - .returns(Promise.resolve(logstashStatsResponse)) // to define if it is internal monitoring or not - .returns(Promise.resolve(logstashStatsResponse)) + .returns(Promise.resolve({})) .onCall(3) - .returns(Promise.resolve({})) // Beats stats + .returns(Promise.resolve({})) .onCall(4) - .returns(Promise.resolve({})) // Beats state + .returns(Promise.resolve(logstashStatsResponse)) .onCall(5) - .returns(Promise.resolve(logstashStatsResponse)) // Logstash stats - .onCall(6) - .returns(Promise.resolve({})); // Logstash state + .returns(Promise.resolve(logstashStatsResponse)); expect(await getAllStats(['a'], callCluster, timestamp, 1)).toStrictEqual(allClusters); }); diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.ts index 77c50d089301e..d39aee6a476c2 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.ts @@ -19,7 +19,8 @@ import { import { getElasticsearchStats, ESClusterStats } from './get_es_stats'; import { getKibanaStats, KibanaStats } from './get_kibana_stats'; import { getBeatsStats, BeatsStatsByClusterUuid } from './get_beats_stats'; -import { getLogstashStats, LogstashStatsByClusterUuid } from './get_logstash_stats'; +import { getLogstashStats } from './get_logstash_stats'; +import { LogstashStatsByClusterUuid } from './logstash_monitoring'; /** * Get statistics for all products joined by Elasticsearch cluster. @@ -68,7 +69,7 @@ export function handleAllStats( beats: BeatsStatsByClusterUuid; } ) { - return clusters.map((cluster) => { + const mappedClusters = clusters.map((cluster) => { const stats = { ...cluster, stack_stats: { @@ -84,6 +85,29 @@ export function handleAllStats( return stats; }); + + const mappedClusterUuids = mappedClusters.map( + (cluster) => cluster.cluster_uuid || cluster?.elasticsearch?.cluster?.id + ); + + // Logstash agent driven monitoring isn't based on cluster UUID + // or standalone LS clusters will be reported with monitoring cluster UUIDs + const logstashOrphanClusterStats = logstash + ? Object.entries(logstash) + .filter(([clusterUuid]) => !mappedClusterUuids.includes(clusterUuid)) + .map(([clusterUuid, logstashBaseStats]) => ({ + cluster_name: LOGSTASH_SYSTEM_ID, + timestamp: `${moment.utc().format()}`, + version: + logstashBaseStats.versions.length > 0 ? logstashBaseStats.versions[0].version : '', + cluster_uuid: clusterUuid, + stack_stats: { + [LOGSTASH_SYSTEM_ID]: logstashBaseStats, + }, + cluster_stats: {}, + })) + : []; + return mappedClusters.concat(logstashOrphanClusterStats); } export function getStackStats( diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_high_level_stats.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_high_level_stats.ts index a8dfdc7900c20..acae6ff11e12c 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_high_level_stats.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_high_level_stats.ts @@ -12,7 +12,7 @@ import { createQuery } from './create_query'; import { INDEX_PATTERN_KIBANA, INDEX_PATTERN_BEATS, - INDEX_PATTERN_LOGSTASH, + INDEX_PATTERN_LOGSTASH_MONITORING, KIBANA_SYSTEM_ID, BEATS_SYSTEM_ID, APM_SYSTEM_ID, @@ -230,7 +230,7 @@ function getIndexPatternForStackProduct(product: string) { case APM_SYSTEM_ID: return INDEX_PATTERN_BEATS; case LOGSTASH_SYSTEM_ID: - return INDEX_PATTERN_LOGSTASH; + return INDEX_PATTERN_LOGSTASH_MONITORING; } return null; } @@ -238,7 +238,6 @@ function getIndexPatternForStackProduct(product: string) { /** * Get statistics about selected Elasticsearch clusters, for the selected {@code product}. * - * @param {Object} server The server instance * @param {function} callCluster The callWithRequest or callWithInternalUser handler * @param {Array} clusterUuids The string Cluster UUIDs to fetch details for * @param {Date} start Start time to limit the stats @@ -246,6 +245,7 @@ function getIndexPatternForStackProduct(product: string) { * @param {String} product The product to limit too ('kibana', 'logstash', 'beats') * * Returns an object keyed by the cluster UUIDs to make grouping easier. + * @param maxBucketSize size of the return bucket */ export async function getHighLevelStats( callCluster: ElasticsearchClient, diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.test.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.test.ts index 0dc5368d27b76..e90ac3f0958d9 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.test.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.test.ts @@ -5,729 +5,77 @@ * 2.0. */ -import { - fetchLogstashStats, - fetchLogstashState, - processStatsResults, - processLogstashStateResults, -} from './get_logstash_stats'; import sinon from 'sinon'; -import { ElasticsearchClient } from '@kbn/core/server'; +import { getLogstashStats, logstashMonitoringInstances } from './get_logstash_stats'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { CatIndicesResponse } from '@elastic/elasticsearch/lib/api/types'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const logstashStatsResultSetOfSelfMonitoring = require('./__mocks__/fixtures/logstash_stats_self_monitoring_results.json'); - -// eslint-disable-next-line @typescript-eslint/no-var-requires -const logstashStatsResultSetOfMetricbeatMonitoring = require('./__mocks__/fixtures/logstash_stats_metricbeat_monitoring_results.json'); - -const logstashStateResultsMapOfSelfMonitoring = new Map(); -const logstashStateResultsMapOfMetricbeatMonitoring = new Map(); - -// Load data for state results. -['1n1p', '1nmp', 'mnmp'].forEach((data) => { - logstashStateResultsMapOfSelfMonitoring.set( - data, - // eslint-disable-next-line @typescript-eslint/no-var-requires - require(`./__mocks__/fixtures/logstash_state_self_monitoring_results_${data}`) - ); - - logstashStateResultsMapOfMetricbeatMonitoring.set( - data, - // eslint-disable-next-line @typescript-eslint/no-var-requires - require(`./__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_${data}`) - ); -}); - -const getBaseOptions = () => ({ - clusters: {}, - allEphemeralIds: {}, - versions: {}, - plugins: {}, -}); - -describe('Get Logstash Stats', () => { - const clusterUuids = ['aCluster', 'bCluster', 'cCluster']; +describe('Get Logstash stats', function () { const searchMock = sinon.stub(); - const callCluster = { search: searchMock } as unknown as ElasticsearchClient; - const start = '2022-03-09T00:00:00.000Z'; - const end = '2022-03-09T00:20:00.000Z'; + const infoMock = sinon.stub().returns({ cluster_uuid: 'cluster-uuid-1' }); + const catIndicesMock = { indices: sinon.stub() }; beforeEach(() => { searchMock.returns(Promise.resolve({})); }); - afterEach(() => { - searchMock.reset(); - }); - - describe('fetchLogstashState', () => { - const clusterUuid = 'a'; - const ephemeralIds = ['a', 'b', 'c']; - it('should create the logstash state query correctly for legacy monitoring', async () => { - const expected = { - bool: { - filter: [ - { - terms: { - 'logstash_state.pipeline.ephemeral_id': ['a', 'b', 'c'], - }, - }, - { - bool: { - should: [ - { term: { type: 'logstash_state' } }, - { term: { 'metricset.name': 'node' } }, - ], - }, - }, - ], - }, - }; - - await fetchLogstashState(callCluster, clusterUuid, ephemeralIds, start, end, {} as any, true); - const { args } = searchMock.firstCall; - const [{ body }] = args; - expect(body.query).toEqual(expected); - }); - - it('should create the logstash state query correctly for metricbeat monitoring', async () => { - const expected = { - bool: { - filter: [ - { - terms: { - 'logstash.node.state.pipeline.ephemeral_id': ['a', 'b', 'c'], - }, - }, - { - bool: { - should: [ - { term: { type: 'logstash_state' } }, - { term: { 'metricset.name': 'node' } }, - ], - }, - }, - ], - }, - }; - - await fetchLogstashState( - callCluster, - clusterUuid, - ephemeralIds, - start, - end, - {} as any, - false - ); - const { args } = searchMock.firstCall; - const [{ body }] = args; - expect(body.query).toEqual(expected); - }); - - it('should set `size: 10` in the query', async () => { - await fetchLogstashState(callCluster, clusterUuid, ephemeralIds, start, end, {} as any, true); - const { args } = searchMock.firstCall; - const [{ body }] = args; - expect(body.size).toEqual(ephemeralIds.length); - }); - }); + test('validates self monitoring instance execution', async () => { + const records: CatIndicesResponse = [ + { + index: 'monitoring-logstash-8-test', + }, + ]; - describe('fetchLogstashStats', () => { - it('should create proper query for legacy monitoring', async () => { - const expectedQuery = { - bool: { - filter: [ - { - range: { - timestamp: { - format: 'epoch_millis', - gte: 1646784000000, - lte: 1646785200000, - }, - }, - }, - { - term: { - cluster_uuid: clusterUuids[0], // cluster_uuid is an alias works for both mertricbeat and legacy structure - }, - }, - { - bool: { - should: [ - { term: { type: 'logstash_stats' } }, - { term: { 'metricset.name': 'node_stats' } }, - ], - }, - }, - ], - }, - }; + catIndicesMock.indices.returns(Promise.resolve(records)); - await fetchLogstashStats(callCluster, clusterUuids[0], start, end, {} as any, true); - const { args } = searchMock.firstCall; - const [{ body }] = args; + const callCluster = { + search: searchMock, + info: infoMock, + cat: catIndicesMock, + } as unknown as ElasticsearchClient; - expect(body.from).toEqual(0); - expect(body.size).toEqual(10000); - expect(body.query).toEqual(expectedQuery); - }); + const collectMetricsSpy = sinon.spy(logstashMonitoringInstances.self, 'collectMetrics'); + await getLogstashStats(callCluster, ['cluster1'], 'start', 'end'); + expect(collectMetricsSpy.calledOnce).toBe(true); }); - describe.each([ - [true, 'processLogstashStatsResults with legacy monitoring'], - [false, 'processLogstashStatsResults with metricbeat monitoring'], - ])( - 'processLogstashStatsResults with self monitoring: %s', - (isLogstashSelfMonitoring, conditionDescription) => { - it('should summarize empty results', () => { - const resultsEmpty = undefined; + test('validates Metricbeat instance execution', async () => { + const records: CatIndicesResponse = [ + { + index: '.ds-metrics-logstash.stack_monitoring-test', + }, + ]; - const options = getBaseOptions(); - processStatsResults(resultsEmpty as any, options, isLogstashSelfMonitoring); + catIndicesMock.indices.returns(Promise.resolve(records)); - expect(options.clusters).toStrictEqual({}); - }); + const callCluster = { + search: searchMock, + info: infoMock, + cat: catIndicesMock, + } as unknown as ElasticsearchClient; - it('should summarize single result with some missing fields', () => { - const source = isLogstashSelfMonitoring - ? { - type: 'logstash_stats', - cluster_uuid: 'FlV4ckTxQ0a78hmBkzzc9A', - logstash_stats: { - logstash: { - uuid: '61de393a-f2b6-4b6c-8cea-22661f9c4134', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5', - queue: { - type: 'memory', - }, - }, - ], - }, - } - : { - metricset: { - period: 10000, - name: 'node_stats', - }, - logstash: { - cluster: { - id: 'FlV4ckTxQ0a78hmBkzzc9A', - }, - elasticsearch: { - cluster: { - id: 'FlV4ckTxQ0a78hmBkzzc9A', - }, - }, - node: { - stats: { - logstash: { - uuid: '61de393a-f2b6-4b6c-8cea-22661f9c4134', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5', - queue: { - type: 'memory', - }, - }, - ], - }, - }, - }, - }; - const results = { - hits: { - hits: [ - { - _source: source, - }, - ], - }, - }; - - const options = getBaseOptions(); - processStatsResults(results as any, options, isLogstashSelfMonitoring); - - expect(options.clusters).toStrictEqual({ - FlV4ckTxQ0a78hmBkzzc9A: { - count: 1, - cluster_stats: { - plugins: [], - collection_types: { - internal_collection: 1, - }, - pipelines: {}, - queues: { - memory: 1, - }, - }, - versions: [], - }, - }); - }); - - it('should retrieve all ephemeral ids from all hits for the same cluster', () => { - const source1 = isLogstashSelfMonitoring - ? { - type: 'logstash_stats', - cluster_uuid: 'FlV4ckTxQ0a78hmBkzzc9A', - logstash_stats: { - logstash: { - uuid: '0000000-0000-0000-0000-000000000000', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - queue: { - type: 'memory', - }, - }, - ], - }, - } - : { - metricset: { - period: 10000, - name: 'node_stats', - }, - logstash: { - cluster: { - id: 'FlV4ckTxQ0a78hmBkzzc9A', - }, - elasticsearch: { - cluster: { - id: 'FlV4ckTxQ0a78hmBkzzc9A', - }, - }, - node: { - stats: { - logstash: { - uuid: '0000000-0000-0000-0000-000000000000', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - queue: { - type: 'memory', - }, - }, - ], - }, - }, - }, - }; - - const source2 = isLogstashSelfMonitoring - ? { - type: 'logstash_stats', - cluster_uuid: 'FlV4ckTxQ0a78hmBkzzc9A', - logstash_stats: { - logstash: { - uuid: '11111111-1111-1111-1111-111111111111', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', - queue: { - type: 'memory', - }, - }, - ], - }, - } - : { - metricset: { - period: 10000, - name: 'node_stats', - }, - logstash: { - cluster: { - id: 'FlV4ckTxQ0a78hmBkzzc9A', - }, - elasticsearch: { - cluster: { - id: 'FlV4ckTxQ0a78hmBkzzc9A', - }, - }, - node: { - stats: { - logstash: { - uuid: '11111111-1111-1111-1111-111111111111', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', - queue: { - type: 'memory', - }, - }, - ], - }, - }, - }, - }; - - const source3 = isLogstashSelfMonitoring - ? { - type: 'logstash_stats', - cluster_uuid: '3', - logstash_stats: { - logstash: { - uuid: '22222222-2222-2222-2222-222222222222', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'cccccccc-cccc-cccc-cccc-cccccccccccc', - queue: { - type: 'memory', - }, - }, - ], - }, - } - : { - metricset: { - period: 10000, - name: 'node_stats', - }, - logstash: { - cluster: { - id: '3', - }, - elasticsearch: { - cluster: { - id: '3', - }, - }, - node: { - stats: { - logstash: { - uuid: '22222222-2222-2222-2222-222222222222', - }, - pipelines: [ - { - id: 'main', - ephemeral_id: 'cccccccc-cccc-cccc-cccc-cccccccccccc', - queue: { - type: 'memory', - }, - }, - ], - }, - }, - }, - }; - - const results = { - hits: { - hits: [ - { - _source: source1, - }, - { - _source: source2, - }, - { - _source: source3, - }, - ], - }, - }; - - const options = getBaseOptions(); - processStatsResults(results as any, options, isLogstashSelfMonitoring); - - expect(options.allEphemeralIds).toStrictEqual({ - FlV4ckTxQ0a78hmBkzzc9A: [ - 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', - ], - '3': ['cccccccc-cccc-cccc-cccc-cccccccccccc'], - }); - - expect(options.clusters).toStrictEqual({ - FlV4ckTxQ0a78hmBkzzc9A: { - count: 2, - cluster_stats: { - plugins: [], - collection_types: { - internal_collection: 2, - }, - pipelines: {}, - queues: { - memory: 2, - }, - }, - versions: [], - }, - '3': { - count: 1, - cluster_stats: { - plugins: [], - collection_types: { - internal_collection: 1, - }, - pipelines: {}, - queues: { - memory: 1, - }, - }, - versions: [], - }, - }); - }); - - it('should summarize stats from hits across multiple result objects', () => { - const options = getBaseOptions(); - - const logstashStatsResultSet = isLogstashSelfMonitoring - ? logstashStatsResultSetOfSelfMonitoring - : logstashStatsResultSetOfMetricbeatMonitoring; - - const logstashStateResultsMap = isLogstashSelfMonitoring - ? logstashStateResultsMapOfSelfMonitoring - : logstashStateResultsMapOfMetricbeatMonitoring; + const collectMetricsSpy = sinon.spy(logstashMonitoringInstances.metricbeat, 'collectMetrics'); + await getLogstashStats(callCluster, ['cluster1'], 'start', 'end'); + expect(collectMetricsSpy.calledOnce).toBe(true); + }); - // logstashStatsResultSet is an array of many small query results - logstashStatsResultSet.forEach((results: any) => { - processStatsResults(results, options, isLogstashSelfMonitoring); - }); + test('validates agent monitoring instance execution', async () => { + const records: CatIndicesResponse = [ + { + index: '.ds-metrics-logstash.node-test', + }, + ]; - logstashStateResultsMap.forEach((value: string[], clusterUuid: string) => { - value.forEach((results: any) => { - processLogstashStateResults(results, clusterUuid, options, isLogstashSelfMonitoring); - }); - }); + catIndicesMock.indices.returns(Promise.resolve(records)); - expect(options.allEphemeralIds).toStrictEqual({ - '1n1p': ['cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5'], - '1nmp': [ - '47a70feb-3cb5-4618-8670-2c0bada61acd', - '5a65d966-0330-4bd7-82f2-ee81040c13cf', - '8d33fe25-a2c0-4c54-9ecf-d218cb8dbfe4', - 'f4167a94-20a8-43e7-828e-4cf38d906187', - ], - mnmp: [ - '2fcd4161-e08f-4eea-818b-703ea3ec6389', - 'c6785d63-6e5f-42c2-839d-5edf139b7c19', - 'bc6ef6f2-ecce-4328-96a2-002de41a144d', - '72058ad1-68a1-45f6-a8e8-10621ffc7288', - '18593052-c021-4158-860d-d8122981a0ac', - '4207025c-9b00-4bea-a36c-6fbf2d3c215e', - '0ec4702d-b5e5-4c60-91e9-6fa6a836f0d1', - '41258219-b129-4fad-a629-f244826281f8', - 'e73bc63d-561a-4acd-a0c4-d5f70c4603df', - 'ddf882b7-be26-4a93-8144-0aeb35122651', - '602936f5-98a3-4f8c-9471-cf389a519f4b', - '8b300988-62cc-4bc6-9ee0-9194f3f78e27', - '6ab60531-fb6f-478c-9063-82f2b0af2bed', - '802a5994-a03c-44b8-a650-47c0f71c2e48', - '6070b400-5c10-4c5e-b5c5-a5bd9be6d321', - '3193df5f-2a34-4fe3-816e-6b05999aa5ce', - '994e68cd-d607-40e6-a54c-02a51caa17e0', - ], - }); + const callCluster = { + search: searchMock, + info: infoMock, + cat: catIndicesMock, + } as unknown as ElasticsearchClient; - expect(options.clusters).toStrictEqual({ - '1n1p': { - count: 1, - versions: [ - { - count: 1, - version: '7.10.0', - }, - ], - cluster_stats: { - collection_types: { - ...(isLogstashSelfMonitoring ? { internal_collection: 1 } : { metricbeat: 1 }), - }, - pipelines: { - batch_size_avg: 125, - batch_size_max: 125, - batch_size_min: 125, - batch_size_total: 125, - count: 1, - sources: { - file: true, - }, - workers_avg: 1, - workers_max: 1, - workers_min: 1, - workers_total: 1, - }, - plugins: [ - { - count: 1, - name: 'logstash-input-stdin', - }, - { - count: 1, - name: 'logstash-input-elasticsearch', - }, - { - count: 3, - name: 'logstash-filter-mutate', - }, - { - count: 3, - name: 'logstash-filter-ruby', - }, - { - count: 1, - name: 'logstash-filter-split', - }, - { - count: 1, - name: 'logstash-filter-elasticsearch', - }, - { - count: 1, - name: 'logstash-filter-aggregate', - }, - { - count: 1, - name: 'logstash-filter-drop', - }, - { - count: 1, - name: 'logstash-output-elasticsearch', - }, - { - count: 1, - name: 'logstash-output-stdout', - }, - ], - queues: { - memory: 1, - }, - }, - }, - '1nmp': { - count: 1, - versions: [ - { - count: 1, - version: '7.8.0', - }, - ], - cluster_stats: { - collection_types: { - ...(isLogstashSelfMonitoring ? { internal_collection: 1 } : { metricbeat: 1 }), - }, - pipelines: { - batch_size_avg: 406.5, - batch_size_max: 1251, - batch_size_min: 125, - batch_size_total: 1626, - count: 4, - sources: { - xpack: true, - }, - workers_avg: 17.25, - workers_max: 44, - workers_min: 1, - workers_total: 69, - }, - plugins: [ - { - count: 4, - name: 'logstash-input-stdin', - }, - { - count: 4, - name: 'logstash-output-stdout', - }, - ], - queues: { - memory: 3, - persisted: 1, - }, - }, - }, - mnmp: { - count: 3, - versions: [ - { - count: 1, - version: '7.9.2', - }, - { - count: 1, - version: '7.9.1', - }, - { - count: 1, - version: '7.10.0', - }, - ], - cluster_stats: { - collection_types: { - ...(isLogstashSelfMonitoring ? { internal_collection: 3 } : { metricbeat: 3 }), - }, - pipelines: { - batch_size_avg: 33.294117647058826, - batch_size_max: 125, - batch_size_min: 1, - batch_size_total: 566, - count: 17, - sources: { - file: true, - string: true, - }, - workers_avg: 7.411764705882353, - workers_max: 16, - workers_min: 1, - workers_total: 126, - }, - plugins: [ - { - count: 1, - name: 'logstash-input-stdin', - }, - { - count: 1, - name: 'logstash-filter-clone', - }, - { - count: 3, - name: 'logstash-output-pipeline', - }, - { - count: 2, - name: 'logstash-input-pipeline', - }, - { - count: 16, - name: 'logstash-filter-sleep', - }, - { - count: 14, - name: 'logstash-output-stdout', - }, - { - count: 14, - name: 'logstash-input-generator', - }, - ], - queues: { - memory: 3, - persisted: 14, - }, - }, - }, - }); - }); - } - ); + const collectMetricsSpy = sinon.spy(logstashMonitoringInstances.agent, 'collectMetrics'); + await getLogstashStats(callCluster, ['cluster1'], 'start', 'end'); + expect(collectMetricsSpy.calledOnce).toBe(true); + }); }); diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.ts index c2a8904607e53..3ac713fec8919 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_logstash_stats.ts @@ -6,450 +6,29 @@ */ import { ElasticsearchClient } from '@kbn/core/server'; -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { createQuery } from './create_query'; -import { mapToList } from './get_high_level_stats'; -import { incrementByKey } from './get_high_level_stats'; - -import { INDEX_PATTERN_LOGSTASH, TELEMETRY_QUERY_SOURCE } from '../../common/constants'; - -type Counter = Map; - -const HITS_SIZE = 10000; // maximum hits to receive from ES with each search - -export interface LogstashBaseStats { - // stats - versions: Array<{ version: string; count: number }>; - count: number; - - cluster_stats?: { - collection_types?: { [collection_type_type: string]: number }; - queues?: { [queue_type: string]: number }; - plugins?: Array<{ name: string; count: number }>; - pipelines?: { - count?: number; - batch_size_max?: number; - batch_size_avg?: number; - batch_size_min?: number; - batch_size_total?: number; - workers_max?: number; - workers_avg?: number; - workers_min?: number; - workers_total?: number; - sources?: { [source_type: string]: boolean }; - }; - }; -} - -const getLogstashBaseStats = () => ({ - versions: [], - count: 0, - cluster_stats: { - pipelines: {}, - plugins: [], - }, -}); - -export interface LogstashStats { - cluster_uuid: string; - source_node: string; - type: string; - agent?: { - type: string; - }; - // legacy monitoring shape - logstash_stats?: { - pipelines?: [ - { - id?: string; - ephemeral_id: string; - queue?: { - type: string; - }; - } - ]; - logstash?: { - version?: string; - uuid?: string; - snapshot?: string; - }; - }; - // metricbeat monitoring shape - logstash?: { - node?: { - stats?: { - pipelines?: [ - { - id?: string; - ephemeral_id: string; - queue?: { - type: string; - }; - } - ]; - logstash?: { - version?: string; - uuid?: string; - snapshot?: string; - }; - }; - }; - elasticsearch?: { - cluster?: { - id?: string; - }; - }; - }; -} - -export interface LogstashState { - // legacy monitoring shape - logstash_state?: { - pipeline?: { - batch_size?: number; - workers?: number; - representation?: { - graph?: { - vertices?: [ - { - config_name?: string; - plugin_type?: string; - meta?: { - source?: { - protocol?: string; - }; - }; - } - ]; - }; - }; - }; - }; - // metricbeat monitoring shape - logstash?: { - node?: { - state?: { - pipeline?: { - batch_size?: number; - workers?: number; - representation?: { - graph?: { - vertices?: [ - { - config_name?: string; - plugin_type?: string; - meta?: { - source?: { - protocol?: string; - }; - }; - } - ]; - }; - }; - }; - }; - }; - }; -} - -export interface LogstashProcessOptions { - clusters: { [clusterUuid: string]: LogstashBaseStats }; - allEphemeralIds: { [clusterUuid: string]: string[] }; - versions: { [clusterUuid: string]: Counter }; - plugins: { [clusterUuid: string]: Counter }; -} - -/* - * Update a clusters object with processed Logstash stats - * @param {Array} results - array of LogstashStats docs from ES - * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs - * @param {Object} allEphemeralIds - EphemeralIds in an object keyed by cluster UUIDs to track the pipelines for the cluster - * @param {Object} versions - Versions in an object keyed by cluster UUIDs to track the logstash versions for the cluster - * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins - */ -export function processStatsResults( - results: estypes.SearchResponse, - { clusters, allEphemeralIds, versions, plugins }: LogstashProcessOptions, - isSelfMonitoring: boolean -) { - const currHits = results?.hits?.hits || []; - currHits.forEach((hit) => { - const clusterUuid = isSelfMonitoring - ? hit._source!.cluster_uuid - : hit._source!.logstash?.elasticsearch?.cluster?.id; - - if (clusterUuid !== undefined && clusters[clusterUuid] === undefined) { - clusters[clusterUuid] = getLogstashBaseStats(); - versions[clusterUuid] = new Map(); - plugins[clusterUuid] = new Map(); - } - const logstashStats = isSelfMonitoring - ? hit._source?.logstash_stats - : hit._source?.logstash?.node?.stats; - - if (clusterUuid !== undefined && logstashStats !== undefined) { - const clusterStats = clusters[clusterUuid].cluster_stats || {}; - clusters[clusterUuid].count = (clusters[clusterUuid].count || 0) + 1; - - const thisVersion = logstashStats.logstash?.version; - const a: Counter = versions[clusterUuid]; - incrementByKey(a, thisVersion); - clusters[clusterUuid].versions = mapToList(a, 'version'); - - // Internal Collection has no agent field, so default to 'internal_collection' - let thisCollectionType = isSelfMonitoring ? 'internal_collection' : hit._source?.agent?.type; - if (thisCollectionType === undefined) { - thisCollectionType = 'internal_collection'; - } - if (!clusterStats.hasOwnProperty('collection_types')) { - clusterStats.collection_types = {}; - } - clusterStats.collection_types![thisCollectionType] = - (clusterStats.collection_types![thisCollectionType] || 0) + 1; - const pipelines = logstashStats.pipelines || []; - - pipelines.forEach((pipeline) => { - const thisQueueType = pipeline.queue?.type; - if (thisQueueType !== undefined) { - if (!clusterStats.hasOwnProperty('queues')) { - clusterStats.queues = {}; - } - clusterStats.queues![thisQueueType] = (clusterStats.queues![thisQueueType] || 0) + 1; - } - - const ephemeralId = pipeline.ephemeral_id; - if (ephemeralId !== undefined) { - allEphemeralIds[clusterUuid] = allEphemeralIds[clusterUuid] || []; - allEphemeralIds[clusterUuid].push(ephemeralId); - } - }); - } - }); -} - -/* - * Update a clusters object with logstash state details - * @param {Array} results - array of LogstashState docs from ES - * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs - * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins - */ -export function processLogstashStateResults( - results: estypes.SearchResponse, - clusterUuid: string, - { clusters, versions, plugins }: LogstashProcessOptions, - isSelfMonitoring: boolean -) { - const currHits = results?.hits?.hits || []; - const clusterStats = clusters[clusterUuid].cluster_stats; - const pipelineStats = clusters[clusterUuid].cluster_stats?.pipelines; - - currHits.forEach((hit) => { - const thisLogstashStatePipeline = isSelfMonitoring - ? hit._source?.logstash_state?.pipeline - : hit._source?.logstash?.node?.state?.pipeline; - - if (pipelineStats !== undefined && thisLogstashStatePipeline !== undefined) { - pipelineStats.count = (pipelineStats.count || 0) + 1; - - const thisPipelineBatchSize = thisLogstashStatePipeline.batch_size; - - if (thisPipelineBatchSize !== undefined) { - pipelineStats.batch_size_total = - (pipelineStats.batch_size_total || 0) + thisPipelineBatchSize; - pipelineStats.batch_size_max = pipelineStats.batch_size_max || 0; - pipelineStats.batch_size_min = pipelineStats.batch_size_min || 0; - pipelineStats.batch_size_avg = pipelineStats.batch_size_total / pipelineStats.count; - - if (thisPipelineBatchSize > pipelineStats.batch_size_max) { - pipelineStats.batch_size_max = thisPipelineBatchSize; - } - if ( - pipelineStats.batch_size_min === 0 || - thisPipelineBatchSize < pipelineStats.batch_size_min - ) { - pipelineStats.batch_size_min = thisPipelineBatchSize; - } - } - - const thisPipelineWorkers = thisLogstashStatePipeline.workers; - if (thisPipelineWorkers !== undefined) { - pipelineStats.workers_total = (pipelineStats.workers_total || 0) + thisPipelineWorkers; - pipelineStats.workers_max = pipelineStats.workers_max || 0; - pipelineStats.workers_min = pipelineStats.workers_min || 0; - pipelineStats.workers_avg = pipelineStats.workers_total / pipelineStats.count; - - if (thisPipelineWorkers > pipelineStats.workers_max) { - pipelineStats.workers_max = thisPipelineWorkers; - } - if (pipelineStats.workers_min === 0 || thisPipelineWorkers < pipelineStats.workers_min) { - pipelineStats.workers_min = thisPipelineWorkers; - } - } - - // Extract the vertices object from the pipeline representation. From this, we can - // retrieve the source of the pipeline element on the configuration(from file, string, or - // x-pack-config-management), and the input, filter and output plugins from that pipeline. - const vertices = thisLogstashStatePipeline.representation?.graph?.vertices; - - if (vertices !== undefined) { - vertices.forEach((vertex) => { - const configName = vertex.config_name; - const pluginType = vertex.plugin_type; - let pipelineConfig = vertex.meta?.source?.protocol; - - if (pipelineConfig !== undefined) { - if (pipelineConfig === 'string' || pipelineConfig === 'str') { - pipelineConfig = 'string'; - } else if (pipelineConfig === 'x-pack-config-management') { - pipelineConfig = 'xpack'; - } else { - pipelineConfig = 'file'; - } - if (!pipelineStats.hasOwnProperty('sources')) { - pipelineStats.sources = {}; - } - pipelineStats.sources![pipelineConfig] = true; - } - if (configName !== undefined && pluginType !== undefined) { - incrementByKey(plugins[clusterUuid], `logstash-${pluginType}-${configName}`); - } - }); - } - } - }); - if (clusterStats !== undefined) { - clusterStats.plugins = mapToList(plugins[clusterUuid], 'name'); - } -} - -export async function fetchLogstashStats( - callCluster: ElasticsearchClient, - clusterUuid: string, - start: string, - end: string, - { page = 0, ...options }: { page?: number } & LogstashProcessOptions, - isSelfMonitoring: boolean -): Promise { - const statsField = isSelfMonitoring ? 'logstash_stats' : 'logstash.node.stats'; - const filterPath: string[] = [ - 'hits.hits._source.cluster_uuid', - 'hits.hits._source.type', - 'hits.hits._source.source_node', - 'hits.hits._source.agent.type', - 'hits.hits._source.logstash.elasticsearch.cluster.id', // alias for cluster_uuid - `hits.hits._source.${statsField}.pipelines.id`, - `hits.hits._source.${statsField}.pipelines.ephemeral_id`, - `hits.hits._source.${statsField}.pipelines.queue.type`, - `hits.hits._source.${statsField}.logstash.version`, - `hits.hits._source.${statsField}.logstash.uuid`, - ]; - - const params: estypes.SearchRequest = { - index: INDEX_PATTERN_LOGSTASH, - ignore_unavailable: true, - filter_path: filterPath, - body: { - query: createQuery({ - start, - end, - filters: [ - { term: { cluster_uuid: clusterUuid } }, - { - bool: { - should: [ - { term: { type: 'logstash_stats' } }, - { term: { 'metricset.name': 'node_stats' } }, - ], - }, - }, - ], - }) as estypes.QueryDslQueryContainer, - from: page * HITS_SIZE, - collapse: { - field: `${statsField}.logstash.uuid`, - }, - sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], - size: HITS_SIZE, - }, - }; - - const results = await callCluster.search(params, { - headers: { - 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, - }, - }); - const hitsLength = results?.hits?.hits.length || 0; - - if (hitsLength > 0) { - // further augment the clusters object with more stats - processStatsResults(results, options, isSelfMonitoring); - } - return Promise.resolve(); -} - -export async function fetchLogstashState( - callCluster: ElasticsearchClient, - clusterUuid: string, - ephemeralIds: string[], - start: string, - end: string, - { page = 0, ...options }: { page?: number } & LogstashProcessOptions, - isSelfMonitoring: boolean -): Promise { - const stateField = isSelfMonitoring ? 'logstash_state' : 'logstash.node.state'; - const filterPath: string[] = [ - `hits.hits._source.${stateField}.pipeline.batch_size`, - `hits.hits._source.${stateField}.pipeline.workers`, - `hits.hits._source.${stateField}.pipeline.representation.graph.vertices`, - `hits.hits._source.type`, - ]; - - const params: estypes.SearchRequest = { - index: INDEX_PATTERN_LOGSTASH, - ignore_unavailable: true, - filter_path: filterPath, - body: { - query: createQuery({ - // intentionally not using start and end periods as we need node state info to fill plugin usages - // especially with metricbeat monitoring - filters: [ - { terms: { [`${stateField}.pipeline.ephemeral_id`]: ephemeralIds } }, - { - bool: { - should: [ - { term: { type: 'logstash_state' } }, - { term: { 'metricset.name': 'node' } }, - ], - }, - }, - ], - }) as estypes.QueryDslQueryContainer, - collapse: { - field: `${stateField}.pipeline.ephemeral_id`, - }, - sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], - size: ephemeralIds.length, - }, - }; - - const results = await callCluster.search(params, { - headers: { - 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, - }, - }); - - const hitsLength = results?.hits?.hits.length || 0; - if (hitsLength > 0) { - // further augment the clusters object with more stats - processLogstashStateResults(results, clusterUuid, options, isSelfMonitoring); - } - return Promise.resolve(); -} - -export interface LogstashStatsByClusterUuid { - [clusterUuid: string]: LogstashBaseStats; -} +import { + INDEX_PATTERN_LOGSTASH, + METRICBEAT_INDEX_NAME_UNIQUE_TOKEN, + TELEMETRY_QUERY_SOURCE, +} from '../../common/constants'; +import { LogstashSelfMonitoring } from './logstash_self_monitoring'; +import { LogstashMetricbeatMonitoring } from './logstash_metricbeat_monitoring'; +import { LogstashAgentMonitoring } from './logstash_agent_monitoring'; +import { + LogstashMonitoring, + LogstashProcessOptions, + LogstashStatsByClusterUuid, +} from './logstash_monitoring'; + +const SELF_MONITORING: string = 'self'; +const METRICBEAT_MONITORING: string = 'metricbeat'; +const AGENT_MONITORING: string = 'agent'; + +export const logstashMonitoringInstances: { [key: string]: LogstashMonitoring } = { + self: new LogstashSelfMonitoring(), + metricbeat: new LogstashMetricbeatMonitoring(), + agent: new LogstashAgentMonitoring(), +}; /* * Call the function for fetching and summarizing Logstash stats @@ -464,65 +43,72 @@ export async function getLogstashStats( const options: LogstashProcessOptions = { clusters: {}, // the result object to be built up allEphemeralIds: {}, + allHostIds: {}, versions: {}, plugins: {}, }; - - // if index name contains '-mb', means metricbeat based monitoring - // filter_path and collapse fields in the queries differ on metricbeat vs. self-monitoring - // note: agent driven LS monitoring indices pattern differ ".ds-metrics-logstash*" - for (const clusterUuid of clusterUuids) { - const logstashMonitoringIndex: string = await getLogstashMonitoringIndex( - callCluster, - clusterUuid - ); - - // no need to proceed if we don't have monitoring metrics - if (logstashMonitoringIndex !== '') { - const isSelfMonitoring: boolean = logstashMonitoringIndex.indexOf('-mb') === -1; - await fetchLogstashStats(callCluster, clusterUuid, start, end, options, isSelfMonitoring); - - if (options.clusters[clusterUuid] !== undefined) { - await fetchLogstashState( - callCluster, - clusterUuid, - options.allEphemeralIds[clusterUuid], - start, - end, - options, - isSelfMonitoring - ); - } + const monitoringClusterInfo = await callCluster.info(); + const monitoringClusterUuid: string = monitoringClusterInfo.cluster_uuid; + + // figure out the monitoring methods cluster is using based on the Logstash metrics indices + // mostly single method will be resolved + // multiple monitoring methods case might be due to migration (ex: from self to metricbeat) + const monitoringMethods: string[] = await getLogstashMonitoringMethods(callCluster); + + // collect all _method_ (:self, :metricbeat, :agent) metrics in a given period + for (const monitoringMethod of monitoringMethods) { + const monitoringInstance = logstashMonitoringInstances[monitoringMethod]; + if (monitoringInstance) { + await monitoringInstance.collectMetrics( + callCluster, + clusterUuids, + monitoringClusterUuid, + start, + end, + options + ); } } return options.clusters; } -export async function getLogstashMonitoringIndex( - callCluster: ElasticsearchClient, - clusterUuid: string -): Promise { - const params: estypes.SearchRequest = { - index: INDEX_PATTERN_LOGSTASH, - ignore_unavailable: true, - body: { - query: createQuery({ - clusterUuid, - }) as estypes.QueryDslQueryContainer, - sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], - size: 1, - }, - }; - - const results = await callCluster.search(params, { - headers: { - 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, - }, - }); - const hitsLength = results?.hits?.hits.length || 0; - if (hitsLength > 0) { - const [firstDocument] = results.hits.hits; - return Promise.resolve(firstDocument._index); +export async function getLogstashMonitoringMethods( + callCluster: ElasticsearchClient +): Promise { + const response = await callCluster.cat.indices( + { index: INDEX_PATTERN_LOGSTASH, format: 'json' }, + { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + } + ); + + const monitoringMethods: string[] = []; + for (const record of response) { + if (record.index!.indexOf('monitoring-logstash-') !== -1) { + if (record.index!.indexOf(METRICBEAT_INDEX_NAME_UNIQUE_TOKEN) !== -1) { + // legacy driven metricbeat monitoring + if (!monitoringMethods.includes(METRICBEAT_MONITORING)) { + monitoringMethods.push(METRICBEAT_MONITORING); + logstashMonitoringInstances.metricbeat.setIndexPattern('legacy'); + } + } else { + if (!monitoringMethods.includes(SELF_MONITORING)) { + monitoringMethods.push(SELF_MONITORING); + } + } + } else if (record.index!.indexOf('metrics-logstash.node') !== -1) { + if (!monitoringMethods.includes(AGENT_MONITORING)) { + monitoringMethods.push(AGENT_MONITORING); + } + } else if (record.index!.indexOf('metrics-logstash.stack_monitoring') !== -1) { + if (!monitoringMethods.includes(METRICBEAT_MONITORING)) { + monitoringMethods.push(METRICBEAT_MONITORING); + logstashMonitoringInstances.metricbeat.setIndexPattern('stack'); + } + } } - return Promise.resolve(''); + + return monitoringMethods; } diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.test.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.test.ts new file mode 100644 index 0000000000000..7bce1a37158c9 --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.test.ts @@ -0,0 +1,582 @@ +/* + * 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 sinon from 'sinon'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { LogstashAgentMonitoring } from './logstash_agent_monitoring'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const logstashStatsResultSetOfAgentMonitoring = require('./__mocks__/fixtures/logstash_stats_agent_monitoring_results.json'); + +const logstashStateResultsMapOfAgentMonitoring = new Map(); + +// Load data for state results. +['1n1p', '1nmp', 'mnmp'].forEach((data) => { + logstashStateResultsMapOfAgentMonitoring.set( + data, + // eslint-disable-next-line @typescript-eslint/no-var-requires + require(`./__mocks__/fixtures/logstash_state_agent_monitoring_results_${data}`) + ); +}); + +const getBaseOptions = () => ({ + clusters: {}, + allHostIds: {}, + allEphemeralIds: {}, + versions: {}, + plugins: {}, +}); + +describe('LogstashAgentMonitoring', () => { + let agentMonitoring: LogstashAgentMonitoring; + const monitoringClusterUuid: string = 'monitoringClusterUuid'; + const searchMock = sinon.stub(); + const callCluster = { search: searchMock } as unknown as ElasticsearchClient; + const start = '2024-05-31T00:00:00.000Z'; + const end = '2024-05-31T00:20:00.000Z'; + + beforeEach(() => { + agentMonitoring = new LogstashAgentMonitoring(); + searchMock.returns(Promise.resolve({})); + }); + + afterEach(() => { + searchMock.reset(); + }); + + describe('Logstash agent monitoring query test', () => { + const clusterUuid = 'a'; + const hostIds = ['aHost', 'bHost', 'cHost']; + + it('creates proper query for stats', async () => { + const expectedQuery = { + bool: { + filter: [ + { + bool: { + should: [{ term: { 'data_stream.dataset': 'logstash.node' } }], + }, + }, + { + range: { + '@timestamp': { + format: 'epoch_millis', + gte: 1717113600000, + lte: 1717114800000, + }, + }, + }, + ], + }, + }; + + await (agentMonitoring as any).fetchLogstashStats( + callCluster, + monitoringClusterUuid, + start, + end, + {} as any + ); + const { args } = searchMock.firstCall; + const [{ body }] = args; + + expect(body.from).toEqual(0); + expect(body.size).toEqual(10000); + expect(body.query).toEqual(expectedQuery); + }); + + it('creates the logstash state query correctly for state', async () => { + const expected = { + bool: { + filter: [ + { + bool: { + should: [{ term: { 'data_stream.dataset': 'logstash.plugins' } }], + }, + }, + { + terms: { + 'host.id': ['aHost', 'bHost', 'cHost'], + }, + }, + { + range: { + '@timestamp': { + format: 'epoch_millis', + gte: 1717113600000, + lte: 1717114800000, + }, + }, + }, + ], + }, + }; + + await (agentMonitoring as any).fetchLogstashState( + callCluster, + hostIds, + clusterUuid, + start, + end, + {} as any + ); + const { args } = searchMock.firstCall; + const [{ body }] = args; + expect(body.query).toEqual(expected); + }); + }); + + describe('Process query results', () => { + it('summarizes empty results', () => { + const resultsEmpty = undefined; + const options = getBaseOptions(); + (agentMonitoring as any).processStatsResults( + resultsEmpty as any, + options, + monitoringClusterUuid + ); + + expect(options.clusters).toStrictEqual({}); + }); + + it('summarizes a result with monitoring cluster UUID', () => { + const source = { + logstash: { + node: { + stats: { + logstash: { + pipeline: { + batch_delay: 50, + batch_size: 125, + workers: 10, + }, + pipelines: ['another_test', 'test'], + ephemeral_id: '224e3687-15b2-4e91-84bb-dbb785742c73', + uuid: 'a755552f-9ef8-4f01-abae-394a59352f2d', + version: '8.15.0', + status: 'green', + }, + }, + }, + }, + input: { + type: 'cel', + }, + agent: { + name: 'Mashhurs.local', + id: 'ef37141b-605e-4b6e-a69f-ec525f8dcdd4', + type: 'filebeat', + }, + '@timestamp': '2024-06-03T16:55:30.213Z', + data_stream: { + namespace: 'default', + type: 'metrics', + dataset: 'logstash.node', + }, + host: { + id: '6F56EC02-BC0B-50C7-A3C4-A414CB348C79', + }, + }; + + const results = { + hits: { + hits: [ + { + _source: source, + }, + ], + }, + }; + + const options = getBaseOptions(); + (agentMonitoring as any).processStatsResults( + results as any, + options, + 'FlV4ckTxQ0a78hmBkzzc9A' + ); + + expect(options.clusters).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: { + count: 1, + cluster_stats: { + collection_types: { + filebeat: 1, + }, + monitoringClusterUuid: 'FlV4ckTxQ0a78hmBkzzc9A', + pipelines: { + count: 2, + }, + plugins: [], + }, + versions: [ + { + count: 1, + version: '8.15.0', + }, + ], + }, + }); + }); + + it('summarizes a result with reported cluster UUID', () => { + const source = { + logstash: { + node: { + stats: { + logstash: { + pipeline: { + batch_delay: 50, + batch_size: 125, + workers: 10, + }, + pipelines: ['another_test', 'test'], + ephemeral_id: '224e3687-15b2-4e91-84bb-dbb785742c73', + uuid: 'a755552f-9ef8-4f01-abae-394a59352f2d', + version: '8.15.0', + status: 'green', + }, + }, + }, + elasticsearch: { + cluster: { + id: ['testClusterUuid'], + }, + }, + }, + input: { + type: 'cel', + }, + agent: { + name: 'Mashhurs.local', + id: 'ef37141b-605e-4b6e-a69f-ec525f8dcdd4', + type: 'filebeat', + }, + '@timestamp': '2024-06-03T16:55:30.213Z', + data_stream: { + namespace: 'default', + type: 'metrics', + dataset: 'logstash.node', + }, + host: { + id: '6F56EC02-BC0B-50C7-A3C4-A414CB348C79', + }, + }; + + const results = { + hits: { + hits: [ + { + _source: source, + }, + ], + }, + }; + + const options = getBaseOptions(); + (agentMonitoring as any).processStatsResults( + results as any, + options, + 'FlV4ckTxQ0a78hmBkzzc9A' + ); + + expect(options.clusters).toStrictEqual({ + testClusterUuid: { + count: 1, + cluster_stats: { + collection_types: { + filebeat: 1, + }, + monitoringClusterUuid: 'FlV4ckTxQ0a78hmBkzzc9A', + pipelines: { + count: 2, + }, + plugins: [], + }, + versions: [ + { + count: 1, + version: '8.15.0', + }, + ], + }, + }); + }); + + it('retrieves all host ids from the hits for the same cluster', () => { + const source1 = { + logstash: { + node: { + stats: { + logstash: { + pipeline: { + batch_delay: 50, + batch_size: 125, + workers: 10, + }, + pipelines: ['another_test', 'test'], + ephemeral_id: '224e3687-15b2-4e91-84bb-dbb785742c73', + uuid: 'a755552f-9ef8-4f01-abae-394a59352f2d', + version: '8.15.0', + status: 'green', + }, + }, + }, + elasticsearch: { + cluster: { + id: ['testClusterUuid'], + }, + }, + }, + host: { + id: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + }, + }; + + const source2 = { + logstash: { + node: { + stats: { + logstash: { + pipeline: { + batch_delay: 50, + batch_size: 125, + workers: 10, + }, + pipelines: ['another_test', 'test'], + ephemeral_id: '224e3687-15b2-4e91-84bb-dbb785742c73', + uuid: 'a755552f-9ef8-4f01-abae-394a59352f2d', + version: '8.15.0', + status: 'green', + }, + }, + }, + elasticsearch: { + cluster: { + id: ['testClusterUuid'], + }, + }, + }, + host: { + id: 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', + }, + }; + + const source3 = { + logstash: { + node: { + stats: { + logstash: { + pipeline: { + batch_delay: 50, + batch_size: 125, + workers: 10, + }, + pipelines: ['another_test', 'test'], + ephemeral_id: '224e3687-15b2-4e91-84bb-dbb785742c73', + uuid: 'a755552f-9ef8-4f01-abae-394a59352f2d', + version: '8.15.0', + status: 'green', + }, + }, + }, + elasticsearch: { + cluster: { + id: ['3'], + }, + }, + }, + host: { + id: 'cccccccc-cccc-cccc-cccc-cccccccccccc', + }, + }; + + const results = { + hits: { + hits: [ + { + _source: source1, + }, + { + _source: source2, + }, + { + _source: source3, + }, + ], + }, + }; + + const options = getBaseOptions(); + (agentMonitoring as any).processStatsResults(results as any, options, monitoringClusterUuid); + + expect(options.allHostIds).toStrictEqual({ + testClusterUuid: [ + 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', + ], + '3': ['cccccccc-cccc-cccc-cccc-cccccccccccc'], + }); + + expect(options.clusters).toStrictEqual({ + testClusterUuid: { + count: 2, + cluster_stats: { + plugins: [], + collection_types: { + agent: 2, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + count: 2, + }, + }, + versions: [ + { + count: 2, + version: '8.15.0', + }, + ], + }, + '3': { + count: 1, + cluster_stats: { + plugins: [], + collection_types: { + agent: 1, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + count: 2, + }, + }, + versions: [ + { + count: 1, + version: '8.15.0', + }, + ], + }, + }); + }); + + it('summarizes stats from hits across multiple result objects', () => { + const options = getBaseOptions(); + + // logstashStatsResultSet is an array of many small query results + logstashStatsResultSetOfAgentMonitoring.forEach((results: any) => { + (agentMonitoring as any).processStatsResults(results, options, monitoringClusterUuid); + }); + + logstashStateResultsMapOfAgentMonitoring.forEach((value: string[], clusterUuid: string) => { + value.forEach((results: any) => { + (agentMonitoring as any).processStateResults(results, options, monitoringClusterUuid); + }); + }); + + expect(options.allHostIds).toStrictEqual({ + '1n1p': ['cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5'], + '1nmp': ['47a70feb-3cb5-4618-8670-2c0bada61acd', '5a65d966-0330-4bd7-82f2-ee81040c13cf'], + mnmp: [ + '2fcd4161-e08f-4eea-818b-703ea3ec6389', + 'c6785d63-6e5f-42c2-839d-5edf139b7c19', + 'bc6ef6f2-ecce-4328-96a2-002de41a144d', + ], + }); + + expect(options.clusters).toStrictEqual({ + '1n1p': { + cluster_stats: { + collection_types: { + filebeat: 1, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + count: 2, + }, + plugins: [ + { + count: 1, + name: 'logstash-input-generator', + }, + { + count: 1, + name: 'logstash-input-heartbeat', + }, + { + count: 1, + name: 'logstash-codec-dots', + }, + ], + }, + count: 1, + versions: [ + { + count: 1, + version: '8.15.0', + }, + ], + }, + '1nmp': { + cluster_stats: { + collection_types: { + filebeat: 2, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + count: 2, + }, + plugins: [ + { + count: 2, + name: 'logstash-codec-plain', + }, + ], + }, + count: 2, + versions: [ + { + count: 2, + version: '8.15.0', + }, + ], + }, + mnmp: { + cluster_stats: { + collection_types: { + filebeat: 3, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + count: 2, + }, + plugins: [ + { + count: 1, + name: 'logstash-codec-plain', + }, + { + count: 1, + name: 'logstash-codec-rubydebug', + }, + { + count: 1, + name: 'logstash-output-stdout', + }, + ], + }, + count: 3, + versions: [ + { + count: 3, + version: '8.15.0', + }, + ], + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.ts new file mode 100644 index 0000000000000..eef7637f1b837 --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_agent_monitoring.ts @@ -0,0 +1,310 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import moment from 'moment'; +import { createQuery } from './create_query'; +import { mapToList } from './get_high_level_stats'; +import { incrementByKey } from './get_high_level_stats'; +import { + TELEMETRY_QUERY_SOURCE, + INDEX_PATTERN_LOGSTASH_METRICS_PLUGINS, + INDEX_PATTERN_LOGSTASH_METRICS_NODE, +} from '../../common/constants'; +import { + HITS_SIZE, + LOGSTASH_PLUGIN_TYPES, + getLogstashBaseStats, + Counter, + LogstashMonitoring, + LogstashProcessOptions, + LogstashState, + LogstashStats, + LogstashStatsByClusterUuid, +} from './logstash_monitoring'; + +export class LogstashAgentMonitoring implements LogstashMonitoring { + /* + * Call the function for fetching and summarizing Logstash metrics for agent (LS integration) monitoring + * @param {Object} callCluster - ES client + * @param {Array} clusterUuids - List cluster UUIDs to retrieve metrics + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + * @return {Object} - Logstash stats in an object keyed by the cluster UUIDs + * Note that, we try to fetch all metrics for the given time regardless of the cluster UUID + * If metrics do not have UUID, metrics will be included in the monitoring cluster UUID + */ + async collectMetrics( + callCluster: ElasticsearchClient, + clusterUuids: string[], + monitoringClusterUuid: string, + start: string, + end: string, + options: LogstashProcessOptions + ): Promise { + await this.fetchLogstashStats(callCluster, monitoringClusterUuid, start, end, options); + + const allHostIds = Object.values(options.allHostIds).flat(); + if (allHostIds.length > 0) { + await this.fetchLogstashState( + callCluster, + allHostIds, + monitoringClusterUuid, + start, + end, + options + ); + } + return options.clusters; + } + + setIndexPattern(monitoringType: string) {} + + /* + * Update a clusters object with processed Logstash stats for agent monitoring + * @param {Array} results - array of LogstashStats docs from ES + * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs + * @param {Object} allEphemeralIds - EphemeralIds in an object keyed by cluster UUIDs to track the pipelines for the cluster + * @param {Object} versions - Versions in an object keyed by cluster UUIDs to track the logstash versions for the cluster + * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins + * @param {string} monitoringClusterUuid - monitoring cluster UUID + */ + private processStatsResults( + results: estypes.SearchResponse, + { clusters, allEphemeralIds, allHostIds, versions, plugins }: LogstashProcessOptions, + monitoringClusterUuid: string + ) { + const currHits = results?.hits?.hits || []; + currHits.forEach((hit) => { + // if orphan (no uuid) cluster found, report it with monitoring cluster UUID + const clusterId = hit._source!.logstash?.elasticsearch?.cluster?.id || []; + const clusterUuid = clusterId[0] || monitoringClusterUuid; + + if (clusterUuid !== undefined && clusters[clusterUuid] === undefined) { + clusters[clusterUuid] = getLogstashBaseStats(); + versions[clusterUuid] = new Map(); + plugins[clusterUuid] = new Map(); + } + const logstashStats = hit._source?.logstash?.node?.stats; + + if (clusterUuid !== undefined && logstashStats !== undefined) { + const clusterStats = clusters[clusterUuid].cluster_stats || {}; + clusterStats.monitoringClusterUuid = monitoringClusterUuid; + clusters[clusterUuid].count = (clusters[clusterUuid].count || 0) + 1; + + const thisVersion = logstashStats.logstash?.version; + const a: Counter = versions[clusterUuid]; + incrementByKey(a, thisVersion); + clusters[clusterUuid].versions = mapToList(a, 'version'); + + const ephemeralId = logstashStats.logstash?.ephemeral_id; + if (ephemeralId !== undefined) { + allEphemeralIds[clusterUuid] = allEphemeralIds[clusterUuid] || []; + if (!allEphemeralIds[clusterUuid].includes(ephemeralId)) { + allEphemeralIds[clusterUuid].push(ephemeralId); + } + } + + const hostId = hit._source?.host?.id; + if (hostId !== undefined) { + allHostIds[clusterUuid] = allHostIds[clusterUuid] || []; + if (!allHostIds[clusterUuid].includes(hostId)) { + allHostIds[clusterUuid].push(hostId); + } + } + + const thisCollectionType = hit._source?.agent?.type || 'agent'; + if (!clusterStats.hasOwnProperty('collection_types')) { + clusterStats.collection_types = {}; + } + clusterStats.collection_types![thisCollectionType] = + (clusterStats.collection_types![thisCollectionType] || 0) + 1; + const pipelines = logstashStats?.logstash?.pipelines || []; + + if (!clusterStats.hasOwnProperty('pipelines')) { + clusterStats.pipelines = {}; + } + clusterStats.pipelines!.count = pipelines.length; + // TODO: add queue types of the pipelines with next iterations + } + }); + } + + /* + * Update a clusters object with logstash state details for agent monitoring + * @param {Array} results - array of LogstashState docs from ES + * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs + * @param {Object} allEphemeralIds - EphemeralIds in an object keyed by cluster UUIDs to track the pipelines for the cluster + * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins + * @param {string} monitoringClusterUuid - monitoring cluster UUID + */ + private processStateResults( + results: estypes.SearchResponse, + { clusters, allEphemeralIds, plugins }: LogstashProcessOptions, + monitoringClusterUuid: string + ) { + const currHits = results?.hits?.hits || []; + currHits.forEach((hit) => { + const clusterUuid = + hit._source?.logstash?.pipeline?.elasticsearch?.cluster?.id || monitoringClusterUuid; + const pipelineStats = clusters[clusterUuid]?.cluster_stats?.pipelines; + // pipeline is defined in the mapping but contains plugin info in a reality + const logstashStatePlugin = hit._source?.logstash?.pipeline; + + if (pipelineStats !== undefined && logstashStatePlugin !== undefined) { + const pluginType = logstashStatePlugin?.plugin?.type; + const pluginName = pluginType + ? logstashStatePlugin?.plugin?.[`${pluginType}`]?.name + : undefined; + if (pluginName !== undefined && pluginType !== undefined) { + incrementByKey(plugins[clusterUuid], `logstash-${pluginType}-${pluginName}`); + } + const clusterStats = clusters[clusterUuid]?.cluster_stats; + if (clusterStats !== undefined) { + clusterStats.plugins = mapToList(plugins[clusterUuid], 'name'); + } + } + }); + } + + /* + * Creates a query and executes against ES to fetch agent monitoring, Logstash stats metrics + * @param {Object} callCluster - ES client + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + */ + private async fetchLogstashStats( + callCluster: ElasticsearchClient, + monitoringClusterUuid: string, + start: string, + end: string, + { page = 0, ...options }: { page?: number } & LogstashProcessOptions + ): Promise { + const filterPath: string[] = [ + 'hits.hits._source.cluster_uuid', + 'hits.hits._source.agent.type', + 'hits.hits._source.host.id', + 'hits.hits._source.logstash.elasticsearch.cluster.id', // alias for cluster_uuid + 'hits.hits._source.logstash.node.stats.logstash', + ]; + + const params: estypes.SearchRequest = { + index: INDEX_PATTERN_LOGSTASH_METRICS_NODE, + ignore_unavailable: true, + filter_path: filterPath, + body: { + query: createQuery({ + filters: [ + { + bool: { + should: [{ term: { 'data_stream.dataset': 'logstash.node' } }], + }, + }, + { + range: { + '@timestamp': { + format: 'epoch_millis', + gte: moment.utc(start).valueOf(), + lte: moment.utc(end).valueOf(), + }, + }, + }, + ], + }) as estypes.QueryDslQueryContainer, + collapse: { + field: 'host.id', + }, + sort: [{ '@timestamp': { order: 'desc', unmapped_type: 'long' } }], + from: page * HITS_SIZE, + size: HITS_SIZE, + }, + }; + + const results = await callCluster.search(params, { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + }); + const hitsLength = results?.hits?.hits.length || 0; + + if (hitsLength > 0) { + // further augment the clusters object with more stats + this.processStatsResults(results, options, monitoringClusterUuid); + } + return Promise.resolve(); + } + + /* + * Creates a query and executes against ES to fetch agent monitoring, Logstash state metrics + * @param {Object} callCluster - ES client + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {Array} hostIds - Logstash host IDs + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + */ + private async fetchLogstashState( + callCluster: ElasticsearchClient, + hostIds: string[], + monitoringClusterUuid: string, + start: string, + end: string, + { page = 0, ...options }: { page?: number } & LogstashProcessOptions + ): Promise { + const filters = [ + { + bool: { + should: [{ term: { 'data_stream.dataset': 'logstash.plugins' } }], + }, + }, + { terms: { 'host.id': hostIds } }, + { + range: { + '@timestamp': { + format: 'epoch_millis', + gte: moment.utc(start).valueOf(), + lte: moment.utc(end).valueOf(), + }, + }, + }, + ]; + + // collapse by `plugin-{type}.id` to gather unique plugins pipeline is using + for (const pluginType of LOGSTASH_PLUGIN_TYPES) { + const params: estypes.SearchRequest = { + index: INDEX_PATTERN_LOGSTASH_METRICS_PLUGINS, + ignore_unavailable: true, + filter_path: ['hits.hits._source.logstash.pipeline'], + body: { + query: createQuery({ + filters, + }) as estypes.QueryDslQueryContainer, + collapse: { field: `logstash.pipeline.plugin.${pluginType}.id` }, + sort: [{ '@timestamp': { order: 'desc', unmapped_type: 'long' } }], + size: HITS_SIZE, + }, + }; + + const results = await callCluster.search(params, { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + }); + const hitsLength = results?.hits?.hits.length || 0; + if (hitsLength > 0) { + this.processStateResults(results, options, monitoringClusterUuid); + } + } + + return Promise.resolve(); + } +} diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.test.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.test.ts new file mode 100644 index 0000000000000..4142ee74ddf70 --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.test.ts @@ -0,0 +1,628 @@ +/* + * 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 sinon from 'sinon'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { LogstashMetricbeatMonitoring } from './logstash_metricbeat_monitoring'; +import { + INDEX_PATTERN_LOGSTASH_MONITORING, + INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATS, + INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATE, +} from '../../common/constants'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const logstashStatsResultSetOfMetricbeatMonitoring = require('./__mocks__/fixtures/logstash_stats_metricbeat_monitoring_results.json'); + +const logstashStateResultsMapOfMetricbeatMonitoring = new Map(); + +// Load data for state results. +['1n1p', '1nmp', 'mnmp'].forEach((data) => { + logstashStateResultsMapOfMetricbeatMonitoring.set( + data, + // eslint-disable-next-line @typescript-eslint/no-var-requires + require(`./__mocks__/fixtures/logstash_state_metricbeat_monitoring_results_${data}`) + ); +}); + +const getBaseOptions = () => ({ + clusters: {}, + allEphemeralIds: {}, + versions: {}, + plugins: {}, +}); + +describe('LogstashMetricbeatMonitoring', () => { + let metricbeatMonitoring: LogstashMetricbeatMonitoring; + const monitoringClusterUuid: string = 'monitoringClusterUuid'; + const searchMock = sinon.stub(); + const callCluster = { search: searchMock } as unknown as ElasticsearchClient; + const start = '2024-05-31T00:00:00.000Z'; + const end = '2024-05-31T00:20:00.000Z'; + + beforeEach(() => { + metricbeatMonitoring = new LogstashMetricbeatMonitoring(); + searchMock.returns(Promise.resolve({})); + }); + + afterEach(() => { + searchMock.reset(); + }); + + test('should set and get indexPattern correctly', () => { + metricbeatMonitoring.setIndexPattern('legacy'); + const indexPatternForLegacy = metricbeatMonitoring.getIndexPattern(); + expect(indexPatternForLegacy.stats).toBe(INDEX_PATTERN_LOGSTASH_MONITORING); + expect(indexPatternForLegacy.state).toBe(INDEX_PATTERN_LOGSTASH_MONITORING); + + metricbeatMonitoring.setIndexPattern('stack'); + const indexPatternForStack = metricbeatMonitoring.getIndexPattern(); + expect(indexPatternForStack.stats).toBe(INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATS); + expect(indexPatternForStack.state).toBe(INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATE); + }); + + describe('Logstash metricbeat monitoring query test', () => { + const clusterUuid = 'a'; + const ephemeralIds = ['a', 'b', 'c']; + + it('creates proper query for stats', async () => { + const expectedQuery = { + bool: { + filter: [ + { + range: { + timestamp: { + format: 'epoch_millis', + gte: 1717113600000, + lte: 1717114800000, + }, + }, + }, + { + bool: { + should: [ + { term: { 'metricset.name': 'node_stats' } }, + { term: { 'data_stream.dataset': 'logstash.stack_monitoring.node_stats' } }, + ], + }, + }, + ], + }, + }; + await (metricbeatMonitoring as any).fetchLogstashStats( + callCluster, + monitoringClusterUuid, + start, + end, + {} as any + ); + const { args } = searchMock.firstCall; + const [{ body }] = args; + + expect(body.from).toEqual(0); + expect(body.size).toEqual(10000); + expect(body.query).toEqual(expectedQuery); + }); + + it('creates the logstash state query correctly for state', async () => { + const expected = { + bool: { + filter: [ + { + terms: { + 'logstash.node.state.pipeline.ephemeral_id': ['a', 'b', 'c'], + }, + }, + { + bool: { + should: [ + { term: { 'metricset.name': 'node' } }, + { term: { 'data_stream.dataset': 'logstash.stack_monitoring.node' } }, + ], + }, + }, + ], + }, + }; + + await (metricbeatMonitoring as any).fetchLogstashState( + callCluster, + clusterUuid, + ephemeralIds, + start, + end, + {} as any + ); + const { args } = searchMock.firstCall; + const [{ body }] = args; + expect(body.query).toEqual(expected); + }); + }); + + describe('Process query results', () => { + it('summarizes empty results', () => { + const resultsEmpty = undefined; + const options = getBaseOptions(); + (metricbeatMonitoring as any).processStatsResults( + resultsEmpty as any, + options, + monitoringClusterUuid + ); + + expect(options.clusters).toStrictEqual({}); + }); + + it('summarizes single result with some missing fields', () => { + const source = { + metricset: { + period: 10000, + name: 'node_stats', + }, + logstash: { + cluster: { + id: 'FlV4ckTxQ0a78hmBkzzc9A', + }, + elasticsearch: { + cluster: { + id: 'FlV4ckTxQ0a78hmBkzzc9A', + }, + }, + node: { + stats: { + logstash: { + uuid: '61de393a-f2b6-4b6c-8cea-22661f9c4134', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5', + queue: { + type: 'memory', + }, + }, + ], + }, + }, + }, + }; + const results = { + hits: { + hits: [ + { + _source: source, + }, + ], + }, + }; + + const options = getBaseOptions(); + (metricbeatMonitoring as any).processStatsResults( + results as any, + options, + 'FlV4ckTxQ0a78hmBkzzc9A' + ); + + expect(options.clusters).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: { + count: 1, + cluster_stats: { + plugins: [], + collection_types: { + metricbeat: 1, + }, + monitoringClusterUuid: 'FlV4ckTxQ0a78hmBkzzc9A', + pipelines: {}, + queues: { + memory: 1, + }, + }, + versions: [], + }, + }); + }); + + it('retrieves all ephemeral ids from all hits for the same cluster', () => { + const source1 = { + metricset: { + period: 10000, + name: 'node_stats', + }, + logstash: { + cluster: { + id: 'FlV4ckTxQ0a78hmBkzzc9A', + }, + elasticsearch: { + cluster: { + id: 'FlV4ckTxQ0a78hmBkzzc9A', + }, + }, + node: { + stats: { + logstash: { + uuid: '0000000-0000-0000-0000-000000000000', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + queue: { + type: 'memory', + }, + }, + ], + }, + }, + }, + }; + + const source2 = { + metricset: { + period: 10000, + name: 'node_stats', + }, + logstash: { + cluster: { + id: 'FlV4ckTxQ0a78hmBkzzc9A', + }, + elasticsearch: { + cluster: { + id: 'FlV4ckTxQ0a78hmBkzzc9A', + }, + }, + node: { + stats: { + logstash: { + uuid: '11111111-1111-1111-1111-111111111111', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', + queue: { + type: 'memory', + }, + }, + ], + }, + }, + }, + }; + + const source3 = { + metricset: { + period: 10000, + name: 'node_stats', + }, + logstash: { + cluster: { + id: '3', + }, + elasticsearch: { + cluster: { + id: '3', + }, + }, + node: { + stats: { + logstash: { + uuid: '22222222-2222-2222-2222-222222222222', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'cccccccc-cccc-cccc-cccc-cccccccccccc', + queue: { + type: 'memory', + }, + }, + ], + }, + }, + }, + }; + + const results = { + hits: { + hits: [ + { + _source: source1, + }, + { + _source: source2, + }, + { + _source: source3, + }, + ], + }, + }; + + const options = getBaseOptions(); + (metricbeatMonitoring as any).processStatsResults( + results as any, + options, + monitoringClusterUuid + ); + + expect(options.allEphemeralIds).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: [ + 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', + ], + '3': ['cccccccc-cccc-cccc-cccc-cccccccccccc'], + }); + + expect(options.clusters).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: { + count: 2, + cluster_stats: { + plugins: [], + collection_types: { + metricbeat: 2, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: {}, + queues: { + memory: 2, + }, + }, + versions: [], + }, + '3': { + count: 1, + cluster_stats: { + plugins: [], + collection_types: { + metricbeat: 1, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: {}, + queues: { + memory: 1, + }, + }, + versions: [], + }, + }); + }); + + it('summarizes stats from hits across multiple result objects', () => { + const options = getBaseOptions(); + + // logstashStatsResultSet is an array of many small query results + logstashStatsResultSetOfMetricbeatMonitoring.forEach((results: any) => { + (metricbeatMonitoring as any).processStatsResults(results, options, monitoringClusterUuid); + }); + + logstashStateResultsMapOfMetricbeatMonitoring.forEach( + (value: string[], clusterUuid: string) => { + value.forEach((results: any) => { + (metricbeatMonitoring as any).processStateResults( + results, + options, + monitoringClusterUuid + ); + }); + } + ); + + expect(options.allEphemeralIds).toStrictEqual({ + '1n1p': ['cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5'], + '1nmp': [ + '47a70feb-3cb5-4618-8670-2c0bada61acd', + '5a65d966-0330-4bd7-82f2-ee81040c13cf', + '8d33fe25-a2c0-4c54-9ecf-d218cb8dbfe4', + 'f4167a94-20a8-43e7-828e-4cf38d906187', + ], + mnmp: [ + '2fcd4161-e08f-4eea-818b-703ea3ec6389', + 'c6785d63-6e5f-42c2-839d-5edf139b7c19', + 'bc6ef6f2-ecce-4328-96a2-002de41a144d', + '72058ad1-68a1-45f6-a8e8-10621ffc7288', + '18593052-c021-4158-860d-d8122981a0ac', + '4207025c-9b00-4bea-a36c-6fbf2d3c215e', + '0ec4702d-b5e5-4c60-91e9-6fa6a836f0d1', + '41258219-b129-4fad-a629-f244826281f8', + 'e73bc63d-561a-4acd-a0c4-d5f70c4603df', + 'ddf882b7-be26-4a93-8144-0aeb35122651', + '602936f5-98a3-4f8c-9471-cf389a519f4b', + '8b300988-62cc-4bc6-9ee0-9194f3f78e27', + '6ab60531-fb6f-478c-9063-82f2b0af2bed', + '802a5994-a03c-44b8-a650-47c0f71c2e48', + '6070b400-5c10-4c5e-b5c5-a5bd9be6d321', + '3193df5f-2a34-4fe3-816e-6b05999aa5ce', + '994e68cd-d607-40e6-a54c-02a51caa17e0', + ], + }); + + expect(options.clusters).toStrictEqual({ + '1n1p': { + count: 1, + versions: [ + { + count: 1, + version: '7.10.0', + }, + ], + cluster_stats: { + collection_types: { metricbeat: 1 }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + batch_size_avg: 125, + batch_size_max: 125, + batch_size_min: 125, + batch_size_total: 125, + count: 1, + sources: { + file: true, + }, + workers_avg: 1, + workers_max: 1, + workers_min: 1, + workers_total: 1, + }, + plugins: [ + { + count: 1, + name: 'logstash-input-stdin', + }, + { + count: 1, + name: 'logstash-input-elasticsearch', + }, + { + count: 3, + name: 'logstash-filter-mutate', + }, + { + count: 3, + name: 'logstash-filter-ruby', + }, + { + count: 1, + name: 'logstash-filter-split', + }, + { + count: 1, + name: 'logstash-filter-elasticsearch', + }, + { + count: 1, + name: 'logstash-filter-aggregate', + }, + { + count: 1, + name: 'logstash-filter-drop', + }, + { + count: 1, + name: 'logstash-output-elasticsearch', + }, + { + count: 1, + name: 'logstash-output-stdout', + }, + ], + queues: { + memory: 1, + }, + }, + }, + '1nmp': { + count: 1, + versions: [ + { + count: 1, + version: '7.8.0', + }, + ], + cluster_stats: { + collection_types: { metricbeat: 1 }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + batch_size_avg: 406.5, + batch_size_max: 1251, + batch_size_min: 125, + batch_size_total: 1626, + count: 4, + sources: { + xpack: true, + }, + workers_avg: 17.25, + workers_max: 44, + workers_min: 1, + workers_total: 69, + }, + plugins: [ + { + count: 4, + name: 'logstash-input-stdin', + }, + { + count: 4, + name: 'logstash-output-stdout', + }, + ], + queues: { + memory: 3, + persisted: 1, + }, + }, + }, + mnmp: { + count: 3, + versions: [ + { + count: 1, + version: '7.9.2', + }, + { + count: 1, + version: '7.9.1', + }, + { + count: 1, + version: '7.10.0', + }, + ], + cluster_stats: { + collection_types: { metricbeat: 3 }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + batch_size_avg: 33.294117647058826, + batch_size_max: 125, + batch_size_min: 1, + batch_size_total: 566, + count: 17, + sources: { + file: true, + string: true, + }, + workers_avg: 7.411764705882353, + workers_max: 16, + workers_min: 1, + workers_total: 126, + }, + plugins: [ + { + count: 1, + name: 'logstash-input-stdin', + }, + { + count: 1, + name: 'logstash-filter-clone', + }, + { + count: 3, + name: 'logstash-output-pipeline', + }, + { + count: 2, + name: 'logstash-input-pipeline', + }, + { + count: 16, + name: 'logstash-filter-sleep', + }, + { + count: 14, + name: 'logstash-output-stdout', + }, + { + count: 14, + name: 'logstash-input-generator', + }, + ], + queues: { + memory: 3, + persisted: 14, + }, + }, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.ts new file mode 100644 index 0000000000000..387daa51a67c8 --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_metricbeat_monitoring.ts @@ -0,0 +1,375 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { createQuery } from './create_query'; +import { mapToList } from './get_high_level_stats'; +import { incrementByKey } from './get_high_level_stats'; +import { + TELEMETRY_QUERY_SOURCE, + INDEX_PATTERN_LOGSTASH_MONITORING, + INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATE, + INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATS, +} from '../../common/constants'; +import { + HITS_SIZE, + getLogstashBaseStats, + Counter, + LogstashMonitoring, + LogstashProcessOptions, + LogstashState, + LogstashStats, + LogstashStatsByClusterUuid, +} from './logstash_monitoring'; + +export class LogstashMetricbeatMonitoring implements LogstashMonitoring { + private indexPattern: { [key: string]: string } = { + state: INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATE, + stats: INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATS, + }; + + /* + * Call the function for fetching and summarizing Logstash metrics for Metricbeat monitoring + * @param {Object} callCluster - ES client + * @param {Array} clusterUuids - List cluster UUIDs to retrieve metrics + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + * @return {Object} - Logstash stats in an object keyed by the cluster UUIDs + * Note that, we try to fetch all metrics for the given time regardless of the cluster UUID + * If metrics do not have UUID, metrics will be included in the monitoring cluster UUID + */ + async collectMetrics( + callCluster: ElasticsearchClient, + clusterUuids: string[], + monitoringClusterUuid: string, + start: string, + end: string, + options: LogstashProcessOptions + ): Promise { + await this.fetchLogstashStats(callCluster, monitoringClusterUuid, start, end, options); + + const allEphemeralIds = Object.values(options.allEphemeralIds).flat(); + if (allEphemeralIds.length > 0) { + await this.fetchLogstashState(callCluster, monitoringClusterUuid, allEphemeralIds, options); + } + return options.clusters; + } + + /* + * Sets the index patterns based on the metricbeat monitoring types: [legacy, stack] + * @param monitoringType - the monitoring type where metricbeat monitoring is intended. + */ + setIndexPattern(monitoringType: string) { + if (monitoringType === 'stack') { + this.indexPattern.state = INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATE; + this.indexPattern.stats = INDEX_PATTERN_LOGSTASH_STACK_MONITORING_STATS; + } else { + this.indexPattern.state = INDEX_PATTERN_LOGSTASH_MONITORING; + this.indexPattern.stats = INDEX_PATTERN_LOGSTASH_MONITORING; + } + } + + getIndexPattern(): { [key: string]: string } { + return this.indexPattern; + } + /* + * Update a clusters object with processed Logstash stats for metricbeat monitoring + * @param {Array} results - array of LogstashStats docs from ES + * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs + * @param {Object} allEphemeralIds - EphemeralIds in an object keyed by cluster UUIDs to track the pipelines for the cluster + * @param {Object} versions - Versions in an object keyed by cluster UUIDs to track the logstash versions for the cluster + * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins + * @param {string} monitoringClusterUuid - monitoring cluster UUID + */ + private processStatsResults( + results: estypes.SearchResponse, + { clusters, allEphemeralIds, versions, plugins }: LogstashProcessOptions, + monitoringClusterUuid: string + ) { + const currHits = results?.hits?.hits || []; + currHits.forEach((hit) => { + // consider orphan case as well + // orphan case: where pipeline doesn't set cluster UUID or es-output plugin isn't in pipeline. + const clusterUuid = + hit._source!.logstash?.elasticsearch?.cluster?.id || monitoringClusterUuid; + + if (clusterUuid !== undefined && clusters[clusterUuid] === undefined) { + clusters[clusterUuid] = getLogstashBaseStats(); + versions[clusterUuid] = new Map(); + plugins[clusterUuid] = new Map(); + } + const logstashStats = hit._source?.logstash?.node?.stats; + + if (clusterUuid !== undefined && logstashStats !== undefined) { + const clusterStats = clusters[clusterUuid].cluster_stats || {}; + clusterStats.monitoringClusterUuid = monitoringClusterUuid; + clusters[clusterUuid].count = (clusters[clusterUuid].count || 0) + 1; + + const thisVersion = logstashStats.logstash?.version; + const a: Counter = versions[clusterUuid]; + incrementByKey(a, thisVersion); + clusters[clusterUuid].versions = mapToList(a, 'version'); + + const thisCollectionType = hit._source?.agent?.type || 'metricbeat'; + if (!clusterStats.hasOwnProperty('collection_types')) { + clusterStats.collection_types = {}; + } + clusterStats.collection_types![thisCollectionType] = + (clusterStats.collection_types![thisCollectionType] || 0) + 1; + const pipelines = logstashStats.pipelines || []; + + pipelines.forEach((pipeline) => { + const thisQueueType = pipeline.queue?.type; + if (thisQueueType !== undefined) { + if (!clusterStats.hasOwnProperty('queues')) { + clusterStats.queues = {}; + } + clusterStats.queues![thisQueueType] = (clusterStats.queues![thisQueueType] || 0) + 1; + } + + const ephemeralId = pipeline.ephemeral_id; + if (ephemeralId !== undefined) { + allEphemeralIds[clusterUuid] = allEphemeralIds[clusterUuid] || []; + allEphemeralIds[clusterUuid].push(ephemeralId); + } + }); + } + }); + } + + /* + * Update a clusters object with logstash state details + * @param {Array} results - array of LogstashState docs from ES + * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs + * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins + * @param {string} monitoringClusterUuid - monitoring cluster UUID + */ + private processStateResults( + results: estypes.SearchResponse, + { clusters, plugins }: LogstashProcessOptions, + monitoringClusterUuid: string + ) { + const currHits = results?.hits?.hits || []; + currHits.forEach((hit) => { + const clusterUuid = + hit._source?.logstash?.elasticsearch?.cluster?.id || monitoringClusterUuid; + const pipelineStats = clusters[clusterUuid]?.cluster_stats?.pipelines; + const thisLogstashStatePipeline = hit._source?.logstash?.node?.state?.pipeline; + + if (pipelineStats !== undefined && thisLogstashStatePipeline !== undefined) { + pipelineStats.count = (pipelineStats.count || 0) + 1; + + const thisPipelineBatchSize = thisLogstashStatePipeline.batch_size; + + if (thisPipelineBatchSize !== undefined) { + pipelineStats.batch_size_total = + (pipelineStats.batch_size_total || 0) + thisPipelineBatchSize; + pipelineStats.batch_size_max = pipelineStats.batch_size_max || 0; + pipelineStats.batch_size_min = pipelineStats.batch_size_min || 0; + pipelineStats.batch_size_avg = pipelineStats.batch_size_total / pipelineStats.count; + + if (thisPipelineBatchSize > pipelineStats.batch_size_max) { + pipelineStats.batch_size_max = thisPipelineBatchSize; + } + if ( + pipelineStats.batch_size_min === 0 || + thisPipelineBatchSize < pipelineStats.batch_size_min + ) { + pipelineStats.batch_size_min = thisPipelineBatchSize; + } + } + + const thisPipelineWorkers = thisLogstashStatePipeline.workers; + if (thisPipelineWorkers !== undefined) { + pipelineStats.workers_total = (pipelineStats.workers_total || 0) + thisPipelineWorkers; + pipelineStats.workers_max = pipelineStats.workers_max || 0; + pipelineStats.workers_min = pipelineStats.workers_min || 0; + pipelineStats.workers_avg = pipelineStats.workers_total / pipelineStats.count; + + if (thisPipelineWorkers > pipelineStats.workers_max) { + pipelineStats.workers_max = thisPipelineWorkers; + } + if (pipelineStats.workers_min === 0 || thisPipelineWorkers < pipelineStats.workers_min) { + pipelineStats.workers_min = thisPipelineWorkers; + } + } + + // Extract the vertices object from the pipeline representation. From this, we can + // retrieve the source of the pipeline element on the configuration(from file, string, or + // x-pack-config-management), and the input, filter and output plugins from that pipeline. + const vertices = thisLogstashStatePipeline.representation?.graph?.vertices; + + if (vertices !== undefined) { + vertices.forEach((vertex) => { + const configName = vertex.config_name; + const pluginType = vertex.plugin_type; + let pipelineConfig = vertex.meta?.source?.protocol; + + if (pipelineConfig !== undefined) { + if (pipelineConfig === 'string' || pipelineConfig === 'str') { + pipelineConfig = 'string'; + } else if (pipelineConfig === 'x-pack-config-management') { + pipelineConfig = 'xpack'; + } else { + pipelineConfig = 'file'; + } + if (!pipelineStats.hasOwnProperty('sources')) { + pipelineStats.sources = {}; + } + pipelineStats.sources![pipelineConfig] = true; + } + if (configName !== undefined && pluginType !== undefined) { + incrementByKey(plugins[clusterUuid], `logstash-${pluginType}-${configName}`); + } + }); + } + + const clusterStats = clusters[clusterUuid]?.cluster_stats; + if (clusterStats !== undefined) { + clusterStats.plugins = mapToList(plugins[clusterUuid], 'name'); + } + } + }); + } + + /* + * Creates a query and executes against ES to fetch metricbeat monitoring, Logstash stats metrics + * @param {Object} callCluster - ES client + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + */ + private async fetchLogstashStats( + callCluster: ElasticsearchClient, + monitoringClusterUuid: string, + start: string, + end: string, + { page = 0, ...options }: { page?: number } & LogstashProcessOptions + ): Promise { + const filterPath: string[] = [ + 'hits.hits._source.cluster_uuid', + 'hits.hits._source.type', + 'hits.hits._source.source_node', + 'hits.hits._source.agent.type', + 'hits.hits._source.logstash.elasticsearch.cluster.id', // alias for cluster_uuid + 'hits.hits._source.logstash.node.stats.pipelines.id', + 'hits.hits._source.logstash.node.stats.pipelines.ephemeral_id', + 'hits.hits._source.logstash.node.stats.pipelines.queue.type', + 'hits.hits._source.logstash.node.stats.logstash.version', + 'hits.hits._source.logstash.node.stats.logstash.uuid', + ]; + + const params: estypes.SearchRequest = { + index: this.indexPattern.stats, + ignore_unavailable: true, + filter_path: filterPath, + body: { + query: createQuery({ + start, + end, + filters: [ + { + bool: { + should: [ + { term: { 'metricset.name': 'node_stats' } }, + { term: { 'data_stream.dataset': 'logstash.stack_monitoring.node_stats' } }, + ], + }, + }, + ], + }) as estypes.QueryDslQueryContainer, + collapse: { + field: 'logstash.node.stats.logstash.uuid', + }, + sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], + from: page * HITS_SIZE, + size: HITS_SIZE, + }, + }; + + const results = await callCluster.search(params, { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + }); + const hitsLength = results?.hits?.hits.length || 0; + + if (hitsLength > 0) { + // further augment the clusters object with more stats + this.processStatsResults(results, options, monitoringClusterUuid); + } + return Promise.resolve(); + } + + /* + * Creates a query and executes against ES to fetch metricbeat monitoring, Logstash state metrics + * @param {Object} callCluster - ES client + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {Array} ephemeralIds - Logstash pipeline ephemeral IDs + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + */ + private async fetchLogstashState( + callCluster: ElasticsearchClient, + monitoringClusterUuid: string, + ephemeralIds: string[], + { page = 0, ...options }: { page?: number } & LogstashProcessOptions + ): Promise { + const filterPath: string[] = [ + 'hits.hits._source.logstash.node.state.pipeline.batch_size', + 'hits.hits._source.logstash.node.state.pipeline.workers', + 'hits.hits._source.logstash.node.state.pipeline.representation.graph.vertices', + 'hits.hits._source.type', + ]; + + const params: estypes.SearchRequest = { + index: this.indexPattern.state, + ignore_unavailable: true, + filter_path: filterPath, + body: { + query: createQuery({ + // metricbeat occasionally sends state metrics + // so, not using start and end periods as we need node state info to fill plugin usages + filters: [ + { terms: { 'logstash.node.state.pipeline.ephemeral_id': ephemeralIds } }, + { + bool: { + should: [ + { term: { 'metricset.name': 'node' } }, + { term: { 'data_stream.dataset': 'logstash.stack_monitoring.node' } }, + ], + }, + }, + ], + }) as estypes.QueryDslQueryContainer, + collapse: { + field: 'logstash.node.state.pipeline.ephemeral_id', + }, + sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], + size: ephemeralIds.length, + }, + }; + + const results = await callCluster.search(params, { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + }); + + const hitsLength = results?.hits?.hits.length || 0; + if (hitsLength > 0) { + // further augment the clusters object with more stats + this.processStateResults(results, options, monitoringClusterUuid); + } + return Promise.resolve(); + } +} diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_monitoring.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_monitoring.ts new file mode 100644 index 0000000000000..42022816c1974 --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_monitoring.ts @@ -0,0 +1,202 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; + +export type Counter = Map; +export const HITS_SIZE = 10000; // maximum hits to receive from ES with each search +export const LOGSTASH_PLUGIN_TYPES = ['input', 'codec', 'filter', 'output']; + +export interface LogstashMonitoring { + collectMetrics( + callCluster: ElasticsearchClient, + clusterUuids: string[], + monitoringClusterUuid: string, + start: string, + end: string, + options: LogstashProcessOptions + ): Promise; + + setIndexPattern(pattern: string): void; +} + +export interface LogstashBaseStats { + // stats + versions: Array<{ version: string; count: number }>; + count: number; + + cluster_stats?: { + collection_types?: { [collection_type_type: string]: number }; + queues?: { [queue_type: string]: number }; + plugins?: Array<{ name: string; count: number }>; + monitoringClusterUuid?: string; + pipelines?: { + count?: number; + batch_size_max?: number; + batch_size_avg?: number; + batch_size_min?: number; + batch_size_total?: number; + workers_max?: number; + workers_avg?: number; + workers_min?: number; + workers_total?: number; + sources?: { [source_type: string]: boolean }; + }; + }; +} + +export const getLogstashBaseStats = () => ({ + versions: [], + count: 0, + cluster_stats: { + pipelines: {}, + plugins: [], + }, +}); + +export interface LogstashStats { + cluster_uuid: string; + source_node: string; + type: string; + agent?: { + type: string; + }; + host?: { + id?: string; + }; + // legacy monitoring shape + logstash_stats?: { + pipelines?: [ + { + id?: string; + ephemeral_id: string; + queue?: { + type: string; + }; + } + ]; + logstash?: { + version?: string; + uuid?: string; + snapshot?: string; + }; + }; + // metricbeat and agent driven monitoring shape + logstash?: { + node?: { + stats?: { + pipelines?: [ + { + id?: string; + ephemeral_id: string; + queue?: { + type: string; + }; + } + ]; + logstash?: { + version?: string; + uuid?: string; + snapshot?: string; + ephemeral_id: string; + pipelines?: []; + }; + }; + }; + elasticsearch?: { + cluster?: { + id?: string; + }; + }; + }; +} + +export interface LogstashState { + // legacy monitoring shape + cluster_uuid: string; + logstash_state?: { + pipeline?: { + batch_size?: number; + workers?: number; + representation?: { + graph?: { + vertices?: [ + { + config_name?: string; + plugin_type?: string; + meta?: { + source?: { + protocol?: string; + }; + }; + } + ]; + }; + }; + }; + }; + logstash?: { + // metricbeat monitoring shape + node?: { + state?: { + pipeline?: { + batch_size?: number; + workers?: number; + representation?: { + graph?: { + vertices?: [ + { + config_name?: string; + plugin_type?: string; + meta?: { + source?: { + protocol?: string; + }; + }; + } + ]; + }; + }; + }; + }; + }; + elasticsearch?: { + cluster?: { + id?: string; + }; + }; + // agent monitoring shape + pipeline?: { + elasticsearch?: { + cluster?: { + id?: string; + }; + }; + id: string; + plugin?: { + // + [key: string]: PluginName; + }; + }; + }; +} + +export interface LogstashProcessOptions { + clusters: { [clusterUuid: string]: LogstashBaseStats }; + allEphemeralIds: { [clusterUuid: string]: string[] }; // pipeline ephemeral IDs + allHostIds: { [clusterUuid: string]: string[] }; + versions: { [clusterUuid: string]: Counter }; + plugins: { [clusterUuid: string]: Counter }; +} + +export interface PluginName { + name: string; +} + +export interface LogstashStatsByClusterUuid { + [clusterUuid: string]: LogstashBaseStats; +} diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.test.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.test.ts new file mode 100644 index 0000000000000..0617b3cfda09e --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.test.ts @@ -0,0 +1,551 @@ +/* + * 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 sinon from 'sinon'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { LogstashSelfMonitoring } from './logstash_self_monitoring'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const logstashStatsResultSetOfSelfMonitoring = require('./__mocks__/fixtures/logstash_stats_self_monitoring_results.json'); + +const logstashStateResultsMapOfSelfMonitoring = new Map(); + +// Load data for state results. +['1n1p', '1nmp', 'mnmp'].forEach((data) => { + logstashStateResultsMapOfSelfMonitoring.set( + data, + // eslint-disable-next-line @typescript-eslint/no-var-requires + require(`./__mocks__/fixtures/logstash_state_self_monitoring_results_${data}`) + ); +}); + +const getBaseOptions = () => ({ + clusters: {}, + allEphemeralIds: {}, + versions: {}, + plugins: {}, +}); + +describe('LogstashSelfMonitoring', () => { + let selfMonitoring: LogstashSelfMonitoring; + const clusterUuids = ['aCluster', 'bCluster', 'cCluster']; + const monitoringClusterUuid: string = 'monitoringClusterUuid'; + const searchMock = sinon.stub(); + const callCluster = { search: searchMock } as unknown as ElasticsearchClient; + const start = '2024-05-31T00:00:00.000Z'; + const end = '2024-05-31T00:20:00.000Z'; + + beforeEach(() => { + selfMonitoring = new LogstashSelfMonitoring(); + searchMock.returns(Promise.resolve({})); + }); + + afterEach(() => { + searchMock.reset(); + }); + + describe('Logstash self monitoring query test', () => { + const clusterUuid = 'a'; + const ephemeralIds = ['a', 'b', 'c']; + + it('creates proper query for stats', async () => { + const expectedQuery = { + bool: { + filter: [ + { + range: { + timestamp: { + format: 'epoch_millis', + gte: 1717113600000, + lte: 1717114800000, + }, + }, + }, + { + term: { + cluster_uuid: clusterUuids[0], + }, + }, + { + bool: { + should: [{ term: { type: 'logstash_stats' } }], + }, + }, + ], + }, + }; + + await (selfMonitoring as any).fetchLogstashStats( + callCluster, + clusterUuids[0], + monitoringClusterUuid, + start, + end, + {} as any + ); + const { args } = searchMock.firstCall; + const [{ body }] = args; + + expect(body.from).toEqual(0); + expect(body.size).toEqual(10000); + expect(body.query).toEqual(expectedQuery); + }); + + it('creates the logstash state query correctly for state', async () => { + const expected = { + bool: { + filter: [ + { + range: { + timestamp: { + format: 'epoch_millis', + gte: 1717113600000, + lte: 1717114800000, + }, + }, + }, + { + terms: { + 'logstash_state.pipeline.ephemeral_id': ['a', 'b', 'c'], + }, + }, + { + bool: { + should: [{ term: { type: 'logstash_state' } }], + }, + }, + ], + }, + }; + + await (selfMonitoring as any).fetchLogstashState( + callCluster, + clusterUuid, + ephemeralIds, + start, + end, + {} as any + ); + const { args } = searchMock.firstCall; + const [{ body }] = args; + expect(body.query).toEqual(expected); + }); + }); + + describe('Process query results', () => { + it('summarizes empty results', () => { + const resultsEmpty = undefined; + const options = getBaseOptions(); + (selfMonitoring as any).processStatsResults( + resultsEmpty as any, + options, + monitoringClusterUuid + ); + + expect(options.clusters).toStrictEqual({}); + }); + + it('summarizes single result with some missing fields', () => { + const source = { + type: 'logstash_stats', + cluster_uuid: 'FlV4ckTxQ0a78hmBkzzc9A', + logstash_stats: { + logstash: { + uuid: '61de393a-f2b6-4b6c-8cea-22661f9c4134', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5', + queue: { + type: 'memory', + }, + }, + ], + }, + }; + const results = { + hits: { + hits: [ + { + _source: source, + }, + ], + }, + }; + + const options = getBaseOptions(); + (selfMonitoring as any).processStatsResults(results as any, options, monitoringClusterUuid); + + expect(options.clusters).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: { + count: 1, + cluster_stats: { + plugins: [], + collection_types: { + internal_collection: 1, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: {}, + queues: { + memory: 1, + }, + }, + versions: [], + }, + }); + }); + + it('retrieves all ephemeral ids from all hits for the same cluster', () => { + const source1 = { + type: 'logstash_stats', + cluster_uuid: 'FlV4ckTxQ0a78hmBkzzc9A', + logstash_stats: { + logstash: { + uuid: '0000000-0000-0000-0000-000000000000', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + queue: { + type: 'memory', + }, + }, + ], + }, + }; + + const source2 = { + type: 'logstash_stats', + cluster_uuid: 'FlV4ckTxQ0a78hmBkzzc9A', + logstash_stats: { + logstash: { + uuid: '11111111-1111-1111-1111-111111111111', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', + queue: { + type: 'memory', + }, + }, + ], + }, + }; + + const source3 = { + type: 'logstash_stats', + cluster_uuid: '3', + logstash_stats: { + logstash: { + uuid: '22222222-2222-2222-2222-222222222222', + }, + pipelines: [ + { + id: 'main', + ephemeral_id: 'cccccccc-cccc-cccc-cccc-cccccccccccc', + queue: { + type: 'memory', + }, + }, + ], + }, + }; + + const results = { + hits: { + hits: [ + { + _source: source1, + }, + { + _source: source2, + }, + { + _source: source3, + }, + ], + }, + }; + + const options = getBaseOptions(); + (selfMonitoring as any).processStatsResults(results as any, options, monitoringClusterUuid); + + expect(options.allEphemeralIds).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: [ + 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', + ], + '3': ['cccccccc-cccc-cccc-cccc-cccccccccccc'], + }); + + expect(options.clusters).toStrictEqual({ + FlV4ckTxQ0a78hmBkzzc9A: { + count: 2, + cluster_stats: { + plugins: [], + collection_types: { + internal_collection: 2, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: {}, + queues: { + memory: 2, + }, + }, + versions: [], + }, + '3': { + count: 1, + cluster_stats: { + plugins: [], + collection_types: { + internal_collection: 1, + }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: {}, + queues: { + memory: 1, + }, + }, + versions: [], + }, + }); + }); + + it('summarizes stats from hits across multiple result objects', () => { + const options = getBaseOptions(); + + // logstashStatsResultSet is an array of many small query results + logstashStatsResultSetOfSelfMonitoring.forEach((results: any) => { + (selfMonitoring as any).processStatsResults(results, options, monitoringClusterUuid); + }); + + logstashStateResultsMapOfSelfMonitoring.forEach((value: string[], clusterUuid: string) => { + value.forEach((results: any) => { + (selfMonitoring as any).processStateResults(results, clusterUuid, options); + }); + }); + + expect(options.allEphemeralIds).toStrictEqual({ + '1n1p': ['cf37c6fa-2f1a-41e2-9a89-36b420a8b9a5'], + '1nmp': [ + '47a70feb-3cb5-4618-8670-2c0bada61acd', + '5a65d966-0330-4bd7-82f2-ee81040c13cf', + '8d33fe25-a2c0-4c54-9ecf-d218cb8dbfe4', + 'f4167a94-20a8-43e7-828e-4cf38d906187', + ], + mnmp: [ + '2fcd4161-e08f-4eea-818b-703ea3ec6389', + 'c6785d63-6e5f-42c2-839d-5edf139b7c19', + 'bc6ef6f2-ecce-4328-96a2-002de41a144d', + '72058ad1-68a1-45f6-a8e8-10621ffc7288', + '18593052-c021-4158-860d-d8122981a0ac', + '4207025c-9b00-4bea-a36c-6fbf2d3c215e', + '0ec4702d-b5e5-4c60-91e9-6fa6a836f0d1', + '41258219-b129-4fad-a629-f244826281f8', + 'e73bc63d-561a-4acd-a0c4-d5f70c4603df', + 'ddf882b7-be26-4a93-8144-0aeb35122651', + '602936f5-98a3-4f8c-9471-cf389a519f4b', + '8b300988-62cc-4bc6-9ee0-9194f3f78e27', + '6ab60531-fb6f-478c-9063-82f2b0af2bed', + '802a5994-a03c-44b8-a650-47c0f71c2e48', + '6070b400-5c10-4c5e-b5c5-a5bd9be6d321', + '3193df5f-2a34-4fe3-816e-6b05999aa5ce', + '994e68cd-d607-40e6-a54c-02a51caa17e0', + ], + }); + + expect(options.clusters).toStrictEqual({ + '1n1p': { + count: 1, + versions: [ + { + count: 1, + version: '7.10.0', + }, + ], + cluster_stats: { + collection_types: { internal_collection: 1 }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + batch_size_avg: 125, + batch_size_max: 125, + batch_size_min: 125, + batch_size_total: 125, + count: 1, + sources: { + file: true, + }, + workers_avg: 1, + workers_max: 1, + workers_min: 1, + workers_total: 1, + }, + plugins: [ + { + count: 1, + name: 'logstash-input-stdin', + }, + { + count: 1, + name: 'logstash-input-elasticsearch', + }, + { + count: 3, + name: 'logstash-filter-mutate', + }, + { + count: 3, + name: 'logstash-filter-ruby', + }, + { + count: 1, + name: 'logstash-filter-split', + }, + { + count: 1, + name: 'logstash-filter-elasticsearch', + }, + { + count: 1, + name: 'logstash-filter-aggregate', + }, + { + count: 1, + name: 'logstash-filter-drop', + }, + { + count: 1, + name: 'logstash-output-elasticsearch', + }, + { + count: 1, + name: 'logstash-output-stdout', + }, + ], + queues: { + memory: 1, + }, + }, + }, + '1nmp': { + count: 1, + versions: [ + { + count: 1, + version: '7.8.0', + }, + ], + cluster_stats: { + collection_types: { internal_collection: 1 }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + batch_size_avg: 406.5, + batch_size_max: 1251, + batch_size_min: 125, + batch_size_total: 1626, + count: 4, + sources: { + xpack: true, + }, + workers_avg: 17.25, + workers_max: 44, + workers_min: 1, + workers_total: 69, + }, + plugins: [ + { + count: 4, + name: 'logstash-input-stdin', + }, + { + count: 4, + name: 'logstash-output-stdout', + }, + ], + queues: { + memory: 3, + persisted: 1, + }, + }, + }, + mnmp: { + count: 3, + versions: [ + { + count: 1, + version: '7.9.2', + }, + { + count: 1, + version: '7.9.1', + }, + { + count: 1, + version: '7.10.0', + }, + ], + cluster_stats: { + collection_types: { internal_collection: 3 }, + monitoringClusterUuid: 'monitoringClusterUuid', + pipelines: { + batch_size_avg: 33.294117647058826, + batch_size_max: 125, + batch_size_min: 1, + batch_size_total: 566, + count: 17, + sources: { + file: true, + string: true, + }, + workers_avg: 7.411764705882353, + workers_max: 16, + workers_min: 1, + workers_total: 126, + }, + plugins: [ + { + count: 1, + name: 'logstash-input-stdin', + }, + { + count: 1, + name: 'logstash-filter-clone', + }, + { + count: 3, + name: 'logstash-output-pipeline', + }, + { + count: 2, + name: 'logstash-input-pipeline', + }, + { + count: 16, + name: 'logstash-filter-sleep', + }, + { + count: 14, + name: 'logstash-output-stdout', + }, + { + count: 14, + name: 'logstash-input-generator', + }, + ], + queues: { + memory: 3, + persisted: 14, + }, + }, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.ts b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.ts new file mode 100644 index 0000000000000..bc31c576d154c --- /dev/null +++ b/x-pack/plugins/monitoring/server/telemetry_collection/logstash_self_monitoring.ts @@ -0,0 +1,358 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { createQuery } from './create_query'; +import { mapToList } from './get_high_level_stats'; +import { incrementByKey } from './get_high_level_stats'; +import { INDEX_PATTERN_LOGSTASH_MONITORING, TELEMETRY_QUERY_SOURCE } from '../../common/constants'; +import { + HITS_SIZE, + getLogstashBaseStats, + Counter, + LogstashMonitoring, + LogstashProcessOptions, + LogstashState, + LogstashStats, + LogstashStatsByClusterUuid, +} from './logstash_monitoring'; + +export class LogstashSelfMonitoring implements LogstashMonitoring { + /* + * Call the function for fetching and summarizing Logstash metrics for self/legacy monitoring + * @param {Object} callCluster - ES client + * @param {Array} clusterUuids - List cluster UUIDs to retrieve metrics + * @param {string} monitoringClusterUuid - monitoring cluster UUID + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + * @return {Object} - Logstash stats in an object keyed by the cluster UUIDs + * Note that, we _only_ fetch metrics for the given time and cluster UUIDs + */ + async collectMetrics( + callCluster: ElasticsearchClient, + clusterUuids: string[], + monitoringClusterUuid: string, + start: string, + end: string, + options: LogstashProcessOptions + ): Promise { + for (const clusterUuid of clusterUuids) { + await this.fetchLogstashStats( + callCluster, + clusterUuid, + monitoringClusterUuid, + start, + end, + options + ); + + if (options.clusters[clusterUuid] !== undefined) { + await this.fetchLogstashState( + callCluster, + clusterUuid, + options.allEphemeralIds[clusterUuid], + start, + end, + options + ); + } + } + return options.clusters; + } + + setIndexPattern(monitoringType: string) {} + /* + * Update a clusters object with processed Logstash stats for self monitoring + * @param {Array} results - array of LogstashStats docs from ES + * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs + * @param {Object} allEphemeralIds - EphemeralIds in an object keyed by cluster UUIDs to track the pipelines for the cluster + * @param {Object} versions - Versions in an object keyed by cluster UUIDs to track the logstash versions for the cluster + * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins + * @param {string} monitoringClusterUuid - monitoring cluster UUID + */ + private processStatsResults( + results: estypes.SearchResponse, + { clusters, allEphemeralIds, versions, plugins }: LogstashProcessOptions, + monitoringClusterUuid: string + ) { + const currHits = results?.hits?.hits || []; + currHits.forEach((hit) => { + const clusterUuid = hit._source!.cluster_uuid; + + if (clusterUuid !== undefined && clusters[clusterUuid] === undefined) { + clusters[clusterUuid] = getLogstashBaseStats(); + versions[clusterUuid] = new Map(); + plugins[clusterUuid] = new Map(); + } + const logstashStats = hit._source?.logstash_stats; + + if (clusterUuid !== undefined && logstashStats !== undefined) { + const clusterStats = clusters[clusterUuid].cluster_stats || {}; + clusterStats.monitoringClusterUuid = monitoringClusterUuid; + clusters[clusterUuid].count = (clusters[clusterUuid].count || 0) + 1; + + const thisVersion = logstashStats.logstash?.version; + const a: Counter = versions[clusterUuid]; + incrementByKey(a, thisVersion); + clusters[clusterUuid].versions = mapToList(a, 'version'); + + // Internal Collection has no agent field, so default to 'internal_collection' + const thisCollectionType = hit._source?.agent?.type || 'internal_collection'; + if (!clusterStats.hasOwnProperty('collection_types')) { + clusterStats.collection_types = {}; + } + clusterStats.collection_types![thisCollectionType] = + (clusterStats.collection_types![thisCollectionType] || 0) + 1; + const pipelines = logstashStats.pipelines || []; + + pipelines.forEach((pipeline) => { + const thisQueueType = pipeline.queue?.type; + if (thisQueueType !== undefined) { + if (!clusterStats.hasOwnProperty('queues')) { + clusterStats.queues = {}; + } + clusterStats.queues![thisQueueType] = (clusterStats.queues![thisQueueType] || 0) + 1; + } + + const ephemeralId = pipeline.ephemeral_id; + if (ephemeralId !== undefined) { + allEphemeralIds[clusterUuid] = allEphemeralIds[clusterUuid] || []; + allEphemeralIds[clusterUuid].push(ephemeralId); + } + }); + } + }); + } + + /* + * Update a clusters object with logstash state details for self monitoring + * @param {Array} results - array of LogstashState docs from ES + * @param {string} clusterUuid - A cluster UUID + * @param {Object} clusters - LogstashBaseStats in an object keyed by the cluster UUIDs + * @param {Object} plugins - plugin information keyed by cluster UUIDs to count the unique plugins + */ + private processStateResults( + results: estypes.SearchResponse, + clusterUuid: string, + { clusters, plugins }: LogstashProcessOptions + ) { + const currHits = results?.hits?.hits || []; + const clusterStats = clusters[clusterUuid].cluster_stats; + const pipelineStats = clusters[clusterUuid].cluster_stats?.pipelines; + + currHits.forEach((hit) => { + const thisLogstashStatePipeline = hit._source?.logstash_state?.pipeline; + + if (pipelineStats !== undefined && thisLogstashStatePipeline !== undefined) { + pipelineStats.count = (pipelineStats.count || 0) + 1; + + const thisPipelineBatchSize = thisLogstashStatePipeline.batch_size; + + if (thisPipelineBatchSize !== undefined) { + pipelineStats.batch_size_total = + (pipelineStats.batch_size_total || 0) + thisPipelineBatchSize; + pipelineStats.batch_size_max = pipelineStats.batch_size_max || 0; + pipelineStats.batch_size_min = pipelineStats.batch_size_min || 0; + pipelineStats.batch_size_avg = pipelineStats.batch_size_total / pipelineStats.count; + + if (thisPipelineBatchSize > pipelineStats.batch_size_max) { + pipelineStats.batch_size_max = thisPipelineBatchSize; + } + if ( + pipelineStats.batch_size_min === 0 || + thisPipelineBatchSize < pipelineStats.batch_size_min + ) { + pipelineStats.batch_size_min = thisPipelineBatchSize; + } + } + + const thisPipelineWorkers = thisLogstashStatePipeline.workers; + if (thisPipelineWorkers !== undefined) { + pipelineStats.workers_total = (pipelineStats.workers_total || 0) + thisPipelineWorkers; + pipelineStats.workers_max = pipelineStats.workers_max || 0; + pipelineStats.workers_min = pipelineStats.workers_min || 0; + pipelineStats.workers_avg = pipelineStats.workers_total / pipelineStats.count; + + if (thisPipelineWorkers > pipelineStats.workers_max) { + pipelineStats.workers_max = thisPipelineWorkers; + } + if (pipelineStats.workers_min === 0 || thisPipelineWorkers < pipelineStats.workers_min) { + pipelineStats.workers_min = thisPipelineWorkers; + } + } + + // Extract the vertices object from the pipeline representation. From this, we can + // retrieve the source of the pipeline element on the configuration(from file, string, or + // x-pack-config-management), and the input, filter and output plugins from that pipeline. + const vertices = thisLogstashStatePipeline.representation?.graph?.vertices; + + if (vertices !== undefined) { + vertices.forEach((vertex) => { + const configName = vertex.config_name; + const pluginType = vertex.plugin_type; + let pipelineConfig = vertex.meta?.source?.protocol; + + if (pipelineConfig !== undefined) { + if (pipelineConfig === 'string' || pipelineConfig === 'str') { + pipelineConfig = 'string'; + } else if (pipelineConfig === 'x-pack-config-management') { + pipelineConfig = 'xpack'; + } else { + pipelineConfig = 'file'; + } + if (!pipelineStats.hasOwnProperty('sources')) { + pipelineStats.sources = {}; + } + pipelineStats.sources![pipelineConfig] = true; + } + if (configName !== undefined && pluginType !== undefined) { + incrementByKey(plugins[clusterUuid], `logstash-${pluginType}-${configName}`); + } + }); + } + } + }); + if (clusterStats !== undefined) { + clusterStats.plugins = mapToList(plugins[clusterUuid], 'name'); + } + } + + /* + * Creates a query and executes against ES to fetch self monitoring, Logstash stats metrics + * @param {Object} callCluster - ES client + * @param {string} clusterUuid - A cluster UUID + * @param {string} monitoringClusterUuid - A monitoring cluster UUID + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + */ + private async fetchLogstashStats( + callCluster: ElasticsearchClient, + clusterUuid: string, + monitoringClusterUuid: string, + start: string, + end: string, + { page = 0, ...options }: { page?: number } & LogstashProcessOptions + ): Promise { + const filterPath: string[] = [ + 'hits.hits._source.cluster_uuid', + 'hits.hits._source.type', + 'hits.hits._source.source_node', + 'hits.hits._source.agent.type', + 'hits.hits._source.logstash.elasticsearch.cluster.id', // alias for cluster_uuid + 'hits.hits._source.logstash_stats.pipelines.id', + 'hits.hits._source.logstash_stats.pipelines.ephemeral_id', + 'hits.hits._source.logstash_stats.pipelines.queue.type', + 'hits.hits._source.logstash_stats.logstash.version', + 'hits.hits._source.logstash_stats.logstash.uuid', + ]; + + const params: estypes.SearchRequest = { + index: INDEX_PATTERN_LOGSTASH_MONITORING, + ignore_unavailable: true, + filter_path: filterPath, + body: { + query: createQuery({ + start, + end, + filters: [ + { term: { cluster_uuid: clusterUuid } }, + { + bool: { + should: [{ term: { type: 'logstash_stats' } }], + }, + }, + ], + }) as estypes.QueryDslQueryContainer, + from: page * HITS_SIZE, + collapse: { + field: 'logstash_stats.logstash.uuid', + }, + sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], + size: HITS_SIZE, + }, + }; + + const results = await callCluster.search(params, { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + }); + const hitsLength = results?.hits?.hits.length || 0; + + if (hitsLength > 0) { + // further augment the clusters object with more stats + this.processStatsResults(results, options, monitoringClusterUuid); + } + return Promise.resolve(); + } + + /* + * Creates a query and executes against ES to fetch self monitoring, Logstash state metrics + * @param {Object} callCluster - ES client + * @param {string} clusterUuid - A cluster UUID + * @param {Array} ephemeralIds - Logstash pipeline ephemeral IDs + * @param {string} start - start timestamp + * @param {string} end - end timestamp + * @param {Object} options - additional processing required options + */ + private async fetchLogstashState( + callCluster: ElasticsearchClient, + clusterUuid: string, + ephemeralIds: string[], + start: string, + end: string, + { page = 0, ...options }: { page?: number } & LogstashProcessOptions + ): Promise { + const filterPath: string[] = [ + 'hits.hits._source.logstash_state.pipeline.batch_size', + 'hits.hits._source.logstash_state.pipeline.workers', + 'hits.hits._source.logstash_state.pipeline.representation.graph.vertices', + 'hits.hits._source.type', + ]; + + const params: estypes.SearchRequest = { + index: INDEX_PATTERN_LOGSTASH_MONITORING, + ignore_unavailable: true, + filter_path: filterPath, + body: { + query: createQuery({ + start, + end, + filters: [ + { terms: { 'logstash_state.pipeline.ephemeral_id': ephemeralIds } }, + { + bool: { + should: [{ term: { type: 'logstash_state' } }], + }, + }, + ], + }) as estypes.QueryDslQueryContainer, + collapse: { + field: 'logstash_state.pipeline.ephemeral_id', + }, + sort: [{ ['timestamp']: { order: 'desc', unmapped_type: 'long' } }], + size: ephemeralIds.length, + }, + }; + + const results = await callCluster.search(params, { + headers: { + 'X-QUERY-SOURCE': TELEMETRY_QUERY_SOURCE, + }, + }); + + const hitsLength = results?.hits?.hits.length || 0; + if (hitsLength > 0) { + // further augment the clusters object with more stats + this.processStateResults(results, clusterUuid, options); + } + return Promise.resolve(); + } +} diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/register_monitoring_telemetry_collection.ts b/x-pack/plugins/monitoring/server/telemetry_collection/register_monitoring_telemetry_collection.ts index 15bf4b641b5de..77acc8418b917 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/register_monitoring_telemetry_collection.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/register_monitoring_telemetry_collection.ts @@ -8,7 +8,7 @@ import type { IClusterClient } from '@kbn/core/server'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import type { UsageStatsPayload } from '@kbn/telemetry-collection-manager-plugin/server'; -import type { LogstashBaseStats } from './get_logstash_stats'; +import type { LogstashBaseStats } from './logstash_monitoring'; import type { BeatsBaseStats } from './get_beats_stats'; import { getAllStats } from './get_all_stats'; import { getClusterUuids } from './get_cluster_uuids'; @@ -57,6 +57,7 @@ export function registerMonitoringTelemetryCollection( }, count: { type: 'long' }, cluster_stats: { + monitoringClusterUuid: { type: 'keyword' }, collection_types: { DYNAMIC_KEY: { type: 'long' }, }, diff --git a/x-pack/plugins/monitoring/tsconfig.json b/x-pack/plugins/monitoring/tsconfig.json index 986c4d9fb0b84..957b256bd726b 100644 --- a/x-pack/plugins/monitoring/tsconfig.json +++ b/x-pack/plugins/monitoring/tsconfig.json @@ -48,6 +48,7 @@ "@kbn/react-kibana-context-render", "@kbn/flot-charts", "@kbn/ui-theme", + "@kbn/core-elasticsearch-server", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_monitoring.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_monitoring.json index 0e3571f3c4b1a..a1eb0df9633e1 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_monitoring.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_monitoring.json @@ -43,6 +43,9 @@ }, "cluster_stats": { "properties": { + "monitoringClusterUuid": { + "type": "keyword" + }, "collection_types": { "properties": { "DYNAMIC_KEY": { diff --git a/x-pack/test/api_integration/apis/telemetry/fixtures/multicluster.json b/x-pack/test/api_integration/apis/telemetry/fixtures/multicluster.json index ad1ff9e82bb45..3e39f61f1a6a4 100644 --- a/x-pack/test/api_integration/apis/telemetry/fixtures/multicluster.json +++ b/x-pack/test/api_integration/apis/telemetry/fixtures/multicluster.json @@ -976,49 +976,51 @@ "plugins": {} }, "logstash": { - "count": 1, + "count": 1, "cluster_stats": { + "monitoringClusterUuid": "integrationTestClusterUuid", "collection_types": { "internal_collection": 1 - }, - "pipelines": { - "batch_size_min": 125, - "batch_size_max": 125, - "batch_size_avg": 125, - "batch_size_total": 125, - "count": 1, - "sources": { - "string": true }, - "workers_avg": 4, - "workers_total": 4, - "workers_min": 4, - "workers_max": 4 - }, - "plugins": [ - { - "count": 1, - "name": "logstash-input-twitter" - }, - { - "count": 1, - "name": "logstash-output-stdout" - }, - { - "count": 1, - "name": "logstash-output-elasticsearch" - } - ], + "pipelines": { + "batch_size_min": 125, + "batch_size_max": 125, + "batch_size_avg": 125, + "batch_size_total": 125, + "count": 1, + "sources": { + "string": true + }, + "workers_avg": 4, + "workers_total": 4, + "workers_min": 4, + "workers_max": 4 + }, + "plugins": [ + { + "count": 1, + "name": "logstash-input-twitter" + }, + { + "count": 1, + "name": "logstash-output-stdout" + }, + { + "count": 1, + "name": "logstash-output-elasticsearch" + } + ], "queues": { "memory": 1 } }, "versions": [ - { - "count": 1, - "version": "7.0.0-alpha1" - } - ]} + { + "count": 1, + "version": "7.0.0-alpha1" + } + ] + } }, "timestamp": "2017-08-15T22:10:52.642Z", "version": "7.0.0-alpha1", diff --git a/x-pack/test/api_integration/apis/telemetry/telemetry.ts b/x-pack/test/api_integration/apis/telemetry/telemetry.ts index 203189906f812..bdaa36c1a7d54 100644 --- a/x-pack/test/api_integration/apis/telemetry/telemetry.ts +++ b/x-pack/test/api_integration/apis/telemetry/telemetry.ts @@ -42,6 +42,22 @@ function getCacheDetails(body: UnencryptedTelemetryPayload): CacheDetails[] { return body.map(({ stats }) => (stats as UsageStatsPayload).cacheDetails); } +function updateClusterUuidInLogstashStats( + clusterUuid: string, + payload: Array> +) { + // eslint-disable-next-line @typescript-eslint/naming-convention + return payload.map(({ stack_stats, ...item }) => { + const { logstash } = stack_stats; + if (logstash) { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { cluster_stats } = logstash; + cluster_stats.monitoringClusterUuid = clusterUuid; + } + return { stack_stats, ...item }; + }); +} + /** * Update the .monitoring-* documents loaded via the archiver to the recent `timestamp` * @param esSupertest The client to send requests to ES @@ -161,7 +177,12 @@ export default function ({ getService }: FtrProviderContext) { expect(monitoring).length(3); expect(localXPack.collectionSource).to.eql('local_xpack'); - expect(omitCacheDetails(monitoring)).to.eql( + const withoutCacheDetailsMonitoring = omitCacheDetails(monitoring); + const lsClusterUuidChangedMonitoring = updateClusterUuidInLogstashStats( + 'integrationTestClusterUuid', + withoutCacheDetailsMonitoring + ); + expect(lsClusterUuidChangedMonitoring).to.eql( updateFixtureTimestamps(multiClusterFixture, timestamp) ); }); From ce47a73e848503508ef2526c77a70e747ea94955 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 4 Jun 2024 18:54:14 -0700 Subject: [PATCH 58/82] [DOCS] Add Elasticsearch query rule action variables and data types (#183691) --- .../alerting/rule-types/es-query.asciidoc | 80 ++++++++++++------- 1 file changed, 52 insertions(+), 28 deletions(-) diff --git a/docs/user/alerting/rule-types/es-query.asciidoc b/docs/user/alerting/rule-types/es-query.asciidoc index 17e50ceb40b66..2ea5e1dc76af2 100644 --- a/docs/user/alerting/rule-types/es-query.asciidoc +++ b/docs/user/alerting/rule-types/es-query.asciidoc @@ -143,44 +143,44 @@ You can further refine the conditions under which actions run by specifying that [float] === Add action variables -You can pass rule values to an action to provide contextual details. -To view the list of variables available for each action, click the "add rule variable" button. +When you create a rule in {kib}, it provides an example message that is appropriate for each action. +For example, the following message is provided for server log connector actions that run for each alert: + +[source,mustache] +-------------------------------------------------- +Elasticsearch query rule '{{rule.name}}' is active: + +- Value: {{context.value}} +- Conditions Met: {{context.conditions}} over {{rule.params.timeWindowSize}}{{rule.params.timeWindowUnit}} +- Timestamp: {{context.date}} +- Link: {{context.link}} +-------------------------------------------------- + +Rules use rule action variables and Mustache templates to pass contextual details into the alert notifications. +There is a set of <> and a set that is specific to this rule. +To view the list of variables in {kib}, click the "add rule variable" button. For example: [role="screenshot"] image::images/es-query-rule-action-variables.png[Passing rule values to an action] // NOTE: This is an autogenerated screenshot. Do not edit it directly. -The following variables are specific to the {es} query rule. -You can also specify <>. - -`context.title`:: A preconstructed title for the rule. Example: -`rule term match alert query matched`. - -`context.message`:: A preconstructed message for the rule. Example: + -`rule 'my es-query' is active:` + -`- Value: 2` + -`- Conditions Met: Number of matching documents is greater than 1 over 5m` + -`- Timestamp: 2022-02-03T20:29:27.732Z` - -`context.group`:: The name of the action group associated with the condition. -Example: `query matched`. - -`context.date`:: The date, in ISO format, that the rule met the condition. -Example: `2022-02-03T20:29:27.732Z`. +The following variables are specific to the {es} query rule: -`context.value`:: The value of the rule that met the condition. +`context.conditions`:: +(string) A description of the condition. For example: `Query matched documents`. -`context.conditions`:: A description of the condition. Example: -`count greater than 4`. +`context.date`:: +(string) The date, in ISO format, that the rule met the condition. For example: `2024-04-30T00:55:42.765Z`. -`context.hits`:: The most recent documents that matched the query. Using the -https://mustache.github.io/[Mustache] template array syntax, you can iterate +`context.hits`:: +(array of objects) The most recent documents that matched the query. +Using the https://mustache.github.io/[Mustache] template array syntax, you can iterate over these hits to get values from the {es} documents into your actions. For example, the message in an email connector action might contain: + -- -[source,sh] +[source,mustache] -------------------------------------------------- Elasticsearch query rule '{{rule.name}}' is active: @@ -195,7 +195,7 @@ If the {es} query search API's {ref}/search-fields.html#search-fields-param[`fie which can be used to access any runtime fields defined by the {ref}/runtime-search-request.html[`runtime_mappings`] parameter. For example: -[source,sh] +[source,mustache] -------------------------------------------------- {{#context.hits}} timestamp: {{_source.@timestamp}} @@ -209,7 +209,7 @@ As the {ref}/search-fields.html#search-fields-response[`fields`] response always the https://mustache.github.io/[Mustache] template array syntax is used to iterate over these values in your actions. For example: -[source,sh] +[source,mustache] -------------------------------------------------- {{#context.hits}} Labels: @@ -221,6 +221,30 @@ Labels: // NOTCONSOLE -- +`context.link`:: +(string) The URL for the rule that generated the alert. +For example: `/app/management/insightsAndAlerting/triggersActions/rule/47754354-d894-49d3-87ec-05745a74e2b7`. + +`context.message`:: +(string) A preconstructed message for the rule. +For example: + +`Document count is 100 in the last 1h. Alert when greater than 50.` + +`context.sourceFields`:: +(object) If the rule was configured to copy source fields into alerts, for each source field there is an array of strings that contains its values. +For example: `{'host.id': ['1'], 'host.name': ['host-1']}`. + +`context.title`:: +(string) A preconstructed title for the rule. Example: +`rule 'my-query-rule' matched query`. + +`context.value`:: +(number) The value that met the rule threshold condition. + +`rule.params`:: +(object) The rule parameters, such as `searchType`, `timeWindowSize`, and `timeWindowUnit`. +For the definitive list of parameters for this rule, refer to the API documentation. + [float] === Handling multiple matches of the same document @@ -252,4 +276,4 @@ window of 1 hour and checks if there are more than 99 matches for the query. The | `Run 4 (0:03)` | Rule finds 190 matches in the last hour. 71 of them are duplicates that were already alerted on previously, so you actually have 119 matches: `119 > 99` | Rule is active and user is alerted. -|=== \ No newline at end of file +|=== From 0ecc3d4228611bb719a28bfa858aa3dc6874e62a Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 5 Jun 2024 01:08:49 -0400 Subject: [PATCH 59/82] [api-docs] 2024-06-05 Daily api_docs build (#184793) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/728 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 12 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/assets_data_access.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 | 94 +++++++ api_docs/dashboard.mdx | 4 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.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.devdocs.json | 4 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 3 +- api_docs/deprecations_by_plugin.mdx | 5 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.devdocs.json | 75 ++++- api_docs/embeddable.mdx | 4 +- 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.devdocs.json | 108 ++++++++ api_docs/fleet.mdx | 4 +- 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_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.devdocs.json | 259 +++++++++++++++++- api_docs/kbn_alerting_types.mdx | 4 +- 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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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_entities_schema.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.mdx | 2 +- 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_grouping.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 +- .../kbn_management_settings_ids.devdocs.json | 17 -- api_docs/kbn_management_settings_ids.mdx | 4 +- ...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 +- .../kbn_presentation_containers.devdocs.json | 109 +++++++- api_docs/kbn_presentation_containers.mdx | 4 +- api_docs/kbn_presentation_publishing.mdx | 2 +- 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_hooks.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_search_types.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_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_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_try_in_console.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_data_access.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 | 16 +- 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 | 12 +- api_docs/security_solution.mdx | 2 +- 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 +- 701 files changed, 1349 insertions(+), 755 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 028c3f5826ee6..c1f3d4c99134c 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 33f2f684d461f..003ab0a6453bf 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-06-04 +date: 2024-06-05 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 9ac7c7a38dced..2993e35c0a789 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-06-04 +date: 2024-06-05 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 57b2a4f7cf82c..8e8cddfe04935 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 38298c2b6428d..7c1e8fca1c41f 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -6584,7 +6584,7 @@ "tags": [], "label": "ActionVariable", "description": [], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -6595,7 +6595,7 @@ "tags": [], "label": "name", "description": [], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -6606,7 +6606,7 @@ "tags": [], "label": "description", "description": [], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -6620,7 +6620,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -6634,7 +6634,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -6648,7 +6648,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 93302dd1b5891..fa9bd039a12a6 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 559d9b3ea0b68..d4a59b3abe1de 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-06-04 +date: 2024-06-05 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 a14e26b1d3778..79827c128f768 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-06-04 +date: 2024-06-05 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 565acd62fe824..1504ac4f9d59a 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index ad458c0282c25..795c4e6acc12b 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index aa12c1ea03a77..957beda2a5783 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-06-04 +date: 2024-06-05 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 a0883535cf3be..95898336db303 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-06-04 +date: 2024-06-05 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 45db093ed6f7a..c1d46f6c174a3 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-06-04 +date: 2024-06-05 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 994e8035b21fd..5834da01597e4 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-06-04 +date: 2024-06-05 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 dc67650af4d31..0aee0d5e7ed68 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-06-04 +date: 2024-06-05 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 ceecacd199c28..018cb0dd7b2f4 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-06-04 +date: 2024-06-05 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 ddf0863ee5169..d9b6b5a0a8ece 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-06-04 +date: 2024-06-05 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 468c3536775a3..1e4e2b20487dc 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-06-04 +date: 2024-06-05 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 306bc458e742e..73572f24cb119 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-06-04 +date: 2024-06-05 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 c0d66f0018664..0ea7308d29106 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-06-04 +date: 2024-06-05 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 160913a1192dd..6dfbc40675e49 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-06-04 +date: 2024-06-05 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 58cf70a7fbd6c..bf48f5d3ce9d7 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-06-04 +date: 2024-06-05 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 f8492dc8f3ae5..c00477f026e18 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-06-04 +date: 2024-06-05 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 14bf9269367cc..fc4edd705a70a 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-06-04 +date: 2024-06-05 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 612cf9f1ea2ec..12884642b3c5d 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -1691,6 +1691,77 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.prefixReferencesFromPanel", + "type": "Function", + "tags": [], + "label": "prefixReferencesFromPanel", + "description": [], + "signature": [ + "(id: string, references: ", + { + "pluginId": "@kbn/content-management-utils", + "scope": "common", + "docId": "kibKbnContentManagementUtilsPluginApi", + "section": "def-common.Reference", + "text": "Reference" + }, + "[]) => ", + { + "pluginId": "@kbn/content-management-utils", + "scope": "common", + "docId": "kibKbnContentManagementUtilsPluginApi", + "section": "def-common.Reference", + "text": "Reference" + }, + "[]" + ], + "path": "src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-common.prefixReferencesFromPanel.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dashboard", + "id": "def-common.prefixReferencesFromPanel.$2", + "type": "Array", + "tags": [], + "label": "references", + "description": [], + "signature": [ + { + "pluginId": "@kbn/content-management-utils", + "scope": "common", + "docId": "kibKbnContentManagementUtilsPluginApi", + "section": "def-common.Reference", + "text": "Reference" + }, + "[]" + ], + "path": "src/plugins/dashboard/common/dashboard_container/persistable_state/dashboard_container_references.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ @@ -2254,6 +2325,29 @@ "path": "src/plugins/dashboard/common/dashboard_container/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.DashboardPanelState.references", + "type": "Array", + "tags": [], + "label": "references", + "description": [ + "\nReact embeddables are serialized and may pass references that are later used in factory's deserialize method." + ], + "signature": [ + { + "pluginId": "@kbn/content-management-utils", + "scope": "common", + "docId": "kibKbnContentManagementUtilsPluginApi", + "section": "def-common.Reference", + "text": "Reference" + }, + "[] | undefined" + ], + "path": "src/plugins/dashboard/common/dashboard_container/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 760c47d576b77..639cd78257519 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.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 | |-------------------|-----------|------------------------|-----------------| -| 116 | 0 | 113 | 13 | +| 120 | 0 | 116 | 13 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 78d3130f27e61..693696334d15a 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-06-04 +date: 2024-06-05 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 eed40154c8d05..918ca014877dd 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 61c608068b0db..9d38bf46ade7a 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 1d6042c2856ee..1bf03818e17d0 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-06-04 +date: 2024-06-05 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 5216d6189d5d4..3a31da74eba39 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-06-04 +date: 2024-06-05 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 1eefbfb4492d7..9eb7339dd8dc0 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-06-04 +date: 2024-06-05 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 ff4e26cd53f5b..a11489a7fe725 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-06-04 +date: 2024-06-05 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 d412ee1bedbcf..2eeec04c6e998 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-06-04 +date: 2024-06-05 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 527363d613424..59dd3f2b905f1 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-06-04 +date: 2024-06-05 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 21fa8a1031faf..d9bd128006a0e 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index c7fe97d5b6392..14df933533652 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -201,7 +201,7 @@ "Type", "; }>; }> | undefined; handler: ({}: ", "DatasetQualityRouteHandlerResources", - " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ degradedFields: { name: string; count: number; lastOccurrence: number | null; }[]; }>; } & ", + " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ degradedFields: { name: string; count: number; lastOccurrence: number | null; timeSeries: { x: number; y: number; }[]; }[]; }>; } & ", "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/non_aggregatable\": { endpoint: \"GET /internal/dataset_quality/data_streams/non_aggregatable\"; params?: ", "TypeC", @@ -356,7 +356,7 @@ "Type", "; }>; }> | undefined; handler: ({}: ", "DatasetQualityRouteHandlerResources", - " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ degradedFields: { name: string; count: number; lastOccurrence: number | null; }[]; }>; } & ", + " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ degradedFields: { name: string; count: number; lastOccurrence: number | null; timeSeries: { x: number; y: number; }[]; }[]; }>; } & ", "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/non_aggregatable\": { endpoint: \"GET /internal/dataset_quality/data_streams/non_aggregatable\"; params?: ", "TypeC", diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 6bd5dab529f2f..fd761717cd3eb 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-06-04 +date: 2024-06-05 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 33c7093cad04a..b51a8ebd93b91 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -105,6 +105,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | visualizations, graph | - | | | kubernetesSecurity, osquery, threatIntelligence | - | | | @kbn/core, lens, savedObjects | - | +| | lens, dashboard, canvas | - | | | lens, controls, dashboard, observabilityShared | - | | | dashboard, canvas | - | | | dashboard | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 9e94db37eea2e..538da386fe47d 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -510,6 +510,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.tsx#:~:text=title), [es_data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.tsx#:~:text=title), [data_views.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/kibana/data_views.ts#:~:text=title), [data_views.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/kibana/data_views.ts#:~:text=title), [datasource_component.js](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/datasource/datasource_component.js#:~:text=title) | - | +| | [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx#:~:text=EmbeddablePanel), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx#:~:text=EmbeddablePanel) | - | | | [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx#:~:text=getEmbeddableFactories), [embeddables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/kibana/embeddables.ts#:~:text=getEmbeddableFactories) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context) | - | | | [setup_expressions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | @@ -592,6 +593,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/data/types.ts#:~:text=fieldFormats), [data_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/data/data_service.ts#:~:text=fieldFormats) | - | +| | [dashboard_grid_item.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx#:~:text=EmbeddablePanel), [dashboard_grid_item.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx#:~:text=EmbeddablePanel) | - | | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/plugin.tsx#:~:text=registerEmbeddableFactory) | - | | | [migrate_dashboard_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts#:~:text=getEmbeddableFactory), [migrate_dashboard_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts#:~:text=getEmbeddableFactory), [create_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts#:~:text=getEmbeddableFactory), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=getEmbeddableFactory), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=getEmbeddableFactory), [dashboard_renderer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/external_api/dashboard_renderer.tsx#:~:text=getEmbeddableFactory), [embeddable.stub.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/embeddable/embeddable.stub.ts#:~:text=getEmbeddableFactory), [duplicate_dashboard_panel.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.test.ts#:~:text=getEmbeddableFactory), [create_dashboard.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts#:~:text=getEmbeddableFactory), [create_dashboard.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts#:~:text=getEmbeddableFactory)+ 10 more | - | | | [editor_menu.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/top_nav/editor_menu.tsx#:~:text=getEmbeddableFactories), [embeddable.stub.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/embeddable/embeddable.stub.ts#:~:text=getEmbeddableFactories), [embeddable.stub.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/embeddable/embeddable.stub.ts#:~:text=getEmbeddableFactories) | - | @@ -930,6 +932,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/data_views_service/loader.ts#:~:text=title), [lens_top_nav.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx#:~:text=title) | - | +| | [embeddable_component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_component.tsx#:~:text=EmbeddablePanel), [embeddable_component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_component.tsx#:~:text=EmbeddablePanel) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=registerSavedObjectToPanelMethod) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [embeddable_component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_component.tsx#:~:text=getEmbeddableFactory) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index a89b3fe8fe5f5..2e76022ee377b 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index c060929daea96..8252ff6115dab 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 76647f3fbc66f..25da2f30949ac 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index dcdcca0208b67..73c356c969b49 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 59e5502571071..64db9e7ca8175 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index e9ab1f3be3a14..6a2fbe60f1cd6 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-06-04 +date: 2024-06-05 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 ca12d6bde7837..f747b69145ed4 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index e1e1ad4414f91..9b90be202d337 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -629,6 +629,22 @@ ], "returnComment": [] }, + { + "parentPluginId": "embeddable", + "id": "def-public.Container.getPanelCount", + "type": "Function", + "tags": [], + "label": "getPanelCount", + "description": [], + "signature": [ + "() => number" + ], + "path": "src/plugins/embeddable/public/lib/containers/container.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "embeddable", "id": "def-public.Container.removePanel", @@ -7937,19 +7953,45 @@ "parentPluginId": "embeddable", "id": "def-public.EmbeddablePanel", "type": "Function", - "tags": [], - "label": "EmbeddablePanel", - "description": [ - "\nLoads and renders a legacy embeddable.\n\nAncestry chain must use 'key' attribute to reset DOM and state when embeddable changes\nFor example " + "tags": [ + "deprecated" ], + "label": "EmbeddablePanel", + "description": [], "signature": [ "(props: ", "EmbeddablePanelProps", ") => JSX.Element" ], "path": "src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [ + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/embeddable/embeddable_component.tsx" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/embeddable/embeddable_component.tsx" + }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx" + }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx" + } + ], "children": [ { "parentPluginId": "embeddable", @@ -10749,6 +10791,29 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "embeddable", + "id": "def-public.EmbeddablePackageState.references", + "type": "Array", + "tags": [], + "label": "references", + "description": [ + "\nCopy dashboard panel transfers serialized panel state for React embeddables.\nThe rawState will be passed into the input and references are passed separately\nso the container can update its references array and the updated references\nare correctly passed to the factory's deserialize method.\n\nLegacy embeddables have already injected the references\ninto the input state, so they will not pass references." + ], + "signature": [ + { + "pluginId": "@kbn/content-management-utils", + "scope": "common", + "docId": "kibKbnContentManagementUtilsPluginApi", + "section": "def-common.Reference", + "text": "Reference" + }, + "[] | undefined" + ], + "path": "src/plugins/embeddable/public/lib/state_transfer/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "embeddable", "id": "def-public.EmbeddablePackageState.searchSessionId", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index f9e5f34c82299..20d0bb8050c31 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.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 | |-------------------|-----------|------------------------|-----------------| -| 554 | 1 | 444 | 8 | +| 556 | 1 | 446 | 8 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index d9293a0204d84..2a36bc048ca31 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-06-04 +date: 2024-06-05 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 14d1b7d3f9c21..afe609755793f 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-06-04 +date: 2024-06-05 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 0b5c68ff50098..40801bf27ebe6 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-06-04 +date: 2024-06-05 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 71a9645efda5c..7e3cb69fc0f45 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-06-04 +date: 2024-06-05 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 b3a6dc929c5ec..b093993ab0a63 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-06-04 +date: 2024-06-05 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 bad94c0124410..7d59a8f090d57 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-06-04 +date: 2024-06-05 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 ab90734e44a87..17d9c45529df0 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-06-04 +date: 2024-06-05 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 423ebb61cf3ac..b80a29a86de9b 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-06-04 +date: 2024-06-05 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 d125060d8ce8d..3d4a101e9cb87 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-06-04 +date: 2024-06-05 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 de337d8bee6fd..d7e02c6fb9cab 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-06-04 +date: 2024-06-05 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 dbcd862e445f8..dedf1f356deb4 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-06-04 +date: 2024-06-05 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 9c953bef505a1..655e185d46512 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-06-04 +date: 2024-06-05 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 cb77bad5bd893..d2aadd6444fc3 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-06-04 +date: 2024-06-05 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 850fa5fa805f1..92389c0ec92ae 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-06-04 +date: 2024-06-05 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 c60fb93ea73b5..e3169d31d1f67 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-06-04 +date: 2024-06-05 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 2a6fc980df565..85afebfd437ed 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-06-04 +date: 2024-06-05 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 098fb08094b90..b04ac01380260 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-06-04 +date: 2024-06-05 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 069657a7bcdcd..ade52e9096a8c 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-06-04 +date: 2024-06-05 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 b35fed2c4c456..cda8d9a5002c2 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-06-04 +date: 2024-06-05 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 e1225e91b7880..c76b87e1b619a 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-06-04 +date: 2024-06-05 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 19cc4f6d04f3c..6a24838acafda 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-06-04 +date: 2024-06-05 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 2e156f5930bb7..2ed920680bb2f 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-06-04 +date: 2024-06-05 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 36fc161efdadf..044719c404618 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-06-04 +date: 2024-06-05 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 c7c65c5c383be..e532a3ed81b67 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-06-04 +date: 2024-06-05 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 bb894cc556b78..dc94e0e07c876 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-06-04 +date: 2024-06-05 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 639a4cb36e0b2..e1b00b3fefd77 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-06-04 +date: 2024-06-05 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 bcc4e2bd3a68e..c607e70f12424 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index fe2fd5f54af3a..4323df4ca5710 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -8453,6 +8453,91 @@ ], "returnComment": [] }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getAgentPolicyInputs", + "type": "Function", + "tags": [], + "label": "getAgentPolicyInputs", + "description": [], + "signature": [ + "(pkgName: string, pkgVersion?: string | undefined, prerelease?: false | undefined, ignoreUnverified?: boolean | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.TemplateAgentPolicyInput", + "text": "TemplateAgentPolicyInput" + }, + "[]>" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getAgentPolicyInputs.$1", + "type": "string", + "tags": [], + "label": "pkgName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getAgentPolicyInputs.$2", + "type": "string", + "tags": [], + "label": "pkgVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getAgentPolicyInputs.$3", + "type": "boolean", + "tags": [], + "label": "prerelease", + "description": [], + "signature": [ + "false | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getAgentPolicyInputs.$4", + "type": "CompoundType", + "tags": [], + "label": "ignoreUnverified", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, { "parentPluginId": "fleet", "id": "def-server.PackageClient.reinstallEsAssets", @@ -27278,6 +27363,29 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.TemplateAgentPolicyInput", + "type": "Type", + "tags": [], + "label": "TemplateAgentPolicyInput", + "description": [], + "signature": [ + "{ id: string; type: string; streams?: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.FullAgentPolicyInputStream", + "text": "FullAgentPolicyInputStream" + }, + "[] | undefined; }" + ], + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.UNINSTALL_TOKENS_SAVED_OBJECT_TYPE", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index de2da8b4dd96f..c70634c5c6b95 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1323 | 5 | 1202 | 69 | +| 1329 | 5 | 1208 | 69 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index ca8e1abe471ce..527ddc2cf51cd 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-06-04 +date: 2024-06-05 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 882821661629e..cca990045a059 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-06-04 +date: 2024-06-05 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 3fd16f60f7b94..bd6531ba1ceb9 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-06-04 +date: 2024-06-05 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 c00eb5720ac4b..6f4d3fec1811b 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-06-04 +date: 2024-06-05 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 20349438903de..dbc92c5cf922c 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-06-04 +date: 2024-06-05 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 616390e6c685c..46df890f8428a 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-06-04 +date: 2024-06-05 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 5d6363ab77317..a11b76955488c 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-06-04 +date: 2024-06-05 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 d43cfe447afb1..b13b8b8dd1ff1 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-06-04 +date: 2024-06-05 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 542a795eea5e3..704ff05bd4208 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-06-04 +date: 2024-06-05 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 fda41793da726..81757417b0582 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-06-04 +date: 2024-06-05 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 7c49d66d9c8c7..09fcaac9bf1dc 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-06-04 +date: 2024-06-05 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 967ad868d6a9d..007b242d32cc8 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-06-04 +date: 2024-06-05 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 464a7d9bfcb31..55ed34bac5a33 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-06-04 +date: 2024-06-05 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 ea659d0937c67..3ab0a6163ac19 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-06-04 +date: 2024-06-05 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 495ed8bcfbf5b..4d102b95a8790 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-06-04 +date: 2024-06-05 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 ab878f2d36145..791f048b956f8 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-06-04 +date: 2024-06-05 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index a7a540e87ffc6..b0b6955b0cc72 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 1be15045e1fcd..8a77d1f1499c3 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-06-04 +date: 2024-06-05 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.devdocs.json b/api_docs/kbn_alerting_types.devdocs.json index 983f049002532..2467b5805e0a1 100644 --- a/api_docs/kbn_alerting_types.devdocs.json +++ b/api_docs/kbn_alerting_types.devdocs.json @@ -20,6 +20,197 @@ "classes": [], "functions": [], "interfaces": [ + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables", + "type": "Interface", + "tags": [], + "label": "ActionContextVariables", + "description": [ + "\nAll valid action context variables" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.alertId", + "type": "string", + "tags": [], + "label": "alertId", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.alertName", + "type": "string", + "tags": [], + "label": "alertName", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.alertInstanceId", + "type": "string", + "tags": [], + "label": "alertInstanceId", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.alertActionGroup", + "type": "string", + "tags": [], + "label": "alertActionGroup", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.alertActionGroupName", + "type": "string", + "tags": [], + "label": "alertActionGroupName", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.tags", + "type": "Array", + "tags": [], + "label": "tags", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.spaceId", + "type": "string", + "tags": [], + "label": "spaceId", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.params", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "{ [x: string]: unknown; }" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.context", + "type": "Object", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "{ [x: string]: unknown; }" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.date", + "type": "string", + "tags": [], + "label": "date", + "description": [], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.state", + "type": "Object", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "{ [x: string]: unknown; }" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.kibanaBaseUrl", + "type": "string", + "tags": [], + "label": "kibanaBaseUrl", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.rule", + "type": "Object", + "tags": [], + "label": "rule", + "description": [], + "signature": [ + "{ id: string; name: string; spaceId: string; type: string; params: Record; tags?: string[] | undefined; url?: string | undefined; }" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariables.alert", + "type": "Object", + "tags": [], + "label": "alert", + "description": [], + "signature": [ + "{ id: string; uuid: string; actionGroup: string; actionGroupName: string; flapping: boolean; consecutiveMatches?: number | undefined; }" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/alerting-types", "id": "def-common.ActionGroup", @@ -76,7 +267,7 @@ "tags": [], "label": "ActionVariable", "description": [], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -87,7 +278,7 @@ "tags": [], "label": "name", "description": [], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -98,7 +289,7 @@ "tags": [], "label": "description", "description": [], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -112,7 +303,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -126,7 +317,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false }, @@ -140,7 +331,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-alerting-types/rule_type_types.ts", + "path": "packages/kbn-alerting-types/action_variable.ts", "deprecated": false, "trackAdoption": false } @@ -2314,6 +2505,23 @@ } ], "misc": [ + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.ActionContextVariablesFlatten", + "type": "Type", + "tags": [], + "label": "ActionContextVariablesFlatten", + "description": [ + "\nThis type takes a deep nested object and returns all flattened keys as a union.\nThis is needed for the UI where the context variables are used as flattened keys.\nWe need to remove params and add it ourselves because FlattenKeys\nproduces `params.${string}` for the params which leads to a TS error\nin the UI when the key of the record is `params`" + ], + "signature": [ + "\"params\" | \"spaceId\" | \"date\" | \"tags\" | \"alertId\" | \"alertInstanceId\" | \"rule.id\" | \"rule.name\" | \"alert.uuid\" | \"alert.flapping\" | \"rule.tags\" | \"rule.type\" | \"alertName\" | \"alertActionGroup\" | \"alertActionGroupName\" | \"kibanaBaseUrl\" | \"rule.spaceId\" | \"rule.url\" | `rule.params.${string}` | \"alert.id\" | \"alert.actionGroup\" | \"alert.actionGroupName\" | \"alert.consecutiveMatches\" | \"rule.params\"" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/alerting-types", "id": "def-common.ActionGroupIdsOf", @@ -2662,6 +2870,45 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.SummaryActionContextVariables", + "type": "Type", + "tags": [], + "label": "SummaryActionContextVariables", + "description": [ + "\nAll valid summarized action context variables" + ], + "signature": [ + { + "pluginId": "@kbn/alerting-types", + "scope": "common", + "docId": "kibKbnAlertingTypesPluginApi", + "section": "def-common.ActionContextVariables", + "text": "ActionContextVariables" + }, + " & { alerts: { new: { count: number; data: unknown[]; }; ongoing: { count: number; data: unknown[]; }; recovered: { count: number; data: unknown[]; }; all: { count: number; data: unknown[]; }; }; }" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/alerting-types", + "id": "def-common.SummaryActionContextVariablesFlatten", + "type": "Type", + "tags": [], + "label": "SummaryActionContextVariablesFlatten", + "description": [], + "signature": [ + "\"params\" | \"spaceId\" | \"date\" | \"tags\" | \"alertId\" | \"alertInstanceId\" | \"rule.id\" | \"rule.name\" | \"alert.uuid\" | \"alert.flapping\" | \"rule.tags\" | \"rule.type\" | \"alertName\" | \"alertActionGroup\" | \"alertActionGroupName\" | \"kibanaBaseUrl\" | \"rule.spaceId\" | \"rule.url\" | `rule.params.${string}` | \"alert.id\" | \"alert.actionGroup\" | \"alert.actionGroupName\" | \"alert.consecutiveMatches\" | \"rule.params\" | \"alerts.recovered.count\" | \"alerts.recovered.data\" | \"alerts.new.count\" | \"alerts.new.data\" | \"alerts.all.count\" | \"alerts.all.data\" | \"alerts.ongoing.count\" | \"alerts.ongoing.data\"" + ], + "path": "packages/kbn-alerting-types/action_variable.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [ diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 94d65b7a59804..8c85406acb3e8 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.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 | |-------------------|-----------|------------------------|-----------------| -| 161 | 0 | 161 | 0 | +| 179 | 0 | 176 | 0 | ## Common diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 4da94dbc6109d..622df9ae1d281 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-06-04 +date: 2024-06-05 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 335df80c02b50..2bd1dd6daaf2f 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-06-04 +date: 2024-06-05 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 1cd026b13a275..85aba8bbda942 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-06-04 +date: 2024-06-05 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 faa75fd800077..25a7c2f3293d9 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-06-04 +date: 2024-06-05 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 29b8ccd064971..ee876ddeb8cf4 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-06-04 +date: 2024-06-05 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 93406bdb49d0c..5a3e84257bb2b 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-06-04 +date: 2024-06-05 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 953cc1eb6c347..1475ce7b7e97d 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-06-04 +date: 2024-06-05 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 07c5d27e9d130..e727292283797 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-06-04 +date: 2024-06-05 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 5b000681cea53..5555e035ed1dd 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-06-04 +date: 2024-06-05 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 41dd7ca30617a..b27b1e1d7641a 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-06-04 +date: 2024-06-05 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 f9daef169c71f..95ef06f7d37ea 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-06-04 +date: 2024-06-05 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 dc2ad635820b2..14e06148cf562 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-06-04 +date: 2024-06-05 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 2d823a0e2c3aa..942f6958c1230 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-06-04 +date: 2024-06-05 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 6c69b86aaa71c..1b7372452aca6 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-06-04 +date: 2024-06-05 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 33b86c0431a36..a94ecaebf13d2 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-06-04 +date: 2024-06-05 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 770f3c427fa33..d7c81979b51b6 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-06-04 +date: 2024-06-05 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 e3ba7859dccce..2afa9e4e5da5f 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-06-04 +date: 2024-06-05 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 67e048a4332b2..01112cc4527a2 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-06-04 +date: 2024-06-05 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 d2737b17ffbc6..594fc60c5df8e 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-06-04 +date: 2024-06-05 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 648c94dda587a..c36ecdc5b7c8a 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-06-04 +date: 2024-06-05 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 0f91b94a582a0..85311473df631 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-06-04 +date: 2024-06-05 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 cea3e7043c3b4..833d92ba5f08a 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-06-04 +date: 2024-06-05 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 a4e8b813a916c..55d63bb63651a 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-06-04 +date: 2024-06-05 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 be23146abd52f..b3a603bd94f76 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-06-04 +date: 2024-06-05 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 e5b12be624369..103c33d7f960e 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-06-04 +date: 2024-06-05 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 39e006e0680a7..1edc06f2e17d3 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-06-04 +date: 2024-06-05 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 201a367aae706..beaa6c5ea38dc 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-06-04 +date: 2024-06-05 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 5ac72aa90777c..007cdd8e19495 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-06-04 +date: 2024-06-05 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 f491cb9e6f8cd..68281cce07b8e 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-06-04 +date: 2024-06-05 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 20c368ef2a3dc..3a34d3d05ea0a 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-06-04 +date: 2024-06-05 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 1416f2b240a58..06a88dcfd4e93 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-06-04 +date: 2024-06-05 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 0517ceb71546c..8d1dd41ce0365 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-06-04 +date: 2024-06-05 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 374cabec39a92..35f66bce9fe8f 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-06-04 +date: 2024-06-05 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 8be0510fbde31..11ec0c6169ca0 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-06-04 +date: 2024-06-05 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 4558ee6fae5cb..486fc644ae073 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-06-04 +date: 2024-06-05 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 52db9c4058c96..8bc1ff20f5df7 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-06-04 +date: 2024-06-05 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 62e65a2f61fd6..ede2219227138 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-06-04 +date: 2024-06-05 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 db743aa34a398..4ba90b4dbee5b 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-06-04 +date: 2024-06-05 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 184881a89128c..b7ec5313f9fb2 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-06-04 +date: 2024-06-05 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 4bf21ec454de5..531dd243033ba 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-06-04 +date: 2024-06-05 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 9df3e45b857b6..3d123b2e7b5ea 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-06-04 +date: 2024-06-05 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 cce588320617b..8768cebe13710 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-06-04 +date: 2024-06-05 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 bc218f488f0b1..39e66d12d319e 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-06-04 +date: 2024-06-05 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 ec4375d89fe2a..916df560716ed 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-06-04 +date: 2024-06-05 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 f3bda3c405d9b..1f1b2610329e8 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-06-04 +date: 2024-06-05 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 5447df9edd3f5..ddb4211b42e7a 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-06-04 +date: 2024-06-05 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 b6ac2e2fee819..d27030d6c60b2 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-06-04 +date: 2024-06-05 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 167d2229ce9d7..31c815e0cdf58 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-06-04 +date: 2024-06-05 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 52d82a3b9d6ff..c3cc070c247ee 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-06-04 +date: 2024-06-05 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 e8396206ae0dc..009d223be143a 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-06-04 +date: 2024-06-05 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 de1a00d858b99..b946ef578f474 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-06-04 +date: 2024-06-05 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 d0b8c2b3f7ca6..8c4770b5346cf 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-06-04 +date: 2024-06-05 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 d8d7f290a727f..9fca022c70eb2 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-06-04 +date: 2024-06-05 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 e07965ae025cc..ff891f1282f85 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-06-04 +date: 2024-06-05 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 7f38c77ea7e98..1d9828563610a 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-06-04 +date: 2024-06-05 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 61b8985e10a11..fd2531afc3455 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-06-04 +date: 2024-06-05 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 19e4e5aba1cf9..841c7b0ca57ad 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-06-04 +date: 2024-06-05 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 28352db383f6f..58e1c780e1ae8 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-06-04 +date: 2024-06-05 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 d2d19a2ae518a..3933c683eecc5 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-06-04 +date: 2024-06-05 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 e93349600512c..d747577ec3874 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-06-04 +date: 2024-06-05 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 1e6b6aad930da..976115a72a0cc 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-06-04 +date: 2024-06-05 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 d8d339cbc4862..b00aa99ccdaef 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-06-04 +date: 2024-06-05 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 e6a16da623589..5ca0b6a51b1c8 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-06-04 +date: 2024-06-05 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 de5b55cc32475..b3709527cccd8 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-06-04 +date: 2024-06-05 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 a779c5137d597..38a0eb7f49509 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-06-04 +date: 2024-06-05 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 af254b3f73fdd..127c0d3c884f2 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-06-04 +date: 2024-06-05 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 2ed41250db2f4..35530b12d80f2 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-06-04 +date: 2024-06-05 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 dcccdd71e5c3f..8c0bd814c7298 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-06-04 +date: 2024-06-05 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 11f6cce3fb119..a2d5ac543f43d 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-06-04 +date: 2024-06-05 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 ecaf7e7a52fc0..90ce3fefa61b8 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-06-04 +date: 2024-06-05 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 04ee4e05a864e..2e1de4a80b7b1 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-06-04 +date: 2024-06-05 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 8f9c77c76ec0a..a71efbe4423bf 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-06-04 +date: 2024-06-05 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 40336c0b1d72f..a2fbe5ec762d4 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-06-04 +date: 2024-06-05 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 4cf74fc6ef3df..a1af92782a76e 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-06-04 +date: 2024-06-05 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 f493ddad08bff..76a45e5231832 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-06-04 +date: 2024-06-05 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 13b227589c6ff..81b296cabb4c6 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-06-04 +date: 2024-06-05 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 5b4fa9d22f143..8049ffa24ff49 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-06-04 +date: 2024-06-05 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 2329fed6f4516..d0c199a2d8513 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-06-04 +date: 2024-06-05 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 14a5b34c77d42..f65db4920a0a3 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-06-04 +date: 2024-06-05 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 5d9d23d8c5052..871ed55b6b7da 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-06-04 +date: 2024-06-05 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 a0d7cc3233257..747835841ddb9 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-06-04 +date: 2024-06-05 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 5d53b1e6edc80..e7d06203595a3 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-06-04 +date: 2024-06-05 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 16d0424321a7e..91604c9293c47 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-06-04 +date: 2024-06-05 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 febf10d5ebed7..fd50465b9f4a9 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-06-04 +date: 2024-06-05 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 9618a471eae66..9b56a2878f875 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-06-04 +date: 2024-06-05 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 aa72cf8759d0b..1c4a5c2f48de5 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-06-04 +date: 2024-06-05 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 3cced4d0ab428..a7ec2e4cf3484 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-06-04 +date: 2024-06-05 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 9e6435d856149..922ae2f0e272c 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-06-04 +date: 2024-06-05 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 b17e499115a50..fee7e84a3e301 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-06-04 +date: 2024-06-05 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 d7f980a842b03..5d22fbdcc9f94 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-06-04 +date: 2024-06-05 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 5bb5385c9211a..824691665b7ea 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-06-04 +date: 2024-06-05 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 860c4becb552f..0db8271c5a5f0 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-06-04 +date: 2024-06-05 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 13777d9768b53..db52fbc8f205c 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-06-04 +date: 2024-06-05 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 5b8e8d51824a3..7405cff6c0d2a 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-06-04 +date: 2024-06-05 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 49b06352831fc..db1c795663298 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-06-04 +date: 2024-06-05 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 2bb8265c14b56..f26385e7c02f0 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-06-04 +date: 2024-06-05 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 ee7e8217fb465..f50a0138d9b55 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-06-04 +date: 2024-06-05 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 fcd501d2dd156..6b83912b12678 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-06-04 +date: 2024-06-05 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 e5e4dd09df325..ad771681d50cc 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-06-04 +date: 2024-06-05 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 70b206d04abac..caade77662b7f 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-06-04 +date: 2024-06-05 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 7b01202a35264..0a86916b26d4c 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-06-04 +date: 2024-06-05 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 ffd3840ed6f3d..0fe2c527e34c9 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-06-04 +date: 2024-06-05 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 16a559a3f71e8..abb2deaf0913c 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-06-04 +date: 2024-06-05 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 11e2b35d9d729..7f06c25213833 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-06-04 +date: 2024-06-05 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 fdf2ba551f9e7..66ee6504c35c9 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-06-04 +date: 2024-06-05 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 0295ec6600b48..01f2d45af626b 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-06-04 +date: 2024-06-05 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 160a2ff396e44..c5c718d8f0cb5 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-06-04 +date: 2024-06-05 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 63dc7c17f9638..c8a1f89c91ee3 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-06-04 +date: 2024-06-05 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 48a248df02c02..88214c19e1757 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-06-04 +date: 2024-06-05 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 2ff22f119f171..13a272ca13826 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-06-04 +date: 2024-06-05 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 e35bfa9e0e7b2..137aeb008d79d 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-06-04 +date: 2024-06-05 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 b130b2a0c6041..522a9d33e5197 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-06-04 +date: 2024-06-05 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 0bdd287700816..5ed6a37ed3f5b 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-06-04 +date: 2024-06-05 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 533287a4e45ca..b1791db464297 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-06-04 +date: 2024-06-05 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 d22c74bec78c8..49549ccfe8ee3 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-06-04 +date: 2024-06-05 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 dfbe96c0b0273..7094be1d84a05 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-06-04 +date: 2024-06-05 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 2891d8967078c..5b8bf93add9e4 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-06-04 +date: 2024-06-05 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 a131a5b273a0c..28cff639fc30e 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-06-04 +date: 2024-06-05 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 017d4fe10c5c0..d51f32973b4ff 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-06-04 +date: 2024-06-05 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 2d446fde07793..f146263605819 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-06-04 +date: 2024-06-05 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 170838110e32c..f82a9b10888cb 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-06-04 +date: 2024-06-05 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 1f865eb4bf3b9..69268e7f5bea6 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-06-04 +date: 2024-06-05 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 507f7a57f9b64..87be5fa2ddc3c 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-06-04 +date: 2024-06-05 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 c821759313228..48b67dce6f9fe 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-06-04 +date: 2024-06-05 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 403249b152685..5486c47a62ead 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-06-04 +date: 2024-06-05 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 817fc4f601ae7..92bdf89d54a17 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-06-04 +date: 2024-06-05 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 f18f55f356bc6..02d70f12a426f 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-06-04 +date: 2024-06-05 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 f692e8ddbaac6..efba20139c497 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-06-04 +date: 2024-06-05 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 62cf629f961f0..2dcebc8f705d4 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-06-04 +date: 2024-06-05 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 f16d349ae500f..d7e81cb16b81f 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-06-04 +date: 2024-06-05 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 f5e3d5a140629..a2ed99543132c 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-06-04 +date: 2024-06-05 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 6225f120ac13c..98afbcbd9032d 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-06-04 +date: 2024-06-05 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 3f977035d2f46..26d322b6f717b 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-06-04 +date: 2024-06-05 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 0adc1dd54c9eb..91ec2e563d37f 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-06-04 +date: 2024-06-05 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 91bdfa219133b..3a4d1417757d6 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-06-04 +date: 2024-06-05 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 3d64a07f8d287..3da7120d80faa 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-06-04 +date: 2024-06-05 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 b7e0a265cca9e..74e6abb7a3837 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-06-04 +date: 2024-06-05 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 18b0eb5b5ea5b..8285479dfb7a5 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-06-04 +date: 2024-06-05 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 a8b0588f27bd5..b2a54a8831547 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-06-04 +date: 2024-06-05 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 e843e40ff293f..b568bf7a9d250 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-06-04 +date: 2024-06-05 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 afc5cb3a4a43f..ff572d075e081 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-06-04 +date: 2024-06-05 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 319afeb0de0fd..d4bd2a6eb52ce 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-06-04 +date: 2024-06-05 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 71de587344a39..2e4215ac232e8 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-06-04 +date: 2024-06-05 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 e33eecd1ac6da..8c32261f432c2 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-06-04 +date: 2024-06-05 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 3b1ee2436bb2d..21e5c93587448 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-06-04 +date: 2024-06-05 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 d641846e582d7..b6c0b8167a1da 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-06-04 +date: 2024-06-05 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 435f4ae34b463..af9aa19c3a5d0 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-06-04 +date: 2024-06-05 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 9351e0d001974..8caed749fb104 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-06-04 +date: 2024-06-05 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 5018aaad8680a..dfc236c0e90bf 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-06-04 +date: 2024-06-05 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 f166162c30ed8..810eb30ba8afa 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-06-04 +date: 2024-06-05 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 d7497b6977038..94aadceac51e7 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-06-04 +date: 2024-06-05 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 450e5a214ae86..50c618b952bd2 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-06-04 +date: 2024-06-05 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 b7c393509a4df..728fb29444dd4 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-06-04 +date: 2024-06-05 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 acc10d82f1900..1ae9288341395 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-06-04 +date: 2024-06-05 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 d61ca771f4c0b..3a84584f63be8 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-06-04 +date: 2024-06-05 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 8c79e5d5edbaf..2ea7feb3e6e13 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-06-04 +date: 2024-06-05 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 5cbad3ce85047..86d6d1c3d158a 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-06-04 +date: 2024-06-05 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 9611d831ab034..8d3fee92f0531 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-06-04 +date: 2024-06-05 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 8631d1e1dfe3b..9d94a7899c7a7 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-06-04 +date: 2024-06-05 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 fb2bae778ca1f..510af495000f5 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-06-04 +date: 2024-06-05 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 ca5851036cc16..a50930627d63b 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-06-04 +date: 2024-06-05 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 ee130d770c987..f16ade4e3aa79 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-06-04 +date: 2024-06-05 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 6d2bebc3488dd..3f1d9af8cf16d 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-06-04 +date: 2024-06-05 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 b2a0d6415a414..dc3ed71976258 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-06-04 +date: 2024-06-05 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 0b9c7aa63b0b2..512e8a5cc98be 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-06-04 +date: 2024-06-05 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 3af76a281c3ce..10a57360fb3e0 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-06-04 +date: 2024-06-05 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 1a0ad2fce2b04..1209144c00d96 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-06-04 +date: 2024-06-05 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 5c98bd42597e5..5c8f9ab7d8e97 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-06-04 +date: 2024-06-05 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 ce91309e1cdec..9404348e113a3 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-06-04 +date: 2024-06-05 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 7e04b448184b7..406bdb4117a16 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-06-04 +date: 2024-06-05 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 8844bf6baf45e..a4688633ef107 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-06-04 +date: 2024-06-05 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 6457865139442..ba5224cb2da31 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-06-04 +date: 2024-06-05 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 d8a29d7d581c6..8d7c70bfcafeb 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-06-04 +date: 2024-06-05 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 5635959ab816d..f4b9c3aae6e73 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-06-04 +date: 2024-06-05 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 b050290affb37..5f00ef37d81f8 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-06-04 +date: 2024-06-05 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 6e4e7c77e2059..d1b26ebeff3ba 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-06-04 +date: 2024-06-05 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 cc6c068f8bedf..d5c40ec06a341 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-06-04 +date: 2024-06-05 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 4b0c94ff482a2..dbfd838f4512f 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-06-04 +date: 2024-06-05 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 95631c7f2f249..03b8942888c82 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-06-04 +date: 2024-06-05 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 fece3557a9e8a..e159d96b31426 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-06-04 +date: 2024-06-05 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 0bffa2e0fb2cc..1b03974c74374 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-06-04 +date: 2024-06-05 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 0fcbcf5bd503b..a444f4d6748f0 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-06-04 +date: 2024-06-05 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 49a2c6c562baa..480e2cc306b3a 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-06-04 +date: 2024-06-05 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 50befde81f7fa..2ae100beb279b 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-06-04 +date: 2024-06-05 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 351f0049bf3e6..6476db47c8326 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-06-04 +date: 2024-06-05 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 c6e79e790f57c..f1f00a609d99d 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-06-04 +date: 2024-06-05 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 3e25d1c60c76a..1a1d42cdb6966 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-06-04 +date: 2024-06-05 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 fe59232602135..ccfc107f999c5 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-06-04 +date: 2024-06-05 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 c58c268c56524..e245b0704e48d 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-06-04 +date: 2024-06-05 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 acc97a45e4751..9a9af7001cf38 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-06-04 +date: 2024-06-05 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 ce3935d5f5f47..c92bcae9a5b5a 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-06-04 +date: 2024-06-05 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 843c449b458c0..f1a96c6840a4c 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-06-04 +date: 2024-06-05 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 ea51d69ab0404..ab53cb4aa0ccf 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-06-04 +date: 2024-06-05 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 7dd3092c80f0a..c76d477815de3 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-06-04 +date: 2024-06-05 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 2230fefb38a7e..75bb1d96b969a 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-06-04 +date: 2024-06-05 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 0547bb0349e8c..b6c34f17740aa 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-06-04 +date: 2024-06-05 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 f1cb012de3001..f9e5de0734a2a 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-06-04 +date: 2024-06-05 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 6d274cc87d066..d2bc29dc41c2a 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-06-04 +date: 2024-06-05 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 068f29f341fd6..ea711b2297d90 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-06-04 +date: 2024-06-05 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 d441c62b4aac1..edf596c32409b 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-06-04 +date: 2024-06-05 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 218005991cac0..36a685f5ab0ec 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-06-04 +date: 2024-06-05 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 9bec6da576890..6f289ebd0e7ae 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-06-04 +date: 2024-06-05 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 77b77b318f552..45bc3cfaefe84 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 52df67da36be9..d82314c4d7d42 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index a1dae2b0f9e11..966e6516441ec 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 4e29ee8c8bc2f..7ef10f4ec5c15 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 830c6124ca291..337aa76617432 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 0365e494d8f40..2136bfacd3c97 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 2c66e326b4004..74ace54ea75d1 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 6fa7da61e2650..2697b9a0db2ea 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-06-04 +date: 2024-06-05 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 273abd0348c57..75f3dfbffdb57 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-06-04 +date: 2024-06-05 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 fadcde462e683..4e69f1c6d4e48 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-06-04 +date: 2024-06-05 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 84637b4fbaa32..86ceeafe3c82c 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-06-04 +date: 2024-06-05 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 4e9bb326bf1e9..53e240cbf19c4 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-06-04 +date: 2024-06-05 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 5127b22098660..1af921f94178d 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-06-04 +date: 2024-06-05 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 52e768f06465c..173b39a085c9a 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-06-04 +date: 2024-06-05 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 74cb9faae50fa..a88979f63fb75 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-06-04 +date: 2024-06-05 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 2162245eca191..ea60b222e5486 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-06-04 +date: 2024-06-05 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 08ffa6ac374bc..300abd336b96e 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-06-04 +date: 2024-06-05 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 c4d8c10fe8ab8..3e7d3b40377a6 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-06-04 +date: 2024-06-05 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 3fd554a0323a9..6fe149edabfa1 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-06-04 +date: 2024-06-05 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 b6b449deea51d..54a91cc24402f 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-06-04 +date: 2024-06-05 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 530f8ee72c11e..7d323693b396c 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-06-04 +date: 2024-06-05 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 99c5766ec5839..b049d34d83013 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-06-04 +date: 2024-06-05 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 0f06995ecca4c..e429cfda37245 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-06-04 +date: 2024-06-05 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 4b7774f32c091..3b74723f63e0e 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-06-04 +date: 2024-06-05 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 96954980d80d5..1e2f3725851d7 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-06-04 +date: 2024-06-05 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 8ec4fd3c46e1b..dfc485abd4be6 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-06-04 +date: 2024-06-05 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 a2db6da2c92d5..ac350787ab8e7 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-06-04 +date: 2024-06-05 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 2f957b2f3a61d..5e8e8ae5ad8ea 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-06-04 +date: 2024-06-05 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 c8baa779ef6d9..c98676fe8b854 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-06-04 +date: 2024-06-05 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 d39b7eb45d612..97487c07eb1f3 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-06-04 +date: 2024-06-05 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 1c694aacb8843..827209c635284 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-06-04 +date: 2024-06-05 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 306ed0162c087..ff44272386184 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-06-04 +date: 2024-06-05 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 b5271eeb5805c..52d0a96c630ae 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-06-04 +date: 2024-06-05 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 664633c8d97ff..ef4ba383cd4cf 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-06-04 +date: 2024-06-05 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 c129ceabeedf4..dca12cc50a44d 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-06-04 +date: 2024-06-05 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 ee0a22c9f92a8..542ad1d163196 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-06-04 +date: 2024-06-05 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 92821eb905ae4..7104e5f24c812 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-06-04 +date: 2024-06-05 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 f3d7cdb44191a..9f29b4dce871c 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-06-04 +date: 2024-06-05 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 e02f4404dd1d0..e9a1b5771f4b3 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-06-04 +date: 2024-06-05 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 09c6e37a0c796..7f1c8a5d17914 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-06-04 +date: 2024-06-05 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 372d1f286746b..471b4bd02994c 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-06-04 +date: 2024-06-05 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 54847fe2c10d2..0ff7c3de0a207 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-06-04 +date: 2024-06-05 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 be7a91548bae5..76fa3dc4999c0 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-06-04 +date: 2024-06-05 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 ed3894dff4503..fa56282c7d4bd 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-06-04 +date: 2024-06-05 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 1edc9992c0523..793413695b3e5 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index efb97a4a1ae0e..59901650a5878 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 44d7ab7f8c53a..bb433a7bc37b9 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-06-04 +date: 2024-06-05 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 42a1944b87a3e..908f873291e79 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-06-04 +date: 2024-06-05 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 c81c0be064094..5331d3263d2ca 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-06-04 +date: 2024-06-05 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 ba6c59e29991e..a2e06984276b5 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-06-04 +date: 2024-06-05 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 4ea5f5cc026ad..5b2281df541fe 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-06-04 +date: 2024-06-05 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 71138c91ad267..f6298db9fe502 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-06-04 +date: 2024-06-05 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 b23947085fe94..091df034e0671 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index e0ec156decedb..d86d7368656c2 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 3c85a79ce5d37..7f16649c60e95 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-06-04 +date: 2024-06-05 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 3b7448a7bc3e1..d31fa1761b33a 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-06-04 +date: 2024-06-05 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 8ce9c56e9c982..737e7be8bacb5 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-06-04 +date: 2024-06-05 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 636ac4ac178d3..1ddc5334f12db 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-06-04 +date: 2024-06-05 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 85e347b8186bc..2bee7450a19aa 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-06-04 +date: 2024-06-05 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 d943a69f53937..2fa70663accb4 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-06-04 +date: 2024-06-05 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 6e40763ededb3..56156e751deb2 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-06-04 +date: 2024-06-05 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 42970892eaf54..c3870e4a2f269 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-06-04 +date: 2024-06-05 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 b078882fffeaa..6d4e353d7ca17 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-06-04 +date: 2024-06-05 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 8c4976201b73b..317e7f4ca94cb 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-06-04 +date: 2024-06-05 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 70072a31e504c..7f61054764b82 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-06-04 +date: 2024-06-05 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 71a5df1e80681..7250a05ad36e4 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-06-04 +date: 2024-06-05 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 ac1d795947570..83d556e764f57 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 93a06d168f2cd..7b02b984ce7bb 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index de4d567addd6c..7a4ab6376669f 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-06-04 +date: 2024-06-05 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 fdeb9dd386be5..05a5c4d730541 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-06-04 +date: 2024-06-05 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 75dcf1df12c2e..714f3d23f90f6 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-06-04 +date: 2024-06-05 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 c702583f73068..3c860342b21be 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-06-04 +date: 2024-06-05 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 3f2ada6b4f069..eb0b9e3d9bb95 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-06-04 +date: 2024-06-05 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 5c88d8956f87b..df3a9908ca90e 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-06-04 +date: 2024-06-05 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 243e0940f4ea1..cade74c3c2c95 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-06-04 +date: 2024-06-05 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 7df61de04a245..d582dcfda04d6 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-06-04 +date: 2024-06-05 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 c1b5c3ef7fb6a..dc1262938e1fd 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-06-04 +date: 2024-06-05 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 797f6d151003a..dc9598fef8099 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-06-04 +date: 2024-06-05 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 e3326c573b8c1..e3a2ac1185731 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-06-04 +date: 2024-06-05 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 2617649cdaff7..495e5f4eceb33 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-06-04 +date: 2024-06-05 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 eff62687bc1cd..f6766401f9a45 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-06-04 +date: 2024-06-05 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 1565102572ce0..826a2e015d92c 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-06-04 +date: 2024-06-05 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 a85f9f9272bb7..340b97cb50f35 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-06-04 +date: 2024-06-05 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 574a279756c37..6b9d491326ec2 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-06-04 +date: 2024-06-05 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 7b08d05929d24..012183e69c95f 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-06-04 +date: 2024-06-05 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 5cbb10e387d0a..373423e47847f 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-06-04 +date: 2024-06-05 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 854b7fba23146..dabceb1ea1608 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-06-04 +date: 2024-06-05 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 0a5ce2b816446..0f87ef6a9369b 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-06-04 +date: 2024-06-05 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 c05e6db7262aa..9f651485f2b0b 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-06-04 +date: 2024-06-05 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 210079631146e..7acc56e64569f 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-06-04 +date: 2024-06-05 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 653d4991ae495..b4d82c56b8901 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-06-04 +date: 2024-06-05 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 99b4d9c9598ae..876167ef55c62 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-06-04 +date: 2024-06-05 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 c7ae4fcfceef2..d0ca0747d828f 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-06-04 +date: 2024-06-05 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 903130838a219..f043a347ad6e1 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-06-04 +date: 2024-06-05 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 44863aa603d32..054e8409da644 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-06-04 +date: 2024-06-05 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 354164cc36ab8..b3193118a2ad3 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-06-04 +date: 2024-06-05 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 715f10ef5f9f2..6d09e5b646000 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-06-04 +date: 2024-06-05 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 486257ce26f26..25462b5124f72 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-06-04 +date: 2024-06-05 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 592ebcb45bc78..0ad429d7a47c4 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-06-04 +date: 2024-06-05 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 c2ada2fde336b..eb9f638859990 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-06-04 +date: 2024-06-05 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 4c04eb4916b56..e794f3034430b 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-06-04 +date: 2024-06-05 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.devdocs.json b/api_docs/kbn_management_settings_ids.devdocs.json index 5ddb78e79b853..d3906a812c56c 100644 --- a/api_docs/kbn_management_settings_ids.devdocs.json +++ b/api_docs/kbn_management_settings_ids.devdocs.json @@ -1659,23 +1659,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/management-settings-ids", - "id": "def-common.SECURITY_SOLUTION_ENABLE_EXPANDABLE_FLYOUT_SETTING", - "type": "string", - "tags": [], - "label": "SECURITY_SOLUTION_ENABLE_EXPANDABLE_FLYOUT_SETTING", - "description": [ - "This Kibana Advanced Setting allows users to enable/disable the Expandable Flyout" - ], - "signature": [ - "\"securitySolution:enableExpandableFlyout\"" - ], - "path": "packages/kbn-management/settings/setting_ids/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/management-settings-ids", "id": "def-common.SECURITY_SOLUTION_ENABLE_GROUPED_NAV_ID", diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 6f85622c5f5c4..d61d058956929 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 139 | 0 | 136 | 0 | +| 138 | 0 | 136 | 0 | ## Common diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 37e314eb44b38..f44ea4a9921d8 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-06-04 +date: 2024-06-05 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 b88cd0435f533..344fe3a340396 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-06-04 +date: 2024-06-05 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 a04fb90342dac..c2eea4430459a 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-06-04 +date: 2024-06-05 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 b753e3f117b77..f1aad633aaf19 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-06-04 +date: 2024-06-05 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 6dd5aadd3c274..d504314d55d07 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-06-04 +date: 2024-06-05 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 ba89747d7c753..15d76b62ed581 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-06-04 +date: 2024-06-05 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 14a05b2bcbb9a..3554304c217d9 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-06-04 +date: 2024-06-05 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 e10d7e099180f..5865cb24bf3b0 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-06-04 +date: 2024-06-05 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 4d0b553462606..d673303b475f1 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-06-04 +date: 2024-06-05 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 50d310a9bc0d5..b6203d8e0f155 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-06-04 +date: 2024-06-05 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 ae0970aea3c41..a6e57e27df44e 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-06-04 +date: 2024-06-05 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 aa2ef35916fd0..c0a8a560dc152 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-06-04 +date: 2024-06-05 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 2bc871e272dc8..efa311c6e9b00 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-06-04 +date: 2024-06-05 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 935e5eae32c4e..40a88f0dd0d36 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-06-04 +date: 2024-06-05 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 b7f8af8a66a22..4c799a558a7e8 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-06-04 +date: 2024-06-05 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 d32411e565207..f16123340b054 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-06-04 +date: 2024-06-05 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 adbaab9e40a53..d8a77b898ba13 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-06-04 +date: 2024-06-05 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 f15d7620a7981..f1a36981b2202 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-06-04 +date: 2024-06-05 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 ce84ad9f80440..7715a0687b19a 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-06-04 +date: 2024-06-05 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 06d177de15ae2..4a3e9a2105b75 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-06-04 +date: 2024-06-05 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 58823cf6b1a1b..6e0ad19a7906e 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-06-04 +date: 2024-06-05 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 f7cf28fa1db09..27245cd57556e 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-06-04 +date: 2024-06-05 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 891b9c6f8a7b5..14a809867bea5 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-06-04 +date: 2024-06-05 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 58e8e6db77fd5..b20e6fda44fcb 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-06-04 +date: 2024-06-05 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 65c32edf4851e..c0c83f836050d 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-06-04 +date: 2024-06-05 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 0ce3c444047b3..dffa3a3fa4c02 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-06-04 +date: 2024-06-05 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 7735369f1d016..09fe9abea9422 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-06-04 +date: 2024-06-05 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 7b3003eed8c68..ca597a6a268ce 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-06-04 +date: 2024-06-05 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 07a835fb6957b..353abe9a68981 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-06-04 +date: 2024-06-05 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 f2e833cb15fbf..8828855ac2d51 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-06-04 +date: 2024-06-05 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 8e3f026ad565b..1e2375b0370d1 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-06-04 +date: 2024-06-05 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 1514d2b6a1ec6..b27fa8f78b94b 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-06-04 +date: 2024-06-05 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 87e13e34826b5..c07f760c66350 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-06-04 +date: 2024-06-05 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 430f78e588efe..8c24449f2deb5 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-06-04 +date: 2024-06-05 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 8850a04ce117d..c7ecfeb10d49b 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-06-04 +date: 2024-06-05 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 5cb2e77ff2802..a78aad408ddfa 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-06-04 +date: 2024-06-05 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 7cadb4266a3cb..c373a90b0895e 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-06-04 +date: 2024-06-05 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 b92deaf1a1bf8..ee106ede7c1e5 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-06-04 +date: 2024-06-05 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 e3c5077875d42..442ca3c5e69d0 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-06-04 +date: 2024-06-05 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 8b5bd8bfa7877..307018c9ce66f 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-06-04 +date: 2024-06-05 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 b0e344bc46df8..a4c78d1bc7f87 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-06-04 +date: 2024-06-05 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 c905fd4ddad70..52a2889f36936 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-06-04 +date: 2024-06-05 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 7fb7c9941a0c3..7bc7a428cbf8a 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-06-04 +date: 2024-06-05 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 be29329400638..e40d5be6ab9b6 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-06-04 +date: 2024-06-05 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 e7d888cae4edb..ee381d12a13a5 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-06-04 +date: 2024-06-05 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 3268611d09d7f..69086d9bfc213 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-06-04 +date: 2024-06-05 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 598c93332ae77..26e31258fdd0b 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-06-04 +date: 2024-06-05 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 4a17ce1226c28..d4a18d5bec71a 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.devdocs.json b/api_docs/kbn_presentation_containers.devdocs.json index 81831f10c3eea..1568d0f556103 100644 --- a/api_docs/kbn_presentation_containers.devdocs.json +++ b/api_docs/kbn_presentation_containers.devdocs.json @@ -361,7 +361,7 @@ "text": "TrackContentfulRender" } ], - "path": "packages/presentation/presentation_containers/interfaces/track_contentful_render.ts", + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -375,7 +375,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_containers/interfaces/track_contentful_render.ts", + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1206,7 +1206,9 @@ "type": "Function", "tags": [], "label": "removePanel", - "description": [], + "description": [ + "\nRemoves a panel from the container." + ], "signature": [ "(panelId: string) => void" ], @@ -1238,7 +1240,9 @@ "type": "Function", "tags": [], "label": "canRemovePanels", - "description": [], + "description": [ + "\nDetermines whether or not a container is capable of removing panels." + ], "signature": [ "(() => boolean) | undefined" ], @@ -1254,7 +1258,9 @@ "type": "Function", "tags": [], "label": "replacePanel", - "description": [], + "description": [ + "\nReplaces a panel in the container with a new panel." + ], "signature": [ "(idToRemove: string, newPanel: ", { @@ -1310,13 +1316,33 @@ ], "returnComment": [] }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.PresentationContainer.getPanelCount", + "type": "Function", + "tags": [], + "label": "getPanelCount", + "description": [ + "\nReturns the number of panels in the container." + ], + "signature": [ + "() => number" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "@kbn/presentation-containers", "id": "def-common.PresentationContainer.children$", "type": "Object", "tags": [], "label": "children$", - "description": [], + "description": [ + "\nA publishing subject containing the child APIs of the container. Note that\nchildren are created asynchronously. This means that the children$ observable might\ncontain fewer children than the actual number of panels in the container." + ], "signature": [ "{ source: ", "Observable", @@ -1545,7 +1571,7 @@ "tags": [], "label": "TrackContentfulRender", "description": [], - "path": "packages/presentation/presentation_containers/interfaces/track_contentful_render.ts", + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1561,7 +1587,7 @@ "signature": [ "() => void" ], - "path": "packages/presentation/presentation_containers/interfaces/track_contentful_render.ts", + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -1660,6 +1686,73 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.TracksQueryPerformance", + "type": "Interface", + "tags": [], + "label": "TracksQueryPerformance", + "description": [], + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.TracksQueryPerformance.firstLoad", + "type": "boolean", + "tags": [], + "label": "firstLoad", + "description": [], + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.TracksQueryPerformance.creationStartTime", + "type": "number", + "tags": [], + "label": "creationStartTime", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.TracksQueryPerformance.creationEndTime", + "type": "number", + "tags": [], + "label": "creationEndTime", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.TracksQueryPerformance.lastLoadStartTime", + "type": "number", + "tags": [], + "label": "lastLoadStartTime", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/presentation/presentation_containers/interfaces/performance_trackers.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "enums": [], diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 72b59397f62e6..66e71b3bff34c 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.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 | |-------------------|-----------|------------------------|-----------------| -| 70 | 0 | 64 | 1 | +| 76 | 0 | 65 | 1 | ## Common diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 5cfe1e6e940a8..103701c42a297 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 6624c617d2e25..f4a95cc47e2cb 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-06-04 +date: 2024-06-05 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 68544ce818b6e..6e148fe04ec5e 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-06-04 +date: 2024-06-05 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 56d8035a9c18f..6c14bdb52f93d 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 8db17f82ba2e0..ae03c6634ae73 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 75f7ac331d362..6555bc962eacd 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-06-04 +date: 2024-06-05 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 ff0164930f51f..f5cd026d1ccf6 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-06-04 +date: 2024-06-05 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 25b64c4369887..eca3a14649ae0 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-06-04 +date: 2024-06-05 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 c57d9c3bcbc63..e887d3700a0a1 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-06-04 +date: 2024-06-05 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 8441039eb7608..1f6aa871def9e 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-06-04 +date: 2024-06-05 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 70563f79707ca..517bac5214506 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-06-04 +date: 2024-06-05 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 f8ccbf9eeb318..1f6ff143dda3c 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-06-04 +date: 2024-06-05 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 0e6c7ee6bb294..75518319fda31 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-06-04 +date: 2024-06-05 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 acf67abc205a0..dbfe238ebea39 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-06-04 +date: 2024-06-05 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 2ec5edc70869b..cc51cfca0b103 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-06-04 +date: 2024-06-05 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 b6d88f8e3aa01..3f522dea4337b 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-06-04 +date: 2024-06-05 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 b1bed6ce5e471..67e877a936706 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-06-04 +date: 2024-06-05 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 af7131d29e809..2dae98875726c 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-06-04 +date: 2024-06-05 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 4ff5ec5702d57..63c433c3afc7b 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-06-04 +date: 2024-06-05 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 87582709bfd1e..31cf1a9407b61 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-06-04 +date: 2024-06-05 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 76b1d7e286659..80da7f8bb2e85 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-06-04 +date: 2024-06-05 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 a757a5272c669..4ef75c51e8c88 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-06-04 +date: 2024-06-05 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 340e0473e66c1..010968f87653d 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-06-04 +date: 2024-06-05 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 c882d5a5f1360..2ae2cb325add6 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-06-04 +date: 2024-06-05 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 c75d6bf2d8041..b833e963ca6a5 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-06-04 +date: 2024-06-05 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 b9eb92c987f5c..6e587f33910af 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-06-04 +date: 2024-06-05 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 392ef81c16236..6fa13a08cdb41 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-06-04 +date: 2024-06-05 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 34d2a5b654f42..c4837bf0ac084 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-06-04 +date: 2024-06-05 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 2d64a5ebbceb7..5350f7213d7d5 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-06-04 +date: 2024-06-05 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 41572188cb19f..ab34dc5ce6af5 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-06-04 +date: 2024-06-05 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 32eef0fe810ea..1f90b2a663d26 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-06-04 +date: 2024-06-05 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 13302c3fd507b..f6cf002bf43fa 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-06-04 +date: 2024-06-05 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 ed044e269f4ed..955be246d9bbd 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-06-04 +date: 2024-06-05 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 dcbea6fbfcbc0..7b1f8c78f5a3f 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-06-04 +date: 2024-06-05 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 375b3b8380bf7..895ac71e0cf77 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-06-04 +date: 2024-06-05 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 34f2be6a21c62..b2bd33803034c 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-06-04 +date: 2024-06-05 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 4138b8718d36d..3e18a26df04a9 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-06-04 +date: 2024-06-05 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 fa3754e1271de..d70a659e73784 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 0058b2a44033f..59d4b3fdead40 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index c03c11d502ee8..c15d54f4973cf 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-06-04 +date: 2024-06-05 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 54177ea5f76b3..097964a3d6192 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-06-04 +date: 2024-06-05 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 e152e3ba1c8e3..76bfaf45d129c 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-06-04 +date: 2024-06-05 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 77a3ae21d5342..9137974b89ddb 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-06-04 +date: 2024-06-05 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 f9925717d160d..afae0e1eda8c2 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-06-04 +date: 2024-06-05 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 48edea46ff52c..b5fb278a0bf9f 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-06-04 +date: 2024-06-05 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 fbbf079873b23..db32a3f767b39 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-06-04 +date: 2024-06-05 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 7a7e621602751..885c1be6a569c 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-06-04 +date: 2024-06-05 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 d5d8caa7c47b1..93a8035154584 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-06-04 +date: 2024-06-05 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 b498f7f2293fd..108912e6e961a 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-06-04 +date: 2024-06-05 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 48724c039c797..fc3005bbbcbf7 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-06-04 +date: 2024-06-05 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 07b72ac0a94ac..0ec2575ddd3e6 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-06-04 +date: 2024-06-05 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 1881bc407d8ed..90d1d58eec352 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-06-04 +date: 2024-06-05 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index d423faed4f6ef..9c9be7a01c75a 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-06-04 +date: 2024-06-05 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 feae86006ef11..06066689352d2 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-06-04 +date: 2024-06-05 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 6de4cdab04abe..d9f5af2b265f4 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-06-04 +date: 2024-06-05 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 3b340c9a1e0bf..54fb8ee085ccb 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-06-04 +date: 2024-06-05 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 579598104c568..87e873eb9fb30 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-06-04 +date: 2024-06-05 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 930c9466af6d0..f515c2f59d23f 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-06-04 +date: 2024-06-05 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 8006fe3c5c51e..616b7ecc1a89e 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-06-04 +date: 2024-06-05 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 0780e67d92889..b3123547a5c67 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-06-04 +date: 2024-06-05 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 ab71f21b181f4..fc176e18e47fc 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-06-04 +date: 2024-06-05 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 e7249b40b1261..caf6cc20bf20e 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-06-04 +date: 2024-06-05 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 c97515ca78479..ec0c337f02828 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-06-04 +date: 2024-06-05 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 fc9c9ca9dfb21..f3ef3c91cb14b 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-06-04 +date: 2024-06-05 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 5ad85ce655b40..255b14e6a37ad 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-06-04 +date: 2024-06-05 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 36416aad90ecb..7774cfbe1dfc4 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-06-04 +date: 2024-06-05 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 b6d7a6ef1d604..cf5ebbec33250 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-06-04 +date: 2024-06-05 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 7b44e4529465d..25b3c44d1f964 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-06-04 +date: 2024-06-05 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 13f4fe1b5be78..1fc20de3227a6 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-06-04 +date: 2024-06-05 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 1ffb6c3631923..4077f22bb4f75 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-06-04 +date: 2024-06-05 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 ad421bb0f58cf..11a1bb7f34cc8 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-06-04 +date: 2024-06-05 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 9829f8c88a64a..9cc22fe4b6830 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-06-04 +date: 2024-06-05 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 37ae621f25c1b..bdcf770f40f55 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-06-04 +date: 2024-06-05 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 b3e854a5fd569..f733a79703eb7 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-06-04 +date: 2024-06-05 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 f986ba7fcd8da..69d197a0ed1bb 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-06-04 +date: 2024-06-05 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 b1f9a57be0a69..87a18a0190921 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-06-04 +date: 2024-06-05 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 58b716ca56db2..df32d8386246e 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-06-04 +date: 2024-06-05 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 463c20be58ad1..7185b09f85b41 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-06-04 +date: 2024-06-05 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 63fc262be2225..6354f6d5c5f91 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-06-04 +date: 2024-06-05 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 ddd4bab29696c..d52daa3c8ef49 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-06-04 +date: 2024-06-05 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 3705f2404056d..e8eb77be1bb74 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-06-04 +date: 2024-06-05 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 342dbe38787a3..846862d1d8812 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-06-04 +date: 2024-06-05 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 d506fbc2a4a28..aa1cd2df917bb 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-06-04 +date: 2024-06-05 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 bac14a33a1ccd..5d4eb4fae5157 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-06-04 +date: 2024-06-05 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 e40cebda23a69..f8e8c1dfb6c38 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-06-04 +date: 2024-06-05 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 d55875c5b6025..57b5c53721a1c 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-06-04 +date: 2024-06-05 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 2bda47f698624..10db7013af9b0 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-06-04 +date: 2024-06-05 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 8137a97da64d8..a3896a6fa6a2f 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-06-04 +date: 2024-06-05 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 77cb645f6b43f..69fab0852d591 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-06-04 +date: 2024-06-05 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 5500cb7e41d40..f9bcda515c979 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-06-04 +date: 2024-06-05 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 5d29035f61c39..d66947a0b9714 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-06-04 +date: 2024-06-05 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 895edeacf68f6..caa80e083bb77 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-06-04 +date: 2024-06-05 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 cf715bdb36593..034d01ebca23c 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-06-04 +date: 2024-06-05 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 c397aeb92b2e4..3d5d599ee6ced 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-06-04 +date: 2024-06-05 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 94d38dfd54782..b6f9058f3b778 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-06-04 +date: 2024-06-05 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 e0761e759b837..ed2c97e8da4f9 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-06-04 +date: 2024-06-05 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 a4e9f91351140..58f8c54f328ba 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-06-04 +date: 2024-06-05 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 f4d5968b0a337..2caab7a2a12d0 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-06-04 +date: 2024-06-05 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 0a5164fd5c76a..c6d49e80e5461 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-06-04 +date: 2024-06-05 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 90690632183a4..823944a57275b 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-06-04 +date: 2024-06-05 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 d08f0722c6151..4f506ab58e258 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-06-04 +date: 2024-06-05 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 eb5d02f99ddba..7d982fbf2bb8d 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-06-04 +date: 2024-06-05 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 9bc94feb14a8b..104580929b8f7 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-06-04 +date: 2024-06-05 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 c328cbabcb744..383cc11bbd81d 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-06-04 +date: 2024-06-05 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 17a19b9f7cfc0..debc17d38d10d 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-06-04 +date: 2024-06-05 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 ebb38aabd6c25..ee9ed111e3c57 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-06-04 +date: 2024-06-05 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 f1d9b5815ae8b..469d9ff815d8d 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-06-04 +date: 2024-06-05 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 6664130e78292..8e290a90cf07a 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-06-04 +date: 2024-06-05 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 2966b3db82372..1143741ced19b 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-06-04 +date: 2024-06-05 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 6a94cc7c53360..4155596c2b2a3 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-06-04 +date: 2024-06-05 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 9afbe4446698c..776ac92a9b8ff 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-06-04 +date: 2024-06-05 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 eed75a199e0ed..a414385d506b6 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-06-04 +date: 2024-06-05 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 4c255fc80b4a8..d57c34be2a147 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index ca31c85679193..ad2322745e9c8 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-06-04 +date: 2024-06-05 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 9c7b1b93cf9de..0f38e027bb897 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-06-04 +date: 2024-06-05 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 f92ede7b57f2d..16d19e57dbb1a 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-06-04 +date: 2024-06-05 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 19bf3c52e3afc..3569af80b4b14 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-06-04 +date: 2024-06-05 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 d2cb6ca687029..7bbb7daa277a0 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-06-04 +date: 2024-06-05 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 a55c69027b05b..dc3a9759b2e01 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-06-04 +date: 2024-06-05 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 58ab6a9175848..b3f503c6c36c8 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-06-04 +date: 2024-06-05 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 56ad2884c9809..ce64181201138 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-06-04 +date: 2024-06-05 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 49e9af52900d2..6294212c6d421 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-06-04 +date: 2024-06-05 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 8b4e27598ec1a..6ee33bab28064 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-06-04 +date: 2024-06-05 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 883ac5a574579..f70e18da66fca 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-06-04 +date: 2024-06-05 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 e988cb9111b78..c2c7c55244ff6 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-06-04 +date: 2024-06-05 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 32586ac126066..7d4530dac42ae 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-06-04 +date: 2024-06-05 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 37c1287066f9b..f526e33aa9316 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-06-04 +date: 2024-06-05 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 8ef5eabc1ff01..db0387fdcd34b 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index c5ce9c4b89390..47a903b0ef8bd 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-06-04 +date: 2024-06-05 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 c7883dd67c5cf..3b19c857dfbd7 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-06-04 +date: 2024-06-05 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 f003d7c103466..d33c0f4be566d 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-06-04 +date: 2024-06-05 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 c8c59dfc253e3..e68c484514205 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-06-04 +date: 2024-06-05 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 af8227058ba14..d3f9f5c958c3c 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-06-04 +date: 2024-06-05 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 46e899eae011f..02def6fdbb576 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-06-04 +date: 2024-06-05 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 f3bc90bb13cb3..6262ca7f66f89 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-06-04 +date: 2024-06-05 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 a0186235a7a8f..649b219f409a7 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-06-04 +date: 2024-06-05 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 12b3f70e5d8c4..75d27212791d8 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-06-04 +date: 2024-06-05 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 4cecac96ef7b8..bfcb80d09fb71 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-06-04 +date: 2024-06-05 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 94e9edba2c556..be9fc53c1affe 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-06-04 +date: 2024-06-05 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 7c02ca9c037fa..7cf4a636e2c78 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-06-04 +date: 2024-06-05 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 3a78c867a5933..3511c9091e8e6 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-06-04 +date: 2024-06-05 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 ff8b8b83a4130..7e61b2f257d6b 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-06-04 +date: 2024-06-05 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 a2994f0efc73d..dcd6b37837f12 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-06-04 +date: 2024-06-05 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 0254c2e191923..3ee7b96ae9940 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-06-04 +date: 2024-06-05 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 4eb77d9b2450a..49e7b8a7b2c00 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-06-04 +date: 2024-06-05 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 7eb62236f89ab..c0ea25baf65c0 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-06-04 +date: 2024-06-05 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 2a93666e7d5dc..8c320f8c20ca8 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-06-04 +date: 2024-06-05 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 62b4f53dc3d85..e293e63a6c3b6 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-06-04 +date: 2024-06-05 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 f94119037f13a..4991fdc62d5e9 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-06-04 +date: 2024-06-05 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 4af6dfa240796..492e6198051e6 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-06-04 +date: 2024-06-05 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 73c0fd38181b8..7bee2d2cc03a8 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-06-04 +date: 2024-06-05 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 5c0a387a3a4b3..fea55f92c382a 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-06-04 +date: 2024-06-05 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 d5e111d88c9e1..f32cdd93d56f6 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-06-04 +date: 2024-06-05 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 7d13cfcb77fc1..4bfd5d971c5c9 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-06-04 +date: 2024-06-05 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 dd2c454636094..22355597f3209 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-06-04 +date: 2024-06-05 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 4106c89d16aaf..00b908faf787c 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-06-04 +date: 2024-06-05 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 dacf1a7d516ed..7dc292a3ceec0 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index e3863f9840afa..1949457c88114 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 822ad7ef859f5..e9116222e2aa3 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-06-04 +date: 2024-06-05 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 39d5da75d1a74..3d1aed2478b5f 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-06-04 +date: 2024-06-05 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 13b2b23fd3cc7..b6810c1d8f168 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-06-04 +date: 2024-06-05 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 9568d3a987895..53fdb915b53d6 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-06-04 +date: 2024-06-05 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 d42771ec6d16c..b2fcdc5f14cf7 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-06-04 +date: 2024-06-05 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 3c5517e607752..3131d2446e044 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-06-04 +date: 2024-06-05 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 d37441d295689..50c831ae03816 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-06-04 +date: 2024-06-05 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 95ba3fc6c3bf3..3e96e8cfd14cd 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-06-04 +date: 2024-06-05 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 dacb914d39fd6..0472b0d4965fb 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-06-04 +date: 2024-06-05 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 d255ead74837a..681a181a440b0 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-06-04 +date: 2024-06-05 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 818f64429f02f..1dff1f3b065bf 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-06-04 +date: 2024-06-05 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 3e8b44a7caa0b..93f3061807fe7 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-06-04 +date: 2024-06-05 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 74eb10c72c657..c7c7bfd43ddad 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-06-04 +date: 2024-06-05 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 94eccc7b8e00c..662ed6fc18339 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-06-04 +date: 2024-06-05 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 4f782560a945d..dc6778b98dc74 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-06-04 +date: 2024-06-05 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 7238458b1cbd3..a43fe3ac9a1c7 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-06-04 +date: 2024-06-05 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 603f447b04508..7ef35ead46e3e 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-06-04 +date: 2024-06-05 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 bb022b9fc2818..c88b6dab9b019 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-06-04 +date: 2024-06-05 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 1b77d6f6561ec..629f46660d6cb 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-06-04 +date: 2024-06-05 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 fbedbb55cd24a..330f07cd79ae7 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-06-04 +date: 2024-06-05 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 cdbc1d35c1fc3..0474530148e91 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-06-04 +date: 2024-06-05 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 1583be3436896..32142fa41bcdd 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-06-04 +date: 2024-06-05 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 c1ddf3e633355..eadc32d1e24ef 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-06-04 +date: 2024-06-05 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 df4bd9986df52..6063c56fb8a41 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48663 | 239 | 37161 | 1871 | +| 48698 | 239 | 37188 | 1871 | ## Plugin Directory @@ -55,7 +55,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 116 | 0 | 113 | 13 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 120 | 0 | 116 | 13 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3194 | 31 | 2585 | 24 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | @@ -71,7 +71,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A stateful layer to register shared features and provide an access point to discover without a direct dependency | 16 | 0 | 15 | 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 | 46 | 0 | 32 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 554 | 1 | 444 | 8 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 556 | 1 | 446 | 8 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | @@ -99,7 +99,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 84 | 0 | 84 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 0 | 2 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1323 | 5 | 1202 | 69 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1329 | 5 | 1208 | 69 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -238,7 +238,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 27 | 3 | 27 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 5 | 0 | 5 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 23 | 0 | 22 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 161 | 0 | 161 | 0 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 179 | 0 | 176 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 33 | 0 | 33 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 116 | 0 | 104 | 3 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 73 | 0 | 73 | 2 | @@ -542,7 +542,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 23 | 0 | 7 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 2 | 3 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 45 | 0 | 0 | 0 | -| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 139 | 0 | 136 | 0 | +| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 138 | 0 | 136 | 0 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 88 | 0 | 10 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 56 | 0 | 6 | 0 | @@ -591,7 +591,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 0 | 0 | | | [@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) | - | 70 | 0 | 64 | 1 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 76 | 0 | 65 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 204 | 0 | 169 | 5 | | | [@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 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 49fc72f2e3971..e99b5a6cf8533 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-06-04 +date: 2024-06-05 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 56de8884b7c30..c590b2e2a1a8f 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-06-04 +date: 2024-06-05 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 71eb43fa2bf59..91e23a57ca5d5 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-06-04 +date: 2024-06-05 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 35439b21b6924..421289b4436be 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-06-04 +date: 2024-06-05 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 a301cc4b288b8..2caf7df103dd1 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-06-04 +date: 2024-06-05 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 832c2a0a7a3d8..a021a59609769 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-06-04 +date: 2024-06-05 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 c014db72963d2..4991ece3f6140 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-06-04 +date: 2024-06-05 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 7a48328fdf9ec..1b17933d6d349 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-06-04 +date: 2024-06-05 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 a68ae9582e631..61f6a51553861 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-06-04 +date: 2024-06-05 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 ed184b117b530..098577b3aea4c 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-06-04 +date: 2024-06-05 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 79b85027a872a..814fa0fe40572 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-06-04 +date: 2024-06-05 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 e9dc040afc568..ed76398f81e51 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-06-04 +date: 2024-06-05 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 a7698dd7c3e66..c867b80c5ee03 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-06-04 +date: 2024-06-05 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 8ab80c321153a..1741a9c76ef81 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-06-04 +date: 2024-06-05 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 49899f3b26b6b..3c34d8b864a77 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-06-04 +date: 2024-06-05 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 81adee9a2860f..6b8ed2f1ed387 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-06-04 +date: 2024-06-05 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 7b95c816ca250..f8eeb86b80c7e 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-06-04 +date: 2024-06-05 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 66785e44debea..bb28a8a9deb1f 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-06-04 +date: 2024-06-05 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 82351bc02e286..c6faebf09cb5c 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-06-04 +date: 2024-06-05 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 91e613c57d9f7..c115a95736e13 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-06-04 +date: 2024-06-05 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 e6bc9204f407a..9ddb43e306d93 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-06-04 +date: 2024-06-05 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 e23e3cae4b2fd..362a1a61e51eb 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3071,7 +3071,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3247,7 +3247,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3313,7 +3313,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 0dd6df84b3077..97639944c4515 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index e5d04ae6b556a..259354a48343b 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-06-04 +date: 2024-06-05 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 2dbb3f871c840..470ba9d520dc8 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-06-04 +date: 2024-06-05 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 280a7751c15e5..9493f6ff6eab2 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-06-04 +date: 2024-06-05 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 022a89830b987..580aaf78fdfbd 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-06-04 +date: 2024-06-05 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 2a567594b6bea..6f7d93d0a85cf 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-06-04 +date: 2024-06-05 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 5f9cee0d197e4..32d004842f302 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-06-04 +date: 2024-06-05 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 83ea1ecbe8ecb..9ef7b2b5f2be2 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-06-04 +date: 2024-06-05 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 9ed2c6af9ded0..fa326f9e3fe77 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-06-04 +date: 2024-06-05 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 19873ac479b89..f0b8f83b4e5fd 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-06-04 +date: 2024-06-05 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 71534892eaeab..8692e1a2ce5c1 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-06-04 +date: 2024-06-05 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 64a6f6689affe..4d001f66c67e0 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-06-04 +date: 2024-06-05 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 34f0ce2c7f6b3..6afe061d59814 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-06-04 +date: 2024-06-05 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 5bc5e55948a7d..6f81c55078132 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-06-04 +date: 2024-06-05 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 6ff7cb029267c..3e52100abf669 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-06-04 +date: 2024-06-05 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 2948f7a2c0b70..32a736453b595 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-06-04 +date: 2024-06-05 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 9f9f68e082c98..6dd304982263f 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-06-04 +date: 2024-06-05 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 08e984131d364..29501507ccf1e 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-06-04 +date: 2024-06-05 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 623d4907c0b66..f4a5c553f1d96 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-06-04 +date: 2024-06-05 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 18fccff1df096..a9a1d696e7db6 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-06-04 +date: 2024-06-05 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 e16099051ee69..fadd402e39b22 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-06-04 +date: 2024-06-05 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 053a25eeadb87..c2d4e0630be28 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-06-04 +date: 2024-06-05 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 62c5ff30f344f..63fd71211ef36 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-06-04 +date: 2024-06-05 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 8e9c130946d1f..d7f47a4c5f758 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-06-04 +date: 2024-06-05 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 15401bfddd611..85b26a0d12782 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-06-04 +date: 2024-06-05 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 892e1f2454b3c..1bac1f4aa3d0e 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-06-04 +date: 2024-06-05 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 87b948582d9de..9cfa9da3d0b96 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-06-04 +date: 2024-06-05 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 a64c2979a564c..9d91eb5d792b7 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-06-04 +date: 2024-06-05 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 2b6b1b59fb118..7a5fef5e9cda4 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-06-04 +date: 2024-06-05 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 6ff011970c798..bbca679582ce2 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-06-04 +date: 2024-06-05 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 a398871daa668..7b550c54a118c 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-06-04 +date: 2024-06-05 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 53ce5f03606ab..d1dff752504b5 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-06-04 +date: 2024-06-05 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 d46e89f1f085e..b665527257e47 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-06-04 +date: 2024-06-05 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 0a7f3c6c6891c..b96cc6f0908d4 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-06-04 +date: 2024-06-05 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 5826f50b834b7..3bb1016e612fe 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-06-04 +date: 2024-06-05 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 0b9b3054f0efc..6ccb0cf1166df 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-06-04 +date: 2024-06-05 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 45d97506e4f8d..0038c2988eee9 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-06-04 +date: 2024-06-05 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 558d8755518f3..8ba2473615f86 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-06-04 +date: 2024-06-05 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 365db00290378..deae079852c3b 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-06-04 +date: 2024-06-05 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 54cb1d0d69c55..fc9be06a2d820 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-06-04 +date: 2024-06-05 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 1bbc4ad14065c..6905810c1c5d0 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-06-04 +date: 2024-06-05 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 75f05bb802217..1a2d9a75c4cdf 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-06-04 +date: 2024-06-05 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 f33f110da39ac..7a21b41f684fa 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-06-04 +date: 2024-06-05 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 ab71f47a35e3d..d72780746a17b 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-06-04 +date: 2024-06-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 7bb934b0bf46f02427fe0c5005b675fd995ecb12 Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Wed, 5 Jun 2024 09:13:01 +0200 Subject: [PATCH 60/82] [Security Solution][Sourcerer] Extract sourcerer init hook (#184758) No visual changes, just extracted sourcerer init hook to a separate file. --- .../public/app/home/index.tsx | 7 +- .../{index.test.tsx => hooks.test.tsx} | 3 +- .../public/sourcerer/containers/index.tsx | 377 +----------------- .../containers/use_init_sourcerer.tsx | 373 +++++++++++++++++ 4 files changed, 383 insertions(+), 377 deletions(-) rename x-pack/plugins/security_solution/public/sourcerer/containers/{index.test.tsx => hooks.test.tsx} (99%) create mode 100644 x-pack/plugins/security_solution/public/sourcerer/containers/use_init_sourcerer.tsx diff --git a/x-pack/plugins/security_solution/public/app/home/index.tsx b/x-pack/plugins/security_solution/public/app/home/index.tsx index 7053d2c16aa70..1d7b8a562e2b4 100644 --- a/x-pack/plugins/security_solution/public/app/home/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/index.tsx @@ -12,11 +12,7 @@ import { DragDropContextWrapper } from '../../common/components/drag_and_drop/dr import { SecuritySolutionAppWrapper } from '../../common/components/page'; import { HelpMenu } from '../../common/components/help_menu'; -import { - useInitSourcerer, - getScopeFromPath, - useSourcererDataView, -} from '../../sourcerer/containers'; +import { getScopeFromPath, useSourcererDataView } from '../../sourcerer/containers'; import { GlobalHeader } from './global_header'; import { ConsoleManager } from '../../management/components/console/components/console_manager'; @@ -29,6 +25,7 @@ import { useUpgradeSecurityPackages } from '../../detection_engine/rule_manageme import { useSetupDetectionEngineHealthApi } from '../../detection_engine/rule_monitoring'; import { TopValuesPopover } from '../components/top_values_popover/top_values_popover'; import { AssistantOverlay } from '../../assistant/overlay'; +import { useInitSourcerer } from '../../sourcerer/containers/use_init_sourcerer'; interface HomePageProps { children: React.ReactNode; diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/index.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx similarity index 99% rename from x-pack/plugins/security_solution/public/sourcerer/containers/index.test.tsx rename to x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx index c9b180a7fc41e..db882a9486f80 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/index.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx @@ -10,7 +10,7 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { waitFor } from '@testing-library/react'; import { Provider } from 'react-redux'; -import { getScopeFromPath, useInitSourcerer, useSourcererDataView } from '.'; +import { getScopeFromPath, useSourcererDataView } from '.'; import { mockPatterns } from './mocks'; import type { RouteSpyState } from '../../common/utils/route/types'; import { @@ -31,6 +31,7 @@ import * as source from '../../common/containers/source/use_data_view'; import { sourcererActions } from '../store'; import { useInitializeUrlParam, useUpdateUrlParam } from '../../common/utils/global_query_string'; import { createSourcererDataView } from './create_sourcerer_data_view'; +import { useInitSourcerer } from './use_init_sourcerer'; const mockRouteSpy: RouteSpyState = { pageName: SecurityPageName.overview, diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx index 7eed9e569a700..8e67aa0ed2933 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx @@ -5,20 +5,12 @@ * 2.0. */ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { i18n } from '@kbn/i18n'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useSelector } from 'react-redux'; import { matchPath } from 'react-router-dom'; -import { sourcererActions, sourcererSelectors } from '../store'; -import type { - SelectedDataView, - SourcererDataView, - SourcererUrlState, - RunTimeMappings, -} from '../store/model'; +import { sourcererSelectors } from '../store'; +import type { SelectedDataView, SourcererDataView, RunTimeMappings } from '../store/model'; import { SourcererScopeName } from '../store/model'; -import { useUserInfo } from '../../detections/components/user_info'; -import { timelineSelectors } from '../../timelines/store'; import { ALERTS_PATH, HOSTS_PATH, @@ -29,368 +21,11 @@ import { CASES_PATH, DATA_QUALITY_PATH, } from '../../../common/constants'; -import { TimelineId } from '../../../common/types'; -import { useDeepEqualSelector } from '../../common/hooks/use_selector'; -import { checkIfIndicesExist, getScopePatternListSelection } from '../store/helpers'; -import { useAppToasts } from '../../common/hooks/use_app_toasts'; -import { createSourcererDataView } from './create_sourcerer_data_view'; -import { - getDataViewStateFromIndexFields, - useDataView, -} from '../../common/containers/source/use_data_view'; +import { checkIfIndicesExist } from '../store/helpers'; +import { getDataViewStateFromIndexFields } from '../../common/containers/source/use_data_view'; import { useFetchIndex } from '../../common/containers/source'; import type { State } from '../../common/store/types'; -import { useInitializeUrlParam, useUpdateUrlParam } from '../../common/utils/global_query_string'; -import { URL_PARAM_KEY } from '../../common/hooks/use_url_state'; import { sortWithExcludesAtEnd } from '../../../common/utils/sourcerer'; -import { useKibana } from '../../common/lib/kibana'; - -export const useInitSourcerer = ( - scopeId: SourcererScopeName.default | SourcererScopeName.detections = SourcererScopeName.default -) => { - const dispatch = useDispatch(); - const { - data: { dataViews }, - } = useKibana().services; - const abortCtrl = useRef(new AbortController()); - const initialTimelineSourcerer = useRef(true); - const initialDetectionSourcerer = useRef(true); - const { loading: loadingSignalIndex, isSignalIndexExists, signalIndexName } = useUserInfo(); - const updateUrlParam = useUpdateUrlParam(URL_PARAM_KEY.sourcerer); - - const signalIndexNameSourcerer = useSelector(sourcererSelectors.signalIndexName); - const defaultDataView = useSelector(sourcererSelectors.defaultDataView); - const { addError, addWarning } = useAppToasts(); - - useEffect(() => { - if (defaultDataView.error != null) { - addWarning({ - title: i18n.translate('xpack.securitySolution.sourcerer.permissions.title', { - defaultMessage: 'Write role required to generate data', - }), - text: i18n.translate('xpack.securitySolution.sourcerer.permissions.toastMessage', { - defaultMessage: - 'Users with write permission need to access the Elastic Security app to initialize the app source data.', - }), - }); - } - }, [addWarning, defaultDataView.error]); - - const getTimelineSelector = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []); - const activeTimeline = useDeepEqualSelector((state) => - getTimelineSelector(state, TimelineId.active) - ); - - const scopeDataViewId = useSelector((state: State) => { - return sourcererSelectors.sourcererScopeSelectedDataViewId(state, scopeId); - }); - const selectedPatterns = useSelector((state: State) => { - return sourcererSelectors.sourcererScopeSelectedPatterns(state, scopeId); - }); - const missingPatterns = useSelector((state: State) => { - return sourcererSelectors.sourcererScopeMissingPatterns(state, scopeId); - }); - - const kibanaDataViews = useSelector(sourcererSelectors.kibanaDataViews); - const timelineDataViewId = useSelector((state: State) => { - return sourcererSelectors.sourcererScopeSelectedDataViewId(state, SourcererScopeName.timeline); - }); - const timelineSelectedPatterns = useSelector((state: State) => { - return sourcererSelectors.sourcererScopeSelectedPatterns(state, SourcererScopeName.timeline); - }); - const timelineMissingPatterns = useSelector((state: State) => { - return sourcererSelectors.sourcererScopeMissingPatterns(state, SourcererScopeName.timeline); - }); - const timelineSelectedDataView = useMemo(() => { - return kibanaDataViews.find((dataView) => dataView.id === timelineDataViewId); - }, [kibanaDataViews, timelineDataViewId]); - - const { indexFieldsSearch } = useDataView(); - - const onInitializeUrlParam = useCallback( - (initialState: SourcererUrlState | null) => { - // Initialize the store with value from UrlParam. - if (initialState != null) { - (Object.keys(initialState) as SourcererScopeName[]).forEach((scope) => { - if ( - !(scope === SourcererScopeName.default && scopeId === SourcererScopeName.detections) - ) { - dispatch( - sourcererActions.setSelectedDataView({ - id: scope, - selectedDataViewId: initialState[scope]?.id ?? null, - selectedPatterns: initialState[scope]?.selectedPatterns ?? [], - }) - ); - } - }); - } else { - // Initialize the UrlParam with values from the store. - // It isn't strictly necessary but I am keeping it for compatibility with the previous implementation. - if (scopeDataViewId) { - updateUrlParam({ - [SourcererScopeName.default]: { - id: scopeDataViewId, - selectedPatterns, - }, - }); - } - } - }, - [dispatch, scopeDataViewId, scopeId, selectedPatterns, updateUrlParam] - ); - - useInitializeUrlParam(URL_PARAM_KEY.sourcerer, onInitializeUrlParam); - - /* - * Note for future engineer: - * we changed the logic to not fetch all the index fields for every data view on the loading of the app - * because user can have a lot of them and it can slow down the loading of the app - * and maybe blow up the memory of the browser. We decided to load this data view on demand, - * we know that will only have to load this dataview on default and timeline scope. - * We will use two conditions to see if we need to fetch and initialize the dataview selected. - * First, we will make sure that we did not already fetch them by using `searchedIds` - * and then we will init them if selectedPatterns and missingPatterns are empty. - */ - const searchedIds = useRef([]); - useEffect(() => { - const activeDataViewIds = [...new Set([scopeDataViewId, timelineDataViewId])]; - activeDataViewIds.forEach((id, i) => { - if (id != null && id.length > 0 && !searchedIds.current.includes(id)) { - searchedIds.current = [...searchedIds.current, id]; - - const currentScope = i === 0 ? SourcererScopeName.default : SourcererScopeName.timeline; - - const needToBeInit = - id === scopeDataViewId - ? selectedPatterns.length === 0 && missingPatterns.length === 0 - : timelineDataViewId === id - ? timelineMissingPatterns.length === 0 && - timelineSelectedDataView?.patternList.length === 0 - : false; - - indexFieldsSearch({ - dataViewId: id, - scopeId: currentScope, - needToBeInit, - ...(needToBeInit && currentScope === SourcererScopeName.timeline - ? { - skipScopeUpdate: timelineSelectedPatterns.length > 0, - } - : {}), - }); - } - }); - }, [ - indexFieldsSearch, - missingPatterns.length, - scopeDataViewId, - selectedPatterns.length, - timelineDataViewId, - timelineMissingPatterns.length, - timelineSelectedDataView, - timelineSelectedPatterns.length, - ]); - - // Related to timeline - useEffect(() => { - if ( - !loadingSignalIndex && - signalIndexName != null && - signalIndexNameSourcerer == null && - (activeTimeline == null || activeTimeline.savedObjectId == null) && - initialTimelineSourcerer.current && - defaultDataView.id.length > 0 - ) { - initialTimelineSourcerer.current = false; - dispatch( - sourcererActions.setSelectedDataView({ - id: SourcererScopeName.timeline, - selectedDataViewId: defaultDataView.id, - selectedPatterns: getScopePatternListSelection( - defaultDataView, - SourcererScopeName.timeline, - signalIndexName, - true - ), - }) - ); - dispatch( - sourcererActions.setSelectedDataView({ - id: SourcererScopeName.analyzer, - selectedDataViewId: defaultDataView.id, - selectedPatterns: getScopePatternListSelection( - defaultDataView, - SourcererScopeName.analyzer, - signalIndexName, - true - ), - }) - ); - } else if ( - signalIndexNameSourcerer != null && - (activeTimeline == null || activeTimeline.savedObjectId == null) && - initialTimelineSourcerer.current && - defaultDataView.id.length > 0 - ) { - initialTimelineSourcerer.current = false; - dispatch( - sourcererActions.setSelectedDataView({ - id: SourcererScopeName.timeline, - selectedDataViewId: defaultDataView.id, - selectedPatterns: getScopePatternListSelection( - defaultDataView, - SourcererScopeName.timeline, - signalIndexNameSourcerer, - true - ), - }) - ); - dispatch( - sourcererActions.setSelectedDataView({ - id: SourcererScopeName.analyzer, - selectedDataViewId: defaultDataView.id, - selectedPatterns: getScopePatternListSelection( - defaultDataView, - SourcererScopeName.analyzer, - signalIndexNameSourcerer, - true - ), - }) - ); - } - }, [ - activeTimeline, - defaultDataView, - dispatch, - loadingSignalIndex, - signalIndexName, - signalIndexNameSourcerer, - ]); - const { dataViewId } = useSourcererDataView(scopeId); - - const updateSourcererDataView = useCallback( - (newSignalsIndex: string) => { - const asyncSearch = async (newPatternList: string[]) => { - abortCtrl.current = new AbortController(); - - dispatch(sourcererActions.setSourcererScopeLoading({ loading: true })); - - try { - const response = await createSourcererDataView({ - body: { patternList: newPatternList }, - signal: abortCtrl.current.signal, - dataViewService: dataViews, - dataViewId, - }); - - if (response?.defaultDataView.patternList.includes(newSignalsIndex)) { - // first time signals is defined and validated in the sourcerer - // redo indexFieldsSearch - indexFieldsSearch({ dataViewId: response.defaultDataView.id }); - dispatch(sourcererActions.setSourcererDataViews(response)); - } - dispatch(sourcererActions.setSourcererScopeLoading({ loading: false })); - } catch (err) { - if (err.name === 'AbortError') { - // the fetch was canceled, we don't need to do anything about it - } else { - addError(err, { - title: i18n.translate('xpack.securitySolution.sourcerer.error.title', { - defaultMessage: 'Error updating Security Data View', - }), - toastMessage: i18n.translate('xpack.securitySolution.sourcerer.error.toastMessage', { - defaultMessage: 'Refresh the page', - }), - }); - } - dispatch(sourcererActions.setSourcererScopeLoading({ loading: false })); - } - }; - - if (defaultDataView.title.indexOf(newSignalsIndex) === -1) { - abortCtrl.current.abort(); - asyncSearch([...defaultDataView.title.split(','), newSignalsIndex]); - } - }, - [defaultDataView.title, dispatch, dataViews, dataViewId, indexFieldsSearch, addError] - ); - - const onSignalIndexUpdated = useCallback(() => { - if ( - !loadingSignalIndex && - signalIndexName != null && - signalIndexNameSourcerer == null && - defaultDataView.id.length > 0 - ) { - updateSourcererDataView(signalIndexName); - dispatch(sourcererActions.setSignalIndexName({ signalIndexName })); - } - }, [ - defaultDataView.id.length, - dispatch, - loadingSignalIndex, - signalIndexName, - signalIndexNameSourcerer, - updateSourcererDataView, - ]); - - useEffect(() => { - onSignalIndexUpdated(); - // because we only want onSignalIndexUpdated to run when signalIndexName updates, - // but we want to know about the updates from the dependencies of onSignalIndexUpdated - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [signalIndexName]); - - // Related to the detection page - useEffect(() => { - if ( - scopeId === SourcererScopeName.detections && - isSignalIndexExists && - signalIndexName != null && - initialDetectionSourcerer.current && - defaultDataView.id.length > 0 - ) { - initialDetectionSourcerer.current = false; - dispatch( - sourcererActions.setSelectedDataView({ - id: SourcererScopeName.detections, - selectedDataViewId: defaultDataView.id, - selectedPatterns: getScopePatternListSelection( - defaultDataView, - SourcererScopeName.detections, - signalIndexName, - true - ), - }) - ); - } else if ( - scopeId === SourcererScopeName.detections && - signalIndexNameSourcerer != null && - initialTimelineSourcerer.current && - defaultDataView.id.length > 0 - ) { - initialDetectionSourcerer.current = false; - sourcererActions.setSelectedDataView({ - id: SourcererScopeName.detections, - selectedDataViewId: defaultDataView.id, - selectedPatterns: getScopePatternListSelection( - defaultDataView, - SourcererScopeName.detections, - signalIndexNameSourcerer, - true - ), - }); - } - }, [ - defaultDataView, - dispatch, - isSignalIndexExists, - scopeId, - signalIndexName, - signalIndexNameSourcerer, - ]); -}; export const useSourcererDataView = ( scopeId: SourcererScopeName = SourcererScopeName.default diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/use_init_sourcerer.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/use_init_sourcerer.tsx new file mode 100644 index 0000000000000..4bf8de8c74862 --- /dev/null +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/use_init_sourcerer.tsx @@ -0,0 +1,373 @@ +/* + * 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 { useCallback, useEffect, useMemo, useRef } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { sourcererActions, sourcererSelectors } from '../store'; +import type { SourcererUrlState } from '../store/model'; +import { SourcererScopeName } from '../store/model'; +import { useUserInfo } from '../../detections/components/user_info'; +import { timelineSelectors } from '../../timelines/store'; +import { TimelineId } from '../../../common/types'; +import { useDeepEqualSelector } from '../../common/hooks/use_selector'; +import { getScopePatternListSelection } from '../store/helpers'; +import { useAppToasts } from '../../common/hooks/use_app_toasts'; +import { createSourcererDataView } from './create_sourcerer_data_view'; +import { useDataView } from '../../common/containers/source/use_data_view'; +import type { State } from '../../common/store/types'; +import { useInitializeUrlParam, useUpdateUrlParam } from '../../common/utils/global_query_string'; +import { URL_PARAM_KEY } from '../../common/hooks/use_url_state'; +import { useKibana } from '../../common/lib/kibana'; +import { useSourcererDataView } from '.'; + +export const useInitSourcerer = ( + scopeId: SourcererScopeName.default | SourcererScopeName.detections = SourcererScopeName.default +) => { + const dispatch = useDispatch(); + const { + data: { dataViews }, + } = useKibana().services; + const abortCtrl = useRef(new AbortController()); + const initialTimelineSourcerer = useRef(true); + const initialDetectionSourcerer = useRef(true); + const { loading: loadingSignalIndex, isSignalIndexExists, signalIndexName } = useUserInfo(); + const updateUrlParam = useUpdateUrlParam(URL_PARAM_KEY.sourcerer); + + const signalIndexNameSourcerer = useSelector(sourcererSelectors.signalIndexName); + const defaultDataView = useSelector(sourcererSelectors.defaultDataView); + const { addError, addWarning } = useAppToasts(); + + useEffect(() => { + if (defaultDataView.error != null) { + addWarning({ + title: i18n.translate('xpack.securitySolution.sourcerer.permissions.title', { + defaultMessage: 'Write role required to generate data', + }), + text: i18n.translate('xpack.securitySolution.sourcerer.permissions.toastMessage', { + defaultMessage: + 'Users with write permission need to access the Elastic Security app to initialize the app source data.', + }), + }); + } + }, [addWarning, defaultDataView.error]); + + const getTimelineSelector = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []); + const activeTimeline = useDeepEqualSelector((state) => + getTimelineSelector(state, TimelineId.active) + ); + + const scopeDataViewId = useSelector((state: State) => { + return sourcererSelectors.sourcererScopeSelectedDataViewId(state, scopeId); + }); + const selectedPatterns = useSelector((state: State) => { + return sourcererSelectors.sourcererScopeSelectedPatterns(state, scopeId); + }); + const missingPatterns = useSelector((state: State) => { + return sourcererSelectors.sourcererScopeMissingPatterns(state, scopeId); + }); + + const kibanaDataViews = useSelector(sourcererSelectors.kibanaDataViews); + const timelineDataViewId = useSelector((state: State) => { + return sourcererSelectors.sourcererScopeSelectedDataViewId(state, SourcererScopeName.timeline); + }); + const timelineSelectedPatterns = useSelector((state: State) => { + return sourcererSelectors.sourcererScopeSelectedPatterns(state, SourcererScopeName.timeline); + }); + const timelineMissingPatterns = useSelector((state: State) => { + return sourcererSelectors.sourcererScopeMissingPatterns(state, SourcererScopeName.timeline); + }); + const timelineSelectedDataView = useMemo(() => { + return kibanaDataViews.find((dataView) => dataView.id === timelineDataViewId); + }, [kibanaDataViews, timelineDataViewId]); + + const { indexFieldsSearch } = useDataView(); + + const onInitializeUrlParam = useCallback( + (initialState: SourcererUrlState | null) => { + // Initialize the store with value from UrlParam. + if (initialState != null) { + (Object.keys(initialState) as SourcererScopeName[]).forEach((scope) => { + if ( + !(scope === SourcererScopeName.default && scopeId === SourcererScopeName.detections) + ) { + dispatch( + sourcererActions.setSelectedDataView({ + id: scope, + selectedDataViewId: initialState[scope]?.id ?? null, + selectedPatterns: initialState[scope]?.selectedPatterns ?? [], + }) + ); + } + }); + } else { + // Initialize the UrlParam with values from the store. + // It isn't strictly necessary but I am keeping it for compatibility with the previous implementation. + if (scopeDataViewId) { + updateUrlParam({ + [SourcererScopeName.default]: { + id: scopeDataViewId, + selectedPatterns, + }, + }); + } + } + }, + [dispatch, scopeDataViewId, scopeId, selectedPatterns, updateUrlParam] + ); + + useInitializeUrlParam(URL_PARAM_KEY.sourcerer, onInitializeUrlParam); + + /* + * Note for future engineer: + * we changed the logic to not fetch all the index fields for every data view on the loading of the app + * because user can have a lot of them and it can slow down the loading of the app + * and maybe blow up the memory of the browser. We decided to load this data view on demand, + * we know that will only have to load this dataview on default and timeline scope. + * We will use two conditions to see if we need to fetch and initialize the dataview selected. + * First, we will make sure that we did not already fetch them by using `searchedIds` + * and then we will init them if selectedPatterns and missingPatterns are empty. + */ + const searchedIds = useRef([]); + useEffect(() => { + const activeDataViewIds = [...new Set([scopeDataViewId, timelineDataViewId])]; + activeDataViewIds.forEach((id, i) => { + if (id != null && id.length > 0 && !searchedIds.current.includes(id)) { + searchedIds.current = [...searchedIds.current, id]; + + const currentScope = i === 0 ? SourcererScopeName.default : SourcererScopeName.timeline; + + const needToBeInit = + id === scopeDataViewId + ? selectedPatterns.length === 0 && missingPatterns.length === 0 + : timelineDataViewId === id + ? timelineMissingPatterns.length === 0 && + timelineSelectedDataView?.patternList.length === 0 + : false; + + indexFieldsSearch({ + dataViewId: id, + scopeId: currentScope, + needToBeInit, + ...(needToBeInit && currentScope === SourcererScopeName.timeline + ? { + skipScopeUpdate: timelineSelectedPatterns.length > 0, + } + : {}), + }); + } + }); + }, [ + indexFieldsSearch, + missingPatterns.length, + scopeDataViewId, + selectedPatterns.length, + timelineDataViewId, + timelineMissingPatterns.length, + timelineSelectedDataView, + timelineSelectedPatterns.length, + ]); + + // Related to timeline + useEffect(() => { + if ( + !loadingSignalIndex && + signalIndexName != null && + signalIndexNameSourcerer == null && + (activeTimeline == null || activeTimeline.savedObjectId == null) && + initialTimelineSourcerer.current && + defaultDataView.id.length > 0 + ) { + initialTimelineSourcerer.current = false; + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.timeline, + selectedDataViewId: defaultDataView.id, + selectedPatterns: getScopePatternListSelection( + defaultDataView, + SourcererScopeName.timeline, + signalIndexName, + true + ), + }) + ); + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.analyzer, + selectedDataViewId: defaultDataView.id, + selectedPatterns: getScopePatternListSelection( + defaultDataView, + SourcererScopeName.analyzer, + signalIndexName, + true + ), + }) + ); + } else if ( + signalIndexNameSourcerer != null && + (activeTimeline == null || activeTimeline.savedObjectId == null) && + initialTimelineSourcerer.current && + defaultDataView.id.length > 0 + ) { + initialTimelineSourcerer.current = false; + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.timeline, + selectedDataViewId: defaultDataView.id, + selectedPatterns: getScopePatternListSelection( + defaultDataView, + SourcererScopeName.timeline, + signalIndexNameSourcerer, + true + ), + }) + ); + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.analyzer, + selectedDataViewId: defaultDataView.id, + selectedPatterns: getScopePatternListSelection( + defaultDataView, + SourcererScopeName.analyzer, + signalIndexNameSourcerer, + true + ), + }) + ); + } + }, [ + activeTimeline, + defaultDataView, + dispatch, + loadingSignalIndex, + signalIndexName, + signalIndexNameSourcerer, + ]); + const { dataViewId } = useSourcererDataView(scopeId); + + const updateSourcererDataView = useCallback( + (newSignalsIndex: string) => { + const asyncSearch = async (newPatternList: string[]) => { + abortCtrl.current = new AbortController(); + + dispatch(sourcererActions.setSourcererScopeLoading({ loading: true })); + + try { + const response = await createSourcererDataView({ + body: { patternList: newPatternList }, + signal: abortCtrl.current.signal, + dataViewService: dataViews, + dataViewId, + }); + + if (response?.defaultDataView.patternList.includes(newSignalsIndex)) { + // first time signals is defined and validated in the sourcerer + // redo indexFieldsSearch + indexFieldsSearch({ dataViewId: response.defaultDataView.id }); + dispatch(sourcererActions.setSourcererDataViews(response)); + } + dispatch(sourcererActions.setSourcererScopeLoading({ loading: false })); + } catch (err) { + if (err.name === 'AbortError') { + // the fetch was canceled, we don't need to do anything about it + } else { + addError(err, { + title: i18n.translate('xpack.securitySolution.sourcerer.error.title', { + defaultMessage: 'Error updating Security Data View', + }), + toastMessage: i18n.translate('xpack.securitySolution.sourcerer.error.toastMessage', { + defaultMessage: 'Refresh the page', + }), + }); + } + dispatch(sourcererActions.setSourcererScopeLoading({ loading: false })); + } + }; + + if (defaultDataView.title.indexOf(newSignalsIndex) === -1) { + abortCtrl.current.abort(); + asyncSearch([...defaultDataView.title.split(','), newSignalsIndex]); + } + }, + [defaultDataView.title, dispatch, dataViews, dataViewId, indexFieldsSearch, addError] + ); + + const onSignalIndexUpdated = useCallback(() => { + if ( + !loadingSignalIndex && + signalIndexName != null && + signalIndexNameSourcerer == null && + defaultDataView.id.length > 0 + ) { + updateSourcererDataView(signalIndexName); + dispatch(sourcererActions.setSignalIndexName({ signalIndexName })); + } + }, [ + defaultDataView.id.length, + dispatch, + loadingSignalIndex, + signalIndexName, + signalIndexNameSourcerer, + updateSourcererDataView, + ]); + + useEffect(() => { + onSignalIndexUpdated(); + // because we only want onSignalIndexUpdated to run when signalIndexName updates, + // but we want to know about the updates from the dependencies of onSignalIndexUpdated + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [signalIndexName]); + + // Related to the detection page + useEffect(() => { + if ( + scopeId === SourcererScopeName.detections && + isSignalIndexExists && + signalIndexName != null && + initialDetectionSourcerer.current && + defaultDataView.id.length > 0 + ) { + initialDetectionSourcerer.current = false; + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.detections, + selectedDataViewId: defaultDataView.id, + selectedPatterns: getScopePatternListSelection( + defaultDataView, + SourcererScopeName.detections, + signalIndexName, + true + ), + }) + ); + } else if ( + scopeId === SourcererScopeName.detections && + signalIndexNameSourcerer != null && + initialTimelineSourcerer.current && + defaultDataView.id.length > 0 + ) { + initialDetectionSourcerer.current = false; + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.detections, + selectedDataViewId: defaultDataView.id, + selectedPatterns: getScopePatternListSelection( + defaultDataView, + SourcererScopeName.detections, + signalIndexNameSourcerer, + true + ), + }); + } + }, [ + defaultDataView, + dispatch, + isSignalIndexExists, + scopeId, + signalIndexName, + signalIndexNameSourcerer, + ]); +}; From 0a0853bef9afaf2790fbd553ea6c92c053e568e5 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 5 Jun 2024 09:51:50 +0200 Subject: [PATCH 61/82] [Spacetime] Fields metadata services (#183806) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes https://github.com/elastic/observability-dev/issues/3331 Given the needs described in the linked issue about having a centralized and async way to consume field metadata across Kibana, this work focuses on providing server/client services to consume field metadata on demand from static ECS definition and integration manifests, with the chance to extend further the possible resolution sources. https://github.com/elastic/kibana/assets/34506779/3b2d9027-5c29-4081-ab17-1b43618c62a7 ## 💡 Reviewers hints This PR got quite long as it involves and touches different parts of the codebase, so I'll break down the interesting parts for an easier review. More details, code examples and mechanics description can be found in the README file for the plugin. ### `@kbn/fields-metadata-plugin` To avoid bundling and consuming the whole ECS static definition client-side, a new plugin `@kbn/fields-metadata-plugin` is created to expose the server/client services which enable retrieving only the fields needed on a use-case basis. ### FieldsMetadataService server side A `FieldsMetadataService` is instantiated on the plugin setup/start server lifecycle, exposing a client to consume the fields and setup tools for registering external dependencies. The start contract exposes a `FieldsMetadataClient` instance. With this, any application in Kibana can query for some fields using the available methods, currently: - `FieldsMetadataClient.prototype.getByName()`: retrieves a single `FieldMetadata` instance. - `FieldsMetadataClient.prototype.find()`: retrieves a record of matching `FieldMetadata` instances. `FieldsMetadataClient` is instantiated with the source repositories dependencies. They act as encapsulated sources which are responsible for fetching fields from their related source. Currently, there are 2 field repository sources used in the resolution step, but we can use this concept to extend the resolution step in future with more sources (LLM, OTel, ...). The currently used sources are: - `EcsFieldsRepository`: allows fetching static ECS field metadata. - `IntegrationFieldsRepository`: allows fetching fields from an integration package from EPR, where the fields metadata are stored. To correctly consume these fields, the `fleet` plugin must be enabled, otherwise, the service won't be able to access the registered fields extractor implemented with the fleet services. As this service performs a more expensive retrieval process than the `EcsFieldsRepository` constant complexity access, a caching layer is applied to the retrieved results from the external source to minimize latency. ### Fields metadata API To expose this service to the client, a first API endpoint is created to find field metadata and filter the results to minimize the served payload. - `GET /internal/fields_metadata/find` supports some initial query parameters to narrow the fields' search. ### FieldsMetadataService client side As we have a server-side `FieldsMetadataService`, we need a client counterpart to consume the exposed API safely and go through the validation steps. The client `FieldsMetadataService` works similarly to the server-side one, exposing a client which is returned by the public start contract of the plugin, allowing any other to directly use fields metadata client-side. This client would work well with existing state management solutions, as it's not decoupled from any library. ### useFieldsMetadata For simpler use cases where we need a quick and easy way to consume fields metadata client-side, the plugin start contract also exposes a `useFieldsMetadata` react custom hook, which is pre-created accessing the FieldsMetadataService client described above. It is important to retrieve the hook from the start contract of this plugin, as it already gets all the required dependencies injected minimizing the effort on the consumer side. The `UnifiedDocViewer` plugin changes exemplify how we can use this hook to access and filter fields' metadata quickly. ### `registerIntegrationFieldsExtractor` (@elastic/fleet) Getting fields from an integration dataset is more complex than accessing a static dictionary of ECS fields, and to achieve that we need access to the PackageService implemented by the fleet team. To get access to the package, maintain a proper separation of concerns and avoid a direct dependency on the fleet plugin, some actions were taken: - the `PackageService.prototype.getPackageFieldsMetadata()` method is implemented to keep the knowledge about retrieving package details on this service instead of mixing it on parallel services. - a fleet `registerIntegrationFieldsExtractor` service is created and used during the fleet plugin setup to register a callback that accesses the service as an internal user and retrieves the fields by the given parameters. - the fields metadata plugin returns a `registerIntegrationFieldsExtractor` function from its server setup so that we can use it to register the above-mentioned callback that retrieves fields from an integration. This inverts the dependency between `fields_metadata` and `fleet` plugins so that the `fields_metadata` plugin keeps zero dependencies on external apps. ## Adoption We currently have places where the `@elastic/ecs` package is directly accessed and where we might be able to refactor the codebase to consume this service. **[EcsFlat usages in Kibana](https://github.com/search?q=repo%3Aelastic%2Fkibana%20EcsFlat&type=code)** --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + docs/developer/plugin-list.asciidoc | 4 + package.json | 1 + packages/kbn-io-ts-utils/index.ts | 1 + .../src/array_to_string_rt/index.test.ts | 52 ++++++ .../src/array_to_string_rt/index.ts | 24 +++ packages/kbn-optimizer/limits.yml | 1 + src/plugins/unified_doc_viewer/kibana.jsonc | 1 + .../public/__mocks__/services.ts | 2 + .../logs_overview_highlights.tsx | 39 ++++ .../sub_components/highlight_field.tsx | 7 +- .../highlight_field_description.tsx | 12 +- .../unified_doc_viewer/public/plugin.tsx | 5 +- .../unified_doc_viewer/public/types.ts | 2 + src/plugins/unified_doc_viewer/tsconfig.json | 3 +- tsconfig.base.json | 2 + x-pack/plugins/fields_metadata/README.md | 171 ++++++++++++++++++ .../common/fields_metadata/common.ts | 9 + .../common/fields_metadata/errors.ts | 24 +++ .../common/fields_metadata/index.ts | 10 + .../fields_metadata/models/field_metadata.ts | 53 ++++++ .../models/fields_metadata_dictionary.ts | 28 +++ .../common/fields_metadata/types.ts | 91 ++++++++++ .../v1/find_fields_metadata.ts | 65 +++++++ .../common/fields_metadata/v1/index.ts | 8 + .../fields_metadata/common/hashed_cache.ts | 46 +++++ .../plugins/fields_metadata/common/index.ts | 20 ++ .../plugins/fields_metadata/common/latest.ts | 8 + .../fields_metadata/common/runtime_types.ts | 29 +++ x-pack/plugins/fields_metadata/jest.config.js | 17 ++ x-pack/plugins/fields_metadata/kibana.jsonc | 14 ++ .../public/hooks/use_fields_metadata/index.ts | 8 + .../use_fields_metadata.mock.ts | 16 ++ .../use_fields_metadata.test.ts | 88 +++++++++ .../use_fields_metadata.ts | 49 +++++ .../plugins/fields_metadata/public/index.ts | 19 ++ .../plugins/fields_metadata/public/mocks.tsx | 18 ++ .../plugins/fields_metadata/public/plugin.ts | 38 ++++ .../fields_metadata_client.mock.ts | 12 ++ .../fields_metadata/fields_metadata_client.ts | 74 ++++++++ .../fields_metadata_service.mock.ts | 18 ++ .../fields_metadata_service.ts | 37 ++++ .../public/services/fields_metadata/index.ts | 9 + .../public/services/fields_metadata/types.ts | 27 +++ .../plugins/fields_metadata/public/types.ts | 41 +++++ .../server/fields_metadata_server.ts | 13 ++ .../plugins/fields_metadata/server/index.ts | 21 +++ .../server/lib/shared_types.ts | 21 +++ .../plugins/fields_metadata/server/mocks.ts | 26 +++ .../plugins/fields_metadata/server/plugin.ts | 63 +++++++ .../fields_metadata/find_fields_metadata.ts | 75 ++++++++ .../server/routes/fields_metadata/index.ts | 12 ++ .../server/services/fields_metadata/errors.ts | 14 ++ .../fields_metadata_client.mock.ts | 13 ++ .../fields_metadata_client.test.ts | 171 ++++++++++++++++++ .../fields_metadata/fields_metadata_client.ts | 73 ++++++++ .../fields_metadata_service.mock.ts | 19 ++ .../fields_metadata_service.ts | 47 +++++ .../server/services/fields_metadata/index.ts | 14 ++ .../repositories/ecs_fields_repository.ts | 54 ++++++ .../integration_fields_repository.ts | 135 ++++++++++++++ .../fields_metadata/repositories/types.ts | 22 +++ .../server/services/fields_metadata/types.ts | 31 ++++ .../plugins/fields_metadata/server/types.ts | 34 ++++ x-pack/plugins/fields_metadata/tsconfig.json | 22 +++ x-pack/plugins/fleet/kibana.jsonc | 3 +- x-pack/plugins/fleet/server/plugin.ts | 8 +- .../services/epm/package_service.mock.ts | 1 + .../services/epm/package_service.test.ts | 17 +- .../server/services/epm/package_service.ts | 19 +- .../services/epm/packages/utils.test.ts | 88 +++++++++ .../server/services/epm/packages/utils.ts | 113 ++++++++++++ .../server/services/epm/registry/index.ts | 47 ++++- .../register_integration_fields_extractor.ts | 27 +++ x-pack/plugins/fleet/tsconfig.json | 1 + yarn.lock | 4 + 76 files changed, 2398 insertions(+), 14 deletions(-) create mode 100644 packages/kbn-io-ts-utils/src/array_to_string_rt/index.test.ts create mode 100644 packages/kbn-io-ts-utils/src/array_to_string_rt/index.ts create mode 100755 x-pack/plugins/fields_metadata/README.md create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/common.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/errors.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/index.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/types.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/v1/find_fields_metadata.ts create mode 100644 x-pack/plugins/fields_metadata/common/fields_metadata/v1/index.ts create mode 100644 x-pack/plugins/fields_metadata/common/hashed_cache.ts create mode 100644 x-pack/plugins/fields_metadata/common/index.ts create mode 100644 x-pack/plugins/fields_metadata/common/latest.ts create mode 100644 x-pack/plugins/fields_metadata/common/runtime_types.ts create mode 100644 x-pack/plugins/fields_metadata/jest.config.js create mode 100644 x-pack/plugins/fields_metadata/kibana.jsonc create mode 100644 x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/index.ts create mode 100644 x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.mock.ts create mode 100644 x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.test.ts create mode 100644 x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.ts create mode 100644 x-pack/plugins/fields_metadata/public/index.ts create mode 100644 x-pack/plugins/fields_metadata/public/mocks.tsx create mode 100644 x-pack/plugins/fields_metadata/public/plugin.ts create mode 100644 x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.mock.ts create mode 100644 x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.ts create mode 100644 x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.mock.ts create mode 100644 x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.ts create mode 100644 x-pack/plugins/fields_metadata/public/services/fields_metadata/index.ts create mode 100644 x-pack/plugins/fields_metadata/public/services/fields_metadata/types.ts create mode 100644 x-pack/plugins/fields_metadata/public/types.ts create mode 100644 x-pack/plugins/fields_metadata/server/fields_metadata_server.ts create mode 100644 x-pack/plugins/fields_metadata/server/index.ts create mode 100644 x-pack/plugins/fields_metadata/server/lib/shared_types.ts create mode 100644 x-pack/plugins/fields_metadata/server/mocks.ts create mode 100644 x-pack/plugins/fields_metadata/server/plugin.ts create mode 100644 x-pack/plugins/fields_metadata/server/routes/fields_metadata/find_fields_metadata.ts create mode 100644 x-pack/plugins/fields_metadata/server/routes/fields_metadata/index.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/errors.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.mock.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.test.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.mock.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/index.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/ecs_fields_repository.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/integration_fields_repository.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts create mode 100644 x-pack/plugins/fields_metadata/server/services/fields_metadata/types.ts create mode 100644 x-pack/plugins/fields_metadata/server/types.ts create mode 100644 x-pack/plugins/fields_metadata/tsconfig.json create mode 100644 x-pack/plugins/fleet/server/services/epm/packages/utils.test.ts create mode 100644 x-pack/plugins/fleet/server/services/register_integration_fields_extractor.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ac51c9ce0f926..9d65857bb5d90 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -448,6 +448,7 @@ examples/field_formats_example @elastic/kibana-data-discovery src/plugins/field_formats @elastic/kibana-data-discovery packages/kbn-field-types @elastic/kibana-data-discovery packages/kbn-field-utils @elastic/kibana-data-discovery +x-pack/plugins/fields_metadata @elastic/obs-ux-logs-team x-pack/plugins/file_upload @elastic/kibana-gis examples/files_example @elastic/appex-sharedux src/plugins/files_management @elastic/appex-sharedux diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 874f3f3136190..d861a4e72c572 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -582,6 +582,10 @@ activities. |The features plugin enhance Kibana with a per-feature privilege system. +|{kib-repo}blob/{branch}/x-pack/plugins/fields_metadata/README.md[fieldsMetadata] +|The @kbn/fields-metadata-plugin is designed to provide a centralized and asynchronous way to consume field metadata across Kibana. This plugin addresses the need for on-demand retrieval of field metadata from static ECS definitions and integration manifests, with the flexibility to extend to additional resolution sources in the future. + + |{kib-repo}blob/{branch}/x-pack/plugins/file_upload[fileUpload] |WARNING: Missing README. diff --git a/package.json b/package.json index 7285c7721ae4b..4188137c88ce0 100644 --- a/package.json +++ b/package.json @@ -492,6 +492,7 @@ "@kbn/field-formats-plugin": "link:src/plugins/field_formats", "@kbn/field-types": "link:packages/kbn-field-types", "@kbn/field-utils": "link:packages/kbn-field-utils", + "@kbn/fields-metadata-plugin": "link:x-pack/plugins/fields_metadata", "@kbn/file-upload-plugin": "link:x-pack/plugins/file_upload", "@kbn/files-example-plugin": "link:examples/files_example", "@kbn/files-management-plugin": "link:src/plugins/files_management", diff --git a/packages/kbn-io-ts-utils/index.ts b/packages/kbn-io-ts-utils/index.ts index 2a6c02f6cdf17..786d39ad6a3d6 100644 --- a/packages/kbn-io-ts-utils/index.ts +++ b/packages/kbn-io-ts-utils/index.ts @@ -9,6 +9,7 @@ export type { IndexPattern } from './src/index_pattern_rt'; export type { NonEmptyString, NonEmptyStringBrand } from './src/non_empty_string_rt'; +export { arrayToStringRt } from './src/array_to_string_rt'; export { deepExactRt } from './src/deep_exact_rt'; export { indexPatternRt } from './src/index_pattern_rt'; export { jsonRt } from './src/json_rt'; diff --git a/packages/kbn-io-ts-utils/src/array_to_string_rt/index.test.ts b/packages/kbn-io-ts-utils/src/array_to_string_rt/index.test.ts new file mode 100644 index 0000000000000..8ac8748118b2c --- /dev/null +++ b/packages/kbn-io-ts-utils/src/array_to_string_rt/index.test.ts @@ -0,0 +1,52 @@ +/* + * 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 * as rt from 'io-ts'; +import { arrayToStringRt } from '.'; +import { isRight, Either, fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +function getValueOrThrow(either: Either) { + return fold(() => { + throw new Error('Cannot get right value of left'); + }, identity)(either); +} + +describe('arrayToStringRt', () => { + it('should validate strings', () => { + expect(isRight(arrayToStringRt.decode(''))).toBe(true); + expect(isRight(arrayToStringRt.decode('message'))).toBe(true); + expect(isRight(arrayToStringRt.decode('message,event.original'))).toBe(true); + expect(isRight(arrayToStringRt.decode({}))).toBe(false); + expect(isRight(arrayToStringRt.decode(true))).toBe(false); + }); + + it('should return array of strings when decoding', () => { + expect(getValueOrThrow(arrayToStringRt.decode(''))).toEqual(['']); + expect(getValueOrThrow(arrayToStringRt.decode('message'))).toEqual(['message']); + expect(getValueOrThrow(arrayToStringRt.decode('message,event.original'))).toEqual([ + 'message', + 'event.original', + ]); + }); + + it('should be pipable', () => { + const piped = arrayToStringRt.pipe(rt.array(rt.string)); + + const validInput = ['message', 'event.original']; + const invalidInput = {}; + + const valid = piped.decode(validInput.join(',')); + const invalid = piped.decode(invalidInput); + + expect(isRight(valid)).toBe(true); + expect(getValueOrThrow(valid)).toEqual(validInput); + + expect(isRight(invalid)).toBe(false); + }); +}); diff --git a/packages/kbn-io-ts-utils/src/array_to_string_rt/index.ts b/packages/kbn-io-ts-utils/src/array_to_string_rt/index.ts new file mode 100644 index 0000000000000..98c1af8b6ba09 --- /dev/null +++ b/packages/kbn-io-ts-utils/src/array_to_string_rt/index.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { either } from 'fp-ts/lib/Either'; +import * as rt from 'io-ts'; + +export const arrayToStringRt = new rt.Type( + 'arrayToString', + rt.array(rt.unknown).is, + (input, context) => + either.chain(rt.string.validate(input, context), (str) => { + try { + return rt.success(str.split(',')); + } catch (e) { + return rt.failure(input, context); + } + }), + (arr) => arr.join(',') +); diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index a4e08a8b20a81..c3616140cabe8 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -62,6 +62,7 @@ pageLoadAssetSize: expressionXY: 45000 features: 21723 fieldFormats: 65209 + fieldsMetadata: 21885 files: 22673 filesManagement: 18683 fileUpload: 25664 diff --git a/src/plugins/unified_doc_viewer/kibana.jsonc b/src/plugins/unified_doc_viewer/kibana.jsonc index c5ab9f0c4e632..2361a10120e9b 100644 --- a/src/plugins/unified_doc_viewer/kibana.jsonc +++ b/src/plugins/unified_doc_viewer/kibana.jsonc @@ -9,5 +9,6 @@ "browser": true, "requiredBundles": ["kibanaUtils"], "requiredPlugins": ["data", "discoverShared", "fieldFormats"], + "optionalPlugins": ["fieldsMetadata"] } } diff --git a/src/plugins/unified_doc_viewer/public/__mocks__/services.ts b/src/plugins/unified_doc_viewer/public/__mocks__/services.ts index e9dc74697f358..8496b919b38f0 100644 --- a/src/plugins/unified_doc_viewer/public/__mocks__/services.ts +++ b/src/plugins/unified_doc_viewer/public/__mocks__/services.ts @@ -10,6 +10,7 @@ import { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { discoverSharedPluginMock } from '@kbn/discover-shared-plugin/public/mocks'; import { fieldFormatsMock } from '@kbn/field-formats-plugin/common/mocks'; +import { fieldsMetadataPluginPublicMock } from '@kbn/fields-metadata-plugin/public/mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; import type { UnifiedDocViewerServices, UnifiedDocViewerStart } from '../types'; import { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -24,6 +25,7 @@ export const mockUnifiedDocViewerServices: jest.Mocked data: dataPluginMock.createStartContract(), discoverShared: discoverSharedPluginMock.createStartContract(), fieldFormats: fieldFormatsMock, + fieldsMetadata: fieldsMetadataPluginPublicMock.createStartContract(), storage: new Storage(localStorage), uiSettings: uiSettingsServiceMock.createStartContract(), unifiedDocViewer: mockUnifiedDocViewer, diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_highlights.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_highlights.tsx index a7d998b0f1eba..f22d17956639f 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_highlights.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_highlights.tsx @@ -13,6 +13,7 @@ import { i18n } from '@kbn/i18n'; import { DataTableRecord, LogDocumentOverview, fieldConstants } from '@kbn/discover-utils'; import { HighlightField } from './sub_components/highlight_field'; import { HighlightSection } from './sub_components/highlight_section'; +import { getUnifiedDocViewerServices } from '../../plugin'; export function LogsOverviewHighlights({ formattedDoc, @@ -21,6 +22,30 @@ export function LogsOverviewHighlights({ formattedDoc: LogDocumentOverview; flattenedDoc: DataTableRecord['flattened']; }) { + const { + fieldsMetadata: { useFieldsMetadata }, + } = getUnifiedDocViewerServices(); + + const { fieldsMetadata = {} } = useFieldsMetadata({ + attributes: ['flat_name', 'short', 'type'], + fieldNames: [ + fieldConstants.SERVICE_NAME_FIELD, + fieldConstants.HOST_NAME_FIELD, + fieldConstants.TRACE_ID_FIELD, + fieldConstants.ORCHESTRATOR_CLUSTER_NAME_FIELD, + fieldConstants.ORCHESTRATOR_RESOURCE_ID_FIELD, + fieldConstants.CLOUD_PROVIDER_FIELD, + fieldConstants.CLOUD_REGION_FIELD, + fieldConstants.CLOUD_AVAILABILITY_ZONE_FIELD, + fieldConstants.CLOUD_PROJECT_ID_FIELD, + fieldConstants.CLOUD_INSTANCE_ID_FIELD, + fieldConstants.LOG_FILE_PATH_FIELD, + fieldConstants.DATASTREAM_DATASET_FIELD, + fieldConstants.DATASTREAM_NAMESPACE_FIELD, + fieldConstants.AGENT_NAME_FIELD, + ], + }); + const getHighlightProps = (field: keyof LogDocumentOverview) => ({ field, formattedValue: formattedDoc[field], @@ -38,6 +63,7 @@ export function LogsOverviewHighlights({ )} @@ -45,6 +71,7 @@ export function LogsOverviewHighlights({ )} @@ -52,6 +79,7 @@ export function LogsOverviewHighlights({ )} @@ -59,6 +87,7 @@ export function LogsOverviewHighlights({ )} @@ -66,6 +95,7 @@ export function LogsOverviewHighlights({ )} @@ -79,6 +109,7 @@ export function LogsOverviewHighlights({ )} @@ -100,6 +132,7 @@ export function LogsOverviewHighlights({ )} @@ -107,6 +140,7 @@ export function LogsOverviewHighlights({ )} @@ -114,6 +148,7 @@ export function LogsOverviewHighlights({ )} @@ -127,6 +162,7 @@ export function LogsOverviewHighlights({ )} @@ -134,6 +170,7 @@ export function LogsOverviewHighlights({ )} @@ -141,6 +178,7 @@ export function LogsOverviewHighlights({ @@ -149,6 +187,7 @@ export function LogsOverviewHighlights({ )} diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/highlight_field.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/highlight_field.tsx index 176f8cf2b2a77..b50540c14c7a6 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/highlight_field.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/highlight_field.tsx @@ -11,12 +11,14 @@ import { css } from '@emotion/react'; import React, { ReactNode } from 'react'; import { dynamic } from '@kbn/shared-ux-utility'; import { euiThemeVars } from '@kbn/ui-theme'; +import { PartialFieldMetadataPlain } from '@kbn/fields-metadata-plugin/common'; import { HoverActionPopover } from './hover_popover_action'; const HighlightFieldDescription = dynamic(() => import('./highlight_field_description')); interface HighlightFieldProps { field: string; + fieldMetadata?: PartialFieldMetadataPlain; formattedValue?: string; icon?: ReactNode; label: string; @@ -26,6 +28,7 @@ interface HighlightFieldProps { export function HighlightField({ field, + fieldMetadata, formattedValue, icon, label, @@ -33,13 +36,15 @@ export function HighlightField({ value, ...props }: HighlightFieldProps) { + const hasFieldDescription = !!fieldMetadata?.short; + return formattedValue && value ? (
    {label} - + {hasFieldDescription ? : null} diff --git a/src/plugins/unified_doc_viewer/public/plugin.tsx b/src/plugins/unified_doc_viewer/public/plugin.tsx index 5d26f43892ae1..524a02eec9ee9 100644 --- a/src/plugins/unified_doc_viewer/public/plugin.tsx +++ b/src/plugins/unified_doc_viewer/public/plugin.tsx @@ -18,6 +18,7 @@ import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { CoreStart } from '@kbn/core/public'; import { dynamic } from '@kbn/shared-ux-utility'; import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public'; +import { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; import type { UnifiedDocViewerServices } from './types'; export const [getUnifiedDocViewerServices, setUnifiedDocViewerServices] = @@ -50,6 +51,7 @@ export interface UnifiedDocViewerStartDeps { data: DataPublicPluginStart; discoverShared: DiscoverSharedPublicStart; fieldFormats: FieldFormatsStart; + fieldsMetadata: FieldsMetadataPublicStart; } export class UnifiedDocViewerPublicPlugin @@ -118,7 +120,7 @@ export class UnifiedDocViewerPublicPlugin public start(core: CoreStart, deps: UnifiedDocViewerStartDeps) { const { analytics, uiSettings } = core; - const { data, discoverShared, fieldFormats } = deps; + const { data, discoverShared, fieldFormats, fieldsMetadata } = deps; const storage = new Storage(localStorage); const unifiedDocViewer = { registry: this.docViewsRegistry, @@ -128,6 +130,7 @@ export class UnifiedDocViewerPublicPlugin data, discoverShared, fieldFormats, + fieldsMetadata, storage, uiSettings, unifiedDocViewer, diff --git a/src/plugins/unified_doc_viewer/public/types.ts b/src/plugins/unified_doc_viewer/public/types.ts index 8a2f7d1f1a736..c19c60da72b13 100644 --- a/src/plugins/unified_doc_viewer/public/types.ts +++ b/src/plugins/unified_doc_viewer/public/types.ts @@ -14,6 +14,7 @@ import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { UnifiedDocViewerStart } from './plugin'; @@ -23,6 +24,7 @@ export interface UnifiedDocViewerServices { data: DataPublicPluginStart; discoverShared: DiscoverSharedPublicStart; fieldFormats: FieldFormatsStart; + fieldsMetadata: FieldsMetadataPublicStart; storage: Storage; uiSettings: IUiSettingsClient; unifiedDocViewer: UnifiedDocViewerStart; diff --git a/src/plugins/unified_doc_viewer/tsconfig.json b/src/plugins/unified_doc_viewer/tsconfig.json index 1a0487b317129..43cfe7945f188 100644 --- a/src/plugins/unified_doc_viewer/tsconfig.json +++ b/src/plugins/unified_doc_viewer/tsconfig.json @@ -29,7 +29,8 @@ "@kbn/custom-icons", "@kbn/react-field", "@kbn/ui-theme", - "@kbn/discover-shared-plugin" + "@kbn/discover-shared-plugin", + "@kbn/fields-metadata-plugin" ], "exclude": [ "target/**/*", diff --git a/tsconfig.base.json b/tsconfig.base.json index 37a9c58701589..912a135068d88 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -890,6 +890,8 @@ "@kbn/field-types/*": ["packages/kbn-field-types/*"], "@kbn/field-utils": ["packages/kbn-field-utils"], "@kbn/field-utils/*": ["packages/kbn-field-utils/*"], + "@kbn/fields-metadata-plugin": ["x-pack/plugins/fields_metadata"], + "@kbn/fields-metadata-plugin/*": ["x-pack/plugins/fields_metadata/*"], "@kbn/file-upload-plugin": ["x-pack/plugins/file_upload"], "@kbn/file-upload-plugin/*": ["x-pack/plugins/file_upload/*"], "@kbn/files-example-plugin": ["examples/files_example"], diff --git a/x-pack/plugins/fields_metadata/README.md b/x-pack/plugins/fields_metadata/README.md new file mode 100755 index 0000000000000..d08b18a029345 --- /dev/null +++ b/x-pack/plugins/fields_metadata/README.md @@ -0,0 +1,171 @@ +# Fields Metadata Plugin + +The `@kbn/fields-metadata-plugin` is designed to provide a centralized and asynchronous way to consume field metadata across Kibana. This plugin addresses the need for on-demand retrieval of field metadata from static ECS definitions and integration manifests, with the flexibility to extend to additional resolution sources in the future. + +## Components and Mechanisms + +### FieldsMetadataService (Server-side) + +The `FieldsMetadataService` is instantiated during the plugin setup/start lifecycle on the server side. It exposes a client that can be used to consume field metadata and provides tools for registering external dependencies. + +#### Start Contract + +The start contract exposes a `FieldsMetadataClient` instance, which offers the following methods: +- `getByName(name: string, params? {integration: string, dataset?: string})`: Retrieves a single `FieldMetadata` instance by name. + +```ts +const timestampField = await client.getByName('@timestamp') +/* +{ + dashed_name: 'timestamp', + type: 'date', + ... +} +*/ +``` + +- `find(params?: {fieldNames?: string[], integration?: string, dataset?: string})`: Retrieves a record of matching `FieldMetadata` instances based on the query parameters. + +**Parameters** +| Name | Type | Example | Optional | +|---|---|---|---| +| fieldNames | [] | ['@timestamp', 'onepassword.client.platform_version'] | ✅ | +| integration | string | 1password | ✅ | +| dataset | string | 1password.item_usages | ✅ | + +```ts +const fields = await client.find({ + fieldNames: ['@timestamp', 'onepassword.client.platform_version'], + integration: '1password', + dataset: '*' +}) +/* +{ + '@timestamp': { + dashed_name: 'timestamp', + type: 'date', + ... + }, + 'onepassword.client.platform_version': { + name: 'platform_version', + type: 'keyword', + ... + }, +} +*/ +``` + +> N.B. Passing the `dataset` name parameter to `.find` helps narrowing the scope of the integration assets that need to be fetched, increasing the performance of the request. +In case the exact dataset for a field is unknown, is it still possible to pass a `*` value as `dataset` parameter to access all the integration datasets' fields. +Still, is recommended always passing the `dataset` as well if known or unless the required fields come from different datasets of the same integration. + +> N.B. In case the `fieldNames` parameter is not passed to `.find`, the result will give the whole list of ECS fields by default. This should be avoided as much as possible, although it helps covering cases where we might need the whole ECS fields list. + +#### Source Repositories + +The `FieldsMetadataClient` relies on source repositories to fetch field metadata. Currently, there are two repository sources: +- `EcsFieldsRepository`: Fetches static ECS field metadata. +- `IntegrationFieldsRepository`: Fetches fields from an integration package from the Elastic Package Registry (EPR). This requires the `fleet` plugin to be enabled to access the registered fields extractor. + +To improve performance, a caching layer is applied to the results retrieved from external sources, minimizing latency and enhancing efficiency. + +### Fields Metadata API + +A REST API endpoint is exposed to facilitate the retrieval of field metadata: + +- `GET /internal/fields_metadata/find`: Supports query parameters to filter and find field metadata, optimizing the payload served to the client. + +**Parameters** +| Name | Type | Example | Optional | +|---|---|---|---| +| fieldNames | [] | ['@timestamp', 'onepassword.client.platform_version'] | ✅ | +| attributes | FieldAttribute[] | ['type', 'description', 'name'] | ✅ | +| integration | string | 1password | ✅ | +| dataset | string | 1password.item_usages | ✅ | + +### FieldsMetadataService (Client-side) + +The client-side counterpart of the `FieldsMetadataService` ensures safe consumption of the exposed API and performs necessary validation steps. The client is returned by the public start contract of the plugin, allowing other parts of Kibana to use fields metadata directly. + +With this client request/response validation, error handling and client-side caching are all handled out of the box. + +Typical use cases for this client are integrating fields metadata on existing state management solutions or early metadata retrieval on initialization. + +```ts +export class FieldsMetadataPlugin implements Plugin { + ... + + public start(core: CoreStart, plugins) { + const myFieldsMetadata = plugins.fieldsMetadata.client.find(/* ... */); + ... + } +} +``` + +### useFieldsMetadata (React Hook) + +For simpler use cases, the `useFieldsMetadata` React custom hook is provided. This hook is pre-configured with the required dependencies and allows quick access to field metadata client-side. It is essential to retrieve this hook from the start contract of the plugin to ensure proper dependency injection. + +**Parameters** +| Name | Type | Example | Optional | +|---|---|---|---| +| fieldNames | [] | ['@timestamp', 'onepassword.client.platform_version'] | ✅ | +| attributes | FieldAttribute[] | ['type', 'description', 'name'] | ✅ | +| integration | string | 1password | ✅ | +| dataset | string | 1password.item_usages | ✅ | + +It also accepts a second argument, an array of dependencies to determine when the hook should update the retrieved data. + +```ts +const FieldsComponent = () => { + const { + fieldsMetadata: { useFieldsMetadata }, + } = useServices(); // Or useKibana and any other utility to get the plugin deps + + const { fieldsMetadata, error, loading } = useFieldsMetadata({ + fieldsName: ['@timestamp', 'agent.name'], + attributes: ['name', 'type'] + }, []); + + if (loading) { + return
    Loading...
    ; + } + + if (error) { + return
    Error: {error.message}
    ; + } + + return ( +
    + {fieldsMetadata.map(field => ( +
    {field.name}: {field.type}
    + ))} +
    + ); +}; +``` + +### registerIntegrationFieldsExtractor + +To handle the complexity of fetching fields from an integration dataset, the `PackageService.prototype.getPackageFieldsMetadata()` method is implemented. This method maintains the separation of concerns and avoids direct dependency on the fleet plugin. During the fleet plugin setup, a `registerIntegrationFieldsExtractor` service is created to register a callback that retrieves fields by given parameters. + +```ts +import { registerIntegrationFieldsExtractor } from '@kbn/fields-metadata-plugin/server'; + +registerIntegrationFieldsExtractor((params) => { + // Custom logic to retrieve fields from an integration + const fields = getFieldsFromIntegration(params); + return fields; +}); +``` +```ts +export class FleetPluginServer implements Plugin { + public setup(core: CoreStart, plugins) { + plugins.fieldsMetadata.registerIntegrationFieldsExtractor((params) => { + // Custom logic to retrieve fields from an integration + const fields = getFieldsFromIntegration(params); + return fields; + }); + } +} +``` \ No newline at end of file diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/common.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/common.ts new file mode 100644 index 0000000000000..dbc7857abd1b8 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/common.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 const FIND_FIELDS_METADATA_URL = '/internal/fields_metadata'; +export const ANY_DATASET = '*'; diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/errors.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/errors.ts new file mode 100644 index 0000000000000..e4a2c02c33e44 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/errors.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable max-classes-per-file */ + +export class FetchFieldsMetadataError extends Error { + constructor(message: string, public cause?: Error) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + this.name = 'FetchFieldsMetadataError'; + } +} + +export class DecodeFieldsMetadataError extends Error { + constructor(message: string, public cause?: Error) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + this.name = 'DecodeFieldsMetadataError'; + } +} diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/index.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/index.ts new file mode 100644 index 0000000000000..0590a318d13f9 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './common'; +export * from './errors'; +export * from './types'; diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts new file mode 100644 index 0000000000000..fcde43b3c4e11 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @typescript-eslint/naming-convention */ + +import pick from 'lodash/pick'; +import { FieldAttribute, FieldMetadataPlain, PartialFieldMetadataPlain } from '../types'; + +// Use class/interface merging to define instance properties from FieldMetadataPlain. +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldMetadata extends FieldMetadataPlain {} +export class FieldMetadata { + private constructor(fieldMetadata: FieldMetadataPlain) { + Object.assign(this, fieldMetadata); + } + + public pick(props: FieldAttribute[]): PartialFieldMetadataPlain { + return pick(this, props); + } + + public toPlain(): FieldMetadataPlain { + return Object.assign({}, this); + } + + public static create(fieldMetadata: FieldMetadataPlain) { + const flat_name = fieldMetadata.flat_name ?? fieldMetadata.name; + const dashed_name = fieldMetadata.dashed_name ?? FieldMetadata.toDashedName(flat_name); + const normalize = fieldMetadata.normalize ?? []; + const short = fieldMetadata.short ?? fieldMetadata.description; + const source = fieldMetadata.source ?? 'unknown'; + const type = fieldMetadata.type ?? 'unknown'; + + const fieldMetadataProps = { + ...fieldMetadata, + dashed_name, + flat_name, + normalize, + short, + source, + type, + }; + + return new FieldMetadata(fieldMetadataProps); + } + + private static toDashedName(flatName: string) { + return flatName.split('.').join('-'); + } +} diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts new file mode 100644 index 0000000000000..0ddda927de676 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import mapValues from 'lodash/mapValues'; +import { FieldAttribute, FieldMetadataPlain, PartialFieldMetadataPlain } from '../types'; +import { FieldMetadata } from './field_metadata'; + +export type FieldsMetadataMap = Record; + +export class FieldsMetadataDictionary { + private constructor(private readonly fields: FieldsMetadataMap) {} + + pick(attributes: FieldAttribute[]): Record { + return mapValues(this.fields, (field) => field.pick(attributes)); + } + + toPlain(): Record { + return mapValues(this.fields, (field) => field.toPlain()); + } + + public static create(fields: FieldsMetadataMap) { + return new FieldsMetadataDictionary(fields); + } +} diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/types.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/types.ts new file mode 100644 index 0000000000000..8a1327e363aad --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/types.ts @@ -0,0 +1,91 @@ +/* + * 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 { EcsFlat } from '@elastic/ecs'; +import * as rt from 'io-ts'; + +export const fieldSourceRT = rt.keyof({ + ecs: null, + integration: null, + unknown: null, +}); + +export const allowedValueRT = rt.intersection([ + rt.type({ + description: rt.string, + name: rt.string, + }), + rt.partial({ + expected_event_types: rt.array(rt.string), + beta: rt.string, + }), +]); + +export const multiFieldRT = rt.type({ + flat_name: rt.string, + name: rt.string, + type: rt.string, +}); + +const requiredBaseMetadataPlainRT = rt.type({ + name: rt.string, +}); + +const optionalBaseMetadataPlainRT = rt.partial(requiredBaseMetadataPlainRT.props); + +const optionalMetadataPlainRT = rt.partial({ + allowed_values: rt.array(allowedValueRT), + beta: rt.string, + dashed_name: rt.string, + description: rt.string, + doc_values: rt.boolean, + example: rt.unknown, + expected_values: rt.array(rt.string), + flat_name: rt.string, + format: rt.string, + ignore_above: rt.number, + index: rt.boolean, + input_format: rt.string, + level: rt.string, + multi_fields: rt.array(multiFieldRT), + normalize: rt.array(rt.string), + object_type: rt.string, + original_fieldset: rt.string, + output_format: rt.string, + output_precision: rt.number, + pattern: rt.string, + required: rt.boolean, + scaling_factor: rt.number, + short: rt.string, + source: fieldSourceRT, + type: rt.string, +}); + +export const partialFieldMetadataPlainRT = rt.intersection([ + optionalBaseMetadataPlainRT, + optionalMetadataPlainRT, +]); + +export const fieldMetadataPlainRT = rt.intersection([ + requiredBaseMetadataPlainRT, + optionalMetadataPlainRT, +]); + +export const fieldAttributeRT = rt.union([ + rt.keyof(requiredBaseMetadataPlainRT.props), + rt.keyof(optionalMetadataPlainRT.props), +]); + +export type TEcsFields = typeof EcsFlat; +export type EcsFieldName = keyof TEcsFields; +export type IntegrationFieldName = string; + +export type FieldName = EcsFieldName | (IntegrationFieldName & {}); +export type FieldMetadataPlain = rt.TypeOf; +export type PartialFieldMetadataPlain = rt.TypeOf; + +export type FieldAttribute = rt.TypeOf; diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/v1/find_fields_metadata.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/v1/find_fields_metadata.ts new file mode 100644 index 0000000000000..d293f9232a6f7 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/v1/find_fields_metadata.ts @@ -0,0 +1,65 @@ +/* + * 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 { arrayToStringRt } from '@kbn/io-ts-utils'; +import { either } from 'fp-ts/lib/Either'; +import * as rt from 'io-ts'; +import { ANY_DATASET } from '../common'; +import { FetchFieldsMetadataError } from '../errors'; +import { FieldAttribute, fieldAttributeRT, FieldName, partialFieldMetadataPlainRT } from '../types'; + +const baseFindFieldsMetadataRequestQueryRT = rt.exact( + rt.partial({ + attributes: arrayToStringRt.pipe(rt.array(fieldAttributeRT)), + fieldNames: arrayToStringRt.pipe(rt.array(rt.string)), + integration: rt.string, + dataset: rt.string, + }) +); + +// Define a refinement that enforces the constraint +export const findFieldsMetadataRequestQueryRT = new rt.Type( + 'FindFieldsMetadataRequestQuery', + (query): query is rt.TypeOf => + baseFindFieldsMetadataRequestQueryRT.is(query) && + (query.integration ? query.dataset !== undefined : true), + (input, context) => + either.chain(baseFindFieldsMetadataRequestQueryRT.validate(input, context), (query) => { + try { + if (query.integration && !query.dataset) { + throw new FetchFieldsMetadataError('dataset is required if integration is provided'); + } + + return rt.success(query); + } catch (error) { + return rt.failure(query, context, error.message); + } + }), + baseFindFieldsMetadataRequestQueryRT.encode +); + +export const findFieldsMetadataResponsePayloadRT = rt.type({ + fields: rt.record(rt.string, partialFieldMetadataPlainRT), +}); + +export type FindFieldsMetadataRequestQuery = + | { + attributes?: FieldAttribute[]; + fieldNames?: FieldName[]; + integration?: undefined; + dataset?: undefined; + } + | { + attributes?: FieldAttribute[]; + fieldNames?: FieldName[]; + integration: string; + dataset: typeof ANY_DATASET | (string & {}); + }; + +export type FindFieldsMetadataResponsePayload = rt.TypeOf< + typeof findFieldsMetadataResponsePayloadRT +>; diff --git a/x-pack/plugins/fields_metadata/common/fields_metadata/v1/index.ts b/x-pack/plugins/fields_metadata/common/fields_metadata/v1/index.ts new file mode 100644 index 0000000000000..d54098d5d36fc --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/fields_metadata/v1/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './find_fields_metadata'; diff --git a/x-pack/plugins/fields_metadata/common/hashed_cache.ts b/x-pack/plugins/fields_metadata/common/hashed_cache.ts new file mode 100644 index 0000000000000..c46e34224d4d6 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/hashed_cache.ts @@ -0,0 +1,46 @@ +/* + * 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 LRUCache from 'lru-cache'; +import hash from 'object-hash'; + +export interface IHashedCache { + get(key: KeyType): ValueType | undefined; + set(key: KeyType, value: ValueType): boolean; + has(key: KeyType): boolean; + reset(): void; +} + +export class HashedCache { + private cache: LRUCache; + + constructor(options: LRUCache.Options = { max: 500 }) { + this.cache = new LRUCache(options); + } + + public get(key: KeyType): ValueType | undefined { + const serializedKey = this.getHashedKey(key); + return this.cache.get(serializedKey); + } + + public set(key: KeyType, value: ValueType) { + const serializedKey = this.getHashedKey(key); + return this.cache.set(serializedKey, value); + } + + public has(key: KeyType): boolean { + const serializedKey = this.getHashedKey(key); + return this.cache.has(serializedKey); + } + + public reset() { + return this.cache.reset(); + } + + private getHashedKey(key: KeyType) { + return hash(key, { unorderedArrays: true }); + } +} diff --git a/x-pack/plugins/fields_metadata/common/index.ts b/x-pack/plugins/fields_metadata/common/index.ts new file mode 100644 index 0000000000000..8daf749f74261 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/index.ts @@ -0,0 +1,20 @@ +/* + * 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 { fieldMetadataPlainRT } from './fields_metadata/types'; +export type { + EcsFieldName, + FieldAttribute, + FieldMetadataPlain, + FieldName, + IntegrationFieldName, + PartialFieldMetadataPlain, + TEcsFields, +} from './fields_metadata/types'; + +export { FieldMetadata } from './fields_metadata/models/field_metadata'; +export { FieldsMetadataDictionary } from './fields_metadata/models/fields_metadata_dictionary'; diff --git a/x-pack/plugins/fields_metadata/common/latest.ts b/x-pack/plugins/fields_metadata/common/latest.ts new file mode 100644 index 0000000000000..b3ee1e9932f95 --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './fields_metadata/v1'; diff --git a/x-pack/plugins/fields_metadata/common/runtime_types.ts b/x-pack/plugins/fields_metadata/common/runtime_types.ts new file mode 100644 index 0000000000000..19df92e3af99f --- /dev/null +++ b/x-pack/plugins/fields_metadata/common/runtime_types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RouteValidationFunction } from '@kbn/core/server'; +import { createPlainError, decodeOrThrow, formatErrors, throwErrors } from '@kbn/io-ts-utils'; +import { fold } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { Errors, Type } from 'io-ts'; + +export { createPlainError, decodeOrThrow, formatErrors, throwErrors }; + +type ValdidationResult = ReturnType>; + +export const createValidationFunction = + ( + runtimeType: Type + ): RouteValidationFunction => + (inputValue, { badRequest, ok }) => + pipe( + runtimeType.decode(inputValue), + fold>( + (errors: Errors) => badRequest(formatErrors(errors)), + (result: DecodedValue) => ok(result) + ) + ); diff --git a/x-pack/plugins/fields_metadata/jest.config.js b/x-pack/plugins/fields_metadata/jest.config.js new file mode 100644 index 0000000000000..3c1d51b335696 --- /dev/null +++ b/x-pack/plugins/fields_metadata/jest.config.js @@ -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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/x-pack/plugins/fields_metadata'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/fields_metadata', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/fields_metadata/{common,public,server}/**/*.{ts,tsx}', + ], +}; diff --git a/x-pack/plugins/fields_metadata/kibana.jsonc b/x-pack/plugins/fields_metadata/kibana.jsonc new file mode 100644 index 0000000000000..2befc0c7be07b --- /dev/null +++ b/x-pack/plugins/fields_metadata/kibana.jsonc @@ -0,0 +1,14 @@ +{ + "type": "plugin", + "id": "@kbn/fields-metadata-plugin", + "owner": "@elastic/obs-ux-logs-team", + "description": "Exposes services for async usage and search of fields metadata.", + "plugin": { + "id": "fieldsMetadata", + "server": true, + "browser": true, + "configPath": ["xpack", "fields_metadata"], + "requiredPlugins": [], + "requiredBundles": [], + } +} diff --git a/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/index.ts b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/index.ts new file mode 100644 index 0000000000000..6aacffe118884 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_fields_metadata'; diff --git a/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.mock.ts b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.mock.ts new file mode 100644 index 0000000000000..3928b350aaae8 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.mock.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { UseFieldsMetadataHook } from './use_fields_metadata'; + +export const createUseFieldsMetadataHookMock = (): jest.Mocked => + jest.fn(() => ({ + fieldsMetadata: undefined, + loading: false, + error: undefined, + reload: jest.fn(), + })); diff --git a/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.test.ts b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.test.ts new file mode 100644 index 0000000000000..eaae7c5542c0b --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.test.ts @@ -0,0 +1,88 @@ +/* + * 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 { renderHook } from '@testing-library/react-hooks'; + +import { createUseFieldsMetadataHook, UseFieldsMetadataParams } from './use_fields_metadata'; +import { FindFieldsMetadataResponsePayload } from '../../../common/latest'; +import { createFieldsMetadataServiceStartMock } from '../../services/fields_metadata/fields_metadata_service.mock'; +import { IFieldsMetadataClient } from '../../services/fields_metadata'; + +const fields: FindFieldsMetadataResponsePayload['fields'] = { + '@timestamp': { + dashed_name: 'timestamp', + description: + 'Date/time when the event originated.\nThis is the date/time extracted from the event, typically representing when the event was generated by the source.\nIf the event source has no original timestamp, this value is typically populated by the first time the event was received by the pipeline.\nRequired field for all events.', + example: '2016-05-23T08:05:34.853Z', + flat_name: '@timestamp', + level: 'core', + name: '@timestamp', + normalize: [], + short: 'Date/time when the event originated.', + type: 'date', + source: 'ecs', + }, +}; + +const mockedFieldsMetadataResponse = { fields }; + +const fieldsMetadataService = createFieldsMetadataServiceStartMock(); + +const useFieldsMetadata = createUseFieldsMetadataHook({ fieldsMetadataService }); + +describe('useFieldsMetadata', () => { + let fieldsMetadataClient: jest.Mocked; + beforeEach(async () => { + fieldsMetadataClient = await fieldsMetadataService.getClient(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return the fieldsMetadata value from the API', async () => { + fieldsMetadataClient.find.mockResolvedValue(mockedFieldsMetadataResponse); + const { result, waitForNextUpdate } = renderHook(() => useFieldsMetadata()); + + expect(result.current.loading).toBe(true); + expect(result.current.fieldsMetadata).toEqual(undefined); + + await waitForNextUpdate(); + + const { fieldsMetadata, loading, error } = result.current; + expect(fieldsMetadata).toEqual(fields); + expect(loading).toBeFalsy(); + expect(error).toBeFalsy(); + }); + + it('should call the fieldsMetadata service with the passed parameters', async () => { + fieldsMetadataClient.find.mockResolvedValue(mockedFieldsMetadataResponse); + const params: UseFieldsMetadataParams = { + attributes: ['description', 'short'], + fieldNames: ['@timestamp', 'agent.name'], + integration: 'integration_name', + dataset: 'dataset_name', + }; + + const { waitForNextUpdate } = renderHook(() => useFieldsMetadata(params)); + + await waitForNextUpdate(); + + expect(fieldsMetadataClient.find).toHaveBeenCalledWith(params); + }); + + it('should return an error if the API call fails', async () => { + const error = new Error('Fetch fields metadata Failed'); + fieldsMetadataClient.find.mockRejectedValueOnce(error); + + const { result, waitForNextUpdate } = renderHook(() => useFieldsMetadata()); + + await waitForNextUpdate(); + + expect(result.current.error?.message).toMatch(error.message); + }); +}); diff --git a/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.ts b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.ts new file mode 100644 index 0000000000000..ff8a07ebba338 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect } from 'react'; +import useAsyncFn from 'react-use/lib/useAsyncFn'; +import { + FindFieldsMetadataRequestQuery, + FindFieldsMetadataResponsePayload, +} from '../../../common/latest'; +import { FieldsMetadataServiceStart } from '../../services/fields_metadata'; + +interface UseFieldsMetadataFactoryDeps { + fieldsMetadataService: FieldsMetadataServiceStart; +} + +export type UseFieldsMetadataParams = FindFieldsMetadataRequestQuery; + +export interface UseFieldsMetadataReturnType { + fieldsMetadata: FindFieldsMetadataResponsePayload['fields'] | undefined; + loading: boolean; + error: Error | undefined; + reload: ReturnType[1]; +} + +export type UseFieldsMetadataHook = ( + params?: UseFieldsMetadataParams, + deps?: Parameters[1] +) => UseFieldsMetadataReturnType; + +export const createUseFieldsMetadataHook = ({ + fieldsMetadataService, +}: UseFieldsMetadataFactoryDeps): UseFieldsMetadataHook => { + return (params = {}, deps) => { + const [{ error, loading, value }, load] = useAsyncFn(async () => { + const client = await fieldsMetadataService.getClient(); + return client.find(params); + }, deps); + + useEffect(() => { + load(); + }, [load]); + + return { fieldsMetadata: value?.fields, loading, error, reload: load }; + }; +}; diff --git a/x-pack/plugins/fields_metadata/public/index.ts b/x-pack/plugins/fields_metadata/public/index.ts new file mode 100644 index 0000000000000..74f73c2751f77 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/index.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FieldsMetadataPlugin } from './plugin'; + +export function plugin() { + return new FieldsMetadataPlugin(); +} + +export type { + FieldsMetadataPublicSetup, + FieldsMetadataPublicStart, + FieldsMetadataPublicSetupDeps, + FieldsMetadataPublicStartDeps, +} from './types'; diff --git a/x-pack/plugins/fields_metadata/public/mocks.tsx b/x-pack/plugins/fields_metadata/public/mocks.tsx new file mode 100644 index 0000000000000..400ede3aa0fc7 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/mocks.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createUseFieldsMetadataHookMock } from './hooks/use_fields_metadata/use_fields_metadata.mock'; +import { createFieldsMetadataServiceStartMock } from './services/fields_metadata/fields_metadata_service.mock'; + +const createFieldsMetadataPublicStartMock = () => ({ + getClient: createFieldsMetadataServiceStartMock().getClient, + useFieldsMetadata: createUseFieldsMetadataHookMock(), +}); + +export const fieldsMetadataPluginPublicMock = { + createStartContract: createFieldsMetadataPublicStartMock, +}; diff --git a/x-pack/plugins/fields_metadata/public/plugin.ts b/x-pack/plugins/fields_metadata/public/plugin.ts new file mode 100644 index 0000000000000..d385b3d2ae232 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/plugin.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 { CoreStart } from '@kbn/core/public'; +import { createUseFieldsMetadataHook } from './hooks/use_fields_metadata'; +import { FieldsMetadataService } from './services/fields_metadata'; +import { FieldsMetadataClientPluginClass } from './types'; + +export class FieldsMetadataPlugin implements FieldsMetadataClientPluginClass { + private fieldsMetadata: FieldsMetadataService; + + constructor() { + this.fieldsMetadata = new FieldsMetadataService(); + } + + public setup() { + this.fieldsMetadata.setup(); + + return {}; + } + + public start(core: CoreStart) { + const { http } = core; + + const fieldsMetadataService = this.fieldsMetadata.start({ http }); + + const useFieldsMetadata = createUseFieldsMetadataHook({ fieldsMetadataService }); + + return { + getClient: fieldsMetadataService.getClient, + useFieldsMetadata, + }; + } +} diff --git a/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.mock.ts b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.mock.ts new file mode 100644 index 0000000000000..6264dcc6dc080 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.mock.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IFieldsMetadataClient } from './types'; + +export const createFieldsMetadataClientMock = (): jest.Mocked => ({ + find: jest.fn(), +}); diff --git a/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.ts b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.ts new file mode 100644 index 0000000000000..176721c704126 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_client.ts @@ -0,0 +1,74 @@ +/* + * 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 { HttpStart } from '@kbn/core/public'; +import { HashedCache } from '../../../common/hashed_cache'; +import { + FindFieldsMetadataRequestQuery, + findFieldsMetadataRequestQueryRT, + FindFieldsMetadataResponsePayload, + findFieldsMetadataResponsePayloadRT, +} from '../../../common/latest'; +import { + DecodeFieldsMetadataError, + FetchFieldsMetadataError, + FieldName, + FIND_FIELDS_METADATA_URL, +} from '../../../common/fields_metadata'; +import { decodeOrThrow } from '../../../common/runtime_types'; +import { IFieldsMetadataClient } from './types'; + +export class FieldsMetadataClient implements IFieldsMetadataClient { + private cache: HashedCache; + + constructor(private readonly http: HttpStart) { + this.cache = new HashedCache(); + } + + public async find( + params: FindFieldsMetadataRequestQuery + ): Promise { + // Initially lookup for existing results given request parameters + if (this.cache.has(params)) { + return this.cache.get(params) as FindFieldsMetadataResponsePayload; + } + + const query = findFieldsMetadataRequestQueryRT.encode(params); + + const response = await this.http + .get(FIND_FIELDS_METADATA_URL, { query, version: '1' }) + .catch((error) => { + throw new FetchFieldsMetadataError( + `Failed to fetch fields ${truncateFieldNamesList(params.fieldNames)}: ${error.message}` + ); + }); + + const data = decodeOrThrow( + findFieldsMetadataResponsePayloadRT, + (message: string) => + new DecodeFieldsMetadataError( + `Failed decoding fields ${truncateFieldNamesList(params.fieldNames)}: ${message}` + ) + )(response); + + // Store cached results for given request parameters + this.cache.set(params, data); + + return data; + } +} + +const truncateFieldNamesList = (fieldNames?: FieldName[]) => { + if (!fieldNames || fieldNames.length === 0) return ''; + + const visibleFields = fieldNames.slice(0, 3); + const additionalFieldsCount = fieldNames.length - visibleFields.length; + + return visibleFields + .join() + .concat(additionalFieldsCount > 0 ? `+${additionalFieldsCount} fields` : ''); +}; diff --git a/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.mock.ts b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.mock.ts new file mode 100644 index 0000000000000..f5f21c1eeb4c0 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.mock.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createFieldsMetadataClientMock } from './fields_metadata_client.mock'; +import { IFieldsMetadataClient } from './types'; + +interface FieldsMetadataServiceStartMock { + getClient: () => Promise>; +} + +export const createFieldsMetadataServiceStartMock = + (): jest.Mocked => ({ + getClient: jest.fn().mockResolvedValue(createFieldsMetadataClientMock()), + }); diff --git a/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.ts b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.ts new file mode 100644 index 0000000000000..c5d363fbf9ffe --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/services/fields_metadata/fields_metadata_service.ts @@ -0,0 +1,37 @@ +/* + * 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 { + FieldsMetadataServiceStartDeps, + FieldsMetadataServiceSetup, + FieldsMetadataServiceStart, + IFieldsMetadataClient, +} from './types'; + +export class FieldsMetadataService { + private client?: IFieldsMetadataClient; + + public setup(): FieldsMetadataServiceSetup { + return {}; + } + + public start({ http }: FieldsMetadataServiceStartDeps): FieldsMetadataServiceStart { + return { + getClient: () => this.getClient({ http }), + }; + } + + private async getClient({ http }: FieldsMetadataServiceStartDeps) { + if (!this.client) { + const { FieldsMetadataClient } = await import('./fields_metadata_client'); + const client = new FieldsMetadataClient(http); + this.client = client; + } + + return this.client; + } +} diff --git a/x-pack/plugins/fields_metadata/public/services/fields_metadata/index.ts b/x-pack/plugins/fields_metadata/public/services/fields_metadata/index.ts new file mode 100644 index 0000000000000..76628104a8198 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/services/fields_metadata/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 * from './fields_metadata_service'; +export * from './types'; diff --git a/x-pack/plugins/fields_metadata/public/services/fields_metadata/types.ts b/x-pack/plugins/fields_metadata/public/services/fields_metadata/types.ts new file mode 100644 index 0000000000000..7ab70cc8e8500 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/services/fields_metadata/types.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpStart } from '@kbn/core/public'; +import { + FindFieldsMetadataRequestQuery, + FindFieldsMetadataResponsePayload, +} from '../../../common/latest'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataServiceSetup {} + +export interface FieldsMetadataServiceStart { + getClient: () => Promise; +} + +export interface FieldsMetadataServiceStartDeps { + http: HttpStart; +} + +export interface IFieldsMetadataClient { + find(params: FindFieldsMetadataRequestQuery): Promise; +} diff --git a/x-pack/plugins/fields_metadata/public/types.ts b/x-pack/plugins/fields_metadata/public/types.ts new file mode 100644 index 0000000000000..d7b6ff83a3164 --- /dev/null +++ b/x-pack/plugins/fields_metadata/public/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CoreSetup, CoreStart, Plugin as PluginClass } from '@kbn/core/public'; +import type { UseFieldsMetadataHook } from './hooks/use_fields_metadata/use_fields_metadata'; +import type { FieldsMetadataServiceStart } from './services/fields_metadata'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataPublicSetup {} + +export interface FieldsMetadataPublicStart { + getClient: FieldsMetadataServiceStart['getClient']; + useFieldsMetadata: UseFieldsMetadataHook; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataPublicSetupDeps {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataPublicStartDeps {} + +export type FieldsMetadataClientCoreSetup = CoreSetup< + FieldsMetadataPublicStartDeps, + FieldsMetadataPublicStart +>; +export type FieldsMetadataClientCoreStart = CoreStart; +export type FieldsMetadataClientPluginClass = PluginClass< + FieldsMetadataPublicSetup, + FieldsMetadataPublicStart, + FieldsMetadataPublicSetupDeps, + FieldsMetadataPublicStartDeps +>; + +export type FieldsMetadataPublicStartServicesAccessor = + FieldsMetadataClientCoreSetup['getStartServices']; +export type FieldsMetadataPublicStartServices = + ReturnType; diff --git a/x-pack/plugins/fields_metadata/server/fields_metadata_server.ts b/x-pack/plugins/fields_metadata/server/fields_metadata_server.ts new file mode 100644 index 0000000000000..96c57c9847091 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/fields_metadata_server.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FieldsMetadataBackendLibs } from './lib/shared_types'; +import { initFieldsMetadataRoutes } from './routes/fields_metadata'; + +export const initFieldsMetadataServer = (libs: FieldsMetadataBackendLibs) => { + initFieldsMetadataRoutes(libs); +}; diff --git a/x-pack/plugins/fields_metadata/server/index.ts b/x-pack/plugins/fields_metadata/server/index.ts new file mode 100644 index 0000000000000..1c55673e44e92 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/index.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 { PluginInitializerContext } from '@kbn/core/server'; + +export type { FieldsMetadataServerSetup, FieldsMetadataServerStart } from './types'; +export type { + IntegrationName, + DatasetName, + ExtractedIntegrationFields, + ExtractedDatasetFields, +} from './services/fields_metadata/types'; + +export async function plugin(context: PluginInitializerContext) { + const { FieldsMetadataPlugin } = await import('./plugin'); + return new FieldsMetadataPlugin(context); +} diff --git a/x-pack/plugins/fields_metadata/server/lib/shared_types.ts b/x-pack/plugins/fields_metadata/server/lib/shared_types.ts new file mode 100644 index 0000000000000..ed6f15cf9c485 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/lib/shared_types.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 type { Logger } from '@kbn/logging'; +import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; +import { IRouter } from '@kbn/core-http-server'; +import { + FieldsMetadataPluginStartServicesAccessor, + FieldsMetadataServerPluginSetupDeps, +} from '../types'; + +export interface FieldsMetadataBackendLibs { + getStartServices: FieldsMetadataPluginStartServicesAccessor; + logger: Logger; + plugins: FieldsMetadataServerPluginSetupDeps; + router: IRouter; +} diff --git a/x-pack/plugins/fields_metadata/server/mocks.ts b/x-pack/plugins/fields_metadata/server/mocks.ts new file mode 100644 index 0000000000000..b46ca661b6210 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/mocks.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 { + createFieldsMetadataServiceSetupMock, + createFieldsMetadataServiceStartMock, +} from './services/fields_metadata/fields_metadata_service.mock'; +import { FieldsMetadataServerSetup, FieldsMetadataServerStart } from './types'; + +const createFieldsMetadataServerSetupMock = (): jest.Mocked => ({ + registerIntegrationFieldsExtractor: + createFieldsMetadataServiceSetupMock().registerIntegrationFieldsExtractor, +}); + +const createFieldsMetadataServerStartMock = (): jest.Mocked => ({ + getClient: createFieldsMetadataServiceStartMock().getClient, +}); + +export const fieldsMetadataPluginServerMock = { + createSetupContract: createFieldsMetadataServerSetupMock, + createStartContract: createFieldsMetadataServerStartMock, +}; diff --git a/x-pack/plugins/fields_metadata/server/plugin.ts b/x-pack/plugins/fields_metadata/server/plugin.ts new file mode 100644 index 0000000000000..da7ede5efba3f --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/plugin.ts @@ -0,0 +1,63 @@ +/* + * 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 { PluginInitializerContext, CoreStart, Plugin, Logger } from '@kbn/core/server'; + +import { + FieldsMetadataPluginCoreSetup, + FieldsMetadataServerSetup, + FieldsMetadataServerStart, + FieldsMetadataServerPluginSetupDeps, + FieldsMetadataServerPluginStartDeps, +} from './types'; +import { initFieldsMetadataServer } from './fields_metadata_server'; +import { FieldsMetadataService } from './services/fields_metadata'; +import { FieldsMetadataBackendLibs } from './lib/shared_types'; + +export class FieldsMetadataPlugin + implements + Plugin< + FieldsMetadataServerSetup, + FieldsMetadataServerStart, + FieldsMetadataServerPluginSetupDeps, + FieldsMetadataServerPluginStartDeps + > +{ + private readonly logger: Logger; + private libs!: FieldsMetadataBackendLibs; + private fieldsMetadataService: FieldsMetadataService; + + constructor(context: PluginInitializerContext) { + this.logger = context.logger.get(); + + this.fieldsMetadataService = new FieldsMetadataService(this.logger); + } + + public setup(core: FieldsMetadataPluginCoreSetup, plugins: FieldsMetadataServerPluginSetupDeps) { + const fieldsMetadata = this.fieldsMetadataService.setup(); + + this.libs = { + getStartServices: () => core.getStartServices(), + logger: this.logger, + plugins, + router: core.http.createRouter(), + }; + + // Register server side APIs + initFieldsMetadataServer(this.libs); + + return { + registerIntegrationFieldsExtractor: fieldsMetadata.registerIntegrationFieldsExtractor, + }; + } + + public start(_core: CoreStart, _plugins: FieldsMetadataServerPluginStartDeps) { + const fieldsMetadata = this.fieldsMetadataService.start(); + + return { getClient: fieldsMetadata.getClient }; + } +} diff --git a/x-pack/plugins/fields_metadata/server/routes/fields_metadata/find_fields_metadata.ts b/x-pack/plugins/fields_metadata/server/routes/fields_metadata/find_fields_metadata.ts new file mode 100644 index 0000000000000..5e518618d98d8 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/routes/fields_metadata/find_fields_metadata.ts @@ -0,0 +1,75 @@ +/* + * 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 { createValidationFunction } from '../../../common/runtime_types'; +import { FIND_FIELDS_METADATA_URL } from '../../../common/fields_metadata'; +import * as fieldsMetadataV1 from '../../../common/fields_metadata/v1'; +import { FieldsMetadataBackendLibs } from '../../lib/shared_types'; +import { FindFieldsMetadataResponsePayload } from '../../../common/fields_metadata/v1'; +import { PackageNotFoundError } from '../../services/fields_metadata/errors'; + +export const initFindFieldsMetadataRoute = ({ + router, + getStartServices, +}: FieldsMetadataBackendLibs) => { + router.versioned + .get({ + access: 'internal', + path: FIND_FIELDS_METADATA_URL, + }) + .addVersion( + { + version: '1', + validate: { + request: { + query: createValidationFunction(fieldsMetadataV1.findFieldsMetadataRequestQueryRT), + }, + }, + }, + async (_requestContext, request, response) => { + const { attributes, fieldNames, integration, dataset } = request.query; + + const [_core, _startDeps, startContract] = await getStartServices(); + const fieldsMetadataClient = startContract.getClient(); + + try { + const fieldsDictionary = await fieldsMetadataClient.find({ + fieldNames, + integration, + dataset, + }); + + const responsePayload: FindFieldsMetadataResponsePayload = { fields: {} }; + + if (attributes) { + responsePayload.fields = fieldsDictionary.pick(attributes); + } else { + responsePayload.fields = fieldsDictionary.toPlain(); + } + + return response.ok({ + body: fieldsMetadataV1.findFieldsMetadataResponsePayloadRT.encode(responsePayload), + }); + } catch (error) { + if (error instanceof PackageNotFoundError) { + return response.badRequest({ + body: { + message: error.message, + }, + }); + } + + return response.customError({ + statusCode: error.statusCode ?? 500, + body: { + message: error.message ?? 'An unexpected error occurred', + }, + }); + } + } + ); +}; diff --git a/x-pack/plugins/fields_metadata/server/routes/fields_metadata/index.ts b/x-pack/plugins/fields_metadata/server/routes/fields_metadata/index.ts new file mode 100644 index 0000000000000..df72fb7c02e32 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/routes/fields_metadata/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { FieldsMetadataBackendLibs } from '../../lib/shared_types'; +import { initFindFieldsMetadataRoute } from './find_fields_metadata'; + +export const initFieldsMetadataRoutes = (libs: FieldsMetadataBackendLibs) => { + initFindFieldsMetadataRoute(libs); +}; diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/errors.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/errors.ts new file mode 100644 index 0000000000000..f91ebd745ec94 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/errors.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. + */ + +export class PackageNotFoundError extends Error { + constructor(message: string, public cause?: Error) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + this.name = 'PackageNotFoundError'; + } +} diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.mock.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.mock.ts new file mode 100644 index 0000000000000..3f5b6dac385bb --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.mock.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IFieldsMetadataClient } from './types'; + +export const createFieldsMetadataClientMock = (): jest.Mocked => ({ + getByName: jest.fn(), + find: jest.fn(), +}); diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.test.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.test.ts new file mode 100644 index 0000000000000..0d35dc70fd678 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.test.ts @@ -0,0 +1,171 @@ +/* + * 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 { FieldMetadata, TEcsFields } from '../../../common'; +import { loggerMock } from '@kbn/logging-mocks'; +import { FieldsMetadataClient } from './fields_metadata_client'; +import { EcsFieldsRepository } from './repositories/ecs_fields_repository'; +import { IntegrationFieldsRepository } from './repositories/integration_fields_repository'; + +const ecsFields = { + '@timestamp': { + dashed_name: 'timestamp', + description: + 'Date/time when the event originated.\nThis is the date/time extracted from the event, typically representing when the event was generated by the source.\nIf the event source has no original timestamp, this value is typically populated by the first time the event was received by the pipeline.\nRequired field for all events.', + example: '2016-05-23T08:05:34.853Z', + flat_name: '@timestamp', + level: 'core', + name: '@timestamp', + normalize: [], + required: !0, + short: 'Date/time when the event originated.', + type: 'date', + }, +} as TEcsFields; + +const integrationFields = { + '1password.item_usages': { + 'onepassword.client.platform_version': { + name: 'platform_version', + type: 'keyword', + description: + 'The version of the browser or computer where the 1Password app is installed, or the CPU of the machine where the 1Password command-line tool is installed', + flat_name: 'onepassword.client.platform_version', + source: 'integration', + dashed_name: 'onepassword-client-platform_version', + normalize: [], + short: + 'The version of the browser or computer where the 1Password app is installed, or the CPU of the machine where the 1Password command-line tool is installed', + }, + }, +}; + +describe('FieldsMetadataClient class', () => { + const logger = loggerMock.create(); + const ecsFieldsRepository = EcsFieldsRepository.create({ ecsFields }); + const integrationFieldsExtractor = jest.fn(); + integrationFieldsExtractor.mockImplementation(() => Promise.resolve(integrationFields)); + + let integrationFieldsRepository: IntegrationFieldsRepository; + let fieldsMetadataClient: FieldsMetadataClient; + + beforeEach(() => { + integrationFieldsExtractor.mockClear(); + integrationFieldsRepository = IntegrationFieldsRepository.create({ + integrationFieldsExtractor, + }); + fieldsMetadataClient = FieldsMetadataClient.create({ + ecsFieldsRepository, + integrationFieldsRepository, + logger, + }); + }); + + describe('#getByName', () => { + it('should resolve a single ECS FieldMetadata instance by default', async () => { + const timestampFieldInstance = await fieldsMetadataClient.getByName('@timestamp'); + + expect(integrationFieldsExtractor).not.toHaveBeenCalled(); + + expectToBeDefined(timestampFieldInstance); + expect(timestampFieldInstance).toBeInstanceOf(FieldMetadata); + + const timestampField = timestampFieldInstance.toPlain(); + + expect(timestampField.hasOwnProperty('dashed_name')).toBeTruthy(); + expect(timestampField.hasOwnProperty('description')).toBeTruthy(); + expect(timestampField.hasOwnProperty('example')).toBeTruthy(); + expect(timestampField.hasOwnProperty('flat_name')).toBeTruthy(); + expect(timestampField.hasOwnProperty('level')).toBeTruthy(); + expect(timestampField.hasOwnProperty('name')).toBeTruthy(); + expect(timestampField.hasOwnProperty('normalize')).toBeTruthy(); + expect(timestampField.hasOwnProperty('required')).toBeTruthy(); + expect(timestampField.hasOwnProperty('short')).toBeTruthy(); + expect(timestampField.hasOwnProperty('type')).toBeTruthy(); + }); + + it('should attempt resolving the field from an integration if it does not exist in ECS and the integration and dataset params are provided', async () => { + const onePasswordFieldInstance = await fieldsMetadataClient.getByName( + 'onepassword.client.platform_version', + { integration: '1password', dataset: '1password.item_usages' } + ); + + expect(integrationFieldsExtractor).toHaveBeenCalled(); + + expectToBeDefined(onePasswordFieldInstance); + expect(onePasswordFieldInstance).toBeInstanceOf(FieldMetadata); + + const onePasswordField = onePasswordFieldInstance.toPlain(); + + expect(onePasswordField.hasOwnProperty('name')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('type')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('description')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('flat_name')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('source')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('dashed_name')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('normalize')).toBeTruthy(); + expect(onePasswordField.hasOwnProperty('short')).toBeTruthy(); + }); + + it('should not resolve the field from an integration if the integration and dataset params are not provided', async () => { + const onePasswordFieldInstance = await fieldsMetadataClient.getByName( + 'onepassword.client.platform_version' + ); + + expect(integrationFieldsExtractor).not.toHaveBeenCalled(); + expect(onePasswordFieldInstance).toBeUndefined(); + }); + }); + + describe('#find', () => { + it('should resolve a FieldsMetadataDictionary of matching fields', async () => { + const fieldsDictionaryInstance = await fieldsMetadataClient.find({ + fieldNames: ['@timestamp'], + }); + + expect(integrationFieldsExtractor).not.toHaveBeenCalled(); + + const fields = fieldsDictionaryInstance.toPlain(); + + expect(fields.hasOwnProperty('@timestamp')).toBeTruthy(); + }); + + it('should resolve a FieldsMetadataDictionary of matching fields, including integration fields when integration and dataset params are provided', async () => { + const fieldsDictionaryInstance = await fieldsMetadataClient.find({ + fieldNames: ['@timestamp', 'onepassword.client.platform_version'], + integration: '1password', + dataset: '1password.item_usages', + }); + + expect(integrationFieldsExtractor).toHaveBeenCalled(); + + const fields = fieldsDictionaryInstance.toPlain(); + + expect(fields.hasOwnProperty('@timestamp')).toBeTruthy(); + expect(fields.hasOwnProperty('onepassword.client.platform_version')).toBeTruthy(); + }); + + it('should resolve a FieldsMetadataDictionary of matching fields, skipping unmatched fields', async () => { + const fieldsDictionaryInstance = await fieldsMetadataClient.find({ + fieldNames: ['@timestamp', 'onepassword.client.platform_version', 'not-existing-field'], + integration: '1password', + dataset: '1password.item_usages', + }); + + expect(integrationFieldsExtractor).toHaveBeenCalled(); + + const fields = fieldsDictionaryInstance.toPlain(); + + expect(fields.hasOwnProperty('@timestamp')).toBeTruthy(); + expect(fields.hasOwnProperty('onepassword.client.platform_version')).toBeTruthy(); + expect(fields.hasOwnProperty('not-existing-field')).toBeFalsy(); + }); + }); +}); + +function expectToBeDefined(value: T | undefined): asserts value is T { + expect(value).toBeDefined(); +} diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.ts new file mode 100644 index 0000000000000..e152c14347927 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_client.ts @@ -0,0 +1,73 @@ +/* + * 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 { Logger } from '@kbn/core/server'; +import { FieldName, FieldMetadata, FieldsMetadataDictionary } from '../../../common'; +import { EcsFieldsRepository } from './repositories/ecs_fields_repository'; +import { IntegrationFieldsRepository } from './repositories/integration_fields_repository'; +import { IntegrationFieldsSearchParams } from './repositories/types'; +import { FindFieldsMetadataOptions, IFieldsMetadataClient } from './types'; + +interface FieldsMetadataClientDeps { + logger: Logger; + ecsFieldsRepository: EcsFieldsRepository; + integrationFieldsRepository: IntegrationFieldsRepository; +} + +export class FieldsMetadataClient implements IFieldsMetadataClient { + private constructor( + private readonly logger: Logger, + private readonly ecsFieldsRepository: EcsFieldsRepository, + private readonly integrationFieldsRepository: IntegrationFieldsRepository + ) {} + + async getByName( + fieldName: TFieldName, + { integration, dataset }: Partial = {} + ): Promise { + this.logger.debug(`Retrieving field metadata for: ${fieldName}`); + + // 1. Try resolving from ecs static metadata + let field = this.ecsFieldsRepository.getByName(fieldName); + + // 2. Try searching for the fiels in the Elastic Package Registry + if (!field && integration) { + field = await this.integrationFieldsRepository.getByName(fieldName, { integration, dataset }); + } + + return field; + } + + async find({ + fieldNames, + integration, + dataset, + }: FindFieldsMetadataOptions = {}): Promise { + if (!fieldNames) { + return this.ecsFieldsRepository.find(); + } + + const fields: Record = {}; + for (const fieldName of fieldNames) { + const field = await this.getByName(fieldName, { integration, dataset }); + + if (field) { + fields[fieldName] = field; + } + } + + return FieldsMetadataDictionary.create(fields); + } + + public static create({ + logger, + ecsFieldsRepository, + integrationFieldsRepository, + }: FieldsMetadataClientDeps) { + return new FieldsMetadataClient(logger, ecsFieldsRepository, integrationFieldsRepository); + } +} diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.mock.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.mock.ts new file mode 100644 index 0000000000000..6fab587c9ca7a --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.mock.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createFieldsMetadataClientMock } from './fields_metadata_client.mock'; +import { FieldsMetadataServiceSetup, FieldsMetadataServiceStart } from './types'; + +export const createFieldsMetadataServiceSetupMock = + (): jest.Mocked => ({ + registerIntegrationFieldsExtractor: jest.fn(), + }); + +export const createFieldsMetadataServiceStartMock = + (): jest.Mocked => ({ + getClient: jest.fn(() => createFieldsMetadataClientMock()), + }); diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.ts new file mode 100644 index 0000000000000..391da465e9a1f --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/fields_metadata_service.ts @@ -0,0 +1,47 @@ +/* + * 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 { EcsFlat as ecsFields } from '@elastic/ecs'; +import { Logger } from '@kbn/core/server'; +import { FieldsMetadataClient } from './fields_metadata_client'; +import { EcsFieldsRepository } from './repositories/ecs_fields_repository'; +import { IntegrationFieldsRepository } from './repositories/integration_fields_repository'; +import { IntegrationFieldsExtractor } from './repositories/types'; +import { FieldsMetadataServiceSetup, FieldsMetadataServiceStart } from './types'; + +export class FieldsMetadataService { + private integrationFieldsExtractor: IntegrationFieldsExtractor = () => Promise.resolve({}); + + constructor(private readonly logger: Logger) {} + + public setup(): FieldsMetadataServiceSetup { + return { + registerIntegrationFieldsExtractor: (extractor: IntegrationFieldsExtractor) => { + this.integrationFieldsExtractor = extractor; + }, + }; + } + + public start(): FieldsMetadataServiceStart { + const { logger, integrationFieldsExtractor } = this; + + const ecsFieldsRepository = EcsFieldsRepository.create({ ecsFields }); + const integrationFieldsRepository = IntegrationFieldsRepository.create({ + integrationFieldsExtractor, + }); + + return { + getClient() { + return FieldsMetadataClient.create({ + logger, + ecsFieldsRepository, + integrationFieldsRepository, + }); + }, + }; + } +} diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/index.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/index.ts new file mode 100644 index 0000000000000..51f5348b1be93 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/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. + */ + +export { FieldsMetadataService } from './fields_metadata_service'; +export { FieldsMetadataClient } from './fields_metadata_client'; +export type { + FieldsMetadataServiceSetup, + FieldsMetadataServiceStart, + FieldsMetadataServiceStartDeps, +} from './types'; diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/ecs_fields_repository.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/ecs_fields_repository.ts new file mode 100644 index 0000000000000..05f34bbf0ee60 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/ecs_fields_repository.ts @@ -0,0 +1,54 @@ +/* + * 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 mapValues from 'lodash/mapValues'; +import { FieldsMetadataDictionary } from '../../../../common/fields_metadata/models/fields_metadata_dictionary'; +import { FieldMetadata, FieldName, TEcsFields } from '../../../../common'; + +interface EcsFieldsRepositoryDeps { + ecsFields: TEcsFields; +} + +interface FindOptions { + fieldNames?: FieldName[]; +} + +export class EcsFieldsRepository { + private readonly ecsFields: Record; + + private constructor(ecsFields: TEcsFields) { + this.ecsFields = mapValues(ecsFields, (field) => + FieldMetadata.create({ ...field, source: 'ecs' }) + ); + } + + getByName(fieldName: FieldName): FieldMetadata | undefined { + return this.ecsFields[fieldName]; + } + + find({ fieldNames }: FindOptions = {}): FieldsMetadataDictionary { + if (!fieldNames) { + return FieldsMetadataDictionary.create(this.ecsFields); + } + + const fields = fieldNames.reduce((fieldsMetadata, fieldName) => { + const field = this.getByName(fieldName); + + if (field) { + fieldsMetadata[fieldName] = field; + } + + return fieldsMetadata; + }, {} as Record); + + return FieldsMetadataDictionary.create(fields); + } + + public static create({ ecsFields }: EcsFieldsRepositoryDeps) { + return new EcsFieldsRepository(ecsFields); + } +} diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/integration_fields_repository.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/integration_fields_repository.ts new file mode 100644 index 0000000000000..0f25d9357855e --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/integration_fields_repository.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ANY_DATASET } from '../../../../common/fields_metadata'; +import { HashedCache } from '../../../../common/hashed_cache'; +import { FieldMetadata, IntegrationFieldName } from '../../../../common'; +import { + ExtractedIntegrationFields, + IntegrationFieldsExtractor, + IntegrationFieldsSearchParams, + IntegrationName, +} from './types'; +import { PackageNotFoundError } from '../errors'; +interface IntegrationFieldsRepositoryDeps { + integrationFieldsExtractor: IntegrationFieldsExtractor; +} + +type DatasetFieldsMetadata = Record; +type IntegrationFieldsMetadataTree = Record; + +export class IntegrationFieldsRepository { + private cache: HashedCache; + + private constructor(private readonly fieldsExtractor: IntegrationFieldsExtractor) { + this.cache = new HashedCache(); + } + + async getByName( + fieldName: IntegrationFieldName, + { integration, dataset }: IntegrationFieldsSearchParams + ): Promise { + let field = this.getCachedField(fieldName, { integration, dataset }); + + if (!field) { + try { + await this.extractFields({ integration, dataset }); + } catch (error) { + throw new PackageNotFoundError(error.message); + } + + field = this.getCachedField(fieldName, { integration, dataset }); + } + + return field; + } + + public static create({ integrationFieldsExtractor }: IntegrationFieldsRepositoryDeps) { + return new IntegrationFieldsRepository(integrationFieldsExtractor); + } + + private async extractFields({ + integration, + dataset, + }: IntegrationFieldsSearchParams): Promise { + const cacheKey = this.getCacheKey({ integration, dataset }); + const cachedIntegration = this.cache.get(cacheKey); + + if (cachedIntegration) { + return undefined; + } + + return this.fieldsExtractor({ integration, dataset }) + .then(this.mapExtractedFieldsToFieldMetadataTree) + .then((fieldMetadataTree) => this.storeFieldsInCache(cacheKey, fieldMetadataTree)); + } + + private getCachedField( + fieldName: IntegrationFieldName, + { integration, dataset }: IntegrationFieldsSearchParams + ): FieldMetadata | undefined { + const cacheKey = this.getCacheKey({ integration, dataset }); + const cachedIntegration = this.cache.get(cacheKey); + const datasetName = dataset === ANY_DATASET ? null : dataset; + + // 1. Integration fields were never fetched + if (!cachedIntegration) { + return undefined; + } + + // 2. Dataset is passed but was never fetched before + if (datasetName && !cachedIntegration.hasOwnProperty(datasetName)) { + return undefined; + } + + // 3. Dataset is passed and it was previously fetched, should return the field + if (datasetName && cachedIntegration.hasOwnProperty(datasetName)) { + const targetDataset = cachedIntegration[datasetName]; + return targetDataset[fieldName]; + } + + // 4. Dataset is not passed, we attempt search on all stored datasets + if (!datasetName) { + // Merge all the available datasets into a unique field list. Overriding fields might occur in the process. + const cachedDatasetsFields = Object.assign({}, ...Object.values(cachedIntegration)); + return cachedDatasetsFields[fieldName]; + } + } + + private storeFieldsInCache = ( + cacheKey: IntegrationFieldsSearchParams, + extractedFieldsMetadata: IntegrationFieldsMetadataTree + ): void => { + const cachedIntegration = this.cache.get(cacheKey); + + if (!cachedIntegration) { + this.cache.set(cacheKey, extractedFieldsMetadata); + } else { + this.cache.set(cacheKey, { ...cachedIntegration, ...extractedFieldsMetadata }); + } + }; + + private getCacheKey = (params: IntegrationFieldsSearchParams) => params; + + private mapExtractedFieldsToFieldMetadataTree = (extractedFields: ExtractedIntegrationFields) => { + const datasetGroups = Object.entries(extractedFields); + + return datasetGroups.reduce((integrationGroup, [datasetName, datasetGroup]) => { + const datasetFieldsEntries = Object.entries(datasetGroup); + + integrationGroup[datasetName] = datasetFieldsEntries.reduce( + (datasetFields, [fieldName, field]) => { + datasetFields[fieldName] = FieldMetadata.create({ ...field, source: 'integration' }); + return datasetFields; + }, + {} as DatasetFieldsMetadata + ); + + return integrationGroup; + }, {} as IntegrationFieldsMetadataTree); + }; +} diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts new file mode 100644 index 0000000000000..e258c46b569b4 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts @@ -0,0 +1,22 @@ +/* + * 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 { FieldMetadataPlain } from '../../../../common'; + +export interface IntegrationFieldsSearchParams { + integration: string; + dataset?: string; +} + +export type IntegrationName = string; +export type DatasetName = string; +export type ExtractedIntegrationFields = Record; +export type ExtractedDatasetFields = Record; + +export type IntegrationFieldsExtractor = ( + params: IntegrationFieldsSearchParams +) => Promise; diff --git a/x-pack/plugins/fields_metadata/server/services/fields_metadata/types.ts b/x-pack/plugins/fields_metadata/server/services/fields_metadata/types.ts new file mode 100644 index 0000000000000..5b87f3299d61b --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/services/fields_metadata/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FieldName, FieldMetadata, FieldsMetadataDictionary } from '../../../common'; +import { IntegrationFieldsExtractor, IntegrationFieldsSearchParams } from './repositories/types'; + +export * from './repositories/types'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataServiceStartDeps {} + +export interface FieldsMetadataServiceSetup { + registerIntegrationFieldsExtractor: (extractor: IntegrationFieldsExtractor) => void; +} + +export interface FieldsMetadataServiceStart { + getClient(): IFieldsMetadataClient; +} + +export interface FindFieldsMetadataOptions extends Partial { + fieldNames?: FieldName[]; +} + +export interface IFieldsMetadataClient { + getByName(fieldName: FieldName): Promise; + find(params: FindFieldsMetadataOptions): Promise; +} diff --git a/x-pack/plugins/fields_metadata/server/types.ts b/x-pack/plugins/fields_metadata/server/types.ts new file mode 100644 index 0000000000000..4e2bf7ce2c0b3 --- /dev/null +++ b/x-pack/plugins/fields_metadata/server/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CoreSetup } from '@kbn/core/server'; + +import { + FieldsMetadataServiceSetup, + FieldsMetadataServiceStart, +} from './services/fields_metadata/types'; + +export type FieldsMetadataPluginCoreSetup = CoreSetup< + FieldsMetadataServerPluginStartDeps, + FieldsMetadataServerStart +>; +export type FieldsMetadataPluginStartServicesAccessor = + FieldsMetadataPluginCoreSetup['getStartServices']; + +export interface FieldsMetadataServerSetup { + registerIntegrationFieldsExtractor: FieldsMetadataServiceSetup['registerIntegrationFieldsExtractor']; +} + +export interface FieldsMetadataServerStart { + getClient: FieldsMetadataServiceStart['getClient']; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataServerPluginSetupDeps {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface FieldsMetadataServerPluginStartDeps {} diff --git a/x-pack/plugins/fields_metadata/tsconfig.json b/x-pack/plugins/fields_metadata/tsconfig.json new file mode 100644 index 0000000000000..91fc85b3024ea --- /dev/null +++ b/x-pack/plugins/fields_metadata/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "../../../typings/**/*", + "common/**/*", + "public/**/*", + "server/**/*", + "types/**/*" + ], + "exclude": ["target/**/*"], + "kbn_references": [ + "@kbn/core", + "@kbn/io-ts-utils", + "@kbn/logging", + "@kbn/core-http-request-handler-context-server", + "@kbn/core-http-server", + "@kbn/logging-mocks", + ] +} diff --git a/x-pack/plugins/fleet/kibana.jsonc b/x-pack/plugins/fleet/kibana.jsonc index c5e2eea368fed..3211a6a96ebbb 100644 --- a/x-pack/plugins/fleet/kibana.jsonc +++ b/x-pack/plugins/fleet/kibana.jsonc @@ -23,7 +23,8 @@ "taskManager", "files", "uiActions", - "dashboard" + "dashboard", + "fieldsMetadata" ], "optionalPlugins": [ "features", diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 103c44ff1f8d4..1c2ff2353a1a2 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -41,6 +41,7 @@ import type { SecurityPluginStart, } from '@kbn/security-plugin/server'; import type { PluginSetupContract as FeaturesPluginSetup } from '@kbn/features-plugin/server'; +import type { FieldsMetadataServerSetup } from '@kbn/fields-metadata-plugin/server'; import type { TaskManagerSetupContract, TaskManagerStartContract, @@ -125,6 +126,7 @@ import { PolicyWatcher } from './services/agent_policy_watch'; import { getPackageSpecTagId } from './services/epm/kibana/assets/tag_assets'; import { FleetMetricsTask } from './services/metrics/fleet_metrics_task'; import { fetchAgentMetrics } from './services/metrics/fetch_agent_metrics'; +import { registerIntegrationFieldsExtractor } from './services/register_integration_fields_extractor'; export interface FleetSetupDeps { security: SecurityPluginSetup; @@ -135,6 +137,7 @@ export interface FleetSetupDeps { spaces?: SpacesPluginStart; telemetry?: TelemetryPluginSetup; taskManager: TaskManagerSetupContract; + fieldsMetadata: FieldsMetadataServerSetup; } export interface FleetStartDeps { @@ -279,7 +282,7 @@ export class FleetPlugin }); } - public setup(core: CoreSetup, deps: FleetSetupDeps) { + public setup(core: CoreSetup, deps: FleetSetupDeps) { this.httpSetup = core.http; this.encryptedSavedObjectsSetup = deps.encryptedSavedObjects; this.cloud = deps.cloud; @@ -574,6 +577,9 @@ export class FleetPlugin taskManager: deps.taskManager, logFactory: this.initializerContext.logger, }); + + // Register fields metadata extractor + registerIntegrationFieldsExtractor({ core, fieldsMetadata: deps.fieldsMetadata }); } public start(core: CoreStart, plugins: FleetStartDeps): FleetStartContract { diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts b/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts index f3bb2b06f2b03..e07b131a9e806 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts @@ -16,6 +16,7 @@ const createClientMock = (): jest.Mocked => ({ readBundledPackage: jest.fn(), getAgentPolicyInputs: jest.fn(), getPackage: jest.fn(), + getPackageFieldsMetadata: jest.fn(), getPackages: jest.fn(), reinstallEsAssets: jest.fn(), }); diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.test.ts b/x-pack/plugins/fleet/server/services/epm/package_service.test.ts index 8bd2ace1d760c..479d355c00e68 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.test.ts @@ -44,6 +44,7 @@ const testKeys = [ 'ensureInstalledPackage', 'fetchFindLatestPackage', 'getPackage', + 'getPackageFieldsMetadata', 'reinstallEsAssets', 'readBundledPackage', ]; @@ -127,6 +128,20 @@ function getTest( }; break; case testKeys[4]: + test = { + method: mocks.packageClient.getPackageFieldsMetadata.bind(mocks.packageClient), + args: [{ packageName: 'package_name', datasetName: 'dataset_name' }], + spy: jest.spyOn(epmRegistry, 'getPackageFieldsMetadata'), + spyArgs: [{ packageName: 'package_name', datasetName: 'dataset_name' }, undefined], + spyResponse: { + dataset_name: { field_1: { flat_name: 'field_1', type: 'keyword' } }, + }, + expectedReturnValue: { + dataset_name: { field_1: { flat_name: 'field_1', type: 'keyword' } }, + }, + }; + break; + case testKeys[5]: const pkg: InstallablePackage = { format_version: '1.0.0', name: 'package name', @@ -172,7 +187,7 @@ function getTest( ], }; break; - case testKeys[5]: + case testKeys[6]: const bundledPackage = { name: 'package name', version: '8.0.0', diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.ts b/x-pack/plugins/fleet/server/services/epm/package_service.ts index b2212f2e7f6c0..ae2f5721aae8b 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.ts @@ -43,6 +43,7 @@ import { appContextService } from '..'; import type { CustomPackageDatasetConfiguration } from './packages/install'; import type { FetchFindLatestPackageOptions } from './registry'; +import { getPackageFieldsMetadata } from './registry'; import * as Registry from './registry'; import { fetchFindLatestPackageOrThrow, getPackage } from './registry'; @@ -100,8 +101,14 @@ export interface PackageClient { getPackage( packageName: string, - packageVersion: string - ): Promise<{ packageInfo: ArchivePackage; paths: string[] }>; + packageVersion: string, + options?: Parameters['2'] + ): ReturnType; + + getPackageFieldsMetadata( + params: Parameters['0'], + options?: Parameters['1'] + ): ReturnType; getPackages(params?: { excludeInstallStatus?: false; @@ -312,6 +319,14 @@ class PackageClientImpl implements PackageClient { return getPackage(packageName, packageVersion, options); } + public async getPackageFieldsMetadata( + params: Parameters['0'], + options?: Parameters['1'] + ) { + await this.#runPreflight(READ_PACKAGE_INFO_AUTHZ); + return getPackageFieldsMetadata(params, options); + } + public async getPackages(params?: { excludeInstallStatus?: false; category?: CategoryId; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/utils.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/utils.test.ts new file mode 100644 index 0000000000000..166687a836fb1 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/epm/packages/utils.test.ts @@ -0,0 +1,88 @@ +/* + * 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 { dump } from 'js-yaml'; + +import type { AssetsMap } from '../../../../common/types'; + +import type { RegistryDataStream } from '../../../../common'; + +import { resolveDataStreamFields } from './utils'; + +describe('resolveDataStreamFields', () => { + const statusAssetYml = dump([ + { + name: 'apache.status', + type: 'group', + fields: [ + { + name: 'total_accesses', + type: 'long', + description: 'Total number of access requests.\n', + metric_type: 'counter', + }, + { + name: 'uptime', + type: 'group', + fields: [ + { + name: 'server_uptime', + type: 'long', + description: 'Server uptime in seconds.\n', + metric_type: 'counter', + }, + { + name: 'uptime', + type: 'long', + description: 'Server uptime.\n', + metric_type: 'counter', + }, + ], + }, + ], + }, + ]); + + const dataStream = { + dataset: 'apache.status', + path: 'status', + } as RegistryDataStream; + + const assetsMap = new Map([ + ['apache-1.18.0/data_stream/status/fields/fields.yml', Buffer.from(statusAssetYml)], + ]) as AssetsMap; + + const expectedResult = { + 'apache.status': { + 'apache.status.total_accesses': { + name: 'total_accesses', + type: 'long', + description: 'Total number of access requests.\n', + metric_type: 'counter', + flat_name: 'apache.status.total_accesses', + }, + 'apache.status.uptime.server_uptime': { + name: 'server_uptime', + type: 'long', + description: 'Server uptime in seconds.\n', + metric_type: 'counter', + flat_name: 'apache.status.uptime.server_uptime', + }, + 'apache.status.uptime.uptime': { + name: 'uptime', + type: 'long', + description: 'Server uptime.\n', + metric_type: 'counter', + flat_name: 'apache.status.uptime.uptime', + }, + }, + }; + + it('should load and resolve fields for the passed data stream', () => { + expect(resolveDataStreamFields({ dataStream, assetsMap })).toEqual(expectedResult); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/utils.ts b/x-pack/plugins/fleet/server/services/epm/packages/utils.ts index 0cb97ca007daf..5be4833d290bd 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/utils.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/utils.ts @@ -6,6 +6,119 @@ */ import { withSpan } from '@kbn/apm-utils'; +import type { FieldMetadataPlain } from '@kbn/fields-metadata-plugin/common'; +import type { ExtractedDatasetFields } from '@kbn/fields-metadata-plugin/server'; + +import { load } from 'js-yaml'; + +import type { RegistryDataStream } from '../../../../common'; +import type { AssetsMap } from '../../../../common/types'; + +type InputField = + | FieldMetadataPlain + | { + name: string; + type: 'group'; + fields: InputField[]; + }; export const withPackageSpan = (stepName: string, func: () => Promise) => withSpan({ name: stepName, type: 'package' }, func); + +const normalizeFields = (fields: InputField[], prefix = ''): ExtractedDatasetFields => { + return fields.reduce((normalizedFields, field) => { + const flatName = prefix ? `${prefix}.${field.name}` : field.name; + // Recursively resolve field groups + if (isGroupField(field)) { + return Object.assign(normalizedFields, normalizeFields(field.fields || [], flatName)); + } + + normalizedFields[flatName] = createIntegrationField(field, flatName); + + return normalizedFields; + }, {} as ExtractedDatasetFields); +}; + +const createIntegrationField = ( + field: Omit, + flatName: string +) => ({ + ...field, + flat_name: flatName, +}); + +const isGroupField = (field: InputField): field is Extract => { + return field.type === 'group'; +}; + +export const resolveDataStreamsMap = ( + dataStreams?: RegistryDataStream[] +): Map => { + if (!dataStreams) return new Map(); + + return dataStreams.reduce((dataStreamsMap, dataStream) => { + dataStreamsMap.set(dataStream.dataset, dataStream); + return dataStreamsMap; + }, new Map() as Map); +}; + +export const resolveDataStreamFields = ({ + dataStream, + assetsMap, + excludedFieldsAssets, +}: { + dataStream: RegistryDataStream; + assetsMap: AssetsMap; + excludedFieldsAssets?: string[]; +}) => { + const { dataset, path } = dataStream; + const dataStreamFieldsAssetPaths = getDataStreamFieldsAssetPaths( + assetsMap, + path, + excludedFieldsAssets + ); + + /** + * We want to create a single dictionary with fields taken from all the dataset /fields assets. + * This step + * - reads the files buffer + * - normalizes the fields data structure for each file + * - finally merge the fields from each file into a single dictionary + */ + const fields = dataStreamFieldsAssetPaths.reduce((dataStreamFields, fieldsAssetPath) => { + const fieldsAssetBuffer = assetsMap.get(fieldsAssetPath); + + if (fieldsAssetBuffer) { + const fieldsAssetJSON = load(fieldsAssetBuffer.toString('utf8')); + const normalizedFields = normalizeFields(fieldsAssetJSON); + Object.assign(dataStreamFields, normalizedFields); + } + + return dataStreamFields; + }, {} as ExtractedDatasetFields); + + return { + [dataset]: fields, + }; +}; + +const isFieldsAsset = ( + assetPath: string, + dataStreamPath: string, + excludedFieldsAssets: string[] = [] +) => { + return new RegExp( + `.*\/data_stream\/${dataStreamPath}\/fields\/(?!(${excludedFieldsAssets.join('|')})$).*\.yml`, + 'i' + ).test(assetPath); +}; + +const getDataStreamFieldsAssetPaths = ( + assetsMap: AssetsMap, + dataStreamPath: string, + excludedFieldsAssets?: string[] +) => { + return [...assetsMap.keys()].filter((path) => + isFieldsAsset(path, dataStreamPath, excludedFieldsAssets) + ); +}; diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index 9dfd307725945..bb4d612aa7de3 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -13,6 +13,8 @@ import semverGte from 'semver/functions/gte'; import type { Response } from 'node-fetch'; import type { Logger } from '@kbn/logging'; +import type { ExtractedIntegrationFields } from '@kbn/fields-metadata-plugin/server'; + import { splitPkgKey as split } from '../../../../common/services'; import { KibanaAssetType } from '../../../types'; @@ -48,7 +50,7 @@ import { import { getBundledPackageByName } from '../packages/bundled_packages'; -import { withPackageSpan } from '../packages/utils'; +import { resolveDataStreamFields, resolveDataStreamsMap, withPackageSpan } from '../packages/utils'; import { verifyPackageArchiveSignature } from '../packages/package_verification'; @@ -352,6 +354,49 @@ export async function getPackage( return { paths, packageInfo, assetsMap, verificationResult }; } +export async function getPackageFieldsMetadata( + params: { packageName: string; datasetName?: string }, + options: { excludedFieldsAssets?: string[] } = {} +): Promise { + const { packageName, datasetName } = params; + const { excludedFieldsAssets = ['ecs.yml'] } = options; + + // Attempt retrieving latest package name and version + const latestPackage = await fetchFindLatestPackageOrThrow(packageName); + const { name, version } = latestPackage; + + // Attempt retrieving latest package + const resolvedPackage = await getPackage(name, version); + + // We need to collect all the available data streams for the package. + // In case a dataset is specified from the parameter, it will load the fields only for that specific dataset. + // As a fallback case, we'll try to read the fields for all the data streams in the package. + const dataStreamsMap = resolveDataStreamsMap(resolvedPackage.packageInfo.data_streams); + + const { assetsMap } = resolvedPackage; + + const dataStream = datasetName ? dataStreamsMap.get(datasetName) : null; + + if (dataStream) { + // Resolve a single data stream fields when the `datasetName` parameter is specified + return resolveDataStreamFields({ dataStream, assetsMap, excludedFieldsAssets }); + } else { + // Resolve and merge all the integration data streams fields otherwise + return [...dataStreamsMap.values()].reduce( + (packageDataStreamsFields, currentDataStream) => + Object.assign( + packageDataStreamsFields, + resolveDataStreamFields({ + dataStream: currentDataStream, + assetsMap, + excludedFieldsAssets, + }) + ), + {} + ); + } +} + function ensureContentType(archivePath: string) { const contentType = mime.lookup(archivePath); diff --git a/x-pack/plugins/fleet/server/services/register_integration_fields_extractor.ts b/x-pack/plugins/fleet/server/services/register_integration_fields_extractor.ts new file mode 100644 index 0000000000000..d06c1e528469d --- /dev/null +++ b/x-pack/plugins/fleet/server/services/register_integration_fields_extractor.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CoreSetup } from '@kbn/core/server'; +import type { FieldsMetadataServerSetup } from '@kbn/fields-metadata-plugin/server'; + +import type { FleetStartContract, FleetStartDeps } from '../plugin'; + +interface RegistrationDeps { + core: CoreSetup; + fieldsMetadata: FieldsMetadataServerSetup; +} + +export const registerIntegrationFieldsExtractor = ({ core, fieldsMetadata }: RegistrationDeps) => { + fieldsMetadata.registerIntegrationFieldsExtractor(async ({ integration, dataset }) => { + const [_core, _startDeps, { packageService }] = await core.getStartServices(); + + return packageService.asInternalUser.getPackageFieldsMetadata({ + packageName: integration, + datasetName: dataset, + }); + }); +}; diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index ed94ac34dca8c..d4807a5ef53b2 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -108,6 +108,7 @@ "@kbn/zod-helpers", "@kbn/react-kibana-mount", "@kbn/react-kibana-context-render", + "@kbn/fields-metadata-plugin", "@kbn/test-jest-helpers", ] } diff --git a/yarn.lock b/yarn.lock index 172b8fc5940fa..66c3d86bcbbe7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4948,6 +4948,10 @@ version "0.0.0" uid "" +"@kbn/fields-metadata-plugin@link:x-pack/plugins/fields_metadata": + version "0.0.0" + uid "" + "@kbn/file-upload-plugin@link:x-pack/plugins/file_upload": version "0.0.0" uid "" From 8902e06ae6a4ae81f93d78541167ebf517c25f5a Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 5 Jun 2024 10:07:13 +0200 Subject: [PATCH 62/82] [Lens] Fix reference line width stale update (#184414) ## Summary Fixes #182775 Prevents stale update on line width update. I suspect the root problem there was due to this commit 0657a0865187e28a1943bbaa4faa1167c17f1aba applied for too many re-renderings within the annotation panel. I've removed the fix there and used a `useMemo` for the `currentConfig` prop in the parent component to stabilize the object reference on change. I've profiled the renderings with the React profiler without noticing any particular issue. --- .../annotation_editor_controls.tsx | 17 ++++++++++++----- .../components/line_style_settings.tsx | 9 +++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx b/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx index abaf044b75fa3..9e21abbbc67b3 100644 --- a/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx +++ b/packages/kbn-event-annotation-components/components/annotation_editor_controls/annotation_editor_controls.tsx @@ -8,7 +8,7 @@ import './index.scss'; import { isFieldLensCompatible } from '@kbn/visualization-ui-components'; -import React, { useCallback, useEffect } from 'react'; +import React, { useCallback, useEffect, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiSwitch, EuiSwitchEvent, EuiButtonGroup, EuiSpacer } from '@elastic/eui'; import { @@ -87,6 +87,16 @@ const AnnotationEditorControls = ({ [currentAnnotation, onAnnotationChange] ); + const currentLineConfig = useMemo(() => { + if (isRange) { + return; + } + return { + lineStyle: currentAnnotation.lineStyle, + lineWidth: currentAnnotation.lineWidth, + }; + }, [currentAnnotation, isRange]); + return ( <> )} diff --git a/packages/kbn-visualization-ui-components/components/line_style_settings.tsx b/packages/kbn-visualization-ui-components/components/line_style_settings.tsx index 0151e85004d73..15a12c2f18a48 100644 --- a/packages/kbn-visualization-ui-components/components/line_style_settings.tsx +++ b/packages/kbn-visualization-ui-components/components/line_style_settings.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { useState, memo, useCallback } from 'react'; +import React, { useState, memo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonGroup, @@ -44,12 +44,9 @@ export const LineStyleSettings = ({ { + onChange={(value) => { setConfig({ lineWidth: value }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [])} + }} /> From 3793d2f04ae62140760260c1842c97d0bdd5eb35 Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Wed, 5 Jun 2024 10:11:52 +0200 Subject: [PATCH 63/82] [Infra] Add asset details flyout test for the initial container view (#184746) Closes #183899 ## Summary This PR adds asset details flyout test for the initial container view. --- .../test/functional/apps/infra/home_page.ts | 110 +++++++++++++++++- .../test/functional/apps/infra/hosts_view.ts | 4 +- .../page_objects/infra_home_page.ts | 4 + .../page_objects/infra_hosts_view.ts | 4 - .../observability/infra/hosts_page.ts | 2 +- 5 files changed, 116 insertions(+), 8 deletions(-) diff --git a/x-pack/test/functional/apps/infra/home_page.ts b/x-pack/test/functional/apps/infra/home_page.ts index 5e0dd1d36d50f..f1de6350b084f 100644 --- a/x-pack/test/functional/apps/infra/home_page.ts +++ b/x-pack/test/functional/apps/infra/home_page.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { parse } from 'url'; import { KUBERNETES_TOUR_STORAGE_KEY } from '@kbn/infra-plugin/public/pages/metrics/inventory_view/components/kubernetes_tour'; import { InfraSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { enableInfrastructureContainerAssetView } from '@kbn/observability-plugin/common'; import { FtrProviderContext } from '../../ftr_provider_context'; import { DATES, INVENTORY_PATH } from './constants'; import { generateDockerContainersData } from './helpers'; @@ -46,6 +47,12 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { return !!currentUrl.match(path); }); + const setInfrastructureContainerAssetViewUiSetting = async (value: boolean = true) => { + await kibanaServer.uiSettings.update({ [enableInfrastructureContainerAssetView]: value }); + await browser.refresh(); + await pageObjects.header.waitUntilLoadingHasFinished(); + }; + describe('Home page', function () { this.tags('includeFirefox'); before(async () => { @@ -137,7 +144,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { // await pageObjects.infraHome.getWaffleMapTooltips(); see https://github.com/elastic/kibana/issues/137903 }); - describe('Asset Details flyout', () => { + describe('Asset Details flyout for a host', () => { before(async () => { await pageObjects.infraHome.goToTime(DATE_WITH_DATA); await pageObjects.infraHome.getWaffleMap(); @@ -145,6 +152,12 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.infraHome.clickOnNode(); }); + after(async () => { + await retry.try(async () => { + await pageObjects.infraHome.clickCloseFlyoutButton(); + }); + }); + describe('Overview Tab', () => { before(async () => { await pageObjects.assetDetails.clickOverviewTab(); @@ -248,6 +261,101 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); + describe('Asset Details flyout for a container', () => { + let synthEsClient: InfraSynthtraceEsClient; + before(async () => { + await setInfrastructureContainerAssetViewUiSetting(true); + const version = await infraSynthtraceKibanaClient.fetchLatestSystemPackageVersion(); + await infraSynthtraceKibanaClient.installSystemPackage(version); + synthEsClient = await getInfraSynthtraceEsClient(esClient); + await synthEsClient.index( + generateDockerContainersData({ + from: DATE_WITH_DOCKER_DATA_FROM, + to: DATE_WITH_DOCKER_DATA_TO, + count: 5, + }) + ); + + await pageObjects.infraHome.goToContainer(); + await pageObjects.infraHome.goToTime(DATE_WITH_DOCKER_DATA); + await pageObjects.infraHome.clickOnFirstNode(); + }); + + after(async () => { + await setInfrastructureContainerAssetViewUiSetting(false); + return await synthEsClient.clean(); + }); + + describe('Overview Tab', () => { + before(async () => { + await pageObjects.assetDetails.clickOverviewTab(); + }); + + [ + { metric: 'cpuUsage', value: '2,500.0%' }, + { metric: 'memoryUsage', value: '2,000.0%' }, + ].forEach(({ metric, value }) => { + it(`${metric} tile should show ${value}`, async () => { + await retry.tryForTime(3 * 1000, async () => { + const tileValue = await pageObjects.assetDetails.getAssetDetailsKPITileValue( + metric + ); + expect(tileValue).to.eql(value); + }); + }); + }); + + [ + { metric: 'cpu', chartsCount: 1 }, + { metric: 'memory', chartsCount: 1 }, + ].forEach(({ metric, chartsCount }) => { + it(`should render ${chartsCount} ${metric} chart(s) in the Metrics section`, async () => { + const containers = await pageObjects.assetDetails.getOverviewTabDockerMetricCharts( + metric + ); + expect(containers.length).to.equal(chartsCount); + }); + }); + }); + + describe('Metadata Tab', () => { + before(async () => { + await pageObjects.assetDetails.clickMetadataTab(); + }); + + it('should show metadata table', async () => { + await pageObjects.assetDetails.metadataTableExists(); + }); + }); + + describe('APM Link Tab', () => { + before(async () => { + await pageObjects.infraHome.clickOnNode(); + await pageObjects.assetDetails.clickApmTabLink(); + await pageObjects.infraHome.waitForLoading(); + }); + + it('should navigate to APM traces', async () => { + const url = parse(await browser.getCurrentUrl()); + const query = decodeURIComponent(url.query ?? ''); + const kuery = 'kuery=container.id:"container-id-4"'; + + await retry.try(async () => { + expect(url.pathname).to.eql('/app/apm/traces'); + expect(query).to.contain(kuery); + }); + await returnTo(INVENTORY_PATH); + }); + }); + + it('Should show auto-refresh option', async () => { + const kibanaRefreshConfig = await pageObjects.timePicker.getRefreshConfig(); + expect(kibanaRefreshConfig.interval).to.equal('5'); + expect(kibanaRefreshConfig.units).to.equal('Seconds'); + expect(kibanaRefreshConfig.isPaused).to.equal(true); + }); + }); + it('shows query suggestions', async () => { await pageObjects.infraHome.goToTime(DATE_WITH_DATA); await pageObjects.infraHome.clickQueryBar(); diff --git a/x-pack/test/functional/apps/infra/hosts_view.ts b/x-pack/test/functional/apps/infra/hosts_view.ts index e8bc8ffc8f8d5..8af7d9fc23dc3 100644 --- a/x-pack/test/functional/apps/infra/hosts_view.ts +++ b/x-pack/test/functional/apps/infra/hosts_view.ts @@ -267,7 +267,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { after(async () => { await retry.try(async () => { - await pageObjects.infraHostsView.clickCloseFlyoutButton(); + await pageObjects.infraHome.clickCloseFlyoutButton(); }); }); @@ -842,7 +842,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { after(async () => { await retry.try(async () => { - await pageObjects.infraHostsView.clickCloseFlyoutButton(); + await pageObjects.infraHome.clickCloseFlyoutButton(); }); await logoutAndDeleteReadOnlyUser(); }); diff --git a/x-pack/test/functional/page_objects/infra_home_page.ts b/x-pack/test/functional/page_objects/infra_home_page.ts index f112e76ee809a..e67c19a4834c8 100644 --- a/x-pack/test/functional/page_objects/infra_home_page.ts +++ b/x-pack/test/functional/page_objects/infra_home_page.ts @@ -478,5 +478,9 @@ export function InfraHomePageProvider({ getService, getPageObjects }: FtrProvide async clickDismissKubernetesTourButton() { return testSubjects.click('infra-kubernetesTour-dismiss'); }, + + async clickCloseFlyoutButton() { + return testSubjects.click('euiFlyoutCloseButton'); + }, }; } diff --git a/x-pack/test/functional/page_objects/infra_hosts_view.ts b/x-pack/test/functional/page_objects/infra_hosts_view.ts index 31ae75c4000d6..18407b72da412 100644 --- a/x-pack/test/functional/page_objects/infra_hosts_view.ts +++ b/x-pack/test/functional/page_objects/infra_hosts_view.ts @@ -29,10 +29,6 @@ export function InfraHostsViewProvider({ getService }: FtrProviderContext) { return testSubjects.click('hostsViewTableAddFilterButton'); }, - async clickCloseFlyoutButton() { - return testSubjects.click('euiFlyoutCloseButton'); - }, - async getBetaBadgeExists() { return testSubjects.exists('infra-beta-badge'); }, diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts index 8bf1fe411d727..22757855e02f8 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts @@ -76,7 +76,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { after(async () => { await retry.try(async () => { - await pageObjects.infraHostsView.clickCloseFlyoutButton(); + await pageObjects.infraHome.clickCloseFlyoutButton(); }); }); From af1d12cc8ad15173402ed59d116ebd5ccfdba54d Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Wed, 5 Jun 2024 10:24:44 +0200 Subject: [PATCH 64/82] [Index management] Add some time to guarantee execution before deletion (#183980) --- .../enrich_policies_tab/enrich_policies_tab.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/test/functional/apps/index_management/enrich_policies_tab/enrich_policies_tab.ts b/x-pack/test/functional/apps/index_management/enrich_policies_tab/enrich_policies_tab.ts index a757921a6d346..a473a33d298c0 100644 --- a/x-pack/test/functional/apps/index_management/enrich_policies_tab/enrich_policies_tab.ts +++ b/x-pack/test/functional/apps/index_management/enrich_policies_tab/enrich_policies_tab.ts @@ -20,8 +20,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const ENRICH_INDEX_NAME = 'test-policy-1'; const ENRICH_POLICY_NAME = 'test-policy-1'; - // FLAKY: https://github.com/elastic/kibana/issues/178962 - describe.skip('Enrich policies tab', function () { + describe('Enrich policies tab', function () { before(async () => { await log.debug('Creating required index and enrich policy'); try { @@ -96,6 +95,12 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('can delete a policy', async () => { + // Since we disabled wait_for_completion in the server request, we dont know when + // a given policy will finish executing. Until that happens the policy cannot + // be deleted. 2s seems to be plenty enough to guarantee that, at least for this + // test. + await pageObjects.common.sleep(2000); + await pageObjects.indexManagement.clickDeleteEnrichPolicyAt(0); await pageObjects.indexManagement.clickConfirmModalButton(); From 958072af0cb245554b2b6b737c01beb761ab1c7e Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 5 Jun 2024 10:30:52 +0200 Subject: [PATCH 65/82] chore(Lens): remove inline editor empty space (#184369) This PR fixes a style issue in the inline editor. The issue is visible in the Breakdown -> Advanced configuration where the Advanced accordion retained its content space even if it was closed. I cleaned up the style where needed, removing what looked like unnecessary applied styles (not used anymore after the changes). --- .../layer_configuration_section.tsx | 23 +++++++------------ .../lens_configuration_flyout.tsx | 17 +++++++------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx index 3527ce73b6b9c..4890cbe6300a7 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx @@ -67,23 +67,16 @@ export function LayerConfiguration({ return (
    -
    - - - - -
    + + + +
    ); } diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx index 2cc7791f9f941..d55cfddf5a488 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx @@ -434,6 +434,12 @@ export function LensEditConfigurationFlyout({ flex: 1; } } + .lnsIndexPatternDimensionEditor-advancedOptions { + .euiAccordion__childWrapper { + flex: none; + overflow: hidden !important; + } + } `} direction="column" gutterSize="none" @@ -477,18 +483,13 @@ export function LensEditConfigurationFlyout({ Date: Wed, 5 Jun 2024 10:34:20 +0200 Subject: [PATCH 66/82] SOR: re-enable ES client retry mechanism (#184761) ## Summary We recently "discovered" that ES calls performed from the SOR were not having the default retry mechanism used by the ES client. This is caused by the way we construct the ES client wrapper used for the SOR, that forces the `maxRetries` option to `0` https://github.com/elastic/kibana/blob/8911bfabb04b7058fe07a81d07e522ac20c37ec5/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.ts#L38-L40 I initially tried to fully get rid of `retryCallCluster` in https://github.com/elastic/kibana/pull/184658, as we assumed that re-enabling the retry mechanism would be sufficient, but this was causing flakiness in test suites (uncaught rejections in plugins not properly stopping after ES and Kibana are shut down, with `NoLivingConnectionsError` errors...) So instead, I just re-enabled the ES client native mechanism by removing the `maxRetries` override. --- .../src/lib/repository.spaces_extension.test.ts | 16 ++++++++-------- .../src/lib/repository_es_client.test.ts | 10 ++++------ .../src/lib/repository_es_client.ts | 4 +--- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts index ec5fe1d4b25de..9db7049e39c77 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts @@ -78,7 +78,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { const documentMigrator = createDocumentMigrator(registry); // const currentSpace = 'foo-namespace'; - const defaultOptions = { ignore: [404], maxRetries: 0, meta: true }; // These are just the hard-coded options passed in via the repo + const defaultOptions = { ignore: [404], meta: true }; // These are just the hard-coded options passed in via the repo const instantiateRepository = () => { const allTypes = registry.getAllTypes().map((type) => type.name); @@ -283,7 +283,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { : { type: CUSTOM_INDEX_TYPE, customIndex: attributes } ), }), - { maxRetries: 0, meta: true } + { meta: true } ); }); }); @@ -316,7 +316,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { expect.objectContaining({ id: expect.stringMatching(regex), }), - { ignore: [404], maxRetries: 0, meta: true } + { ignore: [404], meta: true } ); }); }); @@ -391,7 +391,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { ]), }), }), - { ignore: [404], maxRetries: 0, meta: true } + { ignore: [404], meta: true } ); }); }); @@ -582,7 +582,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { ]), }), }), - { ignore: [404], maxRetries: 0, meta: true } + { ignore: [404], meta: true } ); }); @@ -652,7 +652,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { }), ]), }), - { maxRetries: 0 } + {} ); }); }); @@ -717,7 +717,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { }), ]), }), - { maxRetries: 0 } + {} ); }); }); @@ -869,7 +869,7 @@ describe('SavedObjectsRepository Spaces Extension', () => { }), ]), }), - { maxRetries: 0 } + {} ); }); }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.test.ts index a0afafa2582ff..89c9e84f17d4c 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.test.ts @@ -33,13 +33,11 @@ describe('RepositoryEsClient', () => { expect(retryCallClusterMock).toHaveBeenCalledTimes(1); }); - it('sets maxRetries: 0 to delegate retry logic to retryCallCluster', async () => { + it('keeps call options unchanged', async () => { expect(repositoryClient.bulk).toStrictEqual(expect.any(Function)); - await repositoryClient.bulk({ body: [] }); - expect(client.bulk).toHaveBeenCalledWith( - expect.any(Object), - expect.objectContaining({ maxRetries: 0 }) - ); + const options = { maxRetries: 12 }; + await repositoryClient.bulk({ body: [] }, options); + expect(client.bulk).toHaveBeenCalledWith(expect.any(Object), options); }); it('transform elasticsearch errors into saved objects errors', async () => { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.ts index 5a4635353ba2e..bf2f563bf08cc 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository_es_client.ts @@ -35,9 +35,7 @@ export function createRepositoryEsClient(client: ElasticsearchClient): Repositor Object.defineProperty(acc, key, { value: async (params?: unknown, options?: TransportRequestOptions) => { try { - return await retryCallCluster(() => - (client[key] as Function)(params, { maxRetries: 0, ...options }) - ); + return await retryCallCluster(() => (client[key] as Function)(params, options ?? {})); } catch (e) { // retry failures are caught here, as are 404's that aren't ignored (e.g update calls) throw decorateEsError(e); From a7af72c2e01a09e6c8de30684f287e440e049220 Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Wed, 5 Jun 2024 10:41:10 +0200 Subject: [PATCH 67/82] [Console] Address ts-expect-error (#184730) --- .../console/public/lib/autocomplete/autocomplete.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index d6d2a8e711f13..01fb8e35e6834 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -43,8 +43,14 @@ function isUrlParamsToken(token: { type: string } | null) { } } +/* Logs the provided arguments to the console if the `window.autocomplete_trace` flag is set to true. + * This function checks if the `autocomplete_trace` flag is enabled on the `window` object. This is + * only used when executing functional tests. + * If the flag is enabled, it logs each argument to the console. + * If an argument is an object, it is stringified before logging. + */ const tracer = (...args: any[]) => { - // @ts-expect-error ts upgrade v4.7.4 + // @ts-ignore if (window.autocomplete_trace) { // eslint-disable-next-line no-console console.log.call( From 115f9cbbb656a3e5c54919a1a24bd5e74750227b Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Wed, 5 Jun 2024 10:46:53 +0200 Subject: [PATCH 68/82] [Index Management] Fix lifecycle tooltip copy on serverless (#184715) --- .../data_stream_detail_panel/data_stream_detail_panel.tsx | 7 +++++-- .../data_stream_table/data_stream_table.tsx | 8 +++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx index d643aa4931d6f..da53b0241095d 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx @@ -129,7 +129,7 @@ export const DataStreamDetailPanel: React.FunctionComponent = ({ const { error, data: dataStream, isLoading } = useLoadDataStream(dataStreamName); const ilmPolicyLink = useIlmLocator(ILM_PAGES_POLICY_EDIT, dataStream?.ilmPolicyName); - const { history } = useAppContext(); + const { history, config } = useAppContext(); let indicesLink; let content; @@ -314,7 +314,10 @@ export const DataStreamDetailPanel: React.FunctionComponent = ({ defaultMessage: 'Effective data retention', }), toolTip: i18n.translate('xpack.idxMgmt.dataStreamDetailPanel.dataRetentionToolTip', { - defaultMessage: `Data is kept at least this long before being automatically deleted. The data retention value only applies to the data managed directly by the data stream. If some data is subject to an index lifecycle management policy, then the data retention value set for the data stream doesn't apply to that data.`, + defaultMessage: `Data is kept at least this long before being automatically deleted. The data retention value only applies to the data managed directly by the data stream. {canEnableDataRetention, plural, one {If some data is subject to an index lifecycle management policy, then the data retention value set for the data stream doesn't apply to that data.} other {}}`, + values: { + canEnableDataRetention: config.enableTogglingDataRetention ? 1 : 0, + }, }), content: ( = ({ name: ( From 04ab723dd96cd9472d23a4c9cbe6b3501ac8d7bf Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Wed, 5 Jun 2024 11:20:35 +0200 Subject: [PATCH 69/82] [Security Solution] Sourcerer cleanups (#184796) Divide and conquer goes on. Extracted some of the helpers out from the containers index. --- .../top_values_popover/top_values_popover.tsx | 3 +- .../app/home/global_header/index.test.tsx | 2 +- .../public/app/home/global_header/index.tsx | 5 +- .../public/app/home/index.tsx | 3 +- .../common/components/inspect/modal.tsx | 3 +- .../components/alerts_kpis/common/hooks.ts | 3 +- .../public/sourcerer/components/readme.md | 2 +- .../sourcerer/containers/hooks.test.tsx | 3 +- .../public/sourcerer/containers/index.tsx | 39 --------------- .../sourcerer/containers/sourcerer_paths.ts | 48 +++++++++++++++++++ .../containers/use_timeline_data_filters.ts | 3 +- 11 files changed, 66 insertions(+), 48 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/sourcerer/containers/sourcerer_paths.ts diff --git a/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx b/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx index 9d936fc6c9462..ad88362e9e861 100644 --- a/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx +++ b/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx @@ -10,7 +10,8 @@ import { EuiWrappingPopover } from '@elastic/eui'; import { useLocation } from 'react-router-dom'; import { useObservable } from 'react-use'; import { StatefulTopN } from '../../../common/components/top_n'; -import { getScopeFromPath, useSourcererDataView } from '../../../sourcerer/containers'; +import { getScopeFromPath } from '../../../sourcerer/containers/sourcerer_paths'; +import { useSourcererDataView } from '../../../sourcerer/containers'; import { useKibana } from '../../../common/lib/kibana'; export const TopValuesPopover = React.memo(() => { diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx b/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx index e5df17daf498e..966e13358d145 100644 --- a/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx @@ -22,7 +22,7 @@ import { TestProviders, } from '../../../common/mock'; import { TimelineId } from '../../../../common/types/timeline'; -import { sourcererPaths } from '../../../sourcerer/containers'; +import { sourcererPaths } from '../../../sourcerer/containers/sourcerer_paths'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx index 09fc8682a3443..31537ad77eafb 100644 --- a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx @@ -24,7 +24,10 @@ import { TimelineId } from '../../../../common/types/timeline'; import { timelineDefaults } from '../../../timelines/store/defaults'; import { timelineSelectors } from '../../../timelines/store'; import { useShallowEqualSelector } from '../../../common/hooks/use_selector'; -import { getScopeFromPath, showSourcererByPath } from '../../../sourcerer/containers'; +import { + getScopeFromPath, + showSourcererByPath, +} from '../../../sourcerer/containers/sourcerer_paths'; import { useAddIntegrationsUrl } from '../../../common/hooks/use_add_integrations_url'; import { AssistantHeaderLink } from '../../../assistant/header_link'; diff --git a/x-pack/plugins/security_solution/public/app/home/index.tsx b/x-pack/plugins/security_solution/public/app/home/index.tsx index 1d7b8a562e2b4..dfaa8ea7fda6e 100644 --- a/x-pack/plugins/security_solution/public/app/home/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/index.tsx @@ -12,7 +12,8 @@ import { DragDropContextWrapper } from '../../common/components/drag_and_drop/dr import { SecuritySolutionAppWrapper } from '../../common/components/page'; import { HelpMenu } from '../../common/components/help_menu'; -import { getScopeFromPath, useSourcererDataView } from '../../sourcerer/containers'; +import { getScopeFromPath } from '../../sourcerer/containers/sourcerer_paths'; +import { useSourcererDataView } from '../../sourcerer/containers'; import { GlobalHeader } from './global_header'; import { ConsoleManager } from '../../management/components/console/components/console_manager'; diff --git a/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx b/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx index d3957390f220d..175c02dfdbed5 100644 --- a/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx +++ b/x-pack/plugins/security_solution/public/common/components/inspect/modal.tsx @@ -27,7 +27,8 @@ import { useLocation } from 'react-router-dom'; import type { InputsModelId } from '../../store/inputs/constants'; import { NO_ALERT_INDEX } from '../../../../common/constants'; import * as i18n from './translations'; -import { getScopeFromPath, useSourcererDataView } from '../../../sourcerer/containers'; +import { getScopeFromPath } from '../../../sourcerer/containers/sourcerer_paths'; +import { useSourcererDataView } from '../../../sourcerer/containers'; import { SourcererScopeName } from '../../../sourcerer/store/model'; export interface ModalInspectProps { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.ts index 7cb8723990e7e..3c383cbd7c2fa 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.ts @@ -14,7 +14,8 @@ import type { BrowserField } from '@kbn/timelines-plugin/common'; import { i18n } from '@kbn/i18n'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import type { GlobalTimeArgs } from '../../../../common/containers/use_global_time'; -import { getScopeFromPath, useSourcererDataView } from '../../../../sourcerer/containers'; +import { useSourcererDataView } from '../../../../sourcerer/containers'; +import { getScopeFromPath } from '../../../../sourcerer/containers/sourcerer_paths'; import { getAllFieldsByName } from '../../../../common/containers/source'; import { isLensSupportedType } from '../../../../common/utils/lens'; diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/readme.md b/x-pack/plugins/security_solution/public/sourcerer/components/readme.md index 2844cbba2a048..9e0b1f27050d3 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/readme.md +++ b/x-pack/plugins/security_solution/public/sourcerer/components/readme.md @@ -2,7 +2,7 @@ ### Adding sourcerer to a new page -- In order for the sourcerer to show up on a page, it needs to be added to the array `sourcererPaths` in `../sourcerer/containers/index.tsx` +- In order for the sourcerer to show up on a page, it needs to be added to the array `sourcererPaths` in `../sourcerer/containers/sourcerer_paths.ts` - The scope of a sourcerer component will be default unless the path is added to the `detectionsPaths` array, in which case the scope can be detections in `../sourcerer/containers/index.tsx` ## Default Sourcerer diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx index db882a9486f80..c95fa85023938 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx @@ -10,7 +10,8 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { waitFor } from '@testing-library/react'; import { Provider } from 'react-redux'; -import { getScopeFromPath, useSourcererDataView } from '.'; +import { useSourcererDataView } from '.'; +import { getScopeFromPath } from './sourcerer_paths'; import { mockPatterns } from './mocks'; import type { RouteSpyState } from '../../common/utils/route/types'; import { diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx index 8e67aa0ed2933..a9cf833696a57 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx @@ -7,20 +7,9 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; -import { matchPath } from 'react-router-dom'; import { sourcererSelectors } from '../store'; import type { SelectedDataView, SourcererDataView, RunTimeMappings } from '../store/model'; import { SourcererScopeName } from '../store/model'; -import { - ALERTS_PATH, - HOSTS_PATH, - USERS_PATH, - NETWORK_PATH, - OVERVIEW_PATH, - RULES_PATH, - CASES_PATH, - DATA_QUALITY_PATH, -} from '../../../common/constants'; import { checkIfIndicesExist } from '../store/helpers'; import { getDataViewStateFromIndexFields } from '../../common/containers/source/use_data_view'; import { useFetchIndex } from '../../common/containers/source'; @@ -155,31 +144,3 @@ export const useSourcererDataView = ( ] ); }; - -const detectionsPaths = [ALERTS_PATH, `${RULES_PATH}/id/:id`, `${CASES_PATH}/:detailName`]; - -export const getScopeFromPath = ( - pathname: string -): SourcererScopeName.default | SourcererScopeName.detections => - matchPath(pathname, { - path: detectionsPaths, - strict: false, - }) == null - ? SourcererScopeName.default - : SourcererScopeName.detections; - -export const sourcererPaths = [ - ALERTS_PATH, - DATA_QUALITY_PATH, - `${RULES_PATH}/id/:id`, - HOSTS_PATH, - USERS_PATH, - NETWORK_PATH, - OVERVIEW_PATH, -]; - -export const showSourcererByPath = (pathname: string): boolean => - matchPath(pathname, { - path: sourcererPaths, - strict: false, - }) != null; diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/sourcerer_paths.ts b/x-pack/plugins/security_solution/public/sourcerer/containers/sourcerer_paths.ts new file mode 100644 index 0000000000000..93b763d7b42c0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/sourcerer_paths.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { matchPath } from 'react-router-dom'; + +import { + CASES_PATH, + ALERTS_PATH, + HOSTS_PATH, + USERS_PATH, + NETWORK_PATH, + OVERVIEW_PATH, + RULES_PATH, + DATA_QUALITY_PATH, +} from '../../../common/constants'; +import { SourcererScopeName } from '../store/model'; + +export const sourcererPaths = [ + ALERTS_PATH, + DATA_QUALITY_PATH, + `${RULES_PATH}/id/:id`, + HOSTS_PATH, + USERS_PATH, + NETWORK_PATH, + OVERVIEW_PATH, +]; + +const detectionsPaths = [ALERTS_PATH, `${RULES_PATH}/id/:id`, `${CASES_PATH}/:detailName`]; + +export const getScopeFromPath = ( + pathname: string +): SourcererScopeName.default | SourcererScopeName.detections => + matchPath(pathname, { + path: detectionsPaths, + strict: false, + }) == null + ? SourcererScopeName.default + : SourcererScopeName.detections; + +export const showSourcererByPath = (pathname: string): boolean => + matchPath(pathname, { + path: sourcererPaths, + strict: false, + }) != null; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.ts b/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.ts index d9ec4998d5e38..cd6ed2c4baa93 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.ts @@ -16,7 +16,8 @@ import { } from '../../common/components/super_date_picker/selectors'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { SourcererScopeName } from '../../sourcerer/store/model'; -import { useSourcererDataView, getScopeFromPath } from '../../sourcerer/containers'; +import { useSourcererDataView } from '../../sourcerer/containers'; +import { getScopeFromPath } from '../../sourcerer/containers/sourcerer_paths'; import { sourcererSelectors } from '../../common/store'; export function useTimelineDataFilters(isActiveTimelines: boolean) { From 4f71937c840a76fca6feacc8a0fbeb0a394d5b48 Mon Sep 17 00:00:00 2001 From: Tre Date: Wed, 5 Jun 2024 10:20:55 +0100 Subject: [PATCH 70/82] [FTR](alerting) update common serverless api tests to use api keys (#183381) ## Summary - update api tests in `x-pack/test_serverless/api_integration/test_suites/common/alerting/` - update ui tests in: - `x-pack/test_serverless/functional/test_suites/observability/rules` - `x-pack/test_serverless/functional/test_suites/search/rules/` Contributes to: https://github.com/elastic/kibana/issues/180834 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../api_integration/services/alerting_api.ts | 46 +++--- .../common/alerting/alert_documents.ts | 36 ++++- .../alerting/helpers/alerting_api_helper.ts | 63 +++++--- .../helpers/alerting_wait_for_helpers.ts | 14 +- .../test_suites/common/alerting/rules.ts | 134 ++++++++++++++---- .../common/alerting/summary_actions.ts | 48 +++++-- .../test_suites/common/core/translations.ts | 47 ++++-- .../burn_rate_rule/burn_rate_rule.ts | 11 +- .../custom_threshold_rule/avg_pct_fired.ts | 10 +- .../custom_threshold_rule/avg_pct_no_data.ts | 10 +- .../custom_eq_avg_bytes_fired.ts | 10 +- .../documents_count_fired.ts | 10 +- .../custom_threshold_rule/group_by_fired.ts | 10 +- .../custom_threshold_rule/p99_pct_fired.ts | 10 +- .../es_query_rule/es_query_rule.ts | 21 ++- .../observability/rules/rules_list.ts | 23 ++- .../test_suites/search/rules/rule_details.ts | 54 +++++-- 17 files changed, 442 insertions(+), 115 deletions(-) diff --git a/x-pack/test_serverless/api_integration/services/alerting_api.ts b/x-pack/test_serverless/api_integration/services/alerting_api.ts index 534d8bf156a87..6000e9d8bdc88 100644 --- a/x-pack/test_serverless/api_integration/services/alerting_api.ts +++ b/x-pack/test_serverless/api_integration/services/alerting_api.ts @@ -12,22 +12,26 @@ import type { import { MetricThresholdParams } from '@kbn/infra-plugin/common/alerting/metrics'; import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; +import { RoleCredentials } from '../../shared/services'; import { SloBurnRateRuleParams } from './slo_api'; import { FtrProviderContext } from '../ftr_provider_context'; export function AlertingApiProvider({ getService }: FtrProviderContext) { const retry = getService('retry'); - const supertest = getService('supertest'); const es = getService('es'); const requestTimeout = 30 * 1000; const retryTimeout = 120 * 1000; const logger = getService('log'); + const svlCommonApi = getService('svlCommonApi'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); return { async waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus, }: { + roleAuthc: RoleCredentials; ruleId: string; expectedStatus: string; }) { @@ -35,10 +39,10 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { throw new Error(`'ruleId' is undefined`); } return await retry.tryForTime(retryTimeout, async () => { - const response = await supertest + const response = await supertestWithoutAuth .get(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .timeout(requestTimeout); const { execution_status: executionStatus } = response.body || {}; const { status } = executionStatus || {}; @@ -62,7 +66,7 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { rest_total_hits_as_int: true, }); logger.debug(`Found ${response.hits.total} docs, looking for atleast ${docCountTarget}.`); - if (!response.hits.total || response.hits.total < docCountTarget) { + if (!response.hits.total || (response.hits.total as number) < docCountTarget) { throw new Error('No hits found'); } return response; @@ -97,11 +101,19 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { }); }, - async createIndexConnector({ name, indexName }: { name: string; indexName: string }) { - const { body } = await supertest + async createIndexConnector({ + roleAuthc, + name, + indexName, + }: { + roleAuthc: RoleCredentials; + name: string; + indexName: string; + }) { + const { body } = await supertestWithoutAuth .post(`/api/actions/connector`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send({ name, config: { @@ -114,6 +126,7 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { }, async createRule({ + roleAuthc, name, ruleTypeId, params, @@ -122,6 +135,7 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { schedule, consumer, }: { + roleAuthc: RoleCredentials; ruleTypeId: string; name: string; params: MetricThresholdParams | ThresholdParams | SloBurnRateRuleParams; @@ -130,10 +144,10 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { schedule?: { interval: string }; consumer: string; }) { - const { body } = await supertest + const { body } = await supertestWithoutAuth .post(`/api/alerting/rule`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send({ params, consumer, @@ -148,14 +162,14 @@ export function AlertingApiProvider({ getService }: FtrProviderContext) { return body; }, - async findRule(ruleId: string) { + async findRule(roleAuthc: RoleCredentials, ruleId: string) { if (!ruleId) { throw new Error(`'ruleId' is undefined`); } - const response = await supertest + const response = await supertestWithoutAuth .get('/api/alerting/rules/_find') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader); return response.body.data.find((obj: any) => obj.id === ruleId); }, }; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts index 5414c9c2512ce..26f72d754c4d6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts @@ -43,11 +43,18 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { createEsQueryRule } from './helpers/alerting_api_helper'; import { waitForAlertInIndex, waitForNumRuleRuns } from './helpers/alerting_wait_for_helpers'; import { ObjectRemover } from '../../../../shared/lib'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; const OPEN_OR_ACTIVE = new Set(['open', 'active']); export default function ({ getService }: FtrProviderContext) { + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAdmin: RoleCredentials; + let internalReqHeader: InternalRequestHeader; const supertest = getService('supertest'); + const esClient = getService('es'); const objectRemover = new ObjectRemover(supertest); @@ -58,13 +65,24 @@ export default function ({ getService }: FtrProviderContext) { const ALERT_INDEX = '.alerts-stack.alerts-default'; let ruleId: string; + before(async () => { + roleAdmin = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + afterEach(async () => { objectRemover.removeAll(); }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAdmin); + }); + it('should generate an alert document for an active alert', async () => { const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -85,7 +103,9 @@ export default function ({ getService }: FtrProviderContext) { // get the first alert document written const testStart1 = new Date(); await waitForNumRuleRuns({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, numOfRuns: 1, ruleId, esClient, @@ -184,7 +204,9 @@ export default function ({ getService }: FtrProviderContext) { it('should update an alert document for an ongoing alert', async () => { const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -205,7 +227,9 @@ export default function ({ getService }: FtrProviderContext) { // get the first alert document written const testStart1 = new Date(); await waitForNumRuleRuns({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, numOfRuns: 1, ruleId, esClient, @@ -223,7 +247,9 @@ export default function ({ getService }: FtrProviderContext) { // wait for another run, get the updated alert document const testStart2 = new Date(); await waitForNumRuleRuns({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, numOfRuns: 1, ruleId, esClient, diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_api_helper.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_api_helper.ts index 88f3f1a76d3bb..e2664e9d7104d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_api_helper.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_api_helper.ts @@ -6,7 +6,13 @@ */ import moment from 'moment'; +import { v4 as uuidv4 } from 'uuid'; import type { Agent as SuperTestAgent } from 'supertest'; +import { + InternalRequestHeader, + RoleCredentials, + SupertestWithoutAuthType, +} from '../../../../../shared/services'; interface CreateEsQueryRuleParams { size: number; @@ -28,18 +34,22 @@ interface CreateEsQueryRuleParams { } export async function createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name, indexName, }: { - supertest: SuperTestAgent; + supertestWithoutAuth: SupertestWithoutAuthType; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; name: string; indexName: string; }) { - const { body } = await supertest + const { body } = await supertestWithoutAuth .post(`/api/actions/connector`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name, config: { @@ -53,16 +63,20 @@ export async function createIndexConnector({ } export async function createSlackConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name, }: { - supertest: SuperTestAgent; + supertestWithoutAuth: SupertestWithoutAuthType; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; name: string; }) { - const { body } = await supertest + const { body } = await supertestWithoutAuth .post(`/api/actions/connector`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name, config: {}, @@ -76,7 +90,9 @@ export async function createSlackConnector({ } export async function createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name, ruleTypeId, params, @@ -87,7 +103,9 @@ export async function createEsQueryRule({ notifyWhen, enabled = true, }: { - supertest: SuperTestAgent; + supertestWithoutAuth: SupertestWithoutAuthType; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; ruleTypeId: string; name: string; params: CreateEsQueryRuleParams; @@ -98,10 +116,10 @@ export async function createEsQueryRule({ notifyWhen?: string; enabled?: boolean; }) { - const { body } = await supertest + const { body } = await supertestWithoutAuth .post(`/api/alerting/rule`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ enabled, params, @@ -119,7 +137,6 @@ export async function createEsQueryRule({ return body; } -import { v4 as uuidv4 } from 'uuid'; export const generateUniqueKey = () => uuidv4().replace(/-/g, ''); export async function createAnomalyRule({ @@ -338,16 +355,20 @@ export async function updateEsQueryRule({ } export async function runRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, ruleId, }: { - supertest: SuperTestAgent; + supertestWithoutAuth: SupertestWithoutAuthType; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; ruleId: string; }) { - const response = await supertest + const response = await supertestWithoutAuth .post(`/internal/alerting/rule/${ruleId}/_run_soon`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .expect(204); return response; } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts index 55bfa422c5f4b..66f69a3801bd0 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts @@ -6,13 +6,15 @@ */ import pRetry from 'p-retry'; -import type { Agent as SuperTestAgent } from 'supertest'; import type { Client } from '@elastic/elasticsearch'; import type { AggregationsAggregate, SearchResponse, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { runRule } from './alerting_api_helper'; +import type { SupertestWithoutAuthType } from '../../../../../shared/services'; +import { RoleCredentials } from '../../../../../shared/services'; +import { InternalRequestHeader } from '../../../../../shared/services'; export async function waitForDocumentInIndex({ esClient, @@ -366,13 +368,17 @@ export async function waitForExecutionEventLog({ } export async function waitForNumRuleRuns({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, numOfRuns, ruleId, esClient, testStart, }: { - supertest: SuperTestAgent; + supertestWithoutAuth: SupertestWithoutAuthType; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; numOfRuns: number; ruleId: string; esClient: Client; @@ -381,7 +387,7 @@ export async function waitForNumRuleRuns({ for (let i = 0; i < numOfRuns; i++) { await pRetry( async () => { - await runRule({ supertest, ruleId }); + await runRule({ supertestWithoutAuth, roleAuthc, internalReqHeader, ruleId }); await waitForExecutionEventLog({ esClient, filter: testStart, diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts index be10f9b83ac6b..70d8f07cc8b84 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts @@ -31,11 +31,17 @@ import { waitForExecutionEventLog, waitForNumRuleRuns, } from './helpers/alerting_wait_for_helpers'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const esClient = getService('es'); const esDeleteAllIndices = getService('esDeleteAllIndices'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAdmin: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Alerting rules', function () { // Timeout of 360000ms exceeded @@ -45,6 +51,14 @@ export default function ({ getService }: FtrProviderContext) { let connectorId: string; let ruleId: string; + before(async () => { + roleAdmin = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAdmin); + }); + afterEach(async () => { await supertest .delete(`/api/actions/connector/${connectorId}`) @@ -66,14 +80,18 @@ export default function ({ getService }: FtrProviderContext) { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -160,14 +178,18 @@ export default function ({ getService }: FtrProviderContext) { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -248,7 +270,9 @@ export default function ({ getService }: FtrProviderContext) { }); await runRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, ruleId, }); @@ -281,13 +305,17 @@ export default function ({ getService }: FtrProviderContext) { // Should fail const createdConnector = await createSlackConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Slack Connector: Alerting API test', }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -332,14 +360,18 @@ export default function ({ getService }: FtrProviderContext) { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -381,7 +413,15 @@ export default function ({ getService }: FtrProviderContext) { ruleId = createdRule.id; // Wait until alerts ran at least 3 times before disabling the alert and waiting for tasks to finish - await waitForNumRuleRuns({ supertest, numOfRuns: 3, ruleId, esClient, testStart }); + await waitForNumRuleRuns({ + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, + numOfRuns: 3, + ruleId, + esClient, + testStart, + }); await disableRule({ supertest, @@ -407,14 +447,18 @@ export default function ({ getService }: FtrProviderContext) { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -460,7 +504,15 @@ export default function ({ getService }: FtrProviderContext) { ruleId = createdRule.id; // Wait until alerts ran at least 3 times before disabling the alert and waiting for tasks to finish - await waitForNumRuleRuns({ supertest, numOfRuns: 3, ruleId, esClient, testStart }); + await waitForNumRuleRuns({ + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, + numOfRuns: 3, + ruleId, + esClient, + testStart, + }); await disableRule({ supertest, @@ -486,14 +538,18 @@ export default function ({ getService }: FtrProviderContext) { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -596,7 +652,9 @@ export default function ({ getService }: FtrProviderContext) { }); await runRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, ruleId, }); @@ -634,14 +692,18 @@ export default function ({ getService }: FtrProviderContext) { await createIndex({ esClient, indexName: ALERT_ACTION_INDEX }); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, enabled: false, consumer: 'alerts', name: 'always fire', @@ -698,7 +760,15 @@ export default function ({ getService }: FtrProviderContext) { // Wait until alerts schedule actions twice to ensure actions had a chance to skip // execution once before disabling the alert and waiting for tasks to finish - await waitForNumRuleRuns({ supertest, numOfRuns: 2, ruleId, esClient, testStart }); + await waitForNumRuleRuns({ + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, + numOfRuns: 2, + ruleId, + esClient, + testStart, + }); await disableRule({ supertest, @@ -725,14 +795,18 @@ export default function ({ getService }: FtrProviderContext) { await createIndex({ esClient, indexName: ALERT_ACTION_INDEX }); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, enabled: false, consumer: 'alerts', name: 'always fire', @@ -790,7 +864,15 @@ export default function ({ getService }: FtrProviderContext) { // Wait until alerts schedule actions twice to ensure actions had a chance to skip // execution once before disabling the alert and waiting for tasks to finish - await waitForNumRuleRuns({ supertest, numOfRuns: 2, ruleId, esClient, testStart }); + await waitForNumRuleRuns({ + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, + numOfRuns: 2, + ruleId, + esClient, + testStart, + }); await disableRule({ supertest, @@ -814,14 +896,18 @@ export default function ({ getService }: FtrProviderContext) { it(`should unmute all instances when unmuting an alert`, async () => { const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, enabled: false, consumer: 'alerts', name: 'always fire', diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts index 4de0ef24b226a..0058e15d85c97 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/summary_actions.ts @@ -34,12 +34,19 @@ import { waitForAlertInIndex, waitForDocumentInIndex, } from './helpers/alerting_wait_for_helpers'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const esClient = getService('es'); const esDeleteAllIndices = getService('esDeleteAllIndices'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAdmin: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + describe('Summary actions', function () { const RULE_TYPE_ID = '.es-query'; const ALERT_ACTION_INDEX = 'alert-action-es-query'; @@ -64,6 +71,11 @@ export default function ({ getService }: FtrProviderContext) { 'kibana.alert.consecutive_matches', ]; + before(async () => { + roleAdmin = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + afterEach(async () => { await supertest .delete(`/api/actions/connector/${connectorId}`) @@ -78,17 +90,25 @@ export default function ({ getService }: FtrProviderContext) { await esDeleteAllIndices([ALERT_ACTION_INDEX]); }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAdmin); + }); + it('should schedule actions for summary of alerts per rule run', async () => { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -206,14 +226,18 @@ export default function ({ getService }: FtrProviderContext) { it('should filter alerts by kql', async () => { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -340,14 +364,18 @@ export default function ({ getService }: FtrProviderContext) { await createIndex({ esClient, indexName: ALERT_ACTION_INDEX }); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -412,14 +440,18 @@ export default function ({ getService }: FtrProviderContext) { it('should schedule actions for summary of alerts on a custom interval', async () => { const testStart = new Date(); const createdConnector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); connectorId = createdConnector.id; const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc: roleAdmin, + internalReqHeader, consumer: 'alerts', name: 'always fire', ruleTypeId: RULE_TYPE_ID, 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 b982799f4a71b..bc01d1743324a 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 @@ -7,28 +7,49 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; + const supertestWithoutAuth = getService('supertestWithoutAuth'); describe('translations', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it(`returns the translations with the correct headers`, async () => { - await supertest.get('/translations/en.json').then((response) => { - expect(response.body.locale).to.eql('en'); + await supertestWithoutAuth + .get('/translations/en.json') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .then((response) => { + 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', - 'public, max-age=31536000, immutable' - ); - expect(response.header).not.to.have.property('etag'); - }); + expect(response.header).to.have.property( + 'content-type', + 'application/json; charset=utf-8' + ); + expect(response.header).to.have.property( + 'cache-control', + 'public, max-age=31536000, immutable' + ); + expect(response.header).not.to.have.property('etag'); + }); }); it(`returns a 404 when not using the correct locale`, async () => { - await supertest.get('/translations/foo.json').then((response) => { - expect(response.status).to.eql(404); - }); + await supertestWithoutAuth + .get('/translations/foo.json') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .then((response) => { + expect(response.status).to.eql(404); + }); }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts b/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts index a651dfc773b62..d16169aa77f39 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts @@ -14,6 +14,7 @@ import { cleanup, Dataset, generate, PartialConfig } from '@kbn/data-forge'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -23,6 +24,8 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); const sloApi = getService('sloApi'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Burn rate rule', () => { const RULE_TYPE_ID = 'slo.rules.burnRate'; @@ -37,6 +40,7 @@ export default function ({ getService }: FtrProviderContext) { let ruleId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); dataForgeConfig = { schedule: [ { @@ -85,11 +89,13 @@ export default function ({ getService }: FtrProviderContext) { await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Slo Burn rate API test', indexName: ALERT_ACTION_INDEX, }); @@ -119,6 +125,7 @@ export default function ({ getService }: FtrProviderContext) { }); const dependencyRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'SLO Burn Rate rule - Dependency', @@ -191,6 +198,7 @@ export default function ({ getService }: FtrProviderContext) { }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'SLO Burn Rate rule', @@ -273,6 +281,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -292,7 +301,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts index 312792e33d9d3..4a1e97c83cb27 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts @@ -16,6 +16,7 @@ import { COMPARATORS } from '@kbn/alerting-comparators'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -24,6 +25,8 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); const logger = getService('log'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Custom Threshold rule - AVG - PCT - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -38,6 +41,7 @@ export default function ({ getService }: FtrProviderContext) { let alertId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); dataForgeConfig = { schedule: [ { @@ -90,16 +94,19 @@ export default function ({ getService }: FtrProviderContext) { }); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'Threshold rule', @@ -156,6 +163,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -163,7 +171,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts index 50772ee105704..333c34f68ab4d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts @@ -15,6 +15,7 @@ import { COMPARATORS } from '@kbn/alerting-comparators'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -22,6 +23,8 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); const esDeleteAllIndices = getService('esDeleteAllIndices'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Custom Threshold rule - AVG - PCT - NoData', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -34,6 +37,7 @@ export default function ({ getService }: FtrProviderContext) { let alertId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); await dataViewApi.create({ name: DATA_VIEW_NAME, id: DATA_VIEW_ID, @@ -64,16 +68,19 @@ export default function ({ getService }: FtrProviderContext) { id: DATA_VIEW_ID, }); await esDeleteAllIndices([ALERT_ACTION_INDEX]); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'Threshold rule', @@ -129,6 +136,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -136,7 +144,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts index 9e4b0be513945..1fc2bab9afa40 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts @@ -17,6 +17,7 @@ import { COMPARATORS } from '@kbn/alerting-comparators'; import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/constants'; import expect from '@kbn/expect'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; +import { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ActionDocument } from './typings'; @@ -27,6 +28,8 @@ export default function ({ getService }: FtrProviderContext) { const logger = getService('log'); const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Custom Threshold rule - CUSTOM_EQ - AVG - BYTES - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -40,6 +43,7 @@ export default function ({ getService }: FtrProviderContext) { let alertId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); dataForgeConfig = { schedule: [ { @@ -93,16 +97,19 @@ export default function ({ getService }: FtrProviderContext) { }); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'Threshold rule', @@ -159,6 +166,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -166,7 +174,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts index 589ebe7a29fa2..84f1d74527fdf 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts @@ -16,6 +16,7 @@ import { COMPARATORS } from '@kbn/alerting-comparators'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -24,6 +25,8 @@ export default function ({ getService }: FtrProviderContext) { const logger = getService('log'); const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Custom Threshold rule - DOCUMENTS_COUNT - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -38,6 +41,7 @@ export default function ({ getService }: FtrProviderContext) { let alertId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); dataForgeConfig = { schedule: [ { @@ -94,16 +98,19 @@ export default function ({ getService }: FtrProviderContext) { }); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'Threshold rule', @@ -157,6 +164,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -164,7 +172,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts index 08baeb3a96eb3..59c9e393df956 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts @@ -20,6 +20,7 @@ import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { COMPARATORS } from '@kbn/alerting-comparators'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ActionDocument } from './typings'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -29,6 +30,8 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); let alertId: string; + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Custom Threshold rule - GROUP_BY - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -41,6 +44,7 @@ export default function ({ getService }: FtrProviderContext) { let ruleId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); dataForgeConfig = { schedule: [ { @@ -94,16 +98,19 @@ export default function ({ getService }: FtrProviderContext) { }); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'Threshold rule', @@ -161,6 +168,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -168,7 +176,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts index f21dc4a3c08ba..aa00aa6a7b0a6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts @@ -16,6 +16,7 @@ import { COMPARATORS } from '@kbn/alerting-comparators'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; +import { RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -23,6 +24,8 @@ export default function ({ getService }: FtrProviderContext) { const esDeleteAllIndices = getService('esDeleteAllIndices'); const alertingApi = getService('alertingApi'); const logger = getService('log'); + const svlUserManager = getService('svlUserManager'); + let roleAuthc: RoleCredentials; describe('Custom Threshold rule - P99 - PCT - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -48,6 +51,7 @@ export default function ({ getService }: FtrProviderContext) { let alertId: string; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); dataForgeConfig = { schedule: [ { @@ -93,16 +97,19 @@ export default function ({ getService }: FtrProviderContext) { }); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Threshold API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await alertingApi.createRule({ + roleAuthc, tags: ['observability'], consumer: 'observability', name: 'Threshold rule', @@ -157,6 +164,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -164,7 +172,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts b/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts index 9f7c72889623b..b473f62c4f108 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts @@ -13,11 +13,18 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { createEsQueryRule } from '../../common/alerting/helpers/alerting_api_helper'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; + export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const supertest = getService('supertest'); const esDeleteAllIndices = getService('esDeleteAllIndices'); const alertingApi = getService('alertingApi'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('ElasticSearch query rule', () => { const RULE_TYPE_ID = '.es-query'; @@ -25,6 +32,11 @@ export default function ({ getService }: FtrProviderContext) { let actionId: string; let ruleId: string; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { await supertest .delete(`/api/alerting/rule/${ruleId}`) @@ -40,17 +52,21 @@ export default function ({ getService }: FtrProviderContext) { conflicts: 'proceed', }); await esDeleteAllIndices([ALERT_ACTION_INDEX]); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Rule creation', () => { it('creates rule successfully', async () => { actionId = await alertingApi.createIndexConnector({ + roleAuthc, name: 'Index Connector: Alerting API test', indexName: ALERT_ACTION_INDEX, }); const createdRule = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'observability', name: 'always fire', ruleTypeId: RULE_TYPE_ID, @@ -97,6 +113,7 @@ export default function ({ getService }: FtrProviderContext) { it('should be active', async () => { const executionStatus = await alertingApi.waitForRuleStatus({ + roleAuthc, ruleId, expectedStatus: 'active', }); @@ -104,7 +121,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId); + const match = await alertingApi.findRule(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts b/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts index fa7fd21328b03..0e486b4947d80 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts @@ -17,6 +17,7 @@ import { createLatencyThresholdRule, createEsQueryRule, } from '../../../../api_integration/test_suites/common/alerting/helpers/alerting_api_helper'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default ({ getPageObject, getService }: FtrProviderContext) => { const svlCommonPage = getPageObject('svlCommonPage'); @@ -29,6 +30,11 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const find = getService('find'); const retry = getService('retry'); const toasts = getService('toasts'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; async function refreshRulesList() { const existsClearFilter = await testSubjects.exists('rules-list-clear-filter'); @@ -50,7 +56,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { numAttempts: number; }) { for (let i = 0; i < numAttempts; i++) { - await runRule({ supertest, ruleId }); + await runRule({ supertestWithoutAuth, roleAuthc, internalReqHeader, ruleId }); await new Promise((resolve) => setTimeout(resolve, intervalMilliseconds)); await disableRule({ supertest, ruleId }); @@ -76,6 +82,8 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await svlCommonPage.login(); await svlObltNavigation.navigateToLandingPage(); await svlCommonNavigation.sidenav.clickLink({ text: 'Alerts' }); @@ -95,11 +103,14 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { after(async () => { await svlCommonPage.forceLogout(); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); it('should create an ES Query Rule and display it when consumer is observability', async () => { const esQuery = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: 'ES Query', consumer: 'observability', ruleTypeId: '.es-query', @@ -124,7 +135,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { it('should create an ES Query rule but not display it when consumer is stackAlerts', async () => { const esQuery = await createEsQueryRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: 'ES Query', consumer: 'stackAlerts', ruleTypeId: '.es-query', @@ -840,7 +853,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { it('should not prevent rules with action execution capabilities from being edited', async () => { const action = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: 'Index Connector: Alerting API test', indexName: '.alerts-observability.apm.alerts-default', }); diff --git a/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts b/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts index 6d859406f3786..d6b1059b7e791 100644 --- a/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts +++ b/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts @@ -7,6 +7,7 @@ import { expect } from 'expect'; import { v4 as uuidv4 } from 'uuid'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { createEsQueryRule as createRule, @@ -65,12 +66,21 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { let ruleIdList: string[]; let connectorIdList: string[]; + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await svlCommonPage.login(); }); after(async () => { await svlCommonPage.forceLogout(); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('Header', () => { @@ -80,7 +90,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { before(async () => { const rule = await createRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'alerts', name: ruleName, ruleTypeId: RULE_TYPE_ID, @@ -251,7 +263,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { before(async () => { const rule = await createRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'alerts', name: ruleName, ruleTypeId: RULE_TYPE_ID, @@ -357,19 +371,25 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const testRunUuid = uuidv4(); const connector1 = await createSlackConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: `slack-${testRunUuid}-${0}`, }); const connector2 = await createSlackConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: `slack-${testRunUuid}-${1}`, }); connectorIdList = [connector2.id]; const rule = await createRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'alerts', name: testRunUuid, ruleTypeId: RULE_TYPE_ID, @@ -432,13 +452,17 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { it('should show and update deleted connectors when there are no existing connectors of the same type', async () => { const testRunUuid = uuidv4(); const connector = await createIndexConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: `index-${testRunUuid}-${2}`, indexName: ALERT_ACTION_INDEX, }); const rule = await createRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'alerts', name: testRunUuid, ruleTypeId: RULE_TYPE_ID, @@ -554,19 +578,25 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const RULE_TYPE_ID = '.es-query'; const connector1 = await createSlackConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: `slack-${testRunUuid}-${0}`, }); const connector2 = await createSlackConnector({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, name: `slack-${testRunUuid}-${1}`, }); connectorIdList = [connector1.id, connector2.id]; const rule = await createRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'alerts', name: `test-rule-${testRunUuid}`, ruleTypeId: RULE_TYPE_ID, @@ -642,7 +672,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { it('renders a disabled rule details view in app button', async () => { const rule = await createRule({ - supertest, + supertestWithoutAuth, + roleAuthc, + internalReqHeader, consumer: 'alerts', name: ruleName, ruleTypeId: RULE_TYPE_ID, From dfd387e0894c8b7928b6c8e1561872a0b3e8fbe1 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Wed, 5 Jun 2024 12:35:28 +0200 Subject: [PATCH 71/82] [EDR Workflows] Improve Crowdstrike's connector API errors (#184302) --- .../crowdstrike/crowdstrike.test.ts | 67 +++++++++++++++++++ .../crowdstrike/crowdstrike.ts | 17 ++++- .../connector_types/crowdstrike/types.ts | 23 +++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/types.ts diff --git a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts index 9eb1444c9bc0d..d53881cae1272 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts @@ -153,6 +153,73 @@ describe('CrowdstrikeConnector', () => { }); }); + describe('getResponseErrorMessage', () => { + it('returns errorData message when errorData is present', () => { + const error = { + response: { + data: { + errors: [{ message: 'Test error message', code: 400 }], + }, + }, + }; + + // @ts-expect-error testing protected method + const result = connector.getResponseErrorMessage(error); + + expect(result).toBe('Test error message'); + }); + + it('returns URL not found message when cause code is ENOTFOUND', () => { + const error = { + cause: { + code: 'ENOTFOUND', + hostname: 'api.crowdstrike.com111', + }, + }; + + // @ts-expect-error testing protected method + const result = connector.getResponseErrorMessage(error); + + expect(result).toBe('URL not found: api.crowdstrike.com111'); + }); + + it('returns Connection Refused message when cause code is ECONNREFUSED', () => { + const error = { + cause: { + code: 'ECONNREFUSED', + port: 5555, + address: 'localhost', + }, + }; + + // @ts-expect-error testing protected method + const result = connector.getResponseErrorMessage(error); + + expect(result).toBe('Connection Refused: localhost:5555'); + }); + + it('returns Unknown API Error message when error response status is undefined', () => { + const error = {}; + // @ts-expect-error testing protected method + const result = connector.getResponseErrorMessage(error); + + expect(result).toBe('Unknown API Error: {}'); + }); + + it('returns API Error message when error response data is present', () => { + const error = { + response: { + status: 400, + data: { message: 'Test API error' }, + }, + }; + // @ts-expect-error testing protected method + const result = connector.getResponseErrorMessage(error); + + expect(result).toBe('API Error: {"message":"Test API error"}'); + }); + }); + describe('getTokenRequest', () => { it('should make a POST request to the correct URL with correct headers', async () => { const mockResponse = { data: { access_token: 'testToken' } }; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts index 6a758a9d33117..07967d5013fa2 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts @@ -9,6 +9,7 @@ import { ServiceParams, SubActionConnector } from '@kbn/actions-plugin/server'; import type { AxiosError } from 'axios'; import { SubActionRequestParams } from '@kbn/actions-plugin/server/sub_action_framework/types'; +import { isAggregateError, NodeSystemError } from './types'; import type { CrowdstrikeConfig, CrowdstrikeSecrets, @@ -199,13 +200,27 @@ export class CrowdstrikeConnector extends SubActionConnector< } protected getResponseErrorMessage( - error: AxiosError<{ errors: [{ message: string; code: number }] }> + error: AxiosError<{ errors: Array<{ message: string; code: number }> }> ): string { const errorData = error.response?.data?.errors?.[0]; if (errorData) { return errorData.message; } + const cause: NodeSystemError = isAggregateError(error.cause) + ? error.cause.errors[0] + : error.cause; + if (cause) { + // ENOTFOUND is the error code for when the host is unreachable eg. api.crowdstrike.com111 + if (cause.code === 'ENOTFOUND') { + return `URL not found: ${cause.hostname}`; + } + // ECONNREFUSED is the error code for when the host is unreachable eg. http://MacBook-Pro-Tomasz.local:55555 + if (cause.code === 'ECONNREFUSED') { + return `Connection Refused: ${cause.address}:${cause.port}`; + } + } + if (!error.response?.status) { return `Unknown API Error: ${JSON.stringify(error.response?.data ?? {})}`; } diff --git a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/types.ts b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/types.ts new file mode 100644 index 0000000000000..95b637818d2a8 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface NodeSystemError extends Error { + hostname?: string; // The hostname of the machine that triggered the error + address?: string; // If present, the address to which a network connection failed + code: string; // The string error code + dest: string; // If present, the file path destination when reporting a file system error + errno: number; // The system-provided error number + info?: object; // If present, extra details about the error condition + message: string; // A system-provided human-readable description of the error + path?: string; // If present, the file path when reporting a file system error + port?: number; // If present, the network connection port that is not available + syscall: string; // The name of the system call that triggered the error +} + +export function isAggregateError(cause: unknown): cause is AggregateError { + return cause instanceof AggregateError; +} From 9bf32f15e879f55dcf34424cfe3c72e6debbd7c5 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Wed, 5 Jun 2024 12:48:13 +0200 Subject: [PATCH 72/82] [Security Solution] [Security Solution] Fix Timeline date picker to honor the date format config (#184799) ## Summary Fixes: https://github.com/elastic/kibana/issues/184798 Use dateFormat from ui config in the `SuperDatePicker` component Timeline uses. #### Screenshots With config: config Before: before After: before --- .../public/common/components/super_date_picker/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx index c86cf9556741b..edce85bf84388 100644 --- a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx @@ -23,7 +23,7 @@ import type { Dispatch } from 'redux'; import deepEqual from 'fast-deep-equal'; import { isQueryInput } from '../../store/inputs/helpers'; -import { DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../../common/constants'; +import { DEFAULT_DATE_FORMAT, DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../../common/constants'; import { timelineActions } from '../../../timelines/store'; import { useUiSetting$ } from '../../lib/kibana'; import type { inputsModel, State } from '../../store'; @@ -200,6 +200,8 @@ export const SuperDatePickerComponent = React.memo( const startDate = fromStr != null ? fromStr : new Date(start).toISOString(); const [quickRanges] = useUiSetting$(DEFAULT_TIMEPICKER_QUICK_RANGES); + const [dateFormat] = useUiSetting$(DEFAULT_DATE_FORMAT); + const commonlyUsedRanges = isEmpty(quickRanges) ? [] : quickRanges.map(({ from, to, display }) => ({ @@ -225,6 +227,7 @@ export const SuperDatePickerComponent = React.memo( width={width} compressed={compressed} updateButtonProps={refreshButtonProps} + dateFormat={dateFormat} /> ); }, From 4182d87d4a2edfed7762b48706b6ae885fa6896f Mon Sep 17 00:00:00 2001 From: Paul Bianciardi <70908889+paulb-elastic@users.noreply.github.com> Date: Wed, 5 Jun 2024 11:59:54 +0100 Subject: [PATCH 73/82] Updates the docs with the advanced setting option for enabling Uptime (#183613) ## Summary Updates the [advanced settings docs](https://www.elastic.co/guide/en/kibana/master/advanced-options.html) to include the `observability:enableLegacyUptimeApp` option for enabling the Uptime Kibana app by default (in conjunction with the Observability doc updates in https://github.com/elastic/observability-docs/pull/3890) The list of options (under Observability, at least) don't seem to be alphabetical, so I've put this in where seems to be a good place, but feel free to move it somewhere else if more appropriate. --- docs/management/advanced-options.asciidoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index 3501b440d13ba..5de4ea45c3204 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -444,6 +444,9 @@ beta:[] Enables faster searching in APM tables by adding a handy search bar with [[observability-enable-aws-lambda-metrics]]`observability:enableAwsLambdaMetrics`:: preview:[] Display Amazon Lambda metrics in the service metrics tab. +[[observability-enable-legacy-uptime-app]]`observability:enableLegacyUptimeApp`:: +Shows the Uptime app even if there is no recent Heartbeat data. + [[observability-apm-enable-comparison]]`observability:enableComparisonByDefault`:: Determines whether the <> is enabled or disabled by default in the APM app. From fb0b81086a43f3df29586d922cb9190f80cdc199 Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:06:31 +0100 Subject: [PATCH 74/82] [Observability Onboarding] Prompt when Elastic Agent is already installed (#184772) Resolves #183477 ## Summary * Detect whether an existing config file for Elastic Agent exists * If not, continue as usual * If yes: * Show finding "Existing config file found at $cfg" * Prompt the user: "Create backup and download new configuration? [Y/n]" See: User flow in [#3367](https://github.com/elastic/observability-dev/issues/3367) ## Screenshot Screenshot 2024-06-04 at 16 46 14 --------- Co-authored-by: Mykola Harmash --- .../public/assets/auto_detect.sh | 50 +++++++++++++++---- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh index 879b3dfce9381..718107050335f 100755 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh @@ -205,6 +205,30 @@ ensure_elastic_agent_healthy() { fi } +backup_elastic_agent_config() { + if [ -f "$elastic_agent_config_path" ]; then + echo -e "\nExisting config file found at $elastic_agent_config_path"; + + printf "\n\e[1;36m?\e[0m \e[1m%s\e[0m \e[2m%s\e[0m" "Create backup and continue installation?" "[Y/n] (default: Yes): " + read confirmation_reply + confirmation_reply="${confirmation_reply:-Y}" + + if [[ "$confirmation_reply" =~ ^[Yy](es)?$ ]]; then + local backup_path="${elastic_agent_config_path%.yml}.$(date +%s).yml" # e.g. /opt/Elastic/Agent/elastic-agent.1712267614.yml + cp $elastic_agent_config_path $backup_path + + if [ "$?" -eq 0 ]; then + printf "\n\e[1;32m✓\e[0m \e[1m%s\e[0m\n" "Backup saved to $backup_path" + else + update_step_progress "ea-config" "warning" "Failed to backup existing configuration" + fail "Failed to backup existing config file - Try manually creating a backup or delete your existing config file before re-running this script" + fi + else + fail "Installation aborted" + fi + fi +} + download_elastic_agent_config() { local decoded_ingest_api_key=$(echo "$ingest_api_key_encoded" | base64 -d) local tmp_path="/tmp/elastic-agent-config-template.yml" @@ -220,8 +244,8 @@ download_elastic_agent_config() { --no-progress-meter if [ "$?" -ne 0 ]; then - update_step_progress "ea-config" "warning" "Failed to install integrations and download Elastic Agent config." - fail "Failed to install integrations and download Elastic Agent config." + update_step_progress "ea-config" "warning" "Failed to install integrations." + fail "Failed to install integrations." fi sed "s/'\${API_KEY}'/$decoded_ingest_api_key/g" $tmp_path > $elastic_agent_config_path @@ -361,12 +385,12 @@ function select_list() { fi done - echo -e "\n" - read -p "Do you want to ingest all of these logs? [Y/n] (default: Yes): " confirmation_reply + printf "\n\e[1;36m?\e[0m \e[1m%s\e[0m \e[2m%s\e[0m" "Ingest all detected logs?" "[Y/n] (default: Yes): " + read confirmation_reply confirmation_reply="${confirmation_reply:-Y}" if [[ ! "$confirmation_reply" =~ ^[Yy](es)?$ ]]; then - echo -e "\nExclude logs by listing their index numbers (e.g. 1, 2, 3):" + printf "\n\e[1;36m?\e[0m \e[1m%s\e[0m \e[2m%s\e[0m" "Exclude logs by listing their index numbers" "(e.g. 1, 2, 3): " read exclude_index_list_string IFS=', ' read -r -a exclude_index_list_array <<< "$exclude_index_list_string" @@ -451,7 +475,8 @@ if [[ -n "$excluded_options_string" ]]; then echo -e "$excluded_options_string" fi -echo -e "\nAdd paths to any custom logs we've missed (e.g. /var/log/myapp/*.log, /home/j/myapp/*.log). Press Enter to skip." + +printf "\n\e[1;36m?\e[0m \e[1m%s\e[0m \e[2m%s\e[0m\n" "Add paths to any custom logs we've missed" "(e.g. /path1/*.log, /path2/*.log). Press Enter to skip." read custom_log_file_path_list_string IFS=', ' read -r -a custom_log_file_path_list_array <<< "$custom_log_file_path_list_string" @@ -464,8 +489,9 @@ for item in "${selected_unknown_log_file_pattern_array[@]}" "${custom_log_file_p printf "• %s\n" "$item" done -echo -e "\n" -read -p "Confirm selection [Y/n] (default: Yes): " confirmation_reply + +printf "\n\e[1;36m?\e[0m \e[1m%s\e[0m \e[2m%s\e[0m" "Continue installation with selected logs?" "[Y/n] (default: Yes): " +read confirmation_reply confirmation_reply="${confirmation_reply:-Y}" if [[ ! "$confirmation_reply" =~ ^[Yy](es)?$ ]]; then @@ -475,16 +501,18 @@ fi build_install_integrations_api_body_string -echo -e "\nDownloading Elastic Agent..." +backup_elastic_agent_config + +echo -e "\nDownloading Elastic Agent...\n" download_elastic_agent extract_elastic_agent -echo -e "\nInstalling Elastic Agent..." +echo -e "\nInstalling Elastic Agent...\n" install_elastic_agent wait_for_elastic_agent_status ensure_elastic_agent_healthy -echo -e "\nDownloading Elastic Agent configuration..." +echo -e "\nInstalling integrations...\n" download_elastic_agent_config update_step_progress "ea-config" "complete" From 8a5ed874af04a50975190ed3a6240a7d63f8951c Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Wed, 5 Jun 2024 07:09:51 -0500 Subject: [PATCH 75/82] [data views] Fix single quotes on field save confirm toast (#184789) ## Summary Address two cases where single quotes needed to be doubled up to prevent escaping of string interpolation. Also addressed some doc examples. Verify confirm toasts after saving field in discover and creating a scripted field in data view management. Follow up to https://github.com/elastic/kibana/pull/179506 --------- Co-authored-by: Julia Rechkunova --- packages/kbn-i18n/GUIDELINE.md | 4 ++-- .../public/components/preview/preview_controller.tsx | 2 +- .../create_edit_field/create_edit_field.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kbn-i18n/GUIDELINE.md b/packages/kbn-i18n/GUIDELINE.md index 983515a16c737..20c170b5ecb4c 100644 --- a/packages/kbn-i18n/GUIDELINE.md +++ b/packages/kbn-i18n/GUIDELINE.md @@ -58,8 +58,8 @@ Messages can contain placeholders for embedding a value of a variable. For examp ```js { - 'kbn.management.editIndexPattern.scripted.deleteFieldLabel': "Delete scripted field '{fieldName}'?" - 'kbn.management.editIndexPattern.scripted.noFieldLabel': "'{indexPatternTitle}' index pattern doesn't have a scripted field called '{fieldName}'" + 'kbn.management.editIndexPattern.scripted.deleteFieldLabel': "Delete scripted field ''{fieldName}''?" + 'kbn.management.editIndexPattern.scripted.noFieldLabel': "''{indexPatternTitle}'' index pattern doesn't have a scripted field called ''{fieldName}''" } ``` diff --git a/src/plugins/data_view_field_editor/public/components/preview/preview_controller.tsx b/src/plugins/data_view_field_editor/public/components/preview/preview_controller.tsx index ae756a305a9bd..ea1a364960edd 100644 --- a/src/plugins/data_view_field_editor/public/components/preview/preview_controller.tsx +++ b/src/plugins/data_view_field_editor/public/components/preview/preview_controller.tsx @@ -253,7 +253,7 @@ export class PreviewController { const afterSave = () => { const message = i18n.translate('indexPatternFieldEditor.deleteField.savedHeader', { - defaultMessage: "Saved '{fieldName}'", + defaultMessage: "Saved ''{fieldName}''", values: { fieldName: updatedField.name }, }); this.deps.notifications.toasts.addSuccess(message); diff --git a/src/plugins/data_view_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx b/src/plugins/data_view_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx index 3c89efe92e4a2..a46c3b1898e47 100644 --- a/src/plugins/data_view_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx +++ b/src/plugins/data_view_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx @@ -50,7 +50,7 @@ export const CreateEditField = withRouter( if (mode === 'edit' && !spec) { const message = i18n.translate('indexPatternManagement.editDataView.scripted.noFieldLabel', { defaultMessage: - "'{dataViewTitle}' data view doesn't have a scripted field called '{fieldName}'", + "''{dataViewTitle}'' data view doesn't have a scripted field called ''{fieldName}''", values: { dataViewTitle: indexPattern.title, fieldName }, }); notifications.toasts.addWarning(message); From db9e530da2f9c73fea66ce6a644cf5f1b2a6c814 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 5 Jun 2024 14:19:30 +0200 Subject: [PATCH 76/82] [UsersProfilePopover] Fix email sometimes is not visible (#184318) ## Summary fix https://github.com/elastic/kibana/issues/182945 - This fixes `UsersProfilePopover` to always show email on the 2nd line. To keep the list virtualized **had to increase the height a bit for every row** Before: ![image](https://github.com/elastic/kibana/assets/7784120/ee42530f-9b39-4139-bd81-12c0a8fd6498) After: ![Screenshot 2024-05-27 at 15 28 05](https://github.com/elastic/kibana/assets/7784120/5d869cf3-194f-4b08-b4a8-945d5904452e) - Also adds email in a label to make it appear in a browser tooltip ![Screenshot 2024-05-27 at 16 20 12](https://github.com/elastic/kibana/assets/7784120/a9687ec2-a92a-44e9-a64d-e64a4e87b497) - Also fixes https://github.com/elastic/kibana/issues/182561 and adds email to Avatar "name" so it appears in a native tooltip ![Screenshot 2024-05-28 at 15 57 21](https://github.com/elastic/kibana/assets/7784120/67b0bb65-4ce4-4561-85cc-356175bc86c2) - Increase popover width in TableListView --- .../src/components/user_filter_panel.tsx | 2 +- .../src/user_avatar.test.tsx | 6 +-- .../src/user_avatar.tsx | 8 +-- .../src/user_profile.ts | 13 +++++ .../src/user_profiles_selectable.tsx | 50 ++++++++----------- .../src/user_tooltip.test.tsx | 24 ++++----- .../src/user_tooltip.tsx | 16 +++--- .../kbn-user-profile-components/tsconfig.json | 3 +- .../components/all_cases/assignees_filter.tsx | 2 +- .../components/suggest_users_popover.tsx | 2 +- 10 files changed, 64 insertions(+), 62 deletions(-) diff --git a/packages/content-management/table_list_view_table/src/components/user_filter_panel.tsx b/packages/content-management/table_list_view_table/src/components/user_filter_panel.tsx index 62d6690954fe1..2307f449b9c2d 100644 --- a/packages/content-management/table_list_view_table/src/components/user_filter_panel.tsx +++ b/packages/content-management/table_list_view_table/src/components/user_filter_panel.tsx @@ -164,7 +164,7 @@ export const UserFilterPanel: FC<{}> = () => { }, onSearchChange: setSearchTerm, }} - panelProps={{ css: { minWidth: euiTheme.base * 18 } }} + panelProps={{ css: { minWidth: euiTheme.base * 22 } }} /> ); diff --git a/packages/kbn-user-profile-components/src/user_avatar.test.tsx b/packages/kbn-user-profile-components/src/user_avatar.test.tsx index 9c654d25f70fe..f46f16cdd4cdd 100644 --- a/packages/kbn-user-profile-components/src/user_avatar.test.tsx +++ b/packages/kbn-user-profile-components/src/user_avatar.test.tsx @@ -31,7 +31,7 @@ describe('UserAvatar', () => { `); }); @@ -56,7 +56,7 @@ describe('UserAvatar', () => { color="#09e8ca" initials="DN" initialsLength={2} - name="Delighted Nightingale" + name="Delighted Nightingale (delighted_nightingale@elastic.co)" /> `); }); @@ -76,7 +76,7 @@ describe('UserAvatar', () => { color="#AA6556" initials="DN" initialsLength={2} - name="Delighted Nightingale" + name="Delighted Nightingale (delighted_nightingale@elastic.co)" /> `); }); diff --git a/packages/kbn-user-profile-components/src/user_avatar.tsx b/packages/kbn-user-profile-components/src/user_avatar.tsx index 1b2a2152f27fc..fe9609b8e822f 100644 --- a/packages/kbn-user-profile-components/src/user_avatar.tsx +++ b/packages/kbn-user-profile-components/src/user_avatar.tsx @@ -16,7 +16,7 @@ import type { UserProfile, UserProfileUserInfo } from './user_profile'; import { getUserAvatarColor, getUserAvatarInitials, - getUserDisplayName, + getUserDisplayLabel, USER_AVATAR_MAX_INITIALS, } from './user_profile'; @@ -62,15 +62,15 @@ export const UserAvatar: FunctionComponent = ({ user, avatar, . return ; } - const displayName = getUserDisplayName(user); + const displayLabel = getUserDisplayLabel(user); if (avatar?.imageUrl) { - return ; + return ; } return ( { if (option.user) { + const displayName = getUserDisplayName(option.user); return ( - - - - {option.label} - - - {option.user.email && option.user.email !== option.label ? ( - - - {searchValue ? ( - {option.user.email} - ) : ( - option.user.email - )} - - + <> +
    + {displayName} +
    + {option.user.email && option.user.email !== displayName ? ( + + {searchValue ? ( + {option.user.email} + ) : ( + option.user.email + )} + ) : undefined} -
    + ); } return {option.label}; @@ -451,7 +443,7 @@ function toSelectableOption( if (userProfile) { return { key: userProfile.uid, - label: getUserDisplayName(userProfile.user), + label: getUserDisplayLabel(userProfile.user), data: userProfile, 'data-test-subj': `userProfileSelectableOption-${userProfile.user.username}`, }; diff --git a/packages/kbn-user-profile-components/src/user_tooltip.test.tsx b/packages/kbn-user-profile-components/src/user_tooltip.test.tsx index ed18651b223cf..14697293cba3c 100644 --- a/packages/kbn-user-profile-components/src/user_tooltip.test.tsx +++ b/packages/kbn-user-profile-components/src/user_tooltip.test.tsx @@ -61,20 +61,20 @@ describe('UserToolTip', () => {
    - + Delighted Nightingale +
    + - - - Delighted Nightingale - - - - delighted_nightingale@elastic.co - - + delighted_nightingale@elastic.co + } diff --git a/packages/kbn-user-profile-components/src/user_tooltip.tsx b/packages/kbn-user-profile-components/src/user_tooltip.tsx index 76b7ca1414274..3122d90b2f06b 100644 --- a/packages/kbn-user-profile-components/src/user_tooltip.tsx +++ b/packages/kbn-user-profile-components/src/user_tooltip.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { EuiToolTipProps } from '@elastic/eui'; +import { EuiText, EuiToolTipProps } from '@elastic/eui'; import { EuiToolTip, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import type { FunctionComponent } from 'react'; import React from 'react'; @@ -43,15 +43,11 @@ export const UserToolTip: FunctionComponent = ({ user, avatar, - - - - {displayName} - - {user.email && user.email !== displayName ? ( - {user.email} - ) : undefined} - + +
    {displayName}
    + {user.email && user.email !== displayName ? ( + {user.email} + ) : undefined}
    } diff --git a/packages/kbn-user-profile-components/tsconfig.json b/packages/kbn-user-profile-components/tsconfig.json index 9fda76c4205a6..522588066834c 100644 --- a/packages/kbn-user-profile-components/tsconfig.json +++ b/packages/kbn-user-profile-components/tsconfig.json @@ -4,7 +4,8 @@ "outDir": "target/types", "types": [ "jest", - "node" + "node", + "@emotion/react/types/css-prop", ] }, "include": [ diff --git a/x-pack/plugins/cases/public/components/all_cases/assignees_filter.tsx b/x-pack/plugins/cases/public/components/all_cases/assignees_filter.tsx index 3a2e03e827665..6d82d02c448e9 100644 --- a/x-pack/plugins/cases/public/components/all_cases/assignees_filter.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/assignees_filter.tsx @@ -112,7 +112,7 @@ const AssigneesFilterPopoverComponent: React.FC = ( isOpen={isPopoverOpen} closePopover={togglePopover} panelStyle={{ - minWidth: 520, + width: 400, }} button={ = ({ isOpen={isPopoverOpen} closePopover={onClosePopover} panelStyle={{ - minWidth: 520, + width: 400, }} selectableProps={{ onChange, From e12c7e37d41788d65b49e152e925636725d16e5e Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 5 Jun 2024 14:30:14 +0200 Subject: [PATCH 77/82] [Lens] Improve user messagging (#184233) This PR cleaned up a bit our user messages. In particular: - marks as required the `uniqueId` for a `UserMessage` making it uniquely identifiable across various message renderers (moves toward this objective: https://github.com/elastic/kibana/issues/151526) - adds a unique ID for each UserMessage in Lens - partially unifies the Error structure between UserMessages and form-based validation. - Opens the door to provide metadata about the errors, that are currently buried within the text/react node (moves toward this objective: https://github.com/elastic/kibana/issues/151526) Subsequent possible steps, outside this PR: - add metadata where required for https://github.com/elastic/kibana/issues/151526 - merge even more the type of `UserMessage`, `FieldBasedOperationErrorMessage` and `ValidationErrors` - centralize the messages id and translations - add a Type for the `uniqueId` to guide future developments --- ...et_application_user_messages.test.tsx.snap | 2 + .../get_application_user_messages.test.tsx | 15 + .../get_application_user_messages.tsx | 12 + .../__snapshots__/utils.test.tsx.snap | 3 + .../form_based/dimension_panel/time_shift.tsx | 2 +- .../datasources/form_based/form_based.test.ts | 6 + .../datasources/form_based/form_based.tsx | 71 +- .../definitions/calculations/counter_rate.tsx | 4 +- .../calculations/cumulative_sum.tsx | 4 +- .../definitions/calculations/differences.tsx | 4 +- .../calculations/moving_average.tsx | 4 +- .../calculations/overall_metric.tsx | 4 +- .../definitions/calculations/time_scale.tsx | 49 +- .../definitions/calculations/utils.test.ts | 18 +- .../definitions/calculations/utils.ts | 119 +- .../operations/definitions/cardinality.tsx | 10 +- .../operations/definitions/count.tsx | 11 +- .../operations/definitions/date_histogram.tsx | 38 +- .../__snapshots__/formula.test.tsx.snap | 6 + .../formula/context_variables.test.ts | 52 +- .../definitions/formula/context_variables.tsx | 72 +- .../formula/editor/formula_editor.tsx | 14 +- .../definitions/formula/formula.test.tsx | 114 +- .../definitions/formula/formula.tsx | 39 +- .../operations/definitions/formula/parse.ts | 8 +- .../definitions/formula/validation.ts | 1064 +++++++++-------- .../definitions/formula/validation_errors.ts | 183 +++ .../operations/definitions/helpers.test.ts | 21 +- .../operations/definitions/helpers.tsx | 34 +- .../operations/definitions/index.ts | 33 +- .../definitions/last_value.test.tsx | 16 +- .../operations/definitions/last_value.tsx | 80 +- .../operations/definitions/metrics.tsx | 10 +- .../operations/definitions/percentile.tsx | 10 +- .../definitions/percentile_ranks.tsx | 10 +- .../definitions/static_value.test.tsx | 8 +- .../operations/definitions/static_value.tsx | 14 +- .../definitions/terms/helpers.test.ts | 52 +- .../operations/definitions/terms/helpers.ts | 235 ++-- .../operations/definitions/terms/index.tsx | 16 +- .../definitions/terms/terms.test.tsx | 19 +- .../form_based/reduced_time_range_utils.tsx | 28 +- .../form_based/time_shift_utils.tsx | 76 +- .../public/datasources/form_based/utils.tsx | 124 +- .../text_based/text_based_languages.test.ts | 2 + .../text_based/text_based_languages.tsx | 2 + .../workspace_panel/workspace_panel.test.tsx | 2 + .../workspace_panel/workspace_panel.tsx | 5 +- .../editor_frame_service/error_helper.tsx | 4 +- .../public/embeddable/embeddable.test.tsx | 1 + .../lens/public/embeddable/embeddable.tsx | 5 +- .../embeddable_info_badges.test.tsx | 78 +- .../embeddable/embeddable_info_badges.tsx | 50 +- x-pack/plugins/lens/public/types.ts | 10 +- .../plugins/lens/public/user_messages_ids.ts | 97 ++ .../gauge/visualization.test.ts | 1 + .../visualizations/gauge/visualization.tsx | 14 + .../heatmap/visualization.test.ts | 1 + .../visualizations/heatmap/visualization.tsx | 3 + .../visualizations/metric/visualization.tsx | 2 + .../partition/visualization.tsx | 8 + .../{state_helpers.ts => state_helpers.tsx} | 111 +- .../visualizations/xy/visualization.test.tsx | 8 +- .../visualizations/xy/visualization.tsx | 103 +- .../xy/visualization_helpers.tsx | 27 +- .../translations/translations/fr-FR.json | 4 +- .../translations/translations/ja-JP.json | 4 +- .../translations/translations/zh-CN.json | 4 +- 68 files changed, 1880 insertions(+), 1380 deletions(-) create mode 100644 x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation_errors.ts create mode 100644 x-pack/plugins/lens/public/user_messages_ids.ts rename x-pack/plugins/lens/public/visualizations/xy/{state_helpers.ts => state_helpers.tsx} (64%) diff --git a/x-pack/plugins/lens/public/app_plugin/__snapshots__/get_application_user_messages.test.tsx.snap b/x-pack/plugins/lens/public/app_plugin/__snapshots__/get_application_user_messages.test.tsx.snap index 6626ac8b51c54..e53df700f6732 100644 --- a/x-pack/plugins/lens/public/app_plugin/__snapshots__/get_application_user_messages.test.tsx.snap +++ b/x-pack/plugins/lens/public/app_plugin/__snapshots__/get_application_user_messages.test.tsx.snap @@ -88,6 +88,7 @@ Array [ , "severity": "error", "shortMessage": "", + "uniqueId": "editor_missing_dataview", }, Object { "displayLocations": Array [ @@ -99,6 +100,7 @@ Array [ "longMessage": "Could not find the data view: missing_pattern", "severity": "error", "shortMessage": "", + "uniqueId": "editor_missing_expression_dataview", }, ] `; diff --git a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx index f511e7e59112a..4c5a17373af8d 100644 --- a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.test.tsx @@ -44,6 +44,7 @@ describe('application-level user messages', () => { "longMessage": "Visualization type not found.", "severity": "error", "shortMessage": "", + "uniqueId": "editor_missing_vis_type", }, ] `); @@ -73,6 +74,7 @@ describe('application-level user messages', () => { "longMessage": "The visualization type id_for_type_that_doesnt_exist could not be resolved.", "severity": "error", "shortMessage": "Unknown visualization type", + "uniqueId": "editor_unknown_vis_type", }, ] `); @@ -102,6 +104,7 @@ describe('application-level user messages', () => { "longMessage": "Could not find datasource for the visualization", "severity": "error", "shortMessage": "Unknown datasource type", + "uniqueId": "editor_unknown_datasource_type", }, ] `); @@ -210,6 +213,7 @@ describe('filtering user messages', () => { const userMessages: UserMessage[] = [ { + uniqueId: 'unique_id_1', severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'dimensionButton', dimensionId: dimensionId1 }], @@ -217,6 +221,7 @@ describe('filtering user messages', () => { longMessage: '', }, { + uniqueId: 'unique_id_2', severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'dimensionButton', dimensionId: dimensionId2 }], @@ -224,6 +229,7 @@ describe('filtering user messages', () => { longMessage: '', }, { + uniqueId: 'unique_id_3', severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'banner' }], @@ -231,6 +237,7 @@ describe('filtering user messages', () => { longMessage: '', }, { + uniqueId: 'unique_id_4', severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], @@ -238,6 +245,7 @@ describe('filtering user messages', () => { longMessage: '', }, { + uniqueId: 'unique_id_5', severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualizationInEditor' }], @@ -245,6 +253,7 @@ describe('filtering user messages', () => { longMessage: '', }, { + uniqueId: 'unique_id_6', severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'visualizationOnEmbeddable' }], @@ -266,6 +275,7 @@ describe('filtering user messages', () => { "longMessage": "", "severity": "warning", "shortMessage": "Deprecation notice!", + "uniqueId": "unique_id_3", }, ] `); @@ -286,6 +296,7 @@ describe('filtering user messages', () => { "longMessage": "", "severity": "error", "shortMessage": "Warning on dimension 1!", + "uniqueId": "unique_id_1", }, ] `); @@ -306,6 +317,7 @@ describe('filtering user messages', () => { "longMessage": "", "severity": "warning", "shortMessage": "Warning on dimension 2!", + "uniqueId": "unique_id_2", }, ] `); @@ -322,6 +334,7 @@ describe('filtering user messages', () => { "longMessage": "", "severity": "error", "shortMessage": "Visualization error!", + "uniqueId": "unique_id_4", }, Object { "displayLocations": Array [ @@ -333,6 +346,7 @@ describe('filtering user messages', () => { "longMessage": "", "severity": "error", "shortMessage": "Visualization editor error!", + "uniqueId": "unique_id_5", }, ] `); @@ -364,6 +378,7 @@ describe('filtering user messages', () => { "longMessage": "", "severity": "warning", "shortMessage": "Visualization embeddable warning!", + "uniqueId": "unique_id_6", }, ] `); diff --git a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx index 4041fce3bbd0a..810acd8d0350f 100644 --- a/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx +++ b/x-pack/plugins/lens/public/app_plugin/get_application_user_messages.tsx @@ -28,6 +28,13 @@ import type { Visualization, } from '../types'; import { getMissingIndexPattern } from '../editor_frame_service/editor_frame/state_helpers'; +import { + EDITOR_MISSING_DATAVIEW, + EDITOR_MISSING_EXPRESSION_DATAVIEW, + EDITOR_MISSING_VIS_TYPE, + EDITOR_UNKNOWN_DATASOURCE_TYPE, + EDITOR_UNKNOWN_VIS_TYPE, +} from '../user_messages_ids'; /** * Provides a place to register general user messages that don't belong in the datasource or visualization objects @@ -78,6 +85,7 @@ export const getApplicationUserMessages = ({ function getMissingVisTypeError(): UserMessage { return { + uniqueId: EDITOR_MISSING_VIS_TYPE, severity: 'error', displayLocations: [{ id: 'visualizationOnEmbeddable' }], fixableInEditor: true, @@ -90,6 +98,7 @@ function getMissingVisTypeError(): UserMessage { function getUnknownVisualizationTypeError(visType: string): UserMessage { return { + uniqueId: EDITOR_UNKNOWN_VIS_TYPE, severity: 'error', fixableInEditor: false, displayLocations: [{ id: 'visualization' }], @@ -107,6 +116,7 @@ function getUnknownVisualizationTypeError(visType: string): UserMessage { function getUnknownDatasourceTypeError(): UserMessage { return { + uniqueId: EDITOR_UNKNOWN_DATASOURCE_TYPE, severity: 'error', fixableInEditor: false, displayLocations: [{ id: 'visualization' }], @@ -130,6 +140,7 @@ function getMissingIndexPatternsErrors( const canFix = isManagementEnabled && isIndexPatternManagementEnabled; return [ { + uniqueId: EDITOR_MISSING_DATAVIEW, severity: 'error', fixableInEditor: canFix, displayLocations: [{ id: 'visualizationInEditor' }], @@ -176,6 +187,7 @@ function getMissingIndexPatternsErrors( ), }, { + uniqueId: EDITOR_MISSING_EXPRESSION_DATAVIEW, severity: 'error', fixableInEditor: canFix, displayLocations: [{ id: 'visualizationOnEmbeddable' }], diff --git a/x-pack/plugins/lens/public/datasources/form_based/__snapshots__/utils.test.tsx.snap b/x-pack/plugins/lens/public/datasources/form_based/__snapshots__/utils.test.tsx.snap index fe59faa80be9f..55cf1e8637292 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/__snapshots__/utils.test.tsx.snap +++ b/x-pack/plugins/lens/public/datasources/form_based/__snapshots__/utils.test.tsx.snap @@ -68,6 +68,7 @@ Object { "longMessage": "", "severity": "warning", "shortMessage": "This may be approximate depending on how the data is indexed. For more precise results, sort by rarity.", + "uniqueId": "precision_error_asc_count_precision", } `; @@ -86,6 +87,7 @@ Object { "longMessage": "", "severity": "warning", "shortMessage": "This might be an approximation. For more precise results, use Filters or increase the number of Top Values.", + "uniqueId": "layer_settings_accuracy_mode_enabled", } `; @@ -104,5 +106,6 @@ Object { "longMessage": "", "severity": "warning", "shortMessage": "This might be an approximation. For more precise results, you can enable accuracy mode, but it increases the load on the Elasticsearch cluster.", + "uniqueId": "layer_settings_accuracy_mode_disabled", } `; diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/time_shift.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/time_shift.tsx index fe69c9d76d45b..82da59b38cc27 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/time_shift.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/time_shift.tsx @@ -130,7 +130,7 @@ export function TimeShift({ defaultMessage: 'Enter the time shift number and unit', })} error={ - warnings[0] || + warnings[0] ?? (isLocalValueInvalid && i18n.translate('xpack.lens.indexPattern.timeShift.genericInvalidHelp', { defaultMessage: 'Time shift value is not valid.', diff --git a/x-pack/plugins/lens/public/datasources/form_based/form_based.test.ts b/x-pack/plugins/lens/public/datasources/form_based/form_based.test.ts index bd01a77f80b9a..94a85962e28b7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/form_based.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/form_based.test.ts @@ -3095,6 +3095,7 @@ describe('IndexPattern Data Source', () => { "longMessage": "error 1", "severity": "error", "shortMessage": "", + "uniqueId": "error 1", }, Object { "displayLocations": Array [ @@ -3106,6 +3107,7 @@ describe('IndexPattern Data Source', () => { "longMessage": "error 2", "severity": "error", "shortMessage": "", + "uniqueId": "error 2", }, ] `); @@ -3160,6 +3162,7 @@ describe('IndexPattern Data Source', () => { />, "severity": "error", "shortMessage": "Layer 1 error: ", + "uniqueId": "error 1", }, Object { "displayLocations": Array [ @@ -3182,6 +3185,7 @@ describe('IndexPattern Data Source', () => { />, "severity": "error", "shortMessage": "Layer 1 error: ", + "uniqueId": "error 2", }, ] `); @@ -3248,6 +3252,7 @@ describe('IndexPattern Data Source', () => {

    , "severity": "error", "shortMessage": "", + "uniqueId": "editor_invalid_dimension", }, ] `); @@ -3286,6 +3291,7 @@ describe('IndexPattern Data Source', () => { , "severity": "error", "shortMessage": "", + "uniqueId": undefined, }, ] `); diff --git a/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx b/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx index 8099a787437ba..1bdd12a5cb49c 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx @@ -100,6 +100,7 @@ import { isColumnOfType } from './operations/definitions/helpers'; import { LayerSettingsPanel } from './layer_settings'; import { FormBasedLayer, LastValueIndexPatternColumn } from '../..'; import { filterAndSortUserMessages } from '../../app_plugin/get_application_user_messages'; +import { EDITOR_INVALID_DIMENSION } from '../../user_messages_ids'; export type { OperationType, GenericIndexPatternColumn } from './operations'; export { deleteColumn } from './operations'; @@ -760,48 +761,56 @@ export function getFormBasedDatasource({ layerErrorMessages, (layerId, columnId) => { const layer = state.layers[layerId]; - return !isColumnInvalid( + const column = layer.columns[columnId]; + const indexPattern = framePublicAPI.dataViews.indexPatterns[layer.indexPatternId]; + if (!column || !indexPattern) { + // this is a different issue that should be catched earlier + return false; + } + return isColumnInvalid( layer, + column, columnId, - framePublicAPI.dataViews.indexPatterns[layer.indexPatternId], + indexPattern, framePublicAPI.dateRange, uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET) ); } ); - const warningMessages = [ - ...[ - ...(getStateTimeShiftWarningMessages(data.datatableUtilities, state, framePublicAPI) || - []), - ].map((longMessage) => { - const message: UserMessage = { - severity: 'warning', - fixableInEditor: true, - displayLocations: [{ id: 'toolbar' }], - shortMessage: '', - longMessage, - }; + const timeShiftWarningMessages = getStateTimeShiftWarningMessages( + data.datatableUtilities, + state, + framePublicAPI + ); - return message; - }), - ...getPrecisionErrorWarningMessages( - data.datatableUtilities, - state, - framePublicAPI, - core.docLinks, - setState - ), - ...getUnsupportedOperationsWarningMessage(state, framePublicAPI, core.docLinks), - ]; + const precisionErrorWarningMsg = getPrecisionErrorWarningMessages( + data.datatableUtilities, + state, + framePublicAPI, + core.docLinks, + setState + ); + + const unsupportedOpsWarningMsg = getUnsupportedOperationsWarningMessage( + state, + framePublicAPI, + core.docLinks + ); const infoMessages = getNotifiableFeatures(state, framePublicAPI, visualizationInfo); - return layerErrorMessages.concat(dimensionErrorMessages, warningMessages, infoMessages); + return layerErrorMessages.concat( + dimensionErrorMessages, + timeShiftWarningMessages, + precisionErrorWarningMsg, + unsupportedOpsWarningMsg, + infoMessages + ); }, getSearchWarningMessages: (state, warning, request, response) => { - return [...getSearchWarningMessages(state, warning, request, response, core.theme)]; + return getSearchWarningMessages(state, warning, request, response, core.theme); }, checkIntegrity: (state, indexPatterns) => { @@ -916,7 +925,7 @@ function getLayerErrorMessages( setState: StateSetter, core: CoreStart, data: DataPublicPluginStart -) { +): UserMessage[] { const indexPatterns = framePublicAPI.dataViews.indexPatterns; const layerErrors: UserMessage[][] = Object.entries(state.layers) @@ -927,6 +936,7 @@ function getLayerErrorMessages( [] ).map((error) => { const message: UserMessage = { + uniqueId: typeof error === 'string' ? error : error.uniqueId, severity: 'error', fixableInEditor: true, displayLocations: @@ -1005,7 +1015,7 @@ function getLayerErrorMessages( function getInvalidDimensionErrorMessages( state: FormBasedPrivateState, currentErrorMessages: UserMessage[], - isValidColumn: (layerId: string, columnId: string) => boolean + isInvalidColumn: (layerId: string, columnId: string) => boolean ) { // generate messages for invalid columns const columnErrorMessages: UserMessage[] = Object.keys(state.layers) @@ -1022,8 +1032,9 @@ function getInvalidDimensionErrorMessages( continue; } - if (!isValidColumn(layerId, columnId)) { + if (isInvalidColumn(layerId, columnId)) { messages.push({ + uniqueId: EDITOR_INVALID_DIMENSION, severity: 'error', displayLocations: [{ id: 'dimensionButton', dimensionId: columnId }], fixableInEditor: true, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx index 93ab93de22f66..af563ccd4bef7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx @@ -129,7 +129,9 @@ export const counterRateOperation: OperationDefinition< } } - return checkForDateHistogram(layer, opName)?.join(', '); + return checkForDateHistogram(layer, opName) + .map((e) => e.message) + .join(', '); }, timeScalingMode: 'mandatory', filterable: true, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx index d7c13d43ba163..50bcd865b855d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx @@ -123,7 +123,9 @@ export const cumulativeSumOperation: OperationDefinition< return dataLayerErrors.join(', '); } } - return checkForDateHistogram(layer, opName)?.join(', '); + return checkForDateHistogram(layer, opName) + .map((e) => e.message) + .join(', '); }, filterable: true, quickFunctionDocumentation: i18n.translate( diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx index 59943a23ece5e..f91636471190e 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx @@ -107,7 +107,9 @@ export const derivativeOperation: OperationDefinition< return dataLayerErrors.join(', '); } } - return checkForDateHistogram(layer, opName)?.join(', '); + return checkForDateHistogram(layer, opName) + .map((e) => e.message) + .join(', '); }, timeScalingMode: 'optional', filterable: true, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx index a2689e7d2209c..4d0912fd96425 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx @@ -137,7 +137,9 @@ export const movingAverageOperation: OperationDefinition< return dataLayerErrors.join(', '); } } - return checkForDateHistogram(layer, opName)?.join(', '); + return checkForDateHistogram(layer, opName) + .map((e) => e.message) + .join(', '); }, timeScalingMode: 'optional', filterable: true, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx index 68c7f18483d12..df0e55ff40dfb 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx @@ -24,7 +24,7 @@ import type { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn, } from '../column_types'; -import { optionallHistogramBasedOperationToExpression } from './utils'; +import { optionalHistogramBasedOperationToExpression } from './utils'; import type { OperationDefinition } from '..'; import { getFormatFromPreviousColumn } from '../helpers'; @@ -79,7 +79,7 @@ function buildOverallMetricOperation { - return optionallHistogramBasedOperationToExpression(layer, columnId, 'overall_metric', { + return optionalHistogramBasedOperationToExpression(layer, columnId, 'overall_metric', { metric: [metric], }); }, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx index 3ccb3e0808129..c79d25d5cf17c 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx @@ -12,8 +12,8 @@ import type { ReferenceBasedIndexPatternColumn, } from '../column_types'; import { getErrorsForDateReference } from './utils'; -import type { OperationDefinition } from '..'; -import { combineErrorMessages, getFormatFromPreviousColumn } from '../helpers'; +import type { FieldBasedOperationErrorMessage, OperationDefinition } from '..'; +import { getFormatFromPreviousColumn } from '../helpers'; import { FormBasedLayer } from '../../../types'; export type TimeScaleIndexPatternColumn = FormattedIndexPatternColumn & @@ -90,26 +90,37 @@ export const timeScaleOperation: OperationDefinition { - return combineErrorMessages([ - getErrorsForDateReference(layer, columnId, NORMALIZE_BY_UNIT_NAME), - !(layer.columns[columnId] as TimeScaleIndexPatternColumn).params.unit - ? [ - i18n.translate('xpack.lens.indexPattern.timeScale.missingUnit', { - defaultMessage: 'No unit specified for normalize by unit.', - }), - ] - : [], + const errors: FieldBasedOperationErrorMessage[] = getErrorsForDateReference( + layer, + columnId, + NORMALIZE_BY_UNIT_NAME + ); + + if (!(layer.columns[columnId] as TimeScaleIndexPatternColumn).params.unit) { + errors.push({ + uniqueId: '', + message: i18n.translate('xpack.lens.indexPattern.timeScale.missingUnit', { + defaultMessage: 'No unit specified for normalize by unit.', + }), + }); + } + + if ( ['s', 'm', 'h', 'd'].indexOf( - (layer.columns[columnId] as TimeScaleIndexPatternColumn).params.unit || 's' + (layer.columns[columnId] as TimeScaleIndexPatternColumn).params.unit ?? 's' ) === -1 - ? [ - i18n.translate('xpack.lens.indexPattern.timeScale.wrongUnit', { - defaultMessage: 'Unknown unit specified: use s, m, h or d.', - }), - ] - : [], - ]); + ) { + errors.push({ + uniqueId: '', + message: i18n.translate('xpack.lens.indexPattern.timeScale.wrongUnit', { + defaultMessage: 'Unknown unit specified: use s, m, h or d.', + }), + }); + } + + return errors; }, + filterable: false, shiftable: false, }; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.test.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.test.ts index 1d27c0db935c8..a83013cac2aa7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.test.ts @@ -10,6 +10,10 @@ import { operationDefinitionMap } from '..'; import { createMockedFullReference } from '../../mocks'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { DateHistogramIndexPatternColumn } from '../date_histogram'; +import { + CALCULATIONS_MISSING_COLUMN_REFERENCE, + CALCULATIONS_WRONG_DIMENSION_CONFIG, +} from '../../../../../user_messages_ids'; // Mock prevents issue with circular loading jest.mock('..'); @@ -47,7 +51,12 @@ describe('utils', () => { }, 'ref' ) - ).toEqual(['"Label" is not fully configured']); + ).toEqual([ + { + uniqueId: CALCULATIONS_MISSING_COLUMN_REFERENCE, + message: '"Label" is not fully configured', + }, + ]); }); it('should show an error if the reference is not allowed per the requirements', () => { @@ -76,7 +85,12 @@ describe('utils', () => { }, 'ref' ) - ).toEqual(['Dimension "Label" is configured incorrectly']); + ).toEqual([ + { + uniqueId: CALCULATIONS_WRONG_DIMENSION_CONFIG, + message: 'Dimension "Label" is configured incorrectly', + }, + ]); }); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.ts index 99173e5064cb5..5a40b967e6c03 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/utils.ts @@ -16,9 +16,12 @@ import type { FormBasedLayer } from '../../../types'; import { adjustTimeScaleLabelSuffix } from '../../time_scale_utils'; import type { ReferenceBasedIndexPatternColumn } from '../column_types'; import { getManagedColumnsFrom, isColumnValidAsReference } from '../../layer_helpers'; -import { operationDefinitionMap } from '..'; -import { FieldBasedIndexPatternColumn } from '../../../types'; -import { IndexPatternField } from '../../../../../types'; +import { FieldBasedOperationErrorMessage, operationDefinitionMap } from '..'; +import { + CALCULATIONS_DATE_HISTOGRAM_REQUIRED, + CALCULATIONS_MISSING_COLUMN_REFERENCE, + CALCULATIONS_WRONG_DIMENSION_CONFIG, +} from '../../../../../user_messages_ids'; export const buildLabelFunction = (ofName: (name?: string) => string) => @@ -51,22 +54,28 @@ export function checkForDataLayerType(layerType: LayerType, name: string) { /** * Checks whether the current layer includes a date histogram and returns an error otherwise */ -export function checkForDateHistogram(layer: FormBasedLayer, name: string) { +export function checkForDateHistogram( + layer: FormBasedLayer, + name: string +): FieldBasedOperationErrorMessage[] { const buckets = layer.columnOrder.filter((colId) => layer.columns[colId].isBucketed); const hasDateHistogram = buckets.some( (colId) => layer.columns[colId].operationType === 'date_histogram' ); if (hasDateHistogram) { - return undefined; + return []; } return [ - i18n.translate('xpack.lens.indexPattern.calculations.dateHistogramErrorMessage', { - defaultMessage: - '{name} requires a date histogram to work. Add a date histogram or select a different function.', - values: { - name, - }, - }), + { + uniqueId: CALCULATIONS_DATE_HISTOGRAM_REQUIRED, + message: i18n.translate('xpack.lens.indexPattern.calculations.dateHistogramErrorMessage', { + defaultMessage: + '{name} requires a date histogram to work. Add a date histogram or select a different function.', + values: { + name, + }, + }), + }, ]; } @@ -87,21 +96,25 @@ const getFullyManagedColumnIds = memoizeOne((layer: FormBasedLayer) => { return managedColumnIds; }); -export function checkReferences(layer: FormBasedLayer, columnId: string) { +export function checkReferences( + layer: FormBasedLayer, + columnId: string +): FieldBasedOperationErrorMessage[] { const column = layer.columns[columnId] as ReferenceBasedIndexPatternColumn; - const errors: string[] = []; + const errors: FieldBasedOperationErrorMessage[] = []; column.references.forEach((referenceId, index) => { if (!layer.columns[referenceId]) { - errors.push( - i18n.translate('xpack.lens.indexPattern.missingReferenceError', { + errors.push({ + uniqueId: CALCULATIONS_MISSING_COLUMN_REFERENCE, + message: i18n.translate('xpack.lens.indexPattern.missingReferenceError', { defaultMessage: '"{dimensionLabel}" is not fully configured', values: { dimensionLabel: column.label, }, - }) - ); + }), + }); } else { const referenceColumn = layer.columns[referenceId]!; const definition = operationDefinitionMap[column.operationType]; @@ -116,27 +129,29 @@ export function checkReferences(layer: FormBasedLayer, columnId: string) { // do not enforce column validity if current column is part of managed subtree if (!isValid && !getFullyManagedColumnIds(layer).has(columnId)) { - errors.push( - i18n.translate('xpack.lens.indexPattern.invalidReferenceConfiguration', { + errors.push({ + uniqueId: CALCULATIONS_WRONG_DIMENSION_CONFIG, + message: i18n.translate('xpack.lens.indexPattern.invalidReferenceConfiguration', { defaultMessage: 'Dimension "{dimensionLabel}" is configured incorrectly', values: { dimensionLabel: column.label, }, - }) - ); + }), + }); } } }); - return errors.length ? errors : undefined; + return errors; } -export function getErrorsForDateReference(layer: FormBasedLayer, columnId: string, name: string) { - const dateErrors = checkForDateHistogram(layer, name) ?? []; - const referenceErrors = checkReferences(layer, columnId) ?? []; - if (dateErrors.length || referenceErrors.length) { - return [...dateErrors, ...referenceErrors]; - } - return; +export function getErrorsForDateReference( + layer: FormBasedLayer, + columnId: string, + name: string +): FieldBasedOperationErrorMessage[] { + const dateErrors = checkForDateHistogram(layer, name); + const referenceErrors = checkReferences(layer, columnId); + return dateErrors.concat(referenceErrors); } export function hasDateField(indexPattern: IndexPattern) { @@ -177,7 +192,7 @@ export function dateBasedOperationToExpression( /** * Creates an expression ast for a date based operation (cumulative sum, derivative, moving average, counter rate) */ -export function optionallHistogramBasedOperationToExpression( +export function optionalHistogramBasedOperationToExpression( layer: FormBasedLayer, columnId: string, functionName: string, @@ -205,45 +220,3 @@ export function optionallHistogramBasedOperationToExpression( }, ]; } - -function isMetricCounterField(field?: IndexPatternField) { - return field?.timeSeriesMetric === 'counter'; -} - -function checkReferencedColumnMetric( - layer: FormBasedLayer, - columnId: string, - indexPattern: IndexPattern -) { - const column = layer.columns[columnId] as ReferenceBasedIndexPatternColumn; - return column.references - .filter((referencedId) => 'sourceField' in layer.columns[referencedId]) - .map((referencedId) => { - const fieldName = (layer.columns[referencedId] as FieldBasedIndexPatternColumn).sourceField; - if (!isMetricCounterField(indexPattern.getFieldByName(fieldName))) { - return i18n.translate('xpack.lens.indexPattern.invalidReferenceConfiguration', { - defaultMessage: 'Dimension "{dimensionLabel}" is configured incorrectly', - values: { - dimensionLabel: layer.columns[referencedId].label, - }, - }); - } - }); -} - -export function getErrorForRateReference( - layer: FormBasedLayer, - columnId: string, - name: string, - indexPattern: IndexPattern -) { - const dateErrors = checkForDateHistogram(layer, name) ?? []; - const referenceErrors = checkReferences(layer, columnId) ?? []; - const metricCounterErrors = checkReferencedColumnMetric(layer, columnId, indexPattern) ?? []; - if (metricCounterErrors.length) { - return metricCounterErrors.concat(referenceErrors); - } - if (dateErrors.length) { - return dateErrors.concat(referenceErrors); - } -} diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/cardinality.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/cardinality.tsx index 028f8016d4067..14ae32b0bf595 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/cardinality.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/cardinality.tsx @@ -20,7 +20,6 @@ import { getInvalidFieldMessage, getSafeName, getFilter, - combineErrorMessages, isColumnOfType, } from './helpers'; import { adjustTimeScaleLabelSuffix } from '../time_scale_utils'; @@ -93,11 +92,10 @@ export const cardinalityOperation: OperationDefinition< return { dataType: 'number', isBucketed: IS_BUCKETED, scale: SCALE }; } }, - getErrorMessage: (layer, columnId, indexPattern) => - combineErrorMessages([ - getInvalidFieldMessage(layer, columnId, indexPattern), - getColumnReducedTimeRangeError(layer, columnId, indexPattern), - ]), + getErrorMessage: (layer, columnId, indexPattern) => [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), + ], isTransferable: (column, newIndexPattern) => { const newField = newIndexPattern.getFieldByName(column.sourceField); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx index 94b1b36193aed..c53fbc28b7887 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx @@ -19,7 +19,6 @@ import type { IndexPatternField } from '../../../../types'; import { getInvalidFieldMessage, getFilter, - combineErrorMessages, getFormatFromPreviousColumn, isColumnOfType, } from './helpers'; @@ -87,11 +86,11 @@ export const countOperation: OperationDefinition - combineErrorMessages([ - getInvalidFieldMessage(layer, columnId, indexPattern), - getColumnReducedTimeRangeError(layer, columnId, indexPattern), - ]), + getErrorMessage: (layer, columnId, indexPattern) => [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), + ], + allowAsReference: true, onFieldChange: (oldColumn, field) => { return { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx index 0d6556344a710..cedf2f976b2cb 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx @@ -31,10 +31,11 @@ import { extendedBoundsToAst, intervalOptions } from '@kbn/data-plugin/common'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; import { TooltipWrapper } from '@kbn/visualization-utils'; import { updateColumnParam } from '../layer_helpers'; -import { OperationDefinition, ParamEditorProps } from '.'; +import { FieldBasedOperationErrorMessage, OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn } from './column_types'; import { getInvalidFieldMessage, getSafeName } from './helpers'; import { FormBasedLayer } from '../../types'; +import { TIME_SHIFT_MULTIPLE_DATE_HISTOGRAMS } from '../../../../user_messages_ids'; const { isValidInterval } = search.aggs; const autoInterval = 'auto'; @@ -50,26 +51,34 @@ export interface DateHistogramIndexPatternColumn extends FieldBasedIndexPatternC }; } -function getMultipleDateHistogramsErrorMessage(layer: FormBasedLayer, columnId: string) { +function getMultipleDateHistogramsErrorMessage( + layer: FormBasedLayer, + columnId: string +): FieldBasedOperationErrorMessage[] { const usesTimeShift = Object.values(layer.columns).some( (col) => col.timeShift && col.timeShift !== '' ); if (!usesTimeShift) { - return undefined; + return []; } const dateHistograms = layer.columnOrder.filter( (colId) => layer.columns[colId].operationType === 'date_histogram' ); if (dateHistograms.length < 2) { - return undefined; + return []; } - return i18n.translate('xpack.lens.indexPattern.multipleDateHistogramsError', { - defaultMessage: - '"{dimensionLabel}" is not the only date histogram. When using time shifts, make sure to only use one date histogram.', - values: { - dimensionLabel: layer.columns[columnId].label, + return [ + { + uniqueId: TIME_SHIFT_MULTIPLE_DATE_HISTOGRAMS, + message: i18n.translate('xpack.lens.indexPattern.multipleDateHistogramsError', { + defaultMessage: + '"{dimensionLabel}" is not the only date histogram. When using time shifts, make sure to only use one date histogram.', + values: { + dimensionLabel: layer.columns[columnId].label, + }, + }), }, - }); + ]; } export const dateHistogramOperation: OperationDefinition< @@ -84,11 +93,10 @@ export const dateHistogramOperation: OperationDefinition< input: 'field', priority: 5, // Highest priority level used operationParams: [{ name: 'interval', type: 'string', required: false }], - getErrorMessage: (layer, columnId, indexPattern) => - [ - ...(getInvalidFieldMessage(layer, columnId, indexPattern) || []), - getMultipleDateHistogramsErrorMessage(layer, columnId) || '', - ].filter(Boolean), + getErrorMessage: (layer, columnId, indexPattern) => [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getMultipleDateHistogramsErrorMessage(layer, columnId), + ], getPossibleOperationForField: ({ aggregationRestrictions, aggregatable, type }) => { if ( (type === 'date' || type === 'date_range') && diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/__snapshots__/formula.test.tsx.snap b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/__snapshots__/formula.test.tsx.snap index 1eabd45dc86b6..310101aec67f8 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/__snapshots__/formula.test.tsx.snap +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/__snapshots__/formula.test.tsx.snap @@ -32,6 +32,7 @@ Array [ } } />, + "uniqueId": "field_not_found", }, ] `; @@ -68,6 +69,7 @@ Array [ } } />, + "uniqueId": "field_not_found", }, ] `; @@ -104,6 +106,7 @@ Array [ } } />, + "uniqueId": "field_not_found", }, ] `; @@ -140,6 +143,7 @@ Array [ } } />, + "uniqueId": "field_not_found", }, ] `; @@ -182,6 +186,7 @@ Array [ } } />, + "uniqueId": "field_not_found", }, ] `; @@ -224,6 +229,7 @@ Array [ } } />, + "uniqueId": "field_not_found", }, ] `; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.test.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.test.ts index db38e18d3bd19..f6278ed8a69f7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.test.ts @@ -6,6 +6,13 @@ */ import type { FormBasedLayer } from '../../../../..'; +import { + INTERVAL_OP_MISSING_DATE_HISTOGRAM_TO_COMPUTE_INTERVAL, + INTERVAL_OP_MISSING_TIME_RANGE, + INTERVAL_OP_MISSING_UI_SETTINGS_HISTOGRAM_BAR_TARGET, + TIMERANGE_OP_DATAVIEW_NOT_TIME_BASED, + TIMERANGE_OP_MISSING_TIME_RANGE, +} from '../../../../../user_messages_ids'; import { createMockedIndexPattern } from '../../../mocks'; import { DateHistogramIndexPatternColumn } from '../date_histogram'; import { @@ -49,7 +56,10 @@ describe('context variables', () => { ) ).toEqual( expect.arrayContaining([ - 'Cannot compute an interval without a date histogram column configured', + { + uniqueId: INTERVAL_OP_MISSING_DATE_HISTOGRAM_TO_COMPUTE_INTERVAL, + message: 'Cannot compute an interval without a date histogram column configured', + }, ]) ); }); @@ -64,7 +74,14 @@ describe('context variables', () => { {}, 100 ) - ).toEqual(expect.arrayContaining(['The current time range interval is not available'])); + ).toEqual( + expect.arrayContaining([ + { + uniqueId: INTERVAL_OP_MISSING_TIME_RANGE, + message: 'The current time range interval is not available', + }, + ]) + ); }); it('should return error if no targetBar is passed over', () => { @@ -76,7 +93,14 @@ describe('context variables', () => { { fromDate: new Date().toISOString(), toDate: new Date().toISOString() }, {} ) - ).toEqual(expect.arrayContaining(['Missing "histogram:barTarget" value'])); + ).toEqual( + expect.arrayContaining([ + { + uniqueId: INTERVAL_OP_MISSING_UI_SETTINGS_HISTOGRAM_BAR_TARGET, + message: 'Missing "histogram:barTarget" value', + }, + ]) + ); }); it('should not return errors if all context is provided', () => { @@ -107,7 +131,7 @@ describe('context variables', () => { {}, 100 ) - ).toBeUndefined(); + ).toHaveLength(0); }); }); }); @@ -123,7 +147,14 @@ describe('context variables', () => { {}, 100 ) - ).toEqual(expect.arrayContaining(['The current time range interval is not available'])); + ).toEqual( + expect.arrayContaining([ + { + message: 'The current time range interval is not available', + uniqueId: TIMERANGE_OP_MISSING_TIME_RANGE, + }, + ]) + ); }); it('should return error if dataView is not time-based', () => { @@ -138,7 +169,14 @@ describe('context variables', () => { {}, 100 ) - ).toEqual(expect.arrayContaining(['The current time range interval is not available'])); + ).toEqual( + expect.arrayContaining([ + { + message: 'The current dataView is not time based', + uniqueId: TIMERANGE_OP_DATAVIEW_NOT_TIME_BASED, + }, + ]) + ); }); }); }); @@ -147,7 +185,7 @@ describe('context variables', () => { it('should return no error even without context', () => { expect( nowOperation.getErrorMessage!(createLayer('now'), 'col1', createMockedIndexPattern()) - ).toBeUndefined(); + ).toHaveLength(0); }); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.tsx index 1509940486379..3bb1935e24223 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/context_variables.tsx @@ -24,9 +24,20 @@ import type { GenericIndexPatternColumn, } from '../../../../..'; import type { DateRange } from '../../../../../../common/types'; -import type { GenericOperationDefinition, OperationDefinition } from '..'; +import type { + FieldBasedOperationErrorMessage, + GenericOperationDefinition, + OperationDefinition, +} from '..'; import type { ReferenceBasedIndexPatternColumn } from '../column_types'; import { IndexPattern } from '../../../../../types'; +import { + INTERVAL_OP_MISSING_DATE_HISTOGRAM_TO_COMPUTE_INTERVAL, + INTERVAL_OP_MISSING_TIME_RANGE, + INTERVAL_OP_MISSING_UI_SETTINGS_HISTOGRAM_BAR_TARGET, + TIMERANGE_OP_DATAVIEW_NOT_TIME_BASED, + TIMERANGE_OP_MISSING_TIME_RANGE, +} from '../../../../../user_messages_ids'; // copied over from layer_helpers // TODO: split layer_helpers util into pure/non-pure functions to avoid issues with tests @@ -72,23 +83,25 @@ function getTimeRangeErrorMessages( _columnId: string, indexPattern: IndexPattern, dateRange?: DateRange | undefined -) { - const errors = []; +): FieldBasedOperationErrorMessage[] { + const errors: FieldBasedOperationErrorMessage[] = []; if (!indexPattern.timeFieldName) { - errors.push( - i18n.translate('xpack.lens.indexPattern.dateRange.dataViewNoTimeBased', { + errors.push({ + uniqueId: TIMERANGE_OP_DATAVIEW_NOT_TIME_BASED, + message: i18n.translate('xpack.lens.indexPattern.dateRange.dataViewNoTimeBased', { defaultMessage: 'The current dataView is not time based', - }) - ); + }), + }); } if (!dateRange) { - errors.push( - i18n.translate('xpack.lens.indexPattern.dateRange.noTimeRange', { + errors.push({ + uniqueId: TIMERANGE_OP_MISSING_TIME_RANGE, + message: i18n.translate('xpack.lens.indexPattern.dateRange.noTimeRange', { defaultMessage: 'The current time range interval is not available', - }) - ); + }), + }); } - return errors.length ? errors : undefined; + return errors; } export const timeRangeOperation = createContextValueBasedOperation({ @@ -107,7 +120,7 @@ export interface NowIndexPatternColumn extends ReferenceBasedIndexPatternColumn } function getNowErrorMessage() { - return undefined; + return []; } export const nowOperation = createContextValueBasedOperation({ @@ -132,37 +145,40 @@ function getIntervalErrorMessages( dateRange?: DateRange | undefined, operationDefinitionMap?: Record | undefined, targetBars?: number -) { - const errors = []; +): FieldBasedOperationErrorMessage[] { + const errors: FieldBasedOperationErrorMessage[] = []; if (!targetBars) { - errors.push( - i18n.translate('xpack.lens.indexPattern.interval.noTargetBars', { + errors.push({ + uniqueId: INTERVAL_OP_MISSING_UI_SETTINGS_HISTOGRAM_BAR_TARGET, + message: i18n.translate('xpack.lens.indexPattern.interval.noTargetBars', { defaultMessage: `Missing "{uiSettingVar}" value`, values: { uiSettingVar: UI_SETTINGS.HISTOGRAM_BAR_TARGET, }, - }) - ); + }), + }); } if (!dateRange) { - errors.push( - i18n.translate('xpack.lens.indexPattern.interval.noTimeRange', { + errors.push({ + uniqueId: INTERVAL_OP_MISSING_TIME_RANGE, + message: i18n.translate('xpack.lens.indexPattern.interval.noTimeRange', { defaultMessage: 'The current time range interval is not available', - }) - ); + }), + }); } if ( !Object.values(layer.columns).some((column) => isColumnOfType('date_histogram', column) ) ) { - errors.push( - i18n.translate('xpack.lens.indexPattern.interval.noDateHistogramColumn', { + errors.push({ + uniqueId: INTERVAL_OP_MISSING_DATE_HISTOGRAM_TO_COMPUTE_INTERVAL, + message: i18n.translate('xpack.lens.indexPattern.interval.noDateHistogramColumn', { defaultMessage: 'Cannot compute an interval without a date histogram column configured', - }) - ); + }), + }); } - return errors.length ? errors : undefined; + return errors; } export const intervalOperation = createContextValueBasedOperation({ diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_editor.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_editor.tsx index e182a3a84b979..011b824fd1766 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_editor.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/formula_editor.tsx @@ -232,12 +232,12 @@ export function FormulaEditor({ let errors: ErrorWrapper[] = []; - const { root, error } = tryToParse(text, visibleOperationsMap); - if (error) { - errors = [error]; - } else if (root) { + const parseResponse = tryToParse(text, visibleOperationsMap); + if ('error' in parseResponse) { + errors = [parseResponse.error]; + } else { const validationErrors = runASTValidation( - root, + parseResponse.root, layer, indexPattern, visibleOperationsMap, @@ -359,11 +359,11 @@ export function FormulaEditor({ visibleOperationsMap, uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET) ); - if (messages) { + if (messages.length) { const startPosition = offsetToRowColumn(text, locations[id].min); const endPosition = offsetToRowColumn(text, locations[id].max); newWarnings.push({ - message: messages.join(', '), + message: messages.map((e) => e.message).join(', '), startColumn: startPosition.column + 1, startLineNumber: startPosition.lineNumber, endColumn: endPosition.column + 1, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx index 26703a2eebbf3..85e15d5c4446a 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx @@ -21,6 +21,7 @@ import type { MovingAverageIndexPatternColumn } from '../calculations'; import { StaticValueIndexPatternColumn } from '../static_value'; import { getFilter } from '../helpers'; import { createOperationDefinitionMock } from './mocks/operation_mocks'; +import { FORMULA_LAYER_ONLY_STATIC_VALUES } from '../../../../../user_messages_ids'; jest.mock('../../layer_helpers', () => { return { @@ -62,7 +63,7 @@ const operationDefinitionMap: Record = { input: 'fullReference', operationParams: [{ name: 'window', type: 'number', required: true }], filterable: true, - getErrorMessage: jest.fn(() => ['mock error']), + getErrorMessage: jest.fn(() => []), buildColumn: ({ referenceIds }, columnsParams) => ({ label: 'moving_average', dataType: 'number', @@ -1044,7 +1045,7 @@ describe('[Lens] formula', () => { indexPattern = createMockedIndexPattern(); }); - it('returns undefined if count is passed without arguments', () => { + it('returns empty array if count is passed without arguments', () => { expect( formulaOperation.getErrorMessage!( getNewLayerWithFormula('count()'), @@ -1053,10 +1054,10 @@ describe('[Lens] formula', () => { undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); }); - it('returns undefined if count is passed with only a named argument', () => { + it('returns empty array if count is passed with only a named argument', () => { expect( formulaOperation.getErrorMessage!( getNewLayerWithFormula(`count(kql='*')`, false), @@ -1064,8 +1065,8 @@ describe('[Lens] formula', () => { indexPattern, undefined, operationDefinitionMap - ) - ).toEqual(undefined); + ).map((e) => e.message) + ).toHaveLength(0); }); it('returns a syntax error if the kql argument does not parse', () => { @@ -1076,7 +1077,7 @@ describe('[Lens] formula', () => { indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ `Expected "(", "{", value, whitespace but """ found. invalid: " @@ -1084,7 +1085,7 @@ invalid: " ]); }); - it('returns undefined if a field operation is passed with the correct first argument', () => { + it('returns empty array if a field operation is passed with the correct first argument', () => { expect( formulaOperation.getErrorMessage!( getNewLayerWithFormula('average(bytes)'), @@ -1093,7 +1094,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); // note that field names can be wrapped in quotes as well expect( formulaOperation.getErrorMessage!( @@ -1103,10 +1104,10 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); }); - it('returns undefined if a fullReference operation is passed with the correct first argument', () => { + it('returns empty array if a fullReference operation is passed with the correct first argument', () => { expect( formulaOperation.getErrorMessage!( getNewLayerWithFormula('derivative(average(bytes))'), @@ -1115,7 +1116,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); expect( formulaOperation.getErrorMessage!( @@ -1125,10 +1126,10 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); }); - it('returns undefined if a fullReference operation is passed with the arguments', () => { + it('returns empty array if a fullReference operation is passed with the arguments', () => { expect( formulaOperation.getErrorMessage!( getNewLayerWithFormula('moving_average(average(bytes), window=7)'), @@ -1137,7 +1138,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); }); it('returns an error if field is used with no Lens wrapping operation', () => { @@ -1148,7 +1149,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The field bytes cannot be used without operation`]); expect( @@ -1158,7 +1159,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The operation add does not accept any field as argument`]); }); @@ -1180,7 +1181,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The Formula ${formula} cannot be parsed`]); } }); @@ -1233,7 +1234,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['Operation noFn not found']); } @@ -1247,7 +1248,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['Operations noFn, noFnTwo not found']); } }); @@ -1263,7 +1264,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['Operation formula not found']); } @@ -1277,7 +1278,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['Operation math not found']); } }); @@ -1301,7 +1302,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual( // some formulas may contain more errors expect.arrayContaining([ @@ -1321,8 +1322,8 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) - ).toEqual(undefined); + ).map((e) => e.message) + ).toHaveLength(0); }); it('returns an error if an operation with required parameters does not receive them', () => { @@ -1333,7 +1334,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ 'The operation moving_average in the Formula is missing the following parameters: window', ]); @@ -1345,7 +1346,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ 'The operation moving_average in the Formula is missing the following parameters: window', ]); @@ -1359,7 +1360,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['The operation average does not accept any parameter']); }); @@ -1380,7 +1381,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual( expect.arrayContaining([ expect.stringMatching( @@ -1411,7 +1412,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual( expect.arrayContaining([ expect.stringMatching( @@ -1430,7 +1431,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ 'The parameters for the operation moving_average in the Formula are of the wrong type: window', ]); @@ -1451,7 +1452,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); }); it('returns no error for a query edge case', () => { @@ -1472,11 +1473,11 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); } }); - it('returns an error for a query not wrapped in single quotes', () => { + it('returns an error for a query not wrapped in single quotes: %s', () => { const formulas = [ `count(kql="")`, `count(kql='")`, @@ -1510,7 +1511,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(expect.arrayContaining([expect.stringMatching(`Single quotes are required`)])); } }); @@ -1541,7 +1542,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The Formula ${formula} cannot be parsed`]); } }); @@ -1560,8 +1561,8 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) - ).toEqual(undefined); + ).map((e) => e.message) + ).toHaveLength(0); } }); @@ -1573,7 +1574,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['Use only one of kql= or lucene=, not both']); }); @@ -1586,7 +1587,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The first argument for ${fn} should be a field name. Found no field`]); } expect( @@ -1596,7 +1597,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The first argument for sum should be a field name. Found category.keyword: *`]); }); @@ -1609,7 +1610,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([`The first argument for ${fn} should be a operation name. Found no operation`]); } }); @@ -1642,6 +1643,7 @@ invalid: " ) ).toEqual([ { + uniqueId: FORMULA_LAYER_ONLY_STATIC_VALUES, message: 'A layer with only static values will not show results, use at least one dynamic metric', }, @@ -1657,7 +1659,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); }); it('returns no error if the formula contains comparison operator within the ifelse operation', () => { @@ -1674,7 +1676,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); } }); @@ -1693,7 +1695,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); } }); @@ -1712,7 +1714,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); } }); @@ -1734,7 +1736,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ `The return value type of the operation ${ errorFormula ?? formula @@ -1808,7 +1810,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toContain(errors[i](fn)); }); }); @@ -1829,7 +1831,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ `The return value type of the operation ${formula} is not supported in Formula`, `The operation ${fn} in the Formula is missing ${expectedCount} arguments: ${expectedArgs}`, @@ -1874,7 +1876,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual( indexReverseMap[expectedFail].map((i) => { const arg = tinymathFunctions[fn].positionalArguments[i]; @@ -1901,7 +1903,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([errorsWithSuggestions[i]]); }); }); @@ -1930,7 +1932,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ `The Formula filter of type "lucene" is not compatible with the inner filter of type "kql" from the ${operation} operation`, ]); @@ -1951,7 +1953,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual([ `The Formula filter of type "lucene" is not compatible with the inner filter of type "kql" from the count operation`, `The Formula filter of type "lucene" is not compatible with the inner filter of type "kql" from the sum operation`, @@ -1977,7 +1979,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); } }); @@ -2002,7 +2004,7 @@ invalid: " undefined, operationDefinitionMap ) - ).toEqual(undefined); + ).toHaveLength(0); expect( formulaOperation.getErrorMessage!( @@ -2011,7 +2013,7 @@ invalid: " indexPattern, undefined, operationDefinitionMap - ) + ).map((e) => e.message) ).toEqual(['Operation operation_not_available not found']); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.tsx index ee415ba9304b3..3f5329a2722d2 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.tsx @@ -7,7 +7,6 @@ import { i18n } from '@kbn/i18n'; import { uniqBy } from 'lodash'; -import { nonNullable } from '../../../../../utils'; import type { BaseIndexPatternColumn, FieldBasedOperationErrorMessage, @@ -22,6 +21,7 @@ import { generateFormula } from './generate'; import { filterByVisibleOperation } from './util'; import { getManagedColumnsFrom } from '../../layer_helpers'; import { generateMissingFieldMessage, getFilter, isColumnFormatted } from '../helpers'; +import { FORMULA_LAYER_ONLY_STATIC_VALUES } from '../../../../../user_messages_ids'; const defaultLabel = i18n.translate('xpack.lens.indexPattern.formulaLabel', { defaultMessage: 'Formula', @@ -71,17 +71,17 @@ export const formulaOperation: OperationDefinition message).map(({ type, message, extraInfo }) => - type === 'missingField' && extraInfo?.missingFields - ? generateMissingFieldMessage(extraInfo.missingFields, columnId) - : message + return uniqBy(errors, ({ message }) => message).map(({ id, message, meta }) => + id === 'missingField' && meta.fieldList.length > 0 + ? generateMissingFieldMessage(meta.fieldList, columnId) // TODO: add missing field List + : { + uniqueId: id, + message, + } ); } @@ -103,21 +106,18 @@ export const formulaOperation: OperationDefinition { const def = visibleOperationsMap[col.operationType]; - if (def?.getErrorMessage) { - // TOOD: it would be nice to have nicer column names here rather than `Part of ` - const messages = def.getErrorMessage( + // TOOD: it would be nice to have nicer column names here rather than `Part of ` + return ( + def?.getErrorMessage?.( layer, id, indexPattern, dateRange, visibleOperationsMap, targetBars - ); - return messages || []; - } - return []; + ) ?? [] + ); }) - .filter(nonNullable) // dedup messages with the same content .reduce((memo, message) => { memo.add(message); @@ -142,6 +142,7 @@ export const formulaOperation: OperationDefinition = ValidationErrors[K]['type']; - -export interface ErrorWrapper { - type?: ErrorTypes; // TODO - make this required? +export type ErrorWrapper = ValidationErrors & { message: string; locations: TinymathLocation[]; severity?: 'error' | 'warning'; - extraInfo?: { missingFields: string[] }; -} +}; const DEFAULT_RETURN_TYPE = getTypeI18n('number'); @@ -172,7 +94,10 @@ export function hasInvalidOperations( }; } -export const getRawQueryValidationError = (text: string, operations: Record) => { +export const getRawQueryValidationError = ( + text: string, + operations: Record +): (InvalidQueryError & { message: string }) | undefined => { // try to extract the query context here const singleLine = text.split('\n').join(''); const languagesRegexp = /(kql|lucene)/; @@ -183,7 +108,7 @@ export const getRawQueryValidationError = (text: string, operations: Record languagesRegexp.test(subArg)) ); const [kqlQueries, luceneQueries] = partition(flattenArgs, (arg) => /kql/.test(arg)); - const errors = []; for (const kqlQuery of kqlQueries) { - const result = validateQueryQuotes(kqlQuery, 'kql'); - if (result) { - errors.push(result); + const message = validateQueryQuotes(kqlQuery, 'kql'); + if (message) { + return { + id: 'invalidQuery', + meta: { + language: 'kql', + }, + message, + }; } } for (const luceneQuery of luceneQueries) { - const result = validateQueryQuotes(luceneQuery, 'lucene'); - if (result) { - errors.push(result); + const message = validateQueryQuotes(luceneQuery, 'lucene'); + if (message) { + return { + id: 'invalidQuery', + meta: { + language: 'lucene', + }, + message, + }; } } - return errors.length ? errors : undefined; }; const validateQueryQuotes = (rawQuery: string, language: 'kql' | 'lucene') => { @@ -233,8 +168,11 @@ export const getQueryValidationError = ( { value: query, name: language, text }: TinymathNamedArgument, indexPattern: IndexPattern ): string | undefined => { + if (language !== 'kql' && language !== 'lucene') { + return; + } // check if the raw argument has the minimal requirements - const result = validateQueryQuotes(text, language as 'kql' | 'lucene'); + const result = validateQueryQuotes(text, language); // forward the error here is ok? if (result) { return result; @@ -251,172 +189,309 @@ export const getQueryValidationError = ( } }; -function getMessageFromId({ - messageId, - values, - locations, -}: { - messageId: K; - values: ErrorValues; - locations: TinymathLocation[]; -}): ErrorWrapper { - let message: string; - // Use a less strict type instead of doing a typecast on each message type - const out = values as unknown as Record; - switch (messageId) { +function getMessageFromId( + { id, meta }: ValidationErrors, + locations: TinymathLocation[] +): ErrorWrapper { + switch (id) { + case 'invalidQuery': + return { + id, + meta, + locations, + // this is just a placeholder because the actual message comes from the query validator + message: i18n.translate('xpack.lens.indexPattern.invalidQuery', { + defaultMessage: 'Invalid {language} query, please check the syntax and retry', + values: { language: meta.language }, + }), + }; case 'wrongFirstArgument': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationWrongFirstArgument', { - defaultMessage: - 'The first argument for {operation} should be a {type} name. Found {argument}', - values: { operation: out.operation, type: out.type, argument: out.argument }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationWrongFirstArgument', { + defaultMessage: + 'The first argument for {operation} should be a {type} name. Found {argument}', + values: { operation: meta.operation, type: meta.type, argument: meta.argument }, + }), + }; case 'shouldNotHaveField': - message = i18n.translate('xpack.lens.indexPattern.formulaFieldNotRequired', { - defaultMessage: 'The operation {operation} does not accept any field as argument', - values: { operation: out.operation }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaFieldNotRequired', { + defaultMessage: 'The operation {operation} does not accept any field as argument', + values: { operation: meta.operation }, + }), + }; case 'cannotAcceptParameter': - message = i18n.translate('xpack.lens.indexPattern.formulaParameterNotRequired', { - defaultMessage: 'The operation {operation} does not accept any parameter', - values: { operation: out.operation }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaParameterNotRequired', { + defaultMessage: 'The operation {operation} does not accept any parameter', + values: { operation: meta.operation }, + }), + }; case 'missingParameter': - message = i18n.translate('xpack.lens.indexPattern.formulaExpressionNotHandled', { - defaultMessage: - 'The operation {operation} in the Formula is missing the following parameters: {params}', - values: { operation: out.operation, params: out.params }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaExpressionNotHandled', { + defaultMessage: + 'The operation {operation} in the Formula is missing the following parameters: {params}', + values: { operation: meta.operation, params: meta.params }, + }), + }; case 'wrongTypeParameter': - message = i18n.translate('xpack.lens.indexPattern.formulaExpressionWrongType', { - defaultMessage: - 'The parameters for the operation {operation} in the Formula are of the wrong type: {params}', - values: { operation: out.operation, params: out.params }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaExpressionWrongType', { + defaultMessage: + 'The parameters for the operation {operation} in the Formula are of the wrong type: {params}', + values: { operation: meta.operation, params: meta.params }, + }), + }; case 'wrongTypeArgument': - message = i18n.translate('xpack.lens.indexPattern.formulaExpressionWrongTypeArgument', { - defaultMessage: - 'The {name} argument for the operation {operation} in the Formula is of the wrong type: {type} instead of {expectedType}', - values: { - operation: out.operation, - name: out.name, - type: out.type, - expectedType: out.expectedType, - }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaExpressionWrongTypeArgument', { + defaultMessage: + 'The {name} argument for the operation {operation} in the Formula is of the wrong type: {type} instead of {expectedType}', + values: { + operation: meta.operation, + name: meta.name, + type: meta.type, + expectedType: meta.expectedType, + }, + }), + }; case 'duplicateArgument': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationDuplicateParams', { - defaultMessage: - 'The parameters for the operation {operation} have been declared multiple times: {params}', - values: { operation: out.operation, params: out.params }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationDuplicateParams', { + defaultMessage: + 'The parameters for the operation {operation} have been declared multiple times: {params}', + values: { operation: meta.operation, params: meta.params }, + }), + }; case 'missingField': - message = i18n.translate('xpack.lens.indexPattern.formulaFieldNotFound', { - defaultMessage: - '{variablesLength, plural, one {Field} other {Fields}} {variablesList} not found', - values: { variablesLength: out.variablesLength, variablesList: out.variablesList }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaFieldNotFound', { + defaultMessage: + '{missingFieldCount, plural, one {Field} other {Fields}} {missingFieldList} not found', + values: { + missingFieldCount: meta.fieldList.length, + missingFieldList: meta.fieldList.join(', '), + }, + }), + }; case 'missingOperation': - message = i18n.translate('xpack.lens.indexPattern.operationsNotFound', { - defaultMessage: - '{operationLength, plural, one {Operation} other {Operations}} {operationsList} not found', - values: { operationLength: out.operationLength, operationsList: out.operationsList }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.operationsNotFound', { + defaultMessage: + '{operationLength, plural, one {Operation} other {Operations}} {operationsList} not found', + values: { operationLength: meta.operationLength, operationsList: meta.operationsList }, + }), + }; case 'fieldWithNoOperation': - message = i18n.translate('xpack.lens.indexPattern.fieldNoOperation', { - defaultMessage: 'The field {field} cannot be used without operation', - values: { field: out.field }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.fieldNoOperation', { + defaultMessage: 'The field {field} cannot be used without operation', + values: { field: meta.field }, + }), + }; case 'failedParsing': - message = i18n.translate('xpack.lens.indexPattern.formulaExpressionParseError', { - defaultMessage: 'The Formula {expression} cannot be parsed', - values: { expression: out.expression }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaExpressionParseError', { + defaultMessage: 'The Formula {expression} cannot be parsed', + values: { expression: meta.expression }, + }), + }; case 'tooManyArguments': - message = i18n.translate('xpack.lens.indexPattern.formulaWithTooManyArguments', { - defaultMessage: 'The operation {operation} has too many arguments', - values: { operation: out.operation }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaWithTooManyArguments', { + defaultMessage: 'The operation {operation} has too many arguments', + values: { operation: meta.operation }, + }), + }; case 'missingMathArgument': - message = i18n.translate('xpack.lens.indexPattern.formulaMathMissingArgument', { - defaultMessage: - 'The operation {operation} in the Formula is missing {count} arguments: {params}', - values: { operation: out.operation, count: out.count, params: out.params }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaMathMissingArgument', { + defaultMessage: + 'The operation {operation} in the Formula is missing {count} arguments: {params}', + values: { operation: meta.operation, count: meta.count, params: meta.params }, + }), + }; case 'tooManyQueries': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationDoubleQueryError', { - defaultMessage: 'Use only one of kql= or lucene=, not both', - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationDoubleQueryError', { + defaultMessage: 'Use only one of kql= or lucene=, not both', + }), + }; case 'tooManyFirstArguments': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationTooManyFirstArguments', { - defaultMessage: - 'The operation {operation} in the Formula requires a {supported, plural, one {single} other {supported}} {type}, found: {text}', - values: { - operation: out.operation, - text: out.text, - type: out.type, - supported: out.supported || 1, - }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationTooManyFirstArguments', { + defaultMessage: + 'The operation {operation} in the Formula requires a {supported, plural, one {single} other {supported}} {type}, found: {text}', + values: { + operation: meta.operation, + text: meta.text, + type: meta.type, + supported: meta.supported || 1, + }, + }), + }; case 'wrongArgument': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationwrongArgument', { - defaultMessage: - 'The operation {operation} in the Formula does not support {type} parameters, found: {text}', - values: { operation: out.operation, text: out.text, type: out.type }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationwrongArgument', { + defaultMessage: + 'The operation {operation} in the Formula does not support {type} parameters, found: {text}', + values: { operation: meta.operation, text: meta.text, type: meta.type }, + }), + }; case 'wrongReturnedType': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationWrongReturnedType', { - defaultMessage: 'The return value type of the operation {text} is not supported in Formula', - values: { text: out.text }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationWrongReturnedType', { + defaultMessage: + 'The return value type of the operation {text} is not supported in Formula', + values: { text: meta.text }, + }), + }; case 'filtersTypeConflict': - message = i18n.translate('xpack.lens.indexPattern.formulaOperationFiltersTypeConflicts', { - defaultMessage: - 'The Formula filter of type "{outerType}" is not compatible with the inner filter of type "{innerType}" from the {operation} operation', - values: { operation: out.operation, outerType: out.outerType, innerType: out.innerType }, - }); - break; + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaOperationFiltersTypeConflicts', { + defaultMessage: + 'The Formula filter of type "{outerType}" is not compatible with the inner filter of type "{innerType}" from the {operation} operation', + values: { + operation: meta.operation, + outerType: meta.outerType, + innerType: meta.innerType, + }, + }), + }; case 'useAlternativeFunction': - message = i18n.translate('xpack.lens.indexPattern.formulaUseAlternative', { - defaultMessage: `The operation {operation} in the Formula is missing the {params} argument: use the {alternativeFn} operation instead`, - values: { operation: out.operation, params: out.params, alternativeFn: out.alternativeFn }, - }); - break; - // case 'mathRequiresFunction': - // message = i18n.translate('xpack.lens.indexPattern.formulaMathRequiresFunctionLabel', { - // defaultMessage; 'The function {name} requires an Elasticsearch function', - // values: { ...values }, - // }); - // break; - default: - message = 'no Error found'; - break; - } + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.formulaUseAlternative', { + defaultMessage: `The operation {operation} in the Formula is missing the {params} argument: use the {alternativeFn} operation instead`, + values: { + operation: meta.operation, + params: meta.params, + alternativeFn: meta.alternativeFn, + }, + }), + }; + case REASON_IDS.missingTimerange: + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.absoluteMissingTimeRange', { + defaultMessage: 'Invalid time shift. No time range found as reference', + }), + }; + case REASON_IDS.invalidDate: + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.absoluteInvalidDate', { + defaultMessage: 'Invalid time shift. The date is not of the correct format', + }), + }; + case REASON_IDS.shiftAfterTimeRange: + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.absoluteAfterTimeRange', { + defaultMessage: 'Invalid time shift. The provided date is after the current time range', + }), + }; - return { type: messageId, message, locations }; + case REASON_IDS.notAbsoluteTimeShift: + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.notAbsoluteTimeShift', { + defaultMessage: 'Invalid time shift.', + }), + }; + case 'invalidTimeShift': + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.invalidTimeShift', { + defaultMessage: + 'Invalid time shift. Enter positive integer amount followed by one of the units s, m, h, d, w, M, y. For example 3h for 3 hours', + }), + }; + case 'invalidReducedTimeRange': + return { + id, + meta, + locations, + message: i18n.translate('xpack.lens.indexPattern.invalidReducedTimeRange', { + defaultMessage: + 'Invalid reduced time range. Enter positive integer amount followed by one of the units s, m, h, d, w, M, y. For example 3h for 3 hours', + }), + }; + } } export function tryToParse( formula: string, operations: Record -): { root: TinymathAST; error: null } | { root: null; error: ErrorWrapper } { - let root; +): { root: TinymathAST } | { error: ErrorWrapper } { + let root: TinymathAST; try { root = parse(formula); } catch (e) { @@ -426,21 +501,13 @@ export function tryToParse( // * if the formula contains at least one existing operation, check for query problems const maybeQueryProblems = getRawQueryValidationError(formula, operations); if (maybeQueryProblems) { - // need to emulate an error shape here - return { root: null, error: { message: maybeQueryProblems[0], locations: [] } }; + return { error: { ...maybeQueryProblems, locations: [] } }; } return { - root: null, - error: getMessageFromId({ - messageId: 'failedParsing', - values: { - expression: formula, - }, - locations: [], - }), + error: getMessageFromId({ id: 'failedParsing', meta: { expression: formula } }, []), }; } - return { root, error: null }; + return { root }; } export function runASTValidation( @@ -462,13 +529,7 @@ function checkVariableEdgeCases(ast: TinymathAST, missingVariables: Set) const invalidVariableErrors = []; if (isObject(ast) && ast.type === 'variable' && !missingVariables.has(ast.value)) { invalidVariableErrors.push( - getMessageFromId({ - messageId: 'fieldWithNoOperation', - values: { - field: ast.value, - }, - locations: [ast.location], - }) + getMessageFromId({ id: 'fieldWithNoOperation', meta: { field: ast.value } }, [ast.location]) ); } return invalidVariableErrors; @@ -485,14 +546,16 @@ function checkMissingVariableOrFunctions( if (missingOperations.names.length) { missingErrors.push( - getMessageFromId({ - messageId: 'missingOperation', - values: { - operationLength: missingOperations.names.length, - operationsList: missingOperations.names.join(', '), + getMessageFromId( + { + id: 'missingOperation', + meta: { + operationLength: missingOperations.names.length, + operationsList: missingOperations.names.join(', '), + }, }, - locations: missingOperations.locations, - }) + missingOperations.locations + ) ); } const missingVariables = findVariables(ast).filter( @@ -503,15 +566,15 @@ function checkMissingVariableOrFunctions( // need to check the arguments here: check only strings for now if (missingVariables.length) { missingErrors.push({ - ...getMessageFromId({ - messageId: 'missingField', - values: { - variablesLength: missingVariables.length, - variablesList: missingVariables.map(({ value }) => value).join(', '), + ...getMessageFromId( + { + id: 'missingField', + meta: { + fieldList: [...new Set(missingVariables.map(({ value }) => value))], + }, }, - locations: missingVariables.map(({ location }) => location), - }), - extraInfo: { missingFields: [...new Set(missingVariables.map(({ value }) => value))] }, + missingVariables.map(({ location }) => location) + ), }); } const invalidVariableErrors = checkVariableEdgeCases( @@ -521,27 +584,6 @@ function checkMissingVariableOrFunctions( return [...missingErrors, ...invalidVariableErrors]; } -function getAbsoluteTimeShiftErrorMessage(reason: REASON_ID_TYPES) { - switch (reason) { - case REASON_IDS.missingTimerange: - return i18n.translate('xpack.lens.indexPattern.absoluteMissingTimeRange', { - defaultMessage: 'Invalid time shift. No time range found as reference', - }); - case REASON_IDS.invalidDate: - return i18n.translate('xpack.lens.indexPattern.absoluteInvalidDate', { - defaultMessage: 'Invalid time shift. The date is not of the correct format', - }); - case REASON_IDS.shiftAfterTimeRange: - return i18n.translate('xpack.lens.indexPattern.absoluteAfterTimeRange', { - defaultMessage: 'Invalid time shift. The provided date is after the current time range', - }); - case REASON_IDS.notAbsoluteTimeShift: - return i18n.translate('xpack.lens.indexPattern.notAbsoluteTimeShift', { - defaultMessage: 'Invalid time shift.', - }); - } -} - function getQueryValidationErrors( namedArguments: TinymathNamedArgument[] | undefined, indexPattern: IndexPattern, @@ -550,13 +592,14 @@ function getQueryValidationErrors( const errors: ErrorWrapper[] = []; (namedArguments ?? []).forEach((arg) => { if (arg.name === 'kql' || arg.name === 'lucene') { - const message = getQueryValidationError( - arg as TinymathNamedArgument & { name: 'kql' | 'lucene' }, - indexPattern - ); + const message = getQueryValidationError(arg, indexPattern); if (message) { errors.push({ + id: 'invalidQuery', message, + meta: { + language: arg.name, + }, locations: [arg.location], }); } @@ -567,7 +610,7 @@ function getQueryValidationErrors( if (parsedShift === 'invalid') { if (isAbsoluteTimeShift(arg.value)) { // try to parse as absolute time shift - const error = validateAbsoluteTimeShift( + const errorId = validateAbsoluteTimeShift( arg.value, dateRange ? { @@ -576,33 +619,18 @@ function getQueryValidationErrors( } : undefined ); - if (error) { - errors.push({ - message: getAbsoluteTimeShiftErrorMessage(error), - locations: [arg.location], - }); + if (errorId) { + errors.push(getMessageFromId({ id: errorId }, [arg.location])); } } else { - errors.push({ - message: i18n.translate('xpack.lens.indexPattern.invalidTimeShift', { - defaultMessage: - 'Invalid time shift. Enter positive integer amount followed by one of the units s, m, h, d, w, M, y. For example 3h for 3 hours', - }), - locations: [arg.location], - }); + errors.push(getMessageFromId({ id: 'invalidTimeShift' }, [arg.location])); } } } if (arg.name === 'reducedTimeRange') { const parsedReducedTimeRange = parseTimeShift(arg.value || ''); if (parsedReducedTimeRange === 'invalid' || parsedReducedTimeRange === 'previous') { - errors.push({ - message: i18n.translate('xpack.lens.indexPattern.invalidReducedTimeRange', { - defaultMessage: - 'Invalid reduced time range. Enter positive integer amount followed by one of the units s, m, h, d, w, M, y. For example 3h for 3 hours', - }), - locations: [arg.location], - }); + errors.push(getMessageFromId({ id: 'invalidReducedTimeRange' }, [arg.location])); } } }); @@ -622,8 +650,8 @@ function validateFiltersArguments( | OperationDefinition, namedArguments: TinymathNamedArgument[] | undefined, globalFilters?: Query -) { - const errors = []; +): ErrorWrapper[] { + const errors: ErrorWrapper[] = []; const { conflicts, innerType, outerType } = hasFiltersConflicts( nodeOperation, namedArguments, @@ -632,15 +660,17 @@ function validateFiltersArguments( if (conflicts) { if (innerType && outerType) { errors.push( - getMessageFromId({ - messageId: 'filtersTypeConflict', - values: { - operation: node.name, - innerType, - outerType, + getMessageFromId( + { + id: 'filtersTypeConflict', + meta: { + operation: node.name, + innerType, + outerType, + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } } @@ -655,60 +685,59 @@ function validateNameArguments( namedArguments: TinymathNamedArgument[] | undefined, indexPattern: IndexPattern, dateRange: DateRange | undefined -) { - const errors = []; +): ErrorWrapper[] { + const errors: ErrorWrapper[] = []; const missingParams = getMissingParams(nodeOperation, namedArguments); if (missingParams.length) { errors.push( - getMessageFromId({ - messageId: 'missingParameter', - values: { - operation: node.name, - params: missingParams.map(({ name }) => name).join(', '), + getMessageFromId( + { + id: 'missingParameter', + meta: { + operation: node.name, + params: missingParams.map(({ name }) => name).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } const wrongTypeParams = getWrongTypeParams(nodeOperation, namedArguments); if (wrongTypeParams.length) { errors.push( - getMessageFromId({ - messageId: 'wrongTypeParameter', - values: { - operation: node.name, - params: wrongTypeParams.map(({ name }) => name).join(', '), + getMessageFromId( + { + id: 'wrongTypeParameter', + meta: { + operation: node.name, + params: wrongTypeParams.map(({ name }) => name).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } const duplicateParams = getDuplicateParams(namedArguments); if (duplicateParams.length) { errors.push( - getMessageFromId({ - messageId: 'duplicateArgument', - values: { - operation: node.name, - params: duplicateParams.join(', '), + getMessageFromId( + { + id: 'duplicateArgument', + meta: { + operation: node.name, + params: duplicateParams.join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } const queryValidationErrors = getQueryValidationErrors(namedArguments, indexPattern, dateRange); - if (queryValidationErrors.length) { - errors.push(...queryValidationErrors); - } + errors.push(...queryValidationErrors); + const hasTooManyQueries = checkSingleQuery(namedArguments); if (hasTooManyQueries) { - errors.push( - getMessageFromId({ - messageId: 'tooManyQueries', - values: {}, - locations: getNodeLocation(node), - }) - ); + errors.push(getMessageFromId({ id: 'tooManyQueries' }, getNodeLocation(node))); } return errors; } @@ -721,13 +750,7 @@ function checkTopNodeReturnType(ast: TinymathAST): ErrorWrapper[] { (tinymathFunctions[ast.name]?.outputType || DEFAULT_RETURN_TYPE) !== DEFAULT_RETURN_TYPE ) { return [ - getMessageFromId({ - messageId: 'wrongReturnedType', - values: { - text: ast.text, - }, - locations: getNodeLocation(ast), - }), + getMessageFromId({ id: 'wrongReturnedType', meta: { text: ast.text } }, getNodeLocation(ast)), ]; } return []; @@ -768,36 +791,40 @@ function runFullASTValidation( if (!isArgumentValidType(firstArg, 'variable')) { if (isMathNode(firstArg)) { errors.push( - getMessageFromId({ - messageId: 'wrongFirstArgument', - values: { - operation: node.name, - type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { - defaultMessage: 'field', - }), - argument: `math operation`, + getMessageFromId( + { + id: 'wrongFirstArgument', + meta: { + operation: node.name, + type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { + defaultMessage: 'field', + }), + argument: `math operation`, + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } else { if (shouldHaveFieldArgument(node)) { errors.push( - getMessageFromId({ - messageId: 'wrongFirstArgument', - values: { - operation: node.name, - type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { - defaultMessage: 'field', - }), - argument: - getValueOrName(firstArg) || - i18n.translate('xpack.lens.indexPattern.formulaNoFieldForOperation', { - defaultMessage: 'no field', + getMessageFromId( + { + id: 'wrongFirstArgument', + meta: { + operation: node.name, + type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { + defaultMessage: 'field', }), + argument: + getValueOrName(firstArg) || + i18n.translate('xpack.lens.indexPattern.formulaNoFieldForOperation', { + defaultMessage: 'no field', + }), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } } @@ -824,13 +851,10 @@ function runFullASTValidation( } if (!canHaveParams(nodeOperation) && namedArguments.length) { errors.push( - getMessageFromId({ - messageId: 'cannotAcceptParameter', - values: { - operation: node.name, - }, - locations: getNodeLocation(node), - }) + getMessageFromId( + { id: 'cannotAcceptParameter', meta: { operation: node.name } }, + getNodeLocation(node) + ) ); } else { const argumentsErrors = validateNameArguments( @@ -862,21 +886,23 @@ function runFullASTValidation( // First field has a special handling if (isFirstArgumentNotValid) { errors.push( - getMessageFromId({ - messageId: 'wrongFirstArgument', - values: { - operation: node.name, - type: i18n.translate('xpack.lens.indexPattern.formulaOperationValue', { - defaultMessage: 'operation', - }), - argument: - getValueOrName(firstArg) || - i18n.translate('xpack.lens.indexPattern.formulaNoOperation', { - defaultMessage: 'no operation', + getMessageFromId( + { + id: 'wrongFirstArgument', + meta: { + operation: node.name, + type: i18n.translate('xpack.lens.indexPattern.formulaOperationValue', { + defaultMessage: 'operation', }), + argument: + getValueOrName(firstArg) || + i18n.translate('xpack.lens.indexPattern.formulaNoOperation', { + defaultMessage: 'no operation', + }), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } // Check for multiple function passed @@ -896,13 +922,15 @@ function runFullASTValidation( if (!canHaveParams(nodeOperation) && namedArguments.length) { errors.push( - getMessageFromId({ - messageId: 'cannotAcceptParameter', - values: { - operation: node.name, + getMessageFromId( + { + id: 'cannotAcceptParameter', + meta: { + operation: node.name, + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } else { // check for fields passed at any position @@ -1075,27 +1103,26 @@ export function validateMathNodes( if (!node.args.length) { // we can stop here return errors.push( - getMessageFromId({ - messageId: 'missingMathArgument', - values: { - operation: node.name, - count: mandatoryArguments.length, - params: mandatoryArguments.map(({ name }) => name).join(', '), + getMessageFromId( + { + id: 'missingMathArgument', + meta: { + operation: node.name, + count: mandatoryArguments.length, + params: mandatoryArguments.map(({ name }) => name).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } if (node.args.length > positionalArguments.length) { errors.push( - getMessageFromId({ - messageId: 'tooManyArguments', - values: { - operation: node.name, - }, - locations: getNodeLocation(node), - }) + getMessageFromId( + { id: 'tooManyArguments', meta: { operation: node.name } }, + getNodeLocation(node) + ) ); } @@ -1108,13 +1135,10 @@ export function validateMathNodes( }); if (hasFieldAsArgument) { errors.push( - getMessageFromId({ - messageId: 'shouldNotHaveField', - values: { - operation: node.name, - }, - locations: getNodeLocation(node), - }) + getMessageFromId( + { id: 'shouldNotHaveField', meta: { operation: node.name } }, + getNodeLocation(node) + ) ); } @@ -1133,30 +1157,34 @@ export function validateMathNodes( if (missingArgsWithoutAlternative.length) { errors.push( - getMessageFromId({ - messageId: 'missingMathArgument', - values: { - operation: node.name, - count: mandatoryArguments.length - node.args.length, - params: missingArgsWithoutAlternative.map(({ name }) => name).join(', '), + getMessageFromId( + { + id: 'missingMathArgument', + meta: { + operation: node.name, + count: mandatoryArguments.length - node.args.length, + params: missingArgsWithoutAlternative.map(({ name }) => name).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } if (missingArgsWithAlternatives.length) { // pick only the first missing argument alternative const [firstArg] = missingArgsWithAlternatives; errors.push( - getMessageFromId({ - messageId: 'useAlternativeFunction', - values: { - operation: node.name, - params: firstArg.name, - alternativeFn: firstArg.alternativeWhenMissing, + getMessageFromId( + { + id: 'useAlternativeFunction', + meta: { + operation: node.name, + params: firstArg.name, + alternativeFn: firstArg.alternativeWhenMissing, + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } } @@ -1174,16 +1202,18 @@ export function validateMathNodes( for (const wrongTypeArgumentIndex of wrongTypeArgumentIndexes) { const arg = node.args[wrongTypeArgumentIndex]; errors.push( - getMessageFromId({ - messageId: 'wrongTypeArgument', - values: { - operation: node.name, - name: positionalArguments[wrongTypeArgumentIndex].name, - type: getArgumentType(arg, operations) || DEFAULT_RETURN_TYPE, - expectedType: positionalArguments[wrongTypeArgumentIndex].type || '', + getMessageFromId( + { + id: 'wrongTypeArgument', + meta: { + operation: node.name, + name: positionalArguments[wrongTypeArgumentIndex].name, + type: getArgumentType(arg, operations) || DEFAULT_RETURN_TYPE, + expectedType: positionalArguments[wrongTypeArgumentIndex].type || '', + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } }); @@ -1209,46 +1239,52 @@ function validateFieldArguments( const errors = []; if (isFieldOperation && (fields.length > 1 || (fields.length === 1 && fields[0] !== firstArg))) { errors.push( - getMessageFromId({ - messageId: 'tooManyFirstArguments', - values: { - operation: node.name, - type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { - defaultMessage: 'field', - }), - supported: 1, - text: (fields as TinymathVariable[]).map(({ text }) => text).join(', '), + getMessageFromId( + { + id: 'tooManyFirstArguments', + meta: { + operation: node.name, + type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { + defaultMessage: 'field', + }), + supported: 1, + text: (fields as TinymathVariable[]).map(({ text }) => text).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } if (isFieldOperation && fields.length === 1 && fields[0] === firstArg) { if (returnedType === 'ordinal') { errors.push( - getMessageFromId({ - messageId: 'wrongReturnedType', - values: { - text: node.text ?? `${node.name}(${getValueOrName(firstArg)})`, + getMessageFromId( + { + id: 'wrongReturnedType', + meta: { + text: node.text ?? `${node.name}(${getValueOrName(firstArg)})`, + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } } if (!isFieldOperation && fields.length) { errors.push( - getMessageFromId({ - messageId: 'wrongArgument', - values: { - operation: node.name, - text: (fields as TinymathVariable[]).map(({ text }) => text).join(', '), - type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { - defaultMessage: 'field', - }), + getMessageFromId( + { + id: 'wrongArgument', + meta: { + operation: node.name, + text: (fields as TinymathVariable[]).map(({ text }) => text).join(', '), + type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { + defaultMessage: 'field', + }), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } return errors; @@ -1270,30 +1306,34 @@ function validateFunctionArguments( if (esOperations.length > requiredFunctions) { if (isFieldOperation) { errors.push( - getMessageFromId({ - messageId: 'wrongArgument', - values: { - operation: node.name, - text: (esOperations as TinymathFunction[]).map(({ text }) => text).join(', '), - type: i18n.translate('xpack.lens.indexPattern.formulaMetricValue', { - defaultMessage: 'metric', - }), + getMessageFromId( + { + id: 'wrongArgument', + meta: { + operation: node.name, + text: (esOperations as TinymathFunction[]).map(({ text }) => text).join(', '), + type: i18n.translate('xpack.lens.indexPattern.formulaMetricValue', { + defaultMessage: 'metric', + }), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } else { errors.push( - getMessageFromId({ - messageId: 'tooManyFirstArguments', - values: { - operation: node.name, - type, - supported: requiredFunctions, - text: (esOperations as TinymathFunction[]).map(({ text }) => text).join(', '), + getMessageFromId( + { + id: 'tooManyFirstArguments', + meta: { + operation: node.name, + type, + supported: requiredFunctions, + text: (esOperations as TinymathFunction[]).map(({ text }) => text).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } } @@ -1303,15 +1343,17 @@ function validateFunctionArguments( ((!firstArgValidation && mathOperations.length) || mathOperations.length > 1) ) { errors.push( - getMessageFromId({ - messageId: 'wrongArgument', - values: { - operation: node.name, - type, - text: (mathOperations as TinymathFunction[]).map(({ text }) => text).join(', '), + getMessageFromId( + { + id: 'wrongArgument', + meta: { + operation: node.name, + type, + text: (mathOperations as TinymathFunction[]).map(({ text }) => text).join(', '), + }, }, - locations: getNodeLocation(node), - }) + getNodeLocation(node) + ) ); } return errors; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation_errors.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation_errors.ts new file mode 100644 index 0000000000000..a16b214f7f157 --- /dev/null +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation_errors.ts @@ -0,0 +1,183 @@ +/* + * 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 { REASON_IDS } from '@kbn/data-plugin/common'; + +export interface MissingFieldError { + id: 'missingField'; + meta: { fieldList: string[] }; +} + +export interface MissingOperationError { + id: 'missingOperation'; + meta: { operationLength: number; operationsList: string }; +} + +export interface MissingParameterError { + id: 'missingParameter'; + meta: { operation: string; params: string }; +} + +export interface WrongTypeParameterError { + id: 'wrongTypeParameter'; + meta: { operation: string; params: string }; +} + +export interface WrongTypeArgumentError { + id: 'wrongTypeArgument'; + meta: { operation: string; name: string; type: string; expectedType: string }; +} + +export interface WrongFirstArgument { + id: 'wrongFirstArgument'; + meta: { operation: string; type: string; argument: string | number }; +} + +export interface CannotAcceptParameterError { + id: 'cannotAcceptParameter'; + meta: { operation: string }; +} + +export interface ShouldNotHaveFieldError { + id: 'shouldNotHaveField'; + meta: { operation: string }; +} + +export interface TooManyArgumentsError { + id: 'tooManyArguments'; + meta: { operation: string }; +} + +export interface FieldWithNoOperationError { + id: 'fieldWithNoOperation'; + meta: { field: string }; +} + +export interface FailedParsingError { + id: 'failedParsing'; + meta: { expression: string }; +} + +export interface DuplicateArgumentError { + id: 'duplicateArgument'; + meta: { operation: string; params: string }; +} + +export interface DuplicateArgumentError { + id: 'duplicateArgument'; + meta: { operation: string; params: string }; +} + +export interface MissingMathArgumentError { + id: 'missingMathArgument'; + meta: { operation: string; count: number; params: string }; +} + +export interface TooManyQueriesError { + id: 'tooManyQueries'; + meta?: {}; +} + +export interface TooManyFirstArgumentsError { + id: 'tooManyFirstArguments'; + meta: { + operation: string; + type: string; + text: string; + supported?: number; + }; +} + +export interface WrongArgumentError { + id: 'wrongArgument'; + meta: { operation: string; text: string; type: string }; +} + +export interface WrongReturnedTypeError { + id: 'wrongReturnedType'; + meta: { text: string }; +} + +export interface FiltersTypeConflictError { + id: 'filtersTypeConflict'; + meta: { operation: string; outerType: string; innerType: string }; +} + +export interface UseAlternativeFunctionError { + id: 'useAlternativeFunction'; + meta: { + operation: string; + params: string; + alternativeFn: string; + }; +} + +export interface InvalidQueryError { + id: 'invalidQuery'; + meta: { + language: 'kql' | 'lucene'; + }; +} + +export interface MissingTimerangeError { + id: typeof REASON_IDS.missingTimerange; + meta?: {}; +} + +export interface InvalidDateError { + id: typeof REASON_IDS.invalidDate; + meta?: {}; +} + +export interface ShiftAfterTimeRangeError { + id: typeof REASON_IDS.shiftAfterTimeRange; + meta?: {}; +} + +export interface NotAbsoluteTimeShiftError { + id: typeof REASON_IDS.notAbsoluteTimeShift; + meta?: {}; +} + +export interface InvalidTimeShift { + id: 'invalidTimeShift'; + meta?: {}; +} + +export interface InvalidReducedTimeRange { + id: 'invalidReducedTimeRange'; + meta?: {}; +} + +export type ValidationErrors = + | MissingFieldError + | MissingOperationError + | MissingParameterError + | WrongTypeParameterError + | WrongTypeArgumentError + | WrongFirstArgument + | CannotAcceptParameterError + | ShouldNotHaveFieldError + | TooManyArgumentsError + | FieldWithNoOperationError + | FailedParsingError + | DuplicateArgumentError + | DuplicateArgumentError + | MissingMathArgumentError + | TooManyQueriesError + | TooManyFirstArgumentsError + | WrongArgumentError + | WrongReturnedTypeError + | FiltersTypeConflictError + | UseAlternativeFunctionError + | InvalidQueryError + | MissingTimerangeError + | InvalidDateError + | ShiftAfterTimeRangeError + | NotAbsoluteTimeShiftError + | InvalidTimeShift + | InvalidReducedTimeRange; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.test.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.test.ts index e9212a74d45a9..5c10597a3a9ac 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { FIELD_WRONG_TYPE } from '../../../../user_messages_ids'; import { createMockedIndexPattern } from '../../mocks'; import type { FormBasedLayer } from '../../types'; import type { GenericIndexPatternColumn } from './column_types'; @@ -67,6 +68,7 @@ describe('helpers', () => { } } />, + "uniqueId": "field_not_found", } `); }); @@ -84,7 +86,10 @@ describe('helpers', () => { createMockedIndexPattern() ); expect(messages).toHaveLength(1); - expect(messages![0]).toEqual('Field timestamp is of the wrong type'); + expect(messages![0]).toEqual({ + uniqueId: FIELD_WRONG_TYPE, + message: 'Field timestamp is of the wrong type', + }); }); it('returns an error if one field amongst multiples does not exist', () => { @@ -134,6 +139,7 @@ describe('helpers', () => { } } />, + "uniqueId": "field_not_found", } `); }); @@ -191,6 +197,7 @@ describe('helpers', () => { } } />, + "uniqueId": "field_not_found", } `); }); @@ -211,7 +218,10 @@ describe('helpers', () => { createMockedIndexPattern() ); expect(messages).toHaveLength(1); - expect(messages![0]).toEqual('Field timestamp is of the wrong type'); + expect(messages![0]).toEqual({ + uniqueId: FIELD_WRONG_TYPE, + message: 'Field timestamp is of the wrong type', + }); }); it('returns an error if multiple fields are of the wrong type', () => { @@ -230,7 +240,10 @@ describe('helpers', () => { createMockedIndexPattern() ); expect(messages).toHaveLength(1); - expect(messages![0]).toEqual('Fields start_date, timestamp are of the wrong type'); + expect(messages![0]).toEqual({ + uniqueId: FIELD_WRONG_TYPE, + message: 'Fields start_date, timestamp are of the wrong type', + }); }); it('returns no message if all fields are matching', () => { @@ -245,7 +258,7 @@ describe('helpers', () => { columnId, createMockedIndexPattern() ); - expect(messages).toBeUndefined(); + expect(messages).toHaveLength(0); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.tsx index 11a4e16a39f44..b65deebec963a 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/helpers.tsx @@ -23,14 +23,15 @@ import { } from './column_types'; import type { FormBasedLayer, LastValueIndexPatternColumn } from '../../types'; import { hasField } from '../../pure_utils'; +import { FIELD_NOT_FOUND, FIELD_WRONG_TYPE } from '../../../../user_messages_ids'; export function getInvalidFieldMessage( layer: FormBasedLayer, columnId: string, indexPattern?: IndexPattern -): FieldBasedOperationErrorMessage[] | undefined { +): FieldBasedOperationErrorMessage[] { if (!indexPattern) { - return; + return []; } const column = layer.columns[columnId] as FieldBasedIndexPatternColumn; @@ -77,25 +78,29 @@ export function getInvalidFieldMessage( const wrongTypeFields = operationDefinition?.getNonTransferableFields?.(column, indexPattern) ?? fieldNames; return [ - i18n.translate('xpack.lens.indexPattern.fieldsWrongType', { - defaultMessage: - '{count, plural, one {Field} other {Fields}} {invalidFields} {count, plural, one {is} other {are}} of the wrong type', - values: { - count: wrongTypeFields.length, - invalidFields: wrongTypeFields.join(', '), - }, - }), + { + uniqueId: FIELD_WRONG_TYPE, + message: i18n.translate('xpack.lens.indexPattern.fieldsWrongType', { + defaultMessage: + '{count, plural, one {Field} other {Fields}} {invalidFields} {count, plural, one {is} other {are}} of the wrong type', + values: { + count: wrongTypeFields.length, + invalidFields: wrongTypeFields.join(', '), + }, + }), + }, ]; } } - return undefined; + return []; } export const generateMissingFieldMessage = ( missingFields: string[], columnId: string ): FieldBasedOperationErrorMessage => ({ + uniqueId: FIELD_NOT_FOUND, message: ( -): FieldBasedOperationErrorMessage[] | undefined { - const messages = (errorMessages.filter(Boolean) as FieldBasedOperationErrorMessage[][]).flat(); - return messages.length ? messages : undefined; -} - export function getSafeName(name: string, indexPattern: IndexPattern | undefined): string { const field = indexPattern?.getFieldByName(name); return field diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts index c7f8ed1e6923d..791024e4c9368 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts @@ -324,7 +324,7 @@ interface BaseOperationDefinitionProps< dateRange?: DateRange, operationDefinitionMap?: Record, targetBars?: number - ) => FieldBasedOperationErrorMessage[] | undefined; + ) => FieldBasedOperationErrorMessage[]; /* * Flag whether this operation can be scaled by time unit if a date histogram is available. @@ -463,21 +463,20 @@ interface FilterParams { lucene?: string; } -export type FieldBasedOperationErrorMessage = - | { - message: string | React.ReactNode; - displayLocations?: UserMessage['displayLocations']; - fixAction?: { - label: string; - newState: ( - data: DataPublicPluginStart, - core: CoreStart, - frame: FramePublicAPI, - layerId: string - ) => Promise; - }; - } - | string; +export interface FieldBasedOperationErrorMessage { + uniqueId: string; + message: string | React.ReactNode; + displayLocations?: UserMessage['displayLocations']; + fixAction?: { + label: string; + newState: ( + data: DataPublicPluginStart, + core: CoreStart, + frame: FramePublicAPI, + layerId: string + ) => Promise; + }; +} interface FieldlessOperationDefinition { input: 'none'; @@ -581,7 +580,7 @@ interface FieldBasedOperationDefinition - ) => FieldBasedOperationErrorMessage[] | undefined; + ) => FieldBasedOperationErrorMessage[]; } export interface RequiredReference { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx index 47777b7c0f6f7..61748339d2a72 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx @@ -914,10 +914,10 @@ describe('last_value', () => { indexPatternId: '', }; }); - it('returns undefined if sourceField exists and sortField is of type date ', () => { + it('returns empty array if sourceField exists and sortField is of type date ', () => { expect( lastValueOperation.getErrorMessage!(errorLayer, 'col1', createMockedIndexPattern()) - ).toEqual(undefined); + ).toHaveLength(0); }); it('shows error message if the sourceField does not exist in index pattern', () => { errorLayer = { @@ -962,6 +962,7 @@ describe('last_value', () => { } } />, + "uniqueId": "field_not_found", }, ] `); @@ -1007,6 +1008,7 @@ describe('last_value', () => { } } />, + "uniqueId": "last_value_op_sort_field_not_found", }, ] `); @@ -1043,9 +1045,9 @@ describe('last_value', () => { } as LastValueIndexPatternColumn, }, }; - expect(lastValueOperation.getErrorMessage!(errorLayer, 'col1', indexPattern)).toEqual([ - 'Field start_date is of the wrong type', - ]); + expect( + lastValueOperation.getErrorMessage!(errorLayer, 'col1', indexPattern).map((e) => e.message) + ).toEqual(['Field start_date is of the wrong type']); }); it('shows error message if the sortField is not date', () => { errorLayer = { @@ -1061,7 +1063,9 @@ describe('last_value', () => { }, }; expect( - lastValueOperation.getErrorMessage!(errorLayer, 'col1', createMockedIndexPattern()) + lastValueOperation.getErrorMessage!(errorLayer, 'col1', createMockedIndexPattern()).map( + (e) => e.message + ) ).toEqual(['Field bytes is not a date field and cannot be used for sorting']); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx index 0861148aacc3d..b508534a19800 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx @@ -36,6 +36,10 @@ import { isRuntimeField, isScriptedField } from './terms/helpers'; import { FormRow } from './shared_components/form_row'; import { getColumnReducedTimeRangeError } from '../../reduced_time_range_utils'; import { getGroupByKey } from './get_group_by_key'; +import { + LAST_VALUE_OP_SORT_FIELD_INVALID_TYPE, + LAST_VALUE_OP_SORT_FIELD_NOT_FOUND, +} from '../../../../user_messages_ids'; function ofName(name: string, timeShift: string | undefined, reducedTimeRange: string | undefined) { return adjustTimeScaleLabelSuffix( @@ -69,35 +73,44 @@ function getInvalidSortFieldMessage( sortField: string, columnId: string, indexPattern?: IndexPattern -): FieldBasedOperationErrorMessage | undefined { +): FieldBasedOperationErrorMessage[] { if (!indexPattern) { - return; + return []; } const field = indexPattern.getFieldByName(sortField); if (!field) { - return { - message: ( - {sortField}, - }} - /> - ), - displayLocations: [ - { id: 'toolbar' }, - { id: 'dimensionButton', dimensionId: columnId }, - { id: 'embeddableBadge' }, - ], - }; + return [ + { + uniqueId: LAST_VALUE_OP_SORT_FIELD_NOT_FOUND, + message: ( + {sortField}, + }} + /> + ), + displayLocations: [ + { id: 'toolbar' }, + { id: 'dimensionButton', dimensionId: columnId }, + { id: 'embeddableBadge' }, + ], + }, + ]; } if (field.type !== 'date') { - return i18n.translate('xpack.lens.indexPattern.lastValue.invalidTypeSortField', { - defaultMessage: 'Field {invalidField} is not a date field and cannot be used for sorting', - values: { invalidField: sortField }, - }); + return [ + { + uniqueId: LAST_VALUE_OP_SORT_FIELD_INVALID_TYPE, + message: i18n.translate('xpack.lens.indexPattern.lastValue.invalidTypeSortField', { + defaultMessage: 'Field {invalidField} is not a date field and cannot be used for sorting', + values: { invalidField: sortField }, + }), + }, + ]; } + return []; } function isTimeFieldNameDateField(indexPattern: IndexPattern) { @@ -211,24 +224,11 @@ export const lastValueOperation: OperationDefinition< }, getErrorMessage(layer, columnId, indexPattern) { const column = layer.columns[columnId] as LastValueIndexPatternColumn; - const errorMessages: FieldBasedOperationErrorMessage[] = []; - - const invalidSourceFieldMessage = getInvalidFieldMessage(layer, columnId, indexPattern); - if (invalidSourceFieldMessage) { - errorMessages.push(...invalidSourceFieldMessage); - } - - const invalidSortFieldMessage = getInvalidSortFieldMessage( - column.params.sortField, - columnId, - indexPattern - ); - if (invalidSortFieldMessage) { - errorMessages.push(invalidSortFieldMessage); - } - - errorMessages.push(...(getColumnReducedTimeRangeError(layer, columnId, indexPattern) || [])); - return errorMessages.length ? errorMessages : undefined; + return [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getInvalidSortFieldMessage(column.params.sortField, columnId, indexPattern), + ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), + ]; }, buildColumn({ field, previousColumn, indexPattern }, columnParams) { const lastValueParams = columnParams as LastValueIndexPatternColumn['params']; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx index 87e3432d54e2f..304698b1be5e9 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx @@ -30,7 +30,6 @@ import { getInvalidFieldMessage, getSafeName, getFilter, - combineErrorMessages, isColumnOfType, } from './helpers'; import { @@ -234,11 +233,10 @@ function buildMetricOperation>({ ); }, - getErrorMessage: (layer, columnId, indexPattern) => - combineErrorMessages([ - getInvalidFieldMessage(layer, columnId, indexPattern), - getColumnReducedTimeRangeError(layer, columnId, indexPattern), - ]), + getErrorMessage: (layer, columnId, indexPattern) => [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), + ], filterable: true, canReduceTimeRange: true, quickFunctionDocumentation, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx index be40f31c770aa..97bb7270d3431 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx @@ -25,7 +25,6 @@ import { isValidNumber, getFilter, isColumnOfType, - combineErrorMessages, } from './helpers'; import { FieldBasedIndexPatternColumn } from './column_types'; import { adjustTimeScaleLabelSuffix } from '../time_scale_utils'; @@ -325,11 +324,10 @@ export const percentileOperation: OperationDefinition< aggs, }; }, - getErrorMessage: (layer, columnId, indexPattern) => - combineErrorMessages([ - getInvalidFieldMessage(layer, columnId, indexPattern), - getColumnReducedTimeRangeError(layer, columnId, indexPattern), - ]), + getErrorMessage: (layer, columnId, indexPattern) => [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), + ], paramEditor: function PercentileParamEditor({ paramEditorUpdater, currentColumn, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx index 3eb867442ef17..f1abee52f68c9 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx @@ -20,7 +20,6 @@ import { isValidNumber, getFilter, isColumnOfType, - combineErrorMessages, } from './helpers'; import { FieldBasedIndexPatternColumn } from './column_types'; import { adjustTimeScaleLabelSuffix } from '../time_scale_utils'; @@ -169,11 +168,10 @@ export const percentileRanksOperation: OperationDefinition< } ).toAst(); }, - getErrorMessage: (layer, columnId, indexPattern) => - combineErrorMessages([ - getInvalidFieldMessage(layer, columnId, indexPattern), - getColumnReducedTimeRangeError(layer, columnId, indexPattern), - ]), + getErrorMessage: (layer, columnId, indexPattern) => [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), + ], paramEditor: function PercentileParamEditor({ paramEditorUpdater, currentColumn, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.test.tsx index 91727f0d56ea7..ce53ca04ea44c 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.test.tsx @@ -158,7 +158,7 @@ describe('static_value', () => { createMockedIndexPattern(), dateRange ) - ).toBeUndefined(); + ).toHaveLength(0); // test for potential falsy value expect( staticValueOperation.getErrorMessage!( @@ -167,7 +167,7 @@ describe('static_value', () => { createMockedIndexPattern(), dateRange ) - ).toBeUndefined(); + ).toHaveLength(0); }); it.each(['NaN', 'Infinity', 'string'])( @@ -179,7 +179,7 @@ describe('static_value', () => { 'col2', createMockedIndexPattern(), dateRange - ) + ).map((e) => e.message) ).toEqual(expect.arrayContaining([expect.stringMatching('is not a valid number')])); } ); @@ -192,7 +192,7 @@ describe('static_value', () => { createMockedIndexPattern(), dateRange ) - ).toBe(undefined); + ).toHaveLength(0); }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.tsx index af00ba7cb5c69..eef9ee2e9017d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/static_value.tsx @@ -17,6 +17,7 @@ import { import type { IndexPattern } from '../../../../types'; import { getFormatFromPreviousColumn, isValidNumber } from './helpers'; import { getColumnOrder } from '../layer_helpers'; +import { STATIC_VALUE_NOT_VALID_NUMBER } from '../../../../user_messages_ids'; const defaultLabel = i18n.translate('xpack.lens.indexPattern.staticValueLabelDefault', { defaultMessage: 'Static value', @@ -70,12 +71,15 @@ export const staticValueOperation: OperationDefinition< return column.params.value != null && !isValid ? [ - i18n.translate('xpack.lens.indexPattern.staticValueError', { - defaultMessage: 'The static value of {value} is not a valid number', - values: { value: column.params.value }, - }), + { + uniqueId: STATIC_VALUE_NOT_VALID_NUMBER, + message: i18n.translate('xpack.lens.indexPattern.staticValueError', { + defaultMessage: 'The static value of {value} is not a valid number', + values: { value: column.params.value }, + }), + }, ] - : undefined; + : []; }, getPossibleOperation() { return { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.test.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.test.ts index 583f3ff5015c2..f71e724ed5d25 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.test.ts @@ -93,52 +93,58 @@ function getCountOperationColumn( describe('getMultiTermsScriptedFieldErrorMessage()', () => { it('should return no error message for a single field', () => { - expect( - getMultiTermsScriptedFieldErrorMessage(getLayer(), 'col1', indexPattern) - ).toBeUndefined(); + expect(getMultiTermsScriptedFieldErrorMessage(getLayer(), 'col1', indexPattern)).toHaveLength( + 0 + ); }); it('should return no error message for a scripted field when single', () => { const col = getStringBasedOperationColumn('scripted'); expect( getMultiTermsScriptedFieldErrorMessage(getLayer(col), 'col1', indexPattern) - ).toBeUndefined(); + ).toHaveLength(0); }); it('should return an error message for a scripted field when there are multiple fields', () => { const col = getStringBasedOperationColumn('scripted', { secondaryFields: ['bytes'] }); - expect(getMultiTermsScriptedFieldErrorMessage(getLayer(col), 'col1', indexPattern)).toBe( - 'Scripted fields are not supported when using multiple fields, found scripted' - ); + expect( + getMultiTermsScriptedFieldErrorMessage(getLayer(col), 'col1', indexPattern).map( + (e) => e.message + ) + ).toEqual(['Scripted fields are not supported when using multiple fields, found scripted']); }); it('should return no error message for multiple "native" fields', () => { const col = getStringBasedOperationColumn('source', { secondaryFields: ['dest'] }); expect( getMultiTermsScriptedFieldErrorMessage(getLayer(col), 'col1', indexPattern) - ).toBeUndefined(); + ).toHaveLength(0); }); it('should list all scripted fields in the error message', () => { const col = getStringBasedOperationColumn('scripted', { secondaryFields: ['scripted', 'scripted', 'scripted'], }); - expect(getMultiTermsScriptedFieldErrorMessage(getLayer(col), 'col1', indexPattern)).toBe( - 'Scripted fields are not supported when using multiple fields, found scripted, scripted, scripted, scripted' - ); + expect( + getMultiTermsScriptedFieldErrorMessage(getLayer(col), 'col1', indexPattern).map( + (e) => e.message + ) + ).toEqual([ + 'Scripted fields are not supported when using multiple fields, found scripted, scripted, scripted, scripted', + ]); }); }); describe('getDisallowedTermsMessage()', () => { it('should return no error if no shifted dimensions are defined', () => { - expect(getDisallowedTermsMessage(getLayer(), 'col1', indexPattern)).toBeUndefined(); + expect(getDisallowedTermsMessage(getLayer(), 'col1', indexPattern)).toHaveLength(0); expect( getDisallowedTermsMessage( getLayer(getStringBasedOperationColumn(), [getCountOperationColumn()]), 'col1', indexPattern ) - ).toBeUndefined(); + ).toHaveLength(0); }); it('should return no error for a single dimension shifted', () => { @@ -148,7 +154,7 @@ describe('getDisallowedTermsMessage()', () => { 'col1', indexPattern ) - ).toBeUndefined(); + ).toHaveLength(0); }); it('should return no error for a single dimension shifted which is wrapped in a referencing column', () => { @@ -174,18 +180,18 @@ describe('getDisallowedTermsMessage()', () => { 'col1', indexPattern ) - ).toBeUndefined(); + ).toHaveLength(0); }); it('should return no for multiple fields with no shifted dimensions', () => { - expect(getDisallowedTermsMessage(getLayer(), 'col1', indexPattern)).toBeUndefined(); + expect(getDisallowedTermsMessage(getLayer(), 'col1', indexPattern)).toHaveLength(0); expect( getDisallowedTermsMessage( getLayer(getStringBasedOperationColumn(), [getCountOperationColumn()]), 'col1', indexPattern ) - ).toBeUndefined(); + ).toHaveLength(0); }); it('should return an error for multiple dimensions shifted for a single term', () => { @@ -197,7 +203,7 @@ describe('getDisallowedTermsMessage()', () => { ]), 'col1', indexPattern - ) + )[0] ).toEqual( expect.objectContaining({ message: @@ -216,7 +222,7 @@ describe('getDisallowedTermsMessage()', () => { ]), 'col1', indexPattern - ) + )[0] ).toEqual( expect.objectContaining({ message: @@ -234,7 +240,7 @@ describe('getDisallowedTermsMessage()', () => { ]), 'col1', indexPattern - )!.fixAction.newState; + )[0]!.fixAction!.newState; const newLayer = await fixAction( dataMock, coreMock, @@ -282,7 +288,7 @@ describe('getDisallowedTermsMessage()', () => { ]), 'col1', indexPattern - )!.fixAction.newState; + )[0]!.fixAction!.newState; const newLayer = await fixAction( dataMock, coreMock, @@ -324,7 +330,7 @@ describe('getDisallowedTermsMessage()', () => { ]), 'col1', indexPattern - )!.fixAction.newState; + )[0]!.fixAction!.newState; const newLayer = await fixAction( dataMock, coreMock, @@ -365,7 +371,7 @@ describe('getDisallowedTermsMessage()', () => { ]), 'col1', indexPattern - )!.fixAction.newState; + )[0]!.fixAction!.newState; const newLayer = await fixAction( dataMock, coreMock, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.ts index cb3ed583d7cda..268e8a61c9f90 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/helpers.ts @@ -13,7 +13,11 @@ import { getEsQueryConfig, DataPublicPluginStart } from '@kbn/data-plugin/public import type { DataViewField } from '@kbn/data-views-plugin/common'; import { type FieldStatsResponse } from '@kbn/unified-field-list/src/types'; import { loadFieldStats } from '@kbn/unified-field-list/src/services/field_stats'; -import { GenericIndexPatternColumn, operationDefinitionMap } from '..'; +import { + FieldBasedOperationErrorMessage, + GenericIndexPatternColumn, + operationDefinitionMap, +} from '..'; import { defaultLabel } from '../filters'; import { isReferenced } from '../../layer_helpers'; @@ -27,6 +31,10 @@ import type { PercentileIndexPatternColumn } from '../percentile'; import type { FormBasedLayer } from '../../../types'; import { MULTI_KEY_VISUAL_SEPARATOR, supportedTypes, MAX_TERMS_OTHER_ENABLED } from './constants'; import { isColumnOfType } from '../helpers'; +import { + TERMS_MULTI_TERMS_AND_SCRIPTED_FIELDS, + TERMS_WITH_MULTIPLE_TIMESHIFT, +} from '../../../../../user_messages_ids'; const fullSeparatorString = ` ${MULTI_KEY_VISUAL_SEPARATOR} `; @@ -34,21 +42,27 @@ export function getMultiTermsScriptedFieldErrorMessage( layer: FormBasedLayer, columnId: string, indexPattern: IndexPattern -) { +): FieldBasedOperationErrorMessage[] { const currentColumn = layer.columns[columnId] as TermsIndexPatternColumn; const usedFields = [currentColumn.sourceField, ...(currentColumn.params.secondaryFields ?? [])]; const scriptedFields = usedFields.filter((field) => indexPattern.getFieldByName(field)?.scripted); if (usedFields.length < 2 || !scriptedFields.length) { - return; + return []; } - return i18n.translate('xpack.lens.indexPattern.termsWithMultipleTermsAndScriptedFields', { - defaultMessage: 'Scripted fields are not supported when using multiple fields, found {fields}', - values: { - fields: scriptedFields.join(', '), + return [ + { + uniqueId: TERMS_MULTI_TERMS_AND_SCRIPTED_FIELDS, + message: i18n.translate('xpack.lens.indexPattern.termsWithMultipleTermsAndScriptedFields', { + defaultMessage: + 'Scripted fields are not supported when using multiple fields, found {fields}', + values: { + fields: scriptedFields.join(', '), + }, + }), }, - }); + ]; } function getQueryForMultiTerms(fieldNames: string[], term: string) { @@ -92,7 +106,7 @@ export function getDisallowedTermsMessage( layer: FormBasedLayer, columnId: string, indexPattern: IndexPattern -) { +): FieldBasedOperationErrorMessage[] { const referenced: Set = new Set(); Object.entries(layer.columns).forEach(([cId, c]) => { if ('references' in c) { @@ -112,116 +126,119 @@ export function getDisallowedTermsMessage( .map(([colId, col]) => col.timeShift || '') ).length > 1; if (!hasMultipleShifts) { - return undefined; + return []; } - return { - message: i18n.translate('xpack.lens.indexPattern.termsWithMultipleShifts', { - defaultMessage: - 'In a single layer, you are unable to combine metrics with different time shifts and dynamic top values. Use the same time shift value for all metrics, or use filters instead of top values.', - }), - fixAction: { - label: i18n.translate('xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel', { - defaultMessage: 'Use filters', + return [ + { + uniqueId: TERMS_WITH_MULTIPLE_TIMESHIFT, + message: i18n.translate('xpack.lens.indexPattern.termsWithMultipleShifts', { + defaultMessage: + 'In a single layer, you are unable to combine metrics with different time shifts and dynamic top values. Use the same time shift value for all metrics, or use filters instead of top values.', }), - newState: async ( - data: DataPublicPluginStart, - core: CoreStart, - frame: FramePublicAPI, - layerId: string - ) => { - const currentColumn = layer.columns[columnId] as TermsIndexPatternColumn; - const fieldNames = [ - currentColumn.sourceField, - ...(currentColumn.params?.secondaryFields ?? []), - ]; - const activeDataFieldNameMatch = - frame.activeData?.[layerId].columns.find(({ id }) => id === columnId)?.meta.field === - fieldNames[0]; + fixAction: { + label: i18n.translate('xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel', { + defaultMessage: 'Use filters', + }), + newState: async ( + data: DataPublicPluginStart, + core: CoreStart, + frame: FramePublicAPI, + layerId: string + ) => { + const currentColumn = layer.columns[columnId] as TermsIndexPatternColumn; + const fieldNames = [ + currentColumn.sourceField, + ...(currentColumn.params?.secondaryFields ?? []), + ]; + const activeDataFieldNameMatch = + frame.activeData?.[layerId].columns.find(({ id }) => id === columnId)?.meta.field === + fieldNames[0]; - let currentTerms = uniq( - frame.activeData?.[layerId].rows - .map((row) => row[columnId] as string | MultiFieldKeyFormat) - .filter((term) => - fieldNames.length > 1 - ? isMultiFieldValue(term) && term.keys[0] !== '__other__' - : typeof term === 'string' && term !== '__other__' - ) - .map((term: string | MultiFieldKeyFormat) => - isMultiFieldValue(term) ? term.keys.join(fullSeparatorString) : term - ) || [] - ); - if (!activeDataFieldNameMatch || currentTerms.length === 0) { - if (fieldNames.length === 1) { - const currentDataView = await data.dataViews.get(indexPattern.id); - const response: FieldStatsResponse = await loadFieldStats({ - services: { data }, - dataView: currentDataView, - field: indexPattern.getFieldByName(fieldNames[0])! as DataViewField, - dslQuery: buildEsQuery( - indexPattern, - frame.query, - frame.filters, - getEsQueryConfig(core.uiSettings) - ), - fromDate: frame.dateRange.fromDate, - toDate: frame.dateRange.toDate, - size: currentColumn.params.size, - }); - currentTerms = response.topValues?.buckets.map(({ key }) => String(key)) || []; + let currentTerms = uniq( + frame.activeData?.[layerId].rows + .map((row) => row[columnId] as string | MultiFieldKeyFormat) + .filter((term) => + fieldNames.length > 1 + ? isMultiFieldValue(term) && term.keys[0] !== '__other__' + : typeof term === 'string' && term !== '__other__' + ) + .map((term: string | MultiFieldKeyFormat) => + isMultiFieldValue(term) ? term.keys.join(fullSeparatorString) : term + ) || [] + ); + if (!activeDataFieldNameMatch || currentTerms.length === 0) { + if (fieldNames.length === 1) { + const currentDataView = await data.dataViews.get(indexPattern.id); + const response: FieldStatsResponse = await loadFieldStats({ + services: { data }, + dataView: currentDataView, + field: indexPattern.getFieldByName(fieldNames[0])! as DataViewField, + dslQuery: buildEsQuery( + indexPattern, + frame.query, + frame.filters, + getEsQueryConfig(core.uiSettings) + ), + fromDate: frame.dateRange.fromDate, + toDate: frame.dateRange.toDate, + size: currentColumn.params.size, + }); + currentTerms = response.topValues?.buckets.map(({ key }) => String(key)) || []; + } + } + // when multi terms the meta.field will always be undefined, so limit the check to no data + if (fieldNames.length > 1 && currentTerms.length === 0) { + // this will produce a query like `field1: * AND field2: * ...etc` + // which is the best we can do for multiple terms when no data is available + currentTerms = [Array(fieldNames.length).fill('*').join(fullSeparatorString)]; } - } - // when multi terms the meta.field will always be undefined, so limit the check to no data - if (fieldNames.length > 1 && currentTerms.length === 0) { - // this will produce a query like `field1: * AND field2: * ...etc` - // which is the best we can do for multiple terms when no data is available - currentTerms = [Array(fieldNames.length).fill('*').join(fullSeparatorString)]; - } - return { - ...layer, - columns: { - ...layer.columns, - [columnId]: { - label: i18n.translate('xpack.lens.indexPattern.pinnedTopValuesLabel', { - defaultMessage: 'Filters of {field}', - values: { - field: - fieldNames.length > 1 ? fieldNames.join(fullSeparatorString) : fieldNames[0], - }, - }), - customLabel: true, - isBucketed: layer.columns[columnId].isBucketed, - dataType: 'string', - operationType: 'filters', - params: { - filters: - currentTerms.length > 0 - ? currentTerms.map((term) => ({ - input: { - query: - fieldNames.length === 1 - ? `${fieldNames[0]}: "${term}"` - : getQueryForMultiTerms(fieldNames, term), - language: 'kuery', - }, - label: getQueryLabel(fieldNames, term), - })) - : [ - { + return { + ...layer, + columns: { + ...layer.columns, + [columnId]: { + label: i18n.translate('xpack.lens.indexPattern.pinnedTopValuesLabel', { + defaultMessage: 'Filters of {field}', + values: { + field: + fieldNames.length > 1 ? fieldNames.join(fullSeparatorString) : fieldNames[0], + }, + }), + customLabel: true, + isBucketed: layer.columns[columnId].isBucketed, + dataType: 'string', + operationType: 'filters', + params: { + filters: + currentTerms.length > 0 + ? currentTerms.map((term) => ({ input: { - query: '*', + query: + fieldNames.length === 1 + ? `${fieldNames[0]}: "${term}"` + : getQueryForMultiTerms(fieldNames, term), language: 'kuery', }, - label: defaultLabel, - }, - ], - }, - } as FiltersIndexPatternColumn, - }, - }; + label: getQueryLabel(fieldNames, term), + })) + : [ + { + input: { + query: '*', + language: 'kuery', + }, + label: defaultLabel, + }, + ], + }, + } as FiltersIndexPatternColumn, + }, + }; + }, }, }, - }; + ]; } function checkLastValue(column: GenericIndexPatternColumn) { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/index.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/index.tsx index 0ffc918844f75..62c5b777bf37b 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/index.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/index.tsx @@ -206,12 +206,11 @@ export const termsOperation: OperationDefinition< } }, getErrorMessage: (layer, columnId, indexPattern) => { - const messages = [ - ...(getInvalidFieldMessage(layer, columnId, indexPattern) || []), - getDisallowedTermsMessage(layer, columnId, indexPattern) || '', - getMultiTermsScriptedFieldErrorMessage(layer, columnId, indexPattern) || '', - ].filter(Boolean); - return messages.length ? messages : undefined; + return [ + ...getInvalidFieldMessage(layer, columnId, indexPattern), + ...getDisallowedTermsMessage(layer, columnId, indexPattern), + ...getMultiTermsScriptedFieldErrorMessage(layer, columnId, indexPattern), + ]; }, getNonTransferableFields: (column, newIndexPattern) => { return getFieldsByValidationState(newIndexPattern, column).invalidFields; @@ -574,9 +573,8 @@ export const termsOperation: OperationDefinition< return ; } - const showScriptedFieldError = Boolean( - getMultiTermsScriptedFieldErrorMessage(layer, columnId, indexPattern) - ); + const showScriptedFieldError = + getMultiTermsScriptedFieldErrorMessage(layer, columnId, indexPattern).length > 0; const { invalidFields } = getFieldsByValidationState(indexPattern, selectedColumn); return ( diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx index ef80e79f291e9..141906c712076 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx @@ -41,6 +41,7 @@ import { ReferenceEditor } from '../../../dimension_panel/reference_editor'; import { IndexPattern } from '../../../../../types'; import { cloneDeep } from 'lodash'; import { IncludeExcludeRow } from './include_exclude_options'; +import { TERMS_MULTI_TERMS_AND_SCRIPTED_FIELDS } from '../../../../../user_messages_ids'; jest.mock('@kbn/unified-field-list/src/services/field_stats', () => ({ loadFieldStats: jest.fn().mockResolvedValue({ @@ -1375,8 +1376,7 @@ describe('terms', () => { it('should show an error message when any field but the first is invalid', () => { const updateLayerSpy = jest.fn(); const operationSupportMatrix = getDefaultOperationSupportMatrix('col1'); - - layer.columns.col1 = { + const col1: TermsIndexPatternColumn = { label: 'Top value of geo.src + 1 other', dataType: 'string', isBucketed: true, @@ -1388,7 +1388,8 @@ describe('terms', () => { secondaryFields: ['unsupported'], }, sourceField: 'geo.src', - } as TermsIndexPatternColumn; + }; + layer.columns.col1 = col1; const instance = mount( { updateLayer={updateLayerSpy} columnId="col1" operationSupportMatrix={operationSupportMatrix} - selectedColumn={layer.columns.col1 as TermsIndexPatternColumn} + selectedColumn={col1} /> ); expect( @@ -2736,7 +2737,7 @@ describe('terms', () => { }; }); it('returns undefined for no errors found', () => { - expect(termsOperation.getErrorMessage!(layer, 'col1', indexPattern)).toEqual(undefined); + expect(termsOperation.getErrorMessage!(layer, 'col1', indexPattern)).toHaveLength(0); }); it('returns error message if the sourceField does not exist in index pattern', () => { layer = { @@ -2780,6 +2781,7 @@ describe('terms', () => { } } />, + "uniqueId": "field_not_found", }, ] `); @@ -2795,7 +2797,7 @@ describe('terms', () => { } as TermsIndexPatternColumn, }, }; - expect(termsOperation.getErrorMessage!(layer, 'col1', indexPattern)).toBeUndefined(); + expect(termsOperation.getErrorMessage!(layer, 'col1', indexPattern)).toHaveLength(0); }); it('return error for scripted field when in multi terms mode', () => { @@ -2814,7 +2816,10 @@ describe('terms', () => { }, }; expect(termsOperation.getErrorMessage!(layer, 'col1', indexPattern)).toEqual([ - 'Scripted fields are not supported when using multiple fields, found scripted', + { + uniqueId: TERMS_MULTI_TERMS_AND_SCRIPTED_FIELDS, + message: 'Scripted fields are not supported when using multiple fields, found scripted', + }, ]); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/reduced_time_range_utils.tsx b/x-pack/plugins/lens/public/datasources/form_based/reduced_time_range_utils.tsx index aaa5a446b514c..ff5465dabee72 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/reduced_time_range_utils.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/reduced_time_range_utils.tsx @@ -9,6 +9,10 @@ import { i18n } from '@kbn/i18n'; import type { FormBasedLayer } from './types'; import type { IndexPattern } from '../../types'; import type { FieldBasedOperationErrorMessage } from './operations/definitions'; +import { + REDUCED_TIME_RANGE_DEFAULT_DATE_FIELD, + REDUCED_TIME_RANGE_NO_DATE_HISTOGRAM, +} from '../../user_messages_ids'; export const reducedTimeRangeOptions = [ { @@ -57,33 +61,39 @@ export function getColumnReducedTimeRangeError( layer: FormBasedLayer, columnId: string, indexPattern: IndexPattern -): FieldBasedOperationErrorMessage[] | undefined { +): FieldBasedOperationErrorMessage[] { const currentColumn = layer.columns[columnId]; if (!currentColumn.reducedTimeRange) { - return; + return []; } const hasDateHistogram = Object.values(layer.columns).some( (column) => column.operationType === 'date_histogram' ); const hasTimeField = Boolean(indexPattern.timeFieldName); - const errors: FieldBasedOperationErrorMessage[] = [ - hasDateHistogram && - i18n.translate('xpack.lens.indexPattern.reducedTimeRangeWithDateHistogram', { + const errors: FieldBasedOperationErrorMessage[] = []; + if (hasDateHistogram) { + errors.push({ + uniqueId: REDUCED_TIME_RANGE_NO_DATE_HISTOGRAM, + message: i18n.translate('xpack.lens.indexPattern.reducedTimeRangeWithDateHistogram', { defaultMessage: 'Reduced time range can only be used without a date histogram. Either remove the date histogram dimension or remove the reduced time range from {column}.', values: { column: currentColumn.label, }, }), - !hasTimeField && - i18n.translate('xpack.lens.indexPattern.reducedTimeRangeWithoutTimefield', { + }); + } + if (!hasTimeField) { + errors.push({ + uniqueId: REDUCED_TIME_RANGE_DEFAULT_DATE_FIELD, + message: i18n.translate('xpack.lens.indexPattern.reducedTimeRangeWithoutTimefield', { defaultMessage: 'Reduced time range can only be used with a specified default time field on the data view. Either use a different data view with default time field or remove the reduced time range from {column}.', values: { column: currentColumn.label, }, }), - ].filter(Boolean) as FieldBasedOperationErrorMessage[]; - + }); + } return errors; } diff --git a/x-pack/plugins/lens/public/datasources/form_based/time_shift_utils.tsx b/x-pack/plugins/lens/public/datasources/form_based/time_shift_utils.tsx index c287a93675f64..ef34542539468 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/time_shift_utils.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/time_shift_utils.tsx @@ -20,7 +20,8 @@ import { } from '@kbn/data-plugin/common'; import type { DateRange } from '../../../common/types'; import type { FormBasedLayer, FormBasedPrivateState } from './types'; -import type { FramePublicAPI, IndexPattern } from '../../types'; +import type { FramePublicAPI, IndexPattern, UserMessage } from '../../types'; +import { TIMESHIFT_LT_INTERVAL, TIMESHIFT_NOT_MULTIPLE_INTERVAL } from '../../user_messages_ids'; export function parseTimeShiftWrapper(timeShiftString: string, dateRange: DateRange) { if (isAbsoluteTimeShift(timeShiftString.trim())) { @@ -175,9 +176,9 @@ export function getStateTimeShiftWarningMessages( datatableUtilities: DatatableUtilitiesService, state: FormBasedPrivateState, { activeData, dataViews }: FramePublicAPI -) { - if (!state) return; - const warningMessages: React.ReactNode[] = []; +): UserMessage[] { + if (!state) return []; + const warningMessages: UserMessage[] = []; Object.entries(state.layers).forEach(([layerId, layer]) => { const layerIndexPattern = dataViews.indexPatterns[layer.indexPatternId]; if (!layerIndexPattern) { @@ -198,6 +199,7 @@ export function getStateTimeShiftWarningMessages( const timeShifts = new Set(); const timeShiftMap: Record = {}; Object.entries(layer.columns).forEach(([columnId, column]) => { + // TODO: I believe this can be replaced with a similar code like getColumnTimeShiftWarnings if (column.isBucketed) return; let duration: number = 0; // skip absolute time shifts as underneath it will be converted to be round @@ -224,33 +226,47 @@ export function getStateTimeShiftWarningMessages( if (timeShift === 0) return; if (timeShift < shiftInterval) { timeShiftMap[timeShift].forEach((columnId) => { - warningMessages.push( - {layer.columns[columnId].label}, - interval: {dateHistogramIntervalExpression}, - columnTimeShift: {layer.columns[columnId].timeShift}, - }} - /> - ); + warningMessages.push({ + uniqueId: TIMESHIFT_LT_INTERVAL, + severity: 'warning', + fixableInEditor: true, + displayLocations: [{ id: 'toolbar' }], + shortMessage: '', + longMessage: ( + {layer.columns[columnId].label}, + interval: {dateHistogramIntervalExpression}, + columnTimeShift: {layer.columns[columnId].timeShift}, + }} + /> + ), + }); }); } else if (!Number.isInteger(timeShift / shiftInterval)) { timeShiftMap[timeShift].forEach((columnId) => { - warningMessages.push( - {layer.columns[columnId].label}, - interval: {dateHistogramIntervalExpression}, - columnTimeShift: {layer.columns[columnId].timeShift!}, - }} - /> - ); + warningMessages.push({ + uniqueId: TIMESHIFT_NOT_MULTIPLE_INTERVAL, + severity: 'warning', + fixableInEditor: true, + displayLocations: [{ id: 'toolbar' }], + shortMessage: '', + longMessage: ( + {layer.columns[columnId].label}, + interval: {dateHistogramIntervalExpression}, + columnTimeShift: {layer.columns[columnId].timeShift!}, + }} + /> + ), + }); }); } }); @@ -261,12 +277,12 @@ export function getStateTimeShiftWarningMessages( export function getColumnTimeShiftWarnings( dateHistogramInterval: ReturnType, timeShift: string | undefined -) { +): string[] { const { isValueTooSmall, isValueNotMultiple } = getLayerTimeShiftChecks(dateHistogramInterval); const warnings: string[] = []; if (isAbsoluteTimeShift(timeShift)) { - return warnings; + return []; } const parsedLocalValue = timeShift && parseTimeShift(timeShift); diff --git a/x-pack/plugins/lens/public/datasources/form_based/utils.tsx b/x-pack/plugins/lens/public/datasources/form_based/utils.tsx index 280e2d6a19a1a..8d74c44c40db6 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/utils.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/utils.tsx @@ -64,6 +64,16 @@ import { DEFAULT_MAX_DOC_COUNT } from './operations/definitions/terms/constants' import { getOriginalId } from '../../../common/expressions/datatable/transpose_helpers'; import { ReducedSamplingSectionEntries } from './info_badges'; import { IgnoredGlobalFiltersEntries } from '../../shared_components/ignore_global_filter'; +import { + INCOMPLETE_ES_RESULTS, + LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS, + LAYER_SETTINGS_RANDOM_SAMPLING_INFO, + PRECISION_ERROR_ACCURACY_MODE_DISABLED, + PRECISION_ERROR_ACCURACY_MODE_ENABLED, + PRECISION_ERROR_ASC_COUNT_PRECISION, + TSDB_UNSUPPORTED_COUNTER_OP, + UNSUPPORTED_DOWNSAMPLED_INDEX_AGG_PREFIX, +} from '../../user_messages_ids'; function isMinOrMaxColumn( column?: GenericIndexPatternColumn @@ -103,62 +113,56 @@ export function getSamplingValue(layer: FormBasedLayer) { export function isColumnInvalid( layer: FormBasedLayer, + column: GenericIndexPatternColumn, columnId: string, indexPattern: IndexPattern, - dateRange: DateRange | undefined, + dateRange: DateRange, targetBars: number -) { - const column: GenericIndexPatternColumn | undefined = layer.columns[columnId]; - if (!column || !indexPattern) return; - - const operationDefinition = column.operationType && operationDefinitionMap[column.operationType]; +): boolean { // check also references for errors const referencesHaveErrors = - true && 'references' in column && - Boolean( - getReferencesErrors(layer, column, indexPattern, dateRange, targetBars).filter(Boolean).length - ); - - const operationErrorMessages = - operationDefinition && - operationDefinition.getErrorMessage?.( - layer, - columnId, - indexPattern, - dateRange, - operationDefinitionMap, - targetBars - ); + hasReferencesErrors(layer, column, indexPattern, dateRange, targetBars); + + const operationHasErrorMessages = + ( + operationDefinitionMap[column.operationType]?.getErrorMessage?.( + layer, + columnId, + indexPattern, + dateRange, + operationDefinitionMap, + targetBars + ) ?? [] + ).length > 0; // it looks like this is just a back-stop since we prevent // invalid filters from being set at the UI level const filterHasError = column.filter ? !isQueryValid(column.filter, indexPattern) : false; - - return ( - (operationErrorMessages && operationErrorMessages.length > 0) || - referencesHaveErrors || - filterHasError - ); + return operationHasErrorMessages || referencesHaveErrors || filterHasError; } -function getReferencesErrors( +function hasReferencesErrors( layer: FormBasedLayer, column: ReferenceBasedIndexPatternColumn, indexPattern: IndexPattern, - dateRange: DateRange | undefined, + dateRange: DateRange, targetBars: number ) { - return column.references?.map((referenceId: string) => { + return column.references?.some((referenceId: string) => { const referencedOperation = layer.columns[referenceId]?.operationType; const referencedDefinition = operationDefinitionMap[referencedOperation]; - return referencedDefinition?.getErrorMessage?.( - layer, - referenceId, - indexPattern, - dateRange, - operationDefinitionMap, - targetBars + return ( + ( + referencedDefinition?.getErrorMessage?.( + layer, + referenceId, + indexPattern, + dateRange, + operationDefinitionMap, + targetBars + ) ?? [] + ).length > 0 ); }); } @@ -173,7 +177,7 @@ export function fieldIsInvalid( if (!column || !hasField(column)) { return false; } - return !!getInvalidFieldMessage(layer, columnId, indexPattern)?.length; + return getInvalidFieldMessage(layer, columnId, indexPattern).length > 0; } const accuracyModeDisabledWarning = ( @@ -181,6 +185,7 @@ const accuracyModeDisabledWarning = ( columnId: string, enableAccuracyMode: () => void ): UserMessage => ({ + uniqueId: PRECISION_ERROR_ACCURACY_MODE_DISABLED, severity: 'warning', displayLocations: [{ id: 'toolbar' }, { id: 'dimensionButton', dimensionId: columnId }], fixableInEditor: true, @@ -215,6 +220,7 @@ const accuracyModeEnabledWarning = ( columnId: string, docLink: string ): UserMessage => ({ + uniqueId: PRECISION_ERROR_ACCURACY_MODE_ENABLED, severity: 'warning', displayLocations: [{ id: 'toolbar' }, { id: 'dimensionButton', dimensionId: columnId }], fixableInEditor: true, @@ -284,27 +290,25 @@ export function getSearchWarningMessages( ].includes(col.operationType) ) .map((col) => col.label) - ).map( - (label) => - ({ - uniqueId: `unsupported_aggregation_on_downsampled_index--${label}`, - severity: 'warning', - fixableInEditor: true, - displayLocations: [{ id: 'toolbar' }, { id: 'embeddableBadge' }], - shortMessage: '', - longMessage: i18n.translate('xpack.lens.indexPattern.tsdbRollupWarning', { - defaultMessage: - '{label} uses a function that is unsupported by rolled up data. Select a different function or change the time range.', - values: { - label, - }, - }), - } as UserMessage) - ) + ).map((label) => ({ + // TODO: we probably need to move label as part of the meta data + uniqueId: `${UNSUPPORTED_DOWNSAMPLED_INDEX_AGG_PREFIX}--${label}`, + severity: 'warning', + fixableInEditor: true, + displayLocations: [{ id: 'toolbar' }, { id: 'embeddableBadge' }], + shortMessage: '', + longMessage: i18n.translate('xpack.lens.indexPattern.tsdbRollupWarning', { + defaultMessage: + '{label} uses a function that is unsupported by rolled up data. Select a different function or change the time range.', + values: { + label, + }, + }), + })) ) : [ { - uniqueId: `incomplete`, + uniqueId: INCOMPLETE_ES_RESULTS, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }, { id: 'embeddableBadge' }], @@ -315,7 +319,7 @@ export function getSearchWarningMessages( warnings={[warning]} /> ), - } as UserMessage, + }, ]; } } @@ -376,6 +380,7 @@ export function getUnsupportedOperationsWarningMessage( for (const columnsGrouped of columnsGroupedByField) { const sourceField = columnsGrouped[0][0].sourceField; warningMessages.push({ + uniqueId: TSDB_UNSUPPORTED_COUNTER_OP, severity: 'warning', fixableInEditor: false, displayLocations: [{ id: 'toolbar' }, { id: 'embeddableBadge' }], @@ -507,6 +512,7 @@ export function getPrecisionErrorWarningMessages( ); } else { warningMessages.push({ + uniqueId: PRECISION_ERROR_ASC_COUNT_PRECISION, severity: 'warning', displayLocations: [ { id: 'toolbar' }, @@ -611,7 +617,7 @@ export function getNotifiableFeatures( ); if (layersWithCustomSamplingValues.length) { features.push({ - uniqueId: 'random_sampling_info', + uniqueId: LAYER_SETTINGS_RANDOM_SAMPLING_INFO, severity: 'info', fixableInEditor: false, shortMessage: i18n.translate('xpack.lens.indexPattern.samplingPerLayer', { @@ -630,7 +636,7 @@ export function getNotifiableFeatures( const layersWithIgnoreGlobalFilters = layers.filter(([, layer]) => layer.ignoreGlobalFilters); if (layersWithIgnoreGlobalFilters.length) { features.push({ - uniqueId: 'ignoring-global-filters-layers', + uniqueId: LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS, severity: 'info', fixableInEditor: false, shortMessage: i18n.translate('xpack.lens.xyChart.layerAnnotationsIgnoreTitle', { diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts index 8904031615bcf..e4bc8c955a4ef 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts @@ -612,6 +612,7 @@ describe('Textbased Data Source', () => { "longMessage": "error 1", "severity": "error", "shortMessage": "error 1", + "uniqueId": "text_based_lang_error", }, Object { "displayLocations": Array [ @@ -626,6 +627,7 @@ describe('Textbased Data Source', () => { "longMessage": "error 2", "severity": "error", "shortMessage": "error 2", + "uniqueId": "text_based_lang_error", }, ] `); diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx index 85d622380695c..8cf8ce7ebd360 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx @@ -54,6 +54,7 @@ import { addColumnsToCache, retrieveLayerColumnsFromCache, } from './fieldlist_cache'; +import { TEXT_BASED_LANGUAGE_ERROR } from '../../user_messages_ids'; function getLayerReferenceName(layerId: string) { return `textBasedLanguages-datasource-layer-${layerId}`; @@ -308,6 +309,7 @@ export function getTextBasedDatasource({ }); return errors.map((err) => { const message: UserMessage = { + uniqueId: TEXT_BASED_LANGUAGE_ERROR, severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }, { id: 'textBasedLanguagesQueryInput' }], diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx index e6d67bb4eb3db..5b8318c58498c 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx @@ -668,6 +668,7 @@ describe('workspace_panel', () => { it('should show configuration error messages if present', async () => { const messages: UserMessage[] = [ { + uniqueId: 'unique_id_1', severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], @@ -675,6 +676,7 @@ describe('workspace_panel', () => { longMessage: "i'm an error", }, { + uniqueId: 'unique_id_2', severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx index c574d575bd5d9..bfca879d18d73 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx @@ -43,7 +43,6 @@ import { UserMessage, UserMessagesGetter, AddUserMessages, - isMessageRemovable, VisualizationDisplayOptions, } from '../../../types'; import { switchToSuggestion } from '../suggestion_helpers'; @@ -267,9 +266,7 @@ export const InnerWorkspacePanel = React.memo(function InnerWorkspacePanel({ } if (requestWarnings.length) { - removeSearchWarningMessagesRef.current = addUserMessages( - requestWarnings.filter(isMessageRemovable) - ); + removeSearchWarningMessagesRef.current = addUserMessages(requestWarnings); } else if (removeSearchWarningMessagesRef.current) { removeSearchWarningMessagesRef.current(); removeSearchWarningMessagesRef.current = undefined; diff --git a/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx b/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx index 062cbcc867fa2..c938b5c3ab940 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx @@ -8,11 +8,11 @@ import { ExpressionRenderError } from '@kbn/expressions-plugin/public'; import { renderSearchError } from '@kbn/search-errors'; import React from 'react'; -import { RemovableUserMessage } from '../types'; +import { UserMessage } from '../types'; export function getOriginalRequestErrorMessages( error: ExpressionRenderError | null -): RemovableUserMessage[] { +): UserMessage[] { const errorMessages: Array = []; if (error && 'original' in error && error.original) { const searchErrorDisplay = renderSearchError(error.original); diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx index 391201bafad02..c162679c6bb89 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx @@ -257,6 +257,7 @@ describe('embeddable', () => { jest.spyOn(embeddable, 'getUserMessages').mockReturnValue([ { + uniqueId: 'error', severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 366b631f7f54b..041d803baad12 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -106,7 +106,6 @@ import { IndexPatternRef, FramePublicAPI, AddUserMessages, - isMessageRemovable, UserMessagesGetter, UserMessagesDisplayLocationId, } from '../types'; @@ -1000,9 +999,7 @@ export class Embeddable this.removeActiveDataWarningMessages(); const searchWarningMessages = this.getSearchWarningMessages(adapters); - this.removeActiveDataWarningMessages = this.addUserMessages( - searchWarningMessages.filter(isMessageRemovable) - ); + this.removeActiveDataWarningMessages = this.addUserMessages(searchWarningMessages); this.activeData = newActiveData; diff --git a/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.test.tsx index 6e0e7077b2899..017df48d0bb81 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.test.tsx @@ -27,6 +27,7 @@ describe('EmbeddableFeatureBadge', () => { { it('should render a description of the badge in a tooltip on hover', async () => { renderPopup([ { + uniqueId: 'unique_id', shortMessage: 'Short message', longMessage: 'Long text', severity: 'info', @@ -104,46 +106,11 @@ describe('EmbeddableFeatureBadge', () => { expect(await screen.findAllByText('LongText', { exact: false })).toHaveLength(2); }); - it('should render messages without id first, then grouped messages', async () => { - renderPopup( - [ - { - shortMessage: 'Section2', - longMessage:
    AnotherText
    , - severity: 'info', - fixableInEditor: false, - displayLocations: [], - }, - { - uniqueId: '1', - shortMessage: 'Section1', - longMessage:
    LongText1
    , - severity: 'info', - fixableInEditor: false, - displayLocations: [], - }, - { - uniqueId: '1', - shortMessage: 'Section1', - longMessage:
    LongText2
    , - severity: 'info', - fixableInEditor: false, - displayLocations: [], - }, - ], - 2 // last two messages are grouped - ); - expect(await screen.findAllByText('Section', { exact: false })).toHaveLength(2); - // now check the order - const longMessages = await screen.findAllByText('Text', { exact: false }); - expect(longMessages[0]).toHaveTextContent('AnotherText'); - expect(longMessages[1]).toHaveTextContent('LongText1'); - }); - describe('Horizontal rules', () => { it('should render no rule for single message', async () => { renderPopup([ { + uniqueId: 'unique_id', shortMessage: `Section1`, longMessage:
    hello
    , severity: 'info', @@ -155,45 +122,10 @@ describe('EmbeddableFeatureBadge', () => { await screen.queryByTestId('lns-feature-badges-horizontal-rule') ).not.toBeInTheDocument(); }); - it('should apply an horizontal if there are multiple messages without id', async () => { - const messages = [1, 2, 3].map((id) => ({ - shortMessage: `Section${id}`, - longMessage:
    {id}
    , - severity: 'info' as const, - fixableInEditor: false, - displayLocations: [], - })); - renderPopup(messages); - expect(await screen.getAllByTestId('lns-feature-badges-horizontal-rule')).toHaveLength( - messages.length - 1 - ); - }); - - it('should apply a rule between messages without id and grouped ones', async () => { - const messages = [ - { - uniqueId: 'myId', - shortMessage: `Section1`, - longMessage:
    Grouped
    , - severity: 'info' as const, - fixableInEditor: false, - displayLocations: [], - }, - { - shortMessage: `Section2`, - longMessage:
    NoId
    , - severity: 'info' as const, - fixableInEditor: false, - displayLocations: [], - }, - ]; - renderPopup(messages); - expect(await screen.getAllByTestId('lns-feature-badges-horizontal-rule')).toHaveLength(1); - }); - it('should apply rules taking into account grouped messages', async () => { - const messages = [ + const messages: UserMessage[] = [ { + uniqueId: 'myId0', shortMessage: `Section2`, longMessage:
    NoId
    , severity: 'info' as const, diff --git a/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.tsx b/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.tsx index a1823201382c2..b774535113a48 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.tsx @@ -36,20 +36,13 @@ export const EmbeddableFeatureBadge = ({ messages }: { messages: UserMessage[] } count: messages.length, }, }); - - const messagesWithoutUniqueId = messages.filter(({ uniqueId }) => !uniqueId); // compact messages be grouping longMessage together on matching unique-id - const messagesGroupedByUniqueId: Record = {}; + const groupedMessages: Map = new Map(); for (const message of messages) { - if (message.uniqueId) { - if (!messagesGroupedByUniqueId[message.uniqueId]) { - messagesGroupedByUniqueId[message.uniqueId] = []; - } - messagesGroupedByUniqueId[message.uniqueId].push(message); - } + const group = groupedMessages.get(message.uniqueId) ?? []; + group.push(message); + groupedMessages.set(message.uniqueId, group); } - const messageCount = - messagesWithoutUniqueId.length + Object.keys(messagesGroupedByUniqueId).length; return ( - {messageCount} + {groupedMessages.size}
    } @@ -86,39 +79,16 @@ export const EmbeddableFeatureBadge = ({ messages }: { messages: UserMessage[] } `} data-test-subj="lns-feature-badges-panel" > - {messagesWithoutUniqueId.map(({ shortMessage, longMessage }, index) => { - return ( - - {index ? ( - - ) : null} - - - ); - })} - {Object.entries(messagesGroupedByUniqueId).map(([uniqueId, messagesByUniqueId], index) => { - const hasHorizontalRule = messagesWithoutUniqueId.length || index; - const [{ shortMessage }] = messagesByUniqueId; + {[...groupedMessages.entries()].map(([uniqueId, messageGroup], index) => { + const [{ shortMessage }] = messageGroup; return ( - {hasHorizontalRule ? ( + {index > 0 && ( - ) : null} + )}
    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℞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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_add_agent_2.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_add_agent_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b99e8f7a5b90f731c45be873ff98f2551efd6ca2 GIT binary patch literal 514717 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ʒ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%0A=fiZtL#?>3^&Q2Pc zMO+Hy$X6E=Nr$8fNHS?(G|D^^dk%Z! z#@xE!O;((}ZuY(Qt>wx`@eU$Ny>aZET7C-#PVsX-$ZvV7Q>QzloTmhoUW8IBuI>;~ zlQRfilU`#wan|!`Qm#A<#aTB~#v~aqTytF=g~R4GAv{o(Q)lEUs^s$G*tdn#%7YL2 zJIG6vsv|gvvw3f;Qu?@LAc=cne4bK{O1#!x>i(_(x-h|k^XYra`KJWSX%EerVy%`2 z@?GcVnswi2l_kuabh0wB4Sk3z3656cFtgF`3|(D+an^}ppRY)0c}d1x$zr%2&8%W! z*lpb2ZPyRV7|*LP{#rSe*S+~GcFgqy{`W>@TH=f{GwES+2n_0={R7m21mINuusdH3 z6G;nKLj}M88aBHeLNS}TgHP6h+D zz1F+bM)ryaaGkh1Sh|_)g;DYL`kq?kxJm>o5@K7tZeQB%B6fenbi_5ea}xX&GqyAR z!AeTH`9Zoq7hNY2_z8Z^Hsd}tut@8%biQ#Pm&(h`(ti(E7LOaGM!=vKId;~%uM@K2r zE|V{1n60}^ISqKdPKGDlthakeX(!4@I6s&yVze?`Us~NKyeldzTg7p-hoUuF_GM9K zVU#vAvoF_yY3WtWLPEAj`I8lDot3RuPmdc}sL`UuCzkr9YggS5`v%7aFy^w3FFv>u z(etDldYErI>Ef=JXZ6%ZSNCi^JSKwi*~0|;;5E8jl!-=$q7Iw*#A{i^9M0meH0?;_ zhi(u0kn-q?YNqdmB=bDW(zTOuS}d=cx$2t8a^~r5ZWpk6-@1+GR!qnW`6VfBI+mK} zgk1Kj(dJwf3i_1HW#c8zpk@Rn^iN*jtkh|k^ zSG7K`4+;QBL@dH3h-$OMWM7kZTy=Ff@xDX4?aKU_MWyqO%h3)KgO#_KhOF%DsP9e! z?+t0^t{jYXrY^^^cu6YH%Qb##9T)grc?LtiM*|S&p z2EF3Z9k&~bn^Mw`cp~Dk9$sUS7d;vgB^9jqd5Js)k1@2kW9J0;5Q8G^dW}yW-d);Y zlY}0+g&TRRt5$nKWKic@o0?zQK1Ag)RyLg-=j?l5?UaAIs-m(prIiZJ>*C~H%j2eC z<>9f-TVJe!9G?&in7J?bpp{xK@FTgJ4ZC%~=Vm4555DvoVYaY#Cr^uG`MjMG*WJBX^{rb-3#Kpvr!-fxfQ{(aU9=i zVV7qJr$yg^qC7{nIxy(k)7+3f??cJ?NS11a?XGK2%cG+3A;E5O&B@J?T_Zd(&7|@C znRnIzy0=!^ciu1AX++E1PutI+l%103c4_p17B7lx*L2j*HR5g%j@x`w&VJt$3TgRo z->HnWPZffQG~o}pJ{8ES-4?&h|5bZ9B7fB$3km*SOl|@nf+-=bVV{WJEUg$Tn~RDQ zRK@jt@Yz>qTAJvF?4>Q3h<2#0x-W5ZG9RWB2+-ReUWT^O>o%r@xPT$M_YbcDuE{}; z&Hs)M7DMMVWvM5L<-NLQ+K1OWj7l_pZ6(gdVPhY%1EumRG0QK|$8(pwS` zrIXMjHT2L!FA0!$!#N&3>g{ts-}jF3j=_%@Fxh*rxn{ZMbR!UXB^8p?r6RGR!iw8J3MT8{Aj6`ob|21Uv4IH}j2$NG>>cg?pj6&DPFB zi&-OzB)Q`!j0Y+jk#+hrx{muKE+cg2esBrs)XhAL(JFvU`h_ZZ;E3Jx3EOT#i z>494yJGgiX;+hj6F`JiP`fG+g;$P6Y{lqX5W;nV6cWb;pg+-GNoU^h<*Q)_zopEV# zwC`ZCvVA@4JBwSd)yA^*oo_ZdAHxCXxxZSsKS#86gYuDq=D9&-zzE0{wYZ(QUif}j zDqADgxxf1Ow%#_b!5=?G>6NS!cN@)|(5sp!00=uVB=LK?`0FdVA)xps<1~}|J8(U+ z^Km1GjW`cXc=mAviI_9IZmued@x7{0(qoxTh?pwfa;=zMn@(ka7m{Pp&DTln-DSuD zy`s&P<;I$TahqlH(w#64kBS?X!)JQnkNrAC-3Y?;Zf&L(vh`I_xu4T`9Lf}Ng%j_P z&vmzBHwI_Yz*q#z5Iz?*2(g%CLC2KAyoS&yD|3c(aV{9VU!^kUbAcTZ2X)Sd&9(dP*kC!zR?5KD?J;=-qUL@q-3S-=8f7)Z0BtTVEVu~BZ z1Ul$mEI0sSt#l|gH4{!ycJ#@e2vQa*(Nj-;45f&)q`&{kPAvKa6Zzgo`D?eJ&Yj>| za7JwzlNzm?(k2pg;*Tj&g_<|IAlFj{16z10dt%e(Q66OUbd4&=9}PHddlGs z{DxV?2h5zV)octpmeAotM>#bl)WbO5M4b0!l&Sm-*2pH>o|_Jguv019Og?QC2rZ#_ z)boY%c^PhI(H>V0q3|p_m4JJ)*8+Y&^Xb3Emy==GsQ|rG8?QQOs?5G&NmswE<=82{ z1sww&cDwCyJ5=G}SlXgPaS=tc4qH$4-Di6IBTD>@o|LUH%A#c0wJ{)5YaX8QA%FEd z=DPjup>`-%TY@Ep;DX3#BDG}Gh{OTpa^3v6-HoXU`3zC3>WEOuhouEbyHx{+`*Y>~ zYn#g#T}^8kiIwZ!uKjoEuUJn=vXL*_pFfBIymVuj-7IxZo>`OgTg6=aaFq9)p$30Z@@MZfqxtVX%;1;_Ns|8gu$aRQN6_g8gj9 z4_NI9U%Aw(C@OG%zN#@8Vm5iSz`~dtK+W5Mm1?l&NzEdJo4Pc;<-z%r#0K88H_7|t zw<=zk9gC(`jDdVvIbu;b|CVvcV`B3QY9Aiqg22n=PgcZZvxeT3~#?@w8n2^?rT3d*ra<@|$7K6fJeDS`!P09@Ai9$An69a${~bbVlz zZ7CNm*CjpYy2Cdp>$V?k}YKc zgB0oNZs^s}1T4mqdO8@zveB-2*86^&22f{Fhpf)U@YgI?s9{;ALc?OX2inW)Ln+Pj zTeA11e_`B^u=?~cxN>koWy@n0WKJDnJirLMoH2K=8!y3O_gK39))nt^AAy7#SQ6jS zB2C6FgF~?qA7gop?u4?7Nw$awR_Qt3WBQ&O$(?iYnIHps_>Ck~nDwnCpuV)XOm{5f zjLxGG3$L`$jk6rf6T+U+FFNk;Tm`RXOOe{48qOQ7)q-CAm)38k)P+r8vtWD%U738b zjbx77$CvTwbFUd+IQZ%hlYs`U%ionu0L=uM`O<@k%4f{3NTAi2#si*0LiC5BqcXwG zOy76>FRvtmpL#7k*kc?xCuW38UfauvhCb2$4I<3P*g~r?3;KFDc1o{25b*BxyhG>> zVANe&I)tFI?Y{^fe6gc$x6Sb;>Vc4eW3HncIAqq%`2$`=>yB31ZiX9q1b9^S1Z9>e zEspSXGeQ79bd28!nDinu*<4_4o^I$#%t2-FU*$ZwqHIC!$qbWV^M=@H-k2%3JOC6t z=9%;JQp*$jd%VZOwN?)ytWcdzNyfHrLK!UaS2*<2-%O6XSg&M4UqtA3KJV?XiV~G7 zbc@nXkeOkM6Oqy6I6ik$LLioz4Age%3Dpm_`;p>0%|<&9uSj(^4c;@le(2h^8Ft4P z<+n`+N;3;EYv~O{J)u+>Ut1%se@_2olW$>HGyRF-_)Jt1Ze@{ZLINgQqaWW>3S{C) zQ5MNQG3RP)4SYR@kp~;PWKzc-dqS_!2ex!{`5Ha6TNMD21-IL|9%SH9)!=7;H&g1` zcIitzyIh#Gyn0VQiI)O2o2sgzi{!(yvz%+tD}SUHJ(UwCBb485hp!JpS$mcLS~pNEMn?&FcCWC2wOB`GHQ$9mlQb*+e4SJ4Y}TJulp! zDk58^EHp8JFGDjioHAHuo=G#jN)K>VrT32 z!J>|y1E7kgtTDe5hQT8r%m+_ITDt*FjLm^#Uu=uofHHZK(gARTysXiZo%*!Aoz=6m zvUm85rWG&T`@I2hV$zFb>B*@_|V#E0uRq@ASkJyRPO=%-2+u>&?Fy76jr@V7c~e4^N-5 zXOE?|&d^NgYxRB5sf-X>?r+(1t98WZIgWRaRyKT82=xjKbn6fD9!&`jpP7Bh5NG0l-$A`G^2r5rYI zqBTzwpfoB|^feCV!{T(!+`J-rD@%vN+UAHGLlHIXJSl3sPQ5hs&Y2tm=PU_y1zkLe z&|dp@wlhEFFgosg5ow{6$Ur~;jf!>dDCi*Kf}l&iub<*Xjb?MBF^78HQ4sSIy=nWeS>-?dw^n@s zlXvd6h$Q}1P!5ru`sO}As25g6pV-wE9m z<{Ky4lt{~y(8ui2<1{5}`Eas(wZ*y*bkCF^e9-(_Vd1WBl8oRK1ph?fyDzCvB z1hK*eANDCn5%sb90I_LIWz-XGt)9ZX(SBtYo86t~=2H6T00=FG{7OGMfI->i%g4If zyHbVpR^q+_Y}+6FsvkgQ6#E~jjF0w1jNVk~wPwBfMvj={&+}+8Krwoy$I!-wuF$;f zdp9X?$HNGoXe<_@df^Zv2$;VC6o5~ng%64VE7Tx-KC_^xNaNAWTYZrxzNmip3MT+v zv|3KDpbVBC7M@YnuYpBd62??*%p$^RZ9|rfDhBvZ*$k<{)+dr!j;=CZb$;d4GRpzf zmlTk>&kP$9>pPQ@u<=O*Fh=ak>`jzS^J?#>0tITdY>quSogyAmM6ZfZ-Jx zbX4h5oFN?aR5Y21{G|Y%V8ulq(Md*jriCHZfXtly6jbhaFCU+ra-5g`ifZ%XRpX{03 zvUc&hos_ZrG1*4Q9?SW-D4r-|hY*PBS3*85bo}cg4Qi3TBmG8_47?_>FZ2LFws!w= z#oeUqUIy_J%}{%CB*+qg5GqYd9t#YPJ9Txz3*BI&!frbY|1?fv8FTYj$UrO$XI)B8 z$5lmfG0=4OW3G~c8n6A61pSZ*{6iTV;Ri6kdCmPaf4}2%mmHV@Z9VwZ`8r`7*OYwi zfC)2y)(%nqer93z&822;9pG^0msy(NgifGxIq7JwhP^`hfENiCH<7ou-r34?yks%7 zkDiok9T)HNsLw?_&lcX9nElv^x58VN-c+}*k-l|9D|H5)7-6IqwTC7yJNxAgviUbX zZJ;q5z_L2`64m3+)$k_`&nC&Z-|602Wkq>`3bMM76qHAnOh#8k<-D!wdoABWu7`?{ zA!kbh4{rULkmBmwUg)}hy4ND<@ zfFx=7kcKw;*272i9BeLBle0!Scf#cy6syGxr+{4Tz3% zQU?>k!?YHwuq_0{wD(Kc=oLR*qYldJWeF)1kRC`sf-p%5c2_V7A#5;zV@XT>C>)sZ z-3_^iq5!Xr`yagaiTw~hz-yliKmLudym&e@D=U-_z*Vq1%23%>Gfv^FRtJ3HHL z&@0UPF#U#=pxZu5!bEntmI#No4qIsaMavldc6L68N6Ow$a>Tv*D@m911wF>1mA9Lx zzP>`G6z8i7%SFbvxrwBIRXWqN*n3C3GUxm)QNlENJNRqs-GJkLB>7{WetwT8p5~rN z_sM;*sV|rfBdyQAwqp)AGSflbD3`~m3mp~{;tu#5uh=WFk_(RRo|qNM@7+-bZ=k7b z9J9XJc6HZur(5#2x6stMN5Z|OqpndC4rJ|jP~Hbd*X*DMc)+{ z=6(X(FkXUA4Zv~({|}^AC_rjW$A_^m&_XY6e}hoYAMDpbw0E?detvN>G^Qs6xQEeh$1D7Yvs zol~<9=phcOfE7T!xzz%EaPWG#u{8K9kzuKQgwn%uJAXBdCPq| z`dEPb)b>GJK7gc_rUx@_&oNMHhF+Uue5nyb`+=LAJGC&onO>HY6F35ZVSJXem-QfG zWckgk{$_f-$h9gH@Oo@llZIs2rBa976|S>A=`=vkR|@|zOK7PCvnDL@(K^a>Dj^~L zb#p@qO_9UIY+37K_6onla`ySqwxYRb9`9a%{MOXpyJQM3`}zL9JKnj2F$Pvq{1oDK z_F)bOZVw0bRl{!JaItUou2tu8JP=@(yd#S=`CGlR?$JBX0+6rf>238T0i?9~b-|B@ z_*VnupX7R<&)TW`ez3LB35ma-QY$~%yei1X{bQvJ#1uGn+{XQ7bS*%+p#ec9lB6A# z2De6i0|{#kqT02F@Z{SD1^{xJyQE}O+kffC z-v3j`a_v$)*Zw<-=OrMx%H8z;ehJs^x4rX4F(#jSz~B7NhTLhjj2uENnNvK={N31g zUnMJ0>{2c@r2Yft(%_Z)P*ZqGOL`gX3Hg@mq1EIcno{2u^ZSloJY^5!0n8m{@pR^& zd$qZkm$mgGK3lRwDMje<1q#y)mxw7i@nU;;^syfj8{kvq;>r8zp57A-{E<@+-UDj( zbY}k>?a*%?iKcVJX}!c7&p%ua5Iu8gGLcO|sGxU)`}j`^iq?>Wy97)e^M4><{{NOR zT#Via^<@7_(|)Mqfip~0&g{lNS^wUe(Co=z1~vX8a#ydB$BoEjAZcc zf4HDs^@zfs)g!&~PicSTU+(icc=D^35qp3J=EiuB1Wx@ng&<#g+tK|-i6!7D?WwrL z^T6WVyFzC4Q!>eaa8K4o{1@f?2a3@DMk4t3DS{us%g^2P|8wffwpG^FR2YTbLhq?KGNh5gX+yX6*^J&u`M1hN{`-Ol|LrFKLB94J@Y^GMQEZvwM-j&N9dT?|_gMdDQkMb1l(Raf zQ~N`s`RB|8(3k9KfWe#pVH@oFX22_*0{u5`X;z0XJY*rfGC6&022g)XaW68{A3U$@adG765p z2UPU?)i-p}(NP_4Fv*|${DgCic5}8~S!7FuBO~AqdY-GMpj=rdCgpdZ`u)9}Gl0PO zh-Xo3aM1TRe|;r4vgbZf{J+gtVk0|NSM&3?US#vjGC9^mrzR=+70pCa0%hk|E8%)4_i~jY%h<$92{Rrm)}S^{;|cWa|MCpu($9A-eJ?eu{`YOc}PDcJ^0BpZL@Fw%!I{O90|x9`AYh zH?76#p${8vM8d{=smQk+>id&Q-rh?WVZE_391vQDovp+^C&U-WSa7SmQ|>0}8oCFS zhr^i!32$L3z*E<@la{>)yfboxy}gF018eck5g9F6#%k12>??dIR8!PUixud9kp4ze zOde+C*j02{(KA~79c|_QqZ9Wzc6-S4E;pgVPMwuAW);PbI$YduooIJOpBFn~xSZgN z(`-ATS7T*NnNTFjQgrs{F3e6KJt`k4hj zhI+>)*%=?h`=^CFVfPm*RhdMd`$vm82xtv}X%?oxc;9URO>$0+fUj&Wp3x;NS>^rl zW3KPIEMO)AP;r}&T>8_MwLaN15sP0d3M4=*(`4=E1lE7b#`UY9qyQ)vFI!rJN_zRn zENYHD8TOZ`&q}~P_g^^0&riOvXfG)#`ZXz`QysF_**xj)M6!jCQ-N$*gm0#=&vy*t zeHp*!G{1S(t8i`#@Jx^jY5vb5-`4*3j-*$2cNoN)>c48--PtIs0KrlRh;Lqnkb*(m z3@*@F>1#mjnh{>F3H*iu*^`Ngh~(P<;I7xm^W&^CH~o*BJGTxw(Np~LWfGygYVq*! z&w%+&shH&c{1ASuTIDY8mJsdkgC;*-m17sc2O#*J*dVl^Z1Pi!z!Te@dY0XZ~}r_m9#==zKAk>;0IbkCm> z$!@9HivAdSjCZlzL4Xgi>+dE<3LMJNto} z&~i;mLvEkX*Mr?K?71er%3;a+S$(~FV8|{5v-Q+wpoG@7eLm*oF8Dz<5UI9g{7aOv z?OMN%T_yj4!&Gl~kGYvGJLZY@Ch>_i1$(bZV@-rP{N?oZW2DwfNqD80m>7q3Bi5U5 zUJ4%j*=b7b4rig-NWEhA^KX8%rYcRqc9taPF=u|L6(lTnn^LY5RhTJ)$7Xlr>Kzjn zNt1>fDj~2p6*t;jOq6+LiJP!7N$j>4a3Yad#!Or%Fx#ZHm<+V-jeU#V-toe|_9SSr zMhTEGQ9s=23$k4_s#)KWF{hn2R{_AEdh%?G95-;tjUrE?sdd@@C&L}rB?;Xc~cc7Kppr;W2~dG2ko*$Km zO92Wm{_;op7dbh_#FZ54PCv4I3Qfbg-i$z9nP~)s%ZQx%b#uaMQ`G(g1R_hy6)!T@ zoqD8FQGOI^A$=XL=jDM7j&JZGg8p)x1#1%6vIY)7aXBmsxgg9=;)g*Wbb-zvtzdvPF2!~*&Xv+ z-Gx!yuFN*5P+cOdyd-#P9M>2+P%^-!1_Dh;4heWaNvg#8&p?9PzAhfT$1r3ywaKiR zy4>v65?i#C$hfVi$|UHPmwk7~3Rl*nVb2NUgBaOXZ0Ba;$11Qp{{2ttY*3rQ(mSbJ zeHO@}z9`!Fp8BVA;f9OxHe>c)Vf2}_8**-8m z>Zpc-!|PLgE`+7r9bYqBW3Pa6H0#y^=hA4>mhiN=H_-qTB`NC$?!-Ahv?mK81Ig~R zt&eS&Yy{kR7Pp_RC`wN4fFYkW5`d`QBo-8dt5OXIWUWaHzA zh=@BnI()BnA+W@8G>-qi z<9$BIZta5fqO6I^Lo;NaOJ#rBxRddF1*z-VAGYmZBS3cV8gDmnDZpBD2Dt0cs7QVg zljMh*{tT~e^*9+Vz(>7LTrLEZa$&);r&c%P&&C6eVu+Upk{Wra^qz;;d#txbBC8K9 zXm!?W=NKr|TWTp2pDHrBisodA0E}6(ZWZ5-fGo$0@s%-WK{Xo$yf&@f%^IM)6L4cL zKdAKF0^vjGI|Q6Hhp$`%@B{Wqnwr8Noeq%KN$ifQ(pVIBp!ws*Rk)m$Mm6|Urx3!n zy7;X>iV?R2<_^Jy4k3Vws1fG!xT~+?ej}$+P{gqQfaK@xToCfwp!0ShU*b$0Pn6%_ z(BKHl=}{5zg}NQir9pg@_C+gOREOJNa@-t(nn=fB3|)O6_ZIfJwkHwB>c)9MJE8b1 z43Y@oKLnAO91j0Ub(7PWl&)k3;{I&5K-WRk) zRO!`uC|R_`2voStttG7ZdJ}w`lVs8BX9Jl*fQ{98Q;%8#*cZvfgL{Q(dbTYeiTnY;VczTSDLTc)a_96sa`X?CHp$+o34AoG#W6ic5RHH%7<`i3_aN0-nUi6J8+%=zGTmJc#Id^EMe zQ7T~^^`9wdOlQAdng6go1eYlIVvYl5MN@%mvlLDTvZ^kTNzZ{l|$%2wJfLqkt(&d4RL(;0h;3#Yr{V*T_Q>O^K)jF>u5sfYDI{5xULHnwG79vtbF;`5= zcf-~+V{Uu2VgR8@UJ%pW`gTm)bACGXWCLr2r!9kuJET?;*;!>;3kSOiLWfXsNRU9Zl@PZ*5J6 z_Od%^hBc$F{GF)ABb3L?#C({&>GAtgz$Q&k1!ooPos`6o{;j*;IgHIdjoW=Qy zNaNj8$rwd#AFr(TLiGejqj8=s=tL2Nz9H}d=h_|e9~gCztbmIvTfSPILQyqBd*bX!V7VTXy$ z>%KcTS){GPmmRN3b7;m+CiafhwZt7W`@+aG{&W+pRIFs~ev{){*)beSSLYkzAB_smk zG~W64wAY5~fiP9XZu3G*K9dk`!DaSnNN z_KMW(6Xbyi9i63ZJgNR5@6MR()lQcgfTD@rAn38Pu_wQnI~JF~hz0w4t`#IjJ_})kx2UhNkw4zq{G5VfoE8yYAR*QQ^OiB! zM9u<#v2&MS=)t*)$+*RUU?yuZWgU!M|5{Gmdx?^=FyYLl3fX@ALAO{*Js7cC(l!e1 zNuYU9BR79`IoI%!yx}gl*Q8;`=)F$~o-`D&v<%uRZ@W_Q{y_;VX%c)=;W|S(aZ)-d zuR>y#dH|B)xoy4Ph(YY|ZO-9$TF00uo%=}vSYb=diD3}S4s>fuliH7R#9fk-Uh3{V zg6IpJ1I4;Kb7xQixC02p@+^vqoZKDZwQcOVc)ARqAuF~cYbz*b=UWchP;m8&6^>v0 zLfU%8Yg~D;bD|^#i*@x{STpzaumx=oLMGAPPrO{hBSn!`sb1=yOEj!uJh&F;fCWfr z6?Es#A`e6IR#Osb?D;9A>AVWk{{ro{1feksd2ygz1Y+yGGD;i^khL1XPRVZUxQ-nt zLCChJrAVZMUUs0D*6PomO>nMtJ@VQowjO_^UkY@c%Uu>lw?PKP}lzz!3%wWi2h3_@TcH+ zj)jcjnU&?gfPU7!a;Ufp<3CEfgp-zB={}YJ=&LnR?RDzJX9^WGDsp{$<#4dR(H-6I57-esi75Q<3P%-Hw)| z^qjJCOWNwRfNL6k-G=7I;SzgMZLhUq4bkA{p+8n^yCx{^YQ%%h^+5&>Q_-`Hay;~Jmr;f zx@E^V{7P&#A|#A01!jEi7-A`{YC;@o=UtYLt*WX$=8;@rfo|M*sr3o5xVfA}6x$5; zCdF^n(UH`42qoSd#>NT{V94UH>(K*lKxPpG9`6ESDbPv> z*7_Xcva{97YBty}E~9+?f}hwulT7GqJ}~6vN<)i{1N_GRBSz$^H9o_ym^VC3#<|Og z3apgGZ5mr9y9(55_2K!bsVD-BpLS{nnsWe@w6Re)ria|gaV>9|7jPd}4q$>_Ou0gZ*N;I|2bYDj@6tX=x8~{)kxzwqYk9xKwI{S4dL8Hc- zu#egW?$qqoHKV~hMxkM03K_t~(>{OaZ;%KfsBm67UCw2lA&n5|9koz;e+Y4J=`Z6c zo#wXVW zl2!r&bb`AqPsy=i^iiTyIAcJKB{g+xWaT z-KTnspdBKKKCq;n*{Ga*JxvG;N>O<6m{|kbj$poZW0(>g|7eD_bai{l7w?_XFcm^} zLS3Vnq0&cy@<>a(h*k)>rDELcpB zKa7c{vPjL{-OsS>{sU-jQC)l25oaCwit9%`dvL|6J6Z+Pt?GENU8Y(k8R#0rG@5fe zW~SucJuqZ%%XjX*l^g9%fwgPU z>x@s!*JAyah}i8c;Iu*n;?$LeuCYV+S{DMaq2k(4TCUFR*gL)s879aJTT1I-!#i7u*;rD@MZ#yeWW|=;+y*ZZHn~0^GTNE+@ zPK@E`6i371XJlP!tMp!GyVIaKepq%(C2Z|3qmwOTcTSM=S;Ef^0Q+j7ZC-vq$;0-K zlES#Bh?vr}e~k$C`U@H+1A(xW8XAc?9R|lznYjBeteRKugmIQwRjwTcPmSeQq&AW? zqT93Fi=8tj8UvT4e0XB(_S zwnn@?jVDksd<>#I1k!B6VNad$Z4&b0^NVsE=fmFS?KU&dA1NjOECDSl(jn?Wbqx$G ztoxD-puFTyE^sqmTN{)-A%BG8#HoC`ZCR|NJ4$-J-w_2DE2DpoUiL6T71R;m#J$Bi z%G7DJZuup(tz${|@9M=_Ufl4Q0g>M6fxub@E$6*}0rTxb4i!iM;}ejjgj&;j@eOYGN*QUp~_@ApqZyYKe8H+awUUosS+p`aF3Y zw6Z3Nk12kD%P+R+yBc1>Hh5p}o%nk5d&24r54v6eNvL(Om8z1oBfZ`&vo1$gJQI+y zVDqQW=*}?+4GyMGkchZBP~m(YVH-_R@bM@NP7sT|?3F!oHv)(mvRkF`EF}20m!MU} z*lTnq2rEOSsEg6lp+I~U3Fs*xcB70cCW|nn;mgVepHo$69!-ZgXoHS`O7LH=*;Q^v z>g%wRVltB62e5iny$j-rLKwq6T4e{_0%JwgwEI2^b>O{7&p(8rKffHEg1hddbmLxB zJcA9___sf&7!9{zPQtiiiB)NtPPjF7DwNBT@r1iZnY(|Dl<70Yi@c{h{Ferswkl&} zMqO<5G@f`3Vg*eY79q7WBe;&&0`OUFP4fjIQWT|iI9OpqXB=`n0)5;aap*XcQiBDm zeq4g7XTQTjvJaJe@3Pry|A!YfQC*I&I88)y<9R{WvmQ~=t>GG+Nw=ApH@)m>@A7Wf z!&u*EX5Nr+AGru$tCi(7+SsUoRBvfAmA5oCWpvxLC@xBgxil~ey1nfUB2UniSryLF zuh3}eP>OD--mdU#(lZjN$j*LKzCLR$E^E6!l9ZG&KTvT;PHx{E*88n7jjRHbq?h4b z-K9^C&xe{`9AA>#ckt(*DrvG4o@I3uML+-I*FR0JrFk1?D;<+r(sy<>1Kp9n`UDb- z`Q*M-Gu6wn;o*U$;x6-uh|(RlH+}*4@?0ZtY-vt)`9xtp*3nINbo(jqnnb=QEv>nQ zR`LmfLVD@;QJEFUy|nG;x5fb3dQO(M0euBcOBv?2;k$(9c01&0#-zE2MM;scTZVy! z&V`F+YRL3lqd-MB-h);><-Wz`T3e&RgKRFh+7BV9R zK6-S!XtSXl)Md3gHr$GmvML3#mSWD+U42x4 zMC;@*?ij8O(7~AMWTbRCW>h{C&_i=2KJO|u94y!2AxzACc@-Vj!DKifX&CUuCdq5* zd>2$NI84>PE6A^3ve+iHD`K<+%a<15J+~46miF$`)h7R<&Z`&X%|9sb1SN^j7;Cj* zq!tsJMsCt)&x_>NtoKEMJm<%bxQ{o|#zN4LLg%jyQ|0=*>b}u!qOR> zGmhkW5gvT-eX0m*Q$4rXL=d5}mDhd7G>=g|Vlf_D8#fTlG6+kG4b44TP4{}XnaS(x z+{*!Yv%IAx7bWAB+FMKy3dILiE2~#y%A6i{1nFyQr@r{oZ0MRkAf@;upsn}``_suT zXh8lVs65iL&mlfxvD^uOnaS$jE1nUEB|oE||F!+nf;hIs;_xPs2>k*$ZnI+uHyH!b zoQ%A@%g!=_OL289oG$u8M?F!+Hk)4_Fy|+BiJ-}Hza;g2G4k}1be*$ojIDd|`gMen zBr|f;g=?E|(&WlZE3Ybl0pKaU6&R9z4~Q!wQlapcRSOk0U7 z=iIc1*)YoD7%tYudA(WO_NA3!;OHFjJ$DlQDGl{go@E{y4dN9ZgOHDp_OIfxn!0+y zNf1Qz&cgG>b#c9RZ(O7Q?D2J?tQ32gM%|cJ9Ww%KfkH&-!i;CMgM|jY@it%B+wyLi zCQ8StLI^zx$imgT7q_})v9}8DK7GtipRb z+&;3Of9yw3JRO>;702A=`lFEnCMd_pnM|uzR-tWIa%EaGDMNi`lpqZAT^4!^n=JpTGyRXC`q7}*@!lFTNLo0yXv@IuG9Hm(Xqq9W#d5xYe6#Ba|cy{=Rw_9T21m; zT3?A%_O{VZo!~QAV;dkPKVd!t$=gsk#B(hugf04UowA;MDe%}nPi&O;a;R2v9|Y;j z2g4AC*C8J34zW?9qdl^4Inws$yEhy*hFFeLQRzYrUW&b8s_yi^@QKRa6A?&;4#8zn z<{msjuvY1d9L+V%I>Wya?tfhL%z1la62>lBaz6gc?V4oQ?t*dzx50uLy8~e%h19+* zP-$A~Pcd4@{g5){6Sd4~^fOsT*<&lXrdLJAOyEXCBPTXCQM8DG)2`aIeac zl)8@L8s(K9)!ydYdAk>T+}(jU&m_{^M-gIIxu{t)Qs?K(c+C20DMMY~x}uJZ(AbD| z=ulIaqbjPWYk9tTYSbUwLtJM~{y56nWXlw!`)~|6=l*J#OMk;uYRVW6m$6d!a6bKI z4ill9BUFP)^mL%rOmqUxwkv*Ce7&tP0$QZrb(J)m??^PS!Qazw=t9eYUE?I5Hpti? z+<#)dduNmZGZV%n_15q6VI|S$LYSh zo|xH+G;D_gHL2E#!Cd|vk85Ce&b_u?ktTKG*t5<~$Ic48T!#dq1+RO7e*U>wwgLH> z&oO>t#@>Fm70&+m9*aZ{nq9YX;&T|AyuxtBAzQ{k-CC>;8gt0LfK$o!LL;_C=-_xAdL8d`S!OxpjA%Py{stjX0ZP=>_Jev z+pS+#_h*l?j|{`Qx86PA->!EQ)oeOX8hfQM>=0)gCOSlTi6lLBxi$+4S5l6IrOH$H zS20Os-oH?q%ewu+q~z$@$o7P;EuB1>3c85CR(c7 zqLF>@gs%J{aUV^Y1ZA`ovGS$_6HTmWnmQv!e2kvmV{Km3(h?W=YH}QjxKUs}m=>vT z1d8C>5S#{SG`}L&P)p09rMAPfr|nm+FPMGleb?b|5hz;J)XoTK8BF>I`yjm%ADz?Ez z7pv~E&fDW3oOlHB^<;3uA~(+?X2A-l8AZ=vMnBxnimpk+y0q<%a9*k9NB*LOrBp6c?B&ojY)Oh>4`r6aPz zEXkeEJdI;9zPc;4Cr-)Rh`fhQp8+pE93`9Su03zhD$yY^EIK zOLWyTO1S%YVis(?c&KzZdjaa7+;oc(alHxMV2#}Wl(7AO>j?cigRig{KNImEsP#escvZfy~61a5q+?Xi{ zyv@3TF4^G=qf%z`iBa&ge#s?P0zB+qcsuBEn zu#(#ZDEaHn>46s>|QOmF*MVEf?Ny0E#-X099@9=_{7(T2`u!2b;I4 z3G^~2O3{9Ogu7q#A#p}0Y6zN|`utQ}N!#w~tYg7(!1)Hy@2jIf`(@-z%24hJli7`i zLT}Rk6#jae!{Tg*`88q6nlnu*dVWJQtfVbE_)e|t_*-M?!As8spfg>nrK4Prp-;F+ z5t)q^{-*n@qXM6IIgh@q!A!ImJR6l}=m&WZ zRb68cvJHK}d<1d)<2jmN%F=xY`!7_H@YK~&2AQ`ge)H>p%2g{mpL{4OrDLkB@%^b3 zhESMhLT`~=_MwBex5&2YST%kBRjt!m{C%~G~QrA`1@-gS;E?ke-@Gng{VHXmfW#Z_bVs;^P~$}{1bR~#`4{>NRuG8r3J zA9n?5k%Oefpp;7o4y~lzdSVwL*6)plWm;%fG#To=665CHAj~d*Sqb0-3I!)baS+R( z-QDz-!iU5OMp%1J$xS^d*aM>D0ulcRREm6Ck55W3j*-F?B$$idU(1lEqrZLoHr1z= z-sy$$z?m*`)wHjSqizm=g+A720*n-P6bOy@t11fqfuU{*L9}JavI30pHlv>*F)?4l z)k9A)Gt5j=VwKsrNDd-5R2|L$9g-()4WG*5?`Y_v0v{N{JNJLDG4kukc6_F4rx zsaVy!H6EP>I&4KPwF>m%Ano*2Np}A`PIr^<=`ylau9IfJNR_`ex+vop?o#&DbEfm% zYT#rbeC3R7GZB|8dgR;nq2lIZ ztpgX7v6^tGGV=ByklpNh%0?6_eT}&yMm+(QD6ZoC`TsEX)=^ch+yAfuN+{Au3rKgv zCMBi2V@sEGw{&bmTDrTtL6Gk5?rx;vx9}X#z2|$+dB^+T9u8r!$9mSBpPKV|*mWQ( ziFnHqi0LDfE;K}n@BRrO26s0+heL~CM+pfNB19J>BjCEj|62i{JWE1aYKD9`TE}D@ zd+|RI_YcsUqyJ3BvHfhiZWOPdPzWYI>kOha>r%G!9!(v^C3pv&pIXOjtSk<>yNemX5vp2I6@+S2IE>SO6h~6ey0n0O!pGn#22E}BnKIk!Mv(97QR}io2tECgs7% zKK4&>SXU>d`0^O_T}IqG*_>ok{)WE%fz@p5&C$_8PNi+RrT)=|099XNu$x5a-Ome# zZ5x;ST7#|on;;)t^=adBmKZ>WN_GK-COQ6eq_Kjl?)xVBD8**qp6EMJlnjUHJQn9f zNsy?Un;Sr==6W)NCp%0E3@^uB-ylJtgId)d91^pnnx}Je)E$AtLRS2Qk7jSHbd|}a z?QN_LsOjjo+-9-3uRQ?Y<%quVXa$@w(;ZZ45-qo@Sg0G$+1Nx;-;|)N0Mmqk3ldN7 z5dX>#!qL%AGuqvFy|%l%`xU$(V2b8aTc?@qcunqfnfg+^^ltyKc*OnwP~*pmd*eBY zM7?96?1nLp`67nGRo_>L-%_totC}b60X0oiZQHKR+*vP3^dlhCf|FiRPD&k^_imh{ zF1AetS5{O+I-TtZ-v-gaA-Z77e8Bq$^jkyn-Tme1@iEYRnJLEpmk<4USVW+Dh%N(B z4iqA8G-!wj<{i6OtfHScBG%k6$&36DM{RL{iX9>i1!m6ekI$M0 zU5{=Wjb7Jq_wO!oUM<_0qPQH#X>v4#G6cf0t8NoG_A2HPRd`6;oadgE7QFC3dy_&s zV_WsuAmq%FKFn4hGU3{{UY2I*&3NW3Js42DSaFie7SDRPy-7BXI6Jf1Stw7An-F&R zai%1OE(1Xyh;MGbGb87^-R(S+z!?E>_4a5t)2AUiKhTV~rhGc}>g5V;wEv(IDi$(d zYU(Yl0!|m(f-ns1Yz0m8J7Eq*J(#BZlM#5E!M)fStsXRk7tPMMB0s8NCE`co#(89T zdB13}^9&}rFB5~@ZlR#zkBK>8e4t*+_%C%Q1D8Ls)xaraI;5w0(rQ{fJmn|9>cjj| z$rztJS;&OC6BQXb^ffhIe3r$0A&BL+VJ3C42i?MPra3_!I9HeTCH9LRkwGBUL4r@k>p!8xc+Kcp1>&)YK`}#y$@MF z#7d`gosoCiO*VgvM(((W_;X7qbo8NZkceQ#+4s<7)?S>>2Xcs0NOn~|h%t(vbeV1h zzD?|2Occ`U4lmv+UA$|_`Pl8X)QkEW?k^zmpAX-upIKa5!J|-k{EI+1hWgB@1%m_K zho!{M2PS7zZ27}a5cB+UubO8uar668pFP6!u~LYVGr=A#!Wj`B(YY))apGX=S?|yO zb#((n0~mLC!%4?B(W7>;dWUv9R{^LS@Fr#Z8Gu0F13gQ0qZahHrgi^|)CYSOXKoG* zUB6nDxM|p!dHX_GXf#9lutv_oOR8tOe5`u$(`b>pY0(60gX2tLh3%}JYgHV#-P#jo z!%rAUHF=9ATF;$M&y{lBADVhPOp|EME8JH5tH-$e34yOO8UH8F*Fr%jcR5?GN1d)I zmAeA49I7yVwxXK`%#Vdi-LWS;eqkWkQDA#0wikMRmc zZ01?!i^DVjA}1etXK<2-YVN>) zv~KLWXLhl`@j&42elwWT-rjz;#2-3x0<5)j=nCTDK8NDE?&4?2#o_v+u05VVhXTMe zi&(gxbYCk$5O&jdDZOOenafS*=OzXEH>y1yqY_@@_jC{x*!kyPCLp7N`Ze@j9_E$C z3e}WisVx|69Dkib z8pL0)39iXav)SXI#yVPH&xXmmfQp(r-Fah9*kq!}+V}^i(=ip#o4WHY6J;g+lk$sP z(ua5IE&EkV2QUK!m*G&B|D^p4!X7QQzPmh0z*hY?QCgnpY2%VfM+(%5e1R1aOq23f zyC*HCQ?;1@m+CZYPPa>`dy?WFx3Gv&Ed%5Le=^X;buZpw?3q9j$Fm|R@Z`KFofc5( zVxTIt$z!656^`t%)9=q5XDYahq)wUGrQFywu%W>swd`jD0Y4fVut_+_%5a&@4HsX5 z=i%KC@7`LsI2NWFU3Z0EhDBsQ!#3?) zM{_xLTst*F*9O|uWl3tJ>pI-LZRb9Mq>#R8&mnxb(if^#rt#b^+mBUA zn4FxSXKK`63}s2g2h7X&wF1`R)_nEDzO;JO%4>6&rh$wM>E?TWoQV`EoBa_Lq!(o+ z`>j6k6*k)pGv)TlO>z8AzZzEt0OS9FT@m>dEt93IodLyf^1t&1BmMA`iy*OV+ti<} z!VNT$mK`A<)z4SD%TTW_g7Xz_3SDihgF88;o)3A24er%t1=%f@ z!QFnYH#&K5JXu7or>{Ta37s4d8n)ySy0BDO_|;kG-d&c39c3*+eAKv{&WRbdNJ6^? z((M-<>j_tSYQy<-fK-PI)@EnTVL(c`G*JD-EPT?9WDr8MiJzC|O~>z|4@f z-*Yk&&aZ_0&&i}~d~4x|GnKY4YjJu2fR+}{aDqgbr##F}LG=|2`U>)pV!h`fsM;x4 zEUhU+o`|@wYlw+0@cMR_Ld0&%YTd8{t@f^G-lz;djgFoP$W(w9q25}V5w7Sk zyD+US_JfrWO=9CWTAWrrbhA@kej5Qt_f)mU$E zT#L@DE%!`av|c_XvW*2Uqb=$Z#1!(LAc}6XXaR@hMU4aKmLmMZYBo=}@K`tyn3SP5Or3Tl{Ay-(tx1Bc zNXFGPT1$O#a_s&%kgc<%3_JFU&->^825L_oN!JK#uF|BRuWdlq#_;QN!3~O}yufWA9*36sE66KwqI_Cw(+o3t$b~Wha>TGyhxi zN+SOydF3yeXmmKL+8w;2EuHX#EtN1b)U^p#*#xe0HR__XzMvthMz<&7(ON+jnlHoyZ4dN=Mns?H9dMElcK4>`vFMEpI#)6Ky;y5$Rc2$vHVbSH>N8HIpz0?YAo^jJHbQY7j<}_q>Yg{QoV zF?CX$rqAyis4rJEA8uE`+jnoc!*eKYZYR~uM=Ij8-~K%A%zh9!-JqtUqBJLg0a03-Pz)#|L_+2Z=&MsB^gIMwA6(&pXg-hETDBq|(T)%0&o{7)mZ@w6CH(Y5u&RW-pZuk(-Y8>xVeSh^r zBAI18^>VHIeH_;&x2R|t{2VUD7BW5ka2ubWnt3y1WMp7h)KrAA1taEQsuXh2c=%MV z^qZDnU0;y~XtWhN8LMvhkE;F3k2_Co^7f{X0{9bL^t;aakMxLSFg=S`RItGU7r+j->#u2aV#mh;Z*h4JQNh<>2sd4 z*H-EC^Ir3{HTVeUck?Kp10EjI&8st{RrNhaB=3K$loQlH3c{${IQOyVDm-abveh6Kf;Ahva>ABX+Sz0X z$%P!5b^et`$l^bIOuli`#RnDe5!b88^J7tZYvJTM74@W$JOCB946Z)eR`iwJR7T*b z)uni}7h+K2_v?y)uj2v5etNS5vUwJe2#;c6Zg&^l1f zZ=|5WF5EGOMLGwN`4(+#XjwNc%tY~CnT`z?ggu%LPd?0w%~A~)nAiKC?a?D_n~>8! zHo37G4yIFeB0=${xIkUL;r&OgOW~;9Kh5Ov8y8XxMP~|n?rl6 zA}a%6#NHt1;d^S9f*%5A0UO3P^?db|;~tPYNZr~p+?lR-uZ040 z{`7%h_zW$VTGi6eGw6Wsu6zv00g1Hv74d%VccEDkK`8KEhV|mzn^Az(Rcc^$#QdR# zep22r+gNbD*L58OXAgkO#^bHEqPqxJ*750h=u zLZ`3Zy>CvBip1ntZ!;E$y_SDVJBbsV+wRDWK!YOo~Tw6Pt1eLZ;b4FTO zT?l?6Nj5R%1ELo1@9AIOx0!52P40w{Q*m!2ncP2;G{9Bx0WWKTJuA@V^CG%A* zSLVdgH$T1r+6$74QL)a!ZgdOm*hhc7N-aM`VY5kpqRk*Pk$X38(WrS+Mk5HKu+@@t zq{fsB(`Fd7-l^hjvE{y_Jk~NkfYPl{zPdj-$$0)ZwbrF9I}htjpX$7ANH#W0kGqJNN;zeT5$>gX#E&B>xThZ*DnXLToKwjxb71Z zlNXPuXHb$27i2rBpKFOOiaXcb8JSp6V>dr|R%dbj$Y=Yk*sOT0dG5YlpB=1!1t&q( zmlUX1`f_93s@JNPGGf;wm3}Jv@Vqm*_*_RxprPfo#(4wBHAXa!^}+pi*cm}@9gUaG zM*Az9GfNb@d#N{fBFExLVL;Ci( zGd7;$MPBZ8Dp`*{YWT*7;VZ0b)CLG{HZ)m%QJZpTab$GxELu4_>P=gH0Id z%{*&;)y+W|+x9w^3$Z9AE>)abC>^yAXwU3^D~7kT9rYVwD23gV_C?fyLCb(i6lnA} zku-HW&d?<58qmc?m>OLDOaLZT;ryZBY;Q7>ad9Q? zTwY28nd){}OAPo1LPA3E`5g6g4UKgxiM>8qRasFjEv-Nc8W2eIs+rY%5CZ*_YU88S zU>+Zt2ye!k%D8; zFyn6|$jgk>)!(nMP~$+n35SM;rlh>p=3a4hQ7qi@p+%dBpU8NsWCLP)`FiN4jA2_; z#F9A?`juKNl;_=!%;u2A3ad6SDe~)=eGmSa!T=4Xw9g(6ux5vw$SHZUGY@J-q=(m5 zR)6n>s;hx+CYEe67p;7xu(;^(92Y)DGINtcqrynr+CBVkTTrUZT}3mAsNUiiP!g~G zYCa`s_?)NCk=Ju)q%DeD)r}9Wq*OWIv7-OA#Nr24{img?D1N-|;5ce;Wd=iNFh7Sd z5`1SttG${m*}1HTY-Zsn#saYl)w}q9@-`jIA^2~3Iz>BeHb}tfF3ybi8I6}>FYv z56u^R&LJS1-6l<3s1d4(n!|#KbZ485rew64x~Zp_btrYnn~gh5QN*R>l$xv%tB_3g z{3)V^1n>RRE?Wub*Z&sB>i}WR;b3 zU|tQt$%yyFqEeteOtPA6Xhg^7zrkVqsM8_AkSH}0@FS3}wc^=7`5S-FMjN97mCAT* z`@8O64hV(l(%H6d52Cq!LEm?CGjVb8oIV1Ixr+%gjCVit=-T7vpF*0hnXK$oa;D2W z_Wu02?;KEPp2e`ONFsG`n4!|b{zW)GBdSlsCzi!1`REUN+3bxU90C#GQ3*3$uFW9x zh21q()@Ck1*tOIir80#93T(Vd*g7D-$#A-zfmn^pzFQNf&VkYRR%F&M{}M2A^UdV- z8~U%=C^p)(-y`g;5YH!{z=;_h?7XkUtoJXCf9tmc&`wN^N7{*oAwX2$v1L3J0RVPE z6+jLYx`*?g4J?bZG_jn@QZC5)i2&Nhah zH_WM`;F*txX+PVYj5~L5CU{JdAmDNrH1vrsUf?G?dE&XQ5x7=`>l=JiGi&s!GMhD1 z9-u9qsh_RsD|z})k)*#ry}aNj4-!HB6z?wcs^q?S{KdT*B$l>Hbs`f@XA7`Ua3z+P zm*tz?Qr6?m=VPBgEJY@Rd4UC2k#-AJ+f47@f19Z=+m}40D7FUC#)NF@DqYpQE!lys zfP+hId%?VDS+vvrN#Iu_^O%w31rlNOWGy~Ry|MnWPmGRzb?a<0yJ|fk2_mj>(h>gG zkqKd&OSkK3v8sJ(#OSo$($k)_>8MJpYqE{B10FDlnx-+24bp9ee$H$<_XUB(VEFnurl{SIFLgGP{u{d39(krkRw38v ziiVl?7Ne7Q#-o^`&FVS2_D1MJceAW^s)GV8?=ipco9?e;=c-}bne(Lld=Nj+GZTEf=LB7N;s9S&3ijwh$Kf9|+C><^ zDJ5+lGZ5(^57E5Pa&lp8Xy|BHX?XDPGn#(G6FcFw@}@bx{-D82`8zPd6##4+8_h3n z{(#MD#$sxJm@s_?4C*ja3qSo`KmSo)1pbk?pWwGap1+ZR+z0i$BBu~SWt1y@Y38Xk z9QMRw%1K~_-du;p@QxtOEy?jW&Kt#;YoxFu)&QF>pV+!4()OYM`pNIkP!w`U=XX`* zkyZrY*w1{r&$X+G?fG;KpIrG@Q)U{VjVNIc=17ph5qw)@9*&4JLd-n`$9V4El|}DH=h59RF#WK5?0s5jX=mL1r46t&*L(( z;ba!ZO#MYsafs(eW#zS02Ni?;H;MRd2NVWAIFG>f7Z@Z{o4+Lr!OkQ z{>X_-tHH`=E$wdJZQE=G^;1VdGg2iSzb{dnXkZpGjyS0awbTKOu#G}VLc5-op-jhb znK?pxsoD1KCGhnx>(TAJ;;jL{?2j8+8AfgYHYCa&4mT5M!tejHsQH7sP=J;_RQ(xl@rt`o2`1p{;c`2i< zs!RWt^J{s``C*FyVFQhCF5!0Irncc-8XI^M0sHqAH3u6S8YoGC+^1S=RXOSF4&;`H zBBVGED({Doem|^#eJR&be&w4Kt`dOzrT@e&yu>J94>akAhf(ntGs1<-ZIi>TqDKaj zi^FKZl!LP@?TWB4uVnY3gakVkZgBF9pJBGr>upbz?{wI*({L1@8KHdGq{SGzA5{^x z`@{uq=i-}a0W=(-(x=!V<%qXTk`qW?ZO5_st6C1hp1L#A>gCWYSZd0@?h0`WUvL!PT!M5zlY+O4Wo5%aQB- zN-u+agoOyUU1+EmjZoGtu4Bj4&dm$qc_V;BNVLzMBr&quL|8>A3Qw$6Qd6Ss+p zq`jKPg!~XGd}OQe{pv6nOX%ICtbVsiZ- zzP4Z4zcv^8z{l3Eb-D~+LE7DsG+GTetX5N_30!lTYVLE2329kbC5a^}o*Bv@R^jnbD$&XV`bcn~`00u_ztn71p+s*jaL~fhAP~s* zcaI-72kKZFJq_X#ac#1EqYlQ?Wwo;HITBep)dq)dnGI1n*$+Gz=`2>9=?s6)j?K~j zsys|U<#GHo3!FYFv4x5y$%vw+$$DA{i?V)m-r|RsxlXC5=m2VVyZmtN?(V{OtDf?J zUTiVB_4n5Q7hL<#hm>$w-Xn$XFT-4a9nE!=scLr~G<0+sg&ODX@sBaZU!J%FDT#=_ zA|zn|__Z13l!?rdc@}%7G3ce&AWf0qt&o#&N>8)(VaKsEy~+`@4=piOXEK)4aLm+u zNQWrFMJ>Cw30-|;i%^)%{aynoQ0kf6?fZ}&hpYv z9lOq$q(Us2;)!707z9rSK&A>;D%?Fiw{$9L-FsSJ0BT~IeqdxE$uj`G5Qn)1&=%PKnf)jUNVPon>M@0?qjPuBy zVAdbWfK8`LK8%(593PVODitWUX>wnGO5uYG944xa6J84+58F-@M91>Y2sy)l%>Rb>km7(7!hT=i9~^^a2d{rR&f z0Hqk|!iBxAM;8$$95BJe&VW&!I{sKEZpr-;-Nshb#>PSmX^?=RCfvgZRLYmqN3hO^ zr?(!}MJNcvB<4aoc5Z844_U10M?KStvBSQ&li~&`gr)mU*H18 z+HDhP%cIhx$Yc(oNU#?e^L(sccQb_m*B?B)x`IBtD@*nsjqVo-xe*utENZ)ZEo*h6 zvV5lJd|&os()(D4jH-{O3UCJx4B7*kZ6s@)x)HIlB?t%zY>romUzVyo+&8w18P9YZ z?^up*m`2hhw5a<4n!*akpamI#8IG3ID=bG9GhM5T63Ia%fjd^ZfKef?(-D-0IcknB>06b|Rk)M> z>NjZqx7wMqf&67DeHs7Gh7)YUDqe$w6?+}+mx}XZ*}#t^OAXU9YEPp+~}WTzVwJysF#`7MzxHW zNp#Jo83m&AL4i0YLN>u!6P7IqjzCVzk`&;z>vRv^T`!oLloI$Kt_6Uz#PJ3wXYD&w z=#gg1GfoTxMMjCp!9JunQegBDi-|oIsEz}$({hR(UJ_i>CFtJBfFe<{dg0STrQq9h z)6uDI?yn{&^Fz1eB9Us!6y^TyMmp`4K~J77kbEc1^LqJ)a$X27Y~=DdUBQ3?9Ud?( zlfuI#Dc6sWEt%~4x~wF$ItS(}oG-XDO>JyYgE6^0f!rS?D zf`Gv~=HBLc^H8Y{X;fCa5P}@kXT>`pN1%SVnanzLjFRo|D4xV5Y1HFc1FXMDZ|e-j zmZ0Z@BKdK3_DZ$tb8YzENG;L%-n0ZdJI?v4A$)MppE)+`#mAgvQy3uk-516HSI9=n z;S^dvQna1XE|vGnt0Yc|68`NOzazR-G=gr|{mj3Mb9q6<60hZm2hZcO!=(utU1i|WmbO-wIjGCnp# zM`S=Kwi7VM+owtq9i+(6Af>?!)FAYMm#ao!_T69OoYFFp8qw1(MSw3p^U$aOvBDFf zGsgRjiCtA_*7z9Vwg47o$^rF{{y4Vva>LEbTFQ#MDPnEAYs8uFp=qtpqH1eax(-yR zvH&WQaR|f$pk$OvN%Yg-92`wlhiyN)D!pM429fmoPBNWGO1Sea-;QD?8LVtLF2$Bz zdWy|qXY`yS^&EY(!f5ry%;#*jVn3BFK^-cr&$Qlt^J+|l?mYO}b~BD8DM3DZ49Zd6 zpiDg%T!Rr!OX^+RZs1SI;UASYCUWDpMzh0d&QSL%OPY2i?X`sRI6)+%p+S;lgOAF3 zjWw2S#41JN?%sLmS60Tb{G=*@f#EY@kD9(XT9JBDvDUszO{n832DzCQRho7-ogLz+ zUlir!(DoWCvGcEPD`@SC7PDQj_xXASKAw(}lQYOH2{bLQPR=nJn8|iHd*~*O(+Pqs zhB{wV)knI6E*SM*d%gIX4y;0<=%23L+cl4tm6XKu@qIBGNgmOq1S1;c>4sy9`&Z|k zWBr8(ZCWrGKT>vOA9~MD2H@1E<8CS`8DgS}NBHC`iGRA=iF?)o{XZe4|J!#xRQaEH z7OPrQlp_AwoNFv$N;#~vl_`SMQ7c=N}A3Tyqb0y;te!goUplUO;DeyJhIN@ zWFv_KNhTSpRx`lEm6aJ@q!ITZhMB6#^%8iEF9)8UZnu`Ah=M*gcyKAZoN4WLCdr0Rxa< z8nzQ}IGpK|t>8o>`yoi$>9!S9TX>krOKX8zHY0#Q6u=5h08*o4C->%fOyvyjJC?hA zbiGl#)0;&xVvn?}{W?N}0oVa=x`qTlpTwk^*Tb9u3q44BZP#8;Q@#51G7PdJrz|V< zLEB8LmD!h7`{ji7f_ENnPR3atB9wn^AUk?M6*spnnPQF4QQeedhoKXIH;w!d5$Ti= z8e+MsO9bc!^_Wszb@Wajs?uZHvc%Qevsx1~MZAwmzCXfQxzBJhse+#o1-ILt zN3kn$$G|+Avnj;i2Z`OP&>-o_h?6C}l;7JK6=su?!{)f9YOu$V-pIM(o!a{qI}Fre zU)FXWe5BgSJv665v>s31BUN&Fd3|#wTjS8Qi<_!`-m-ornAzi`Jl1hXhoUcs!Vgq- z%B&HP$??TG07>&G2YA53F4PXlm!K6B55YGc=R2}Lcn6D!r8-6?8YwzflRdr}Xn=tW zxs?agO&lfz#AlqwNal3HX7*&LIgN`G;aA>$5?TT%&aX~gW1gHe*1ZP(E?X)&H7b9C z;v8gaEal4OqSYM`AyQ#ixbH)%(;1X}8Q8`G!kj4YQLhe} zuMLl+IH+;96f9H@90fN0cn&0TNbR>Bb^*g}>r~pqGwwVpDQ$kQFjE4Dzb%Flbw=I- z8(@(keSMEF1=s(1DF`mL;i^iGwL#QU9AeNb4T{1rXXlyp^b&@=-lq@c@|`YpB)=KX zzcF=S-e(Z%(p~ENRk5zyy00~FeVQ=y9*~j@k!<0m!GeStR;)^XIgv% z9f299Vg1}=>lnDLPTX9{0o*b^2Wc*>X=))Pw{A{uefaEeJ|1JqK+hOsfOqGFeQsgKq*$^Onuxp57|sb6SIsHG3pgxuN>l!{un4(P`SNxE|5H2v4) zmsN#ymfx~ey2~kiR{-SeMqmxSW&&-y(hMk;z5VPwi!n=^)^wi3m)Y8ael!%93TL1Q z2I(717yU(IojCTJ>2|BVJ*_oRM{D`$wxcKp5Tx9W{s3!iufVKi%Pa6Fs7OhGG6SlA z{g*5~bVT?az`2)ip2Z}EZ=2>qeG1he@#z=?ENAxuwb^x=< zfa$McGk0Mq3Yvry=mn-8;YDiOBdiwSh^TqD>?@t7e6y@aw#F}oS z;ou=;6lL@h-{?9rze@0g*jfDtq?z49)8&Ww*iM#?& zPsrY}ee+Bs>~7ZLSL#h$xpnCg8BFmkpgMtnmGJ^8I7dssTaJTfvC%Lf9Dllsxe|xr zTTx)YWK6{1P}G@?=&U_2IlPp3ioYU@K~Bk~!^wGm{@N~XQ;q3DJEUi-$<0l^S%wYZ zpUwA1#>R3^zGc2mmodR-Pr7z6AWri&mwz4{YwuGqT0MbSZfa*mP za4TNeMsB7cj9*kY3eNQ`L)vwCK1%^X^(#^QTd9Yi!MP#=uEvPcF(b4XBiDD^k!pt6 zp}hvdpHqMKZv#l|Y(BaiN8uTVJdhtt&l!3`K}9Zy)1W-`p8uDH6}*q7SE`abb=GIH zRA~W&dK%3~f}adR2>Dd@#y+$mzzG0g#^*>H=~0#A`Mddj&ZDWX#>a!&4M$(jK+8L7 z_k(Z43qWQipYoM_ise&hb_j0KnE*$O}I4=y`Y4;+IS@-_hAQJVj4L?Kf57h>eR{q=a+Ow5tdQ z15;8!3$J2vwk&KNr8|hHL9Tg=aCuj@E-$-sIr6*+5f4vjwKF*FyVdP|jN=u9>(#n_ z58K>ezZ_{jwI~42A`#kn>M!=v6FDxrGOW%}ntw&|HSI%}vvp5?_vRSWE1Udaw9QiDAP*dJS7< z9!Pdn{Tv-@ILu zhpUg#K%Yb-mR48iOCHe3u^Fwi6~kh1_@Wo%?ES>}CS+bT5ug!@Z7R{Pi_kVUF@`*S zAW`zC8v&7#HZx_I^}&E>CkfNTX81e7cDW{x%5RgnvOQ{VU+j>VSdpi+0}mzfuUkBQYp0EM&rM7*s?y`J)YNACX7DYnlV`{Ls;_3)G^KmRG>#W=~udjwHuAq{L{~7yg0r zQk!5xo?vDKu3wkyPKF0;_re4hqo6n|BL>#jpoo5NIxlPmAYi~)ZjKrK7{kP^>7mny zNv?D?Hvb>d@T7>_8xu@rPbIeWtV{DlYOy?df8){`kx#`I_nf3SeC+Q9STcS}@Xvi# z;m9jZ;iNAAa>>!)aarrrt_izR4_xR-0r`%09R5`hV%mIRyFC}?ba9}?J_d}+ZN~(w zMS@m4L$hk8-u7OX9i=&>c1M)P<3QteWVTlG5Rq& z{|ni>61wYT2QQmEhkU1=kVH{TNOj#J3xB|FV)=^mc}k9*X|Cp{ck6okBc%!^IZIa2 zvekEOmZ(?;C_Zmtn<7P5lK;f`qTx4?!vzWST;c7bc1)^kV|E)lAC};3m(pdLyCJO} zHYf4IS(7Y_Q@B?tdlgKe%XtQ39`P|#RXdKJGY)>Aa%$1~lYtSZ!=sT436^-A?v z*|tw%;JNUBN%kIbQYpL*1v>Yhf;|GjUMv3RK5|hCQ`HaeOy}$PbFCr}bp%=LY`U3E z;+<%M-7d9!RB@1z#Un^dy_CMhb%wRJ@?D#4hejs43U=djyUwN0g%EU9?D^WB#e5&&Q&qoj;)Z96>BKhRZN zeft+15V1_UwZQVE&5}O0IGSRQ9}xpqG-ShgvYt+|$U=&D^5@g)TnP5R(ua+W8djscw= zr3tZm^$ZiNC8B#K++^5cRl>Qhi0J$uY%qRHg7&h`*}>ZQt)V?W<4%I0rSQNEOH(Yuo zov(5w-Jf^n&9(l6B3|HZjWE&-*)QIu{N%Fj5eW1*%*d(?v*yF8+KXc=a6A>jqIdDH znxb$Hu2T$Nen1-YHe@YS%s<8Ck`rX|BS)TpX<{Cu)Kwr=OXwCTq!GDpC@!#l+ zvIp2kpb!}^#)08dBwin2F=kAWPSBZev(noR;Nitt2CfkT_eP zJOJNGjWC?%W<4C@#R?5}J&aGk9V)PK*-w_kW|f=q@Dj~C?^;G3POC-cA!30~ny;LV z=FxsDSn)ZvtiRK#PoVE_y zUsr0A`wcL|qT5m5ub2>LtCT}waet-*!lUHc<+r!bh?6y%0UJNc0mwO8FknjoE>&Km za`1nU`pe%)J#}SyiT;=))#4|z#WHX-68?W34ZbfAG>V&7o5}Wv3Za^q$cg`{EMG2u z>!yMwK$8kHRh9dwUa);6SnFt`KWmq%zI$Z5J!S-|(~dIYaP`ncRg8=g#*j+LNI2b& zjENNy)Rv3mmiJxirKS7g)ZZY+6G_M*Hd7+gZC;3Ew+?O+cSd*5UGrlV%cx2hrZ|pB zGrMNiQtgZR}58f;}!cWilunFgZ!H3xxQcZQIsHxYKfcZVb03R7zmArKA zW&wXm$UPw@V)LVw|vi* zrR=m8-qU03JLVPD*7161|92n368N+|g1_zJVR=~Sm#i6T=CS%J7iku?_t)`H*)<0gt`Q#>WZz`#&+A>)S3@@E+6lU$8LDS=MNS8moi`)xJ z@7!tw&2})ja)C?9i^V_3txBT+Q&OQ^U>CtFzQ~T$!332xA{Gp@n?rTIq({dG&wfGw zdc!_bhW#Fx&`0POKWb+NB3o&5e6#V}FKzuZLIOe#lz(al>HNWXjEtAPP*fvKR3cS1 zg5`ad#Bldi*F@a{5c4%2g$UzeQvetgXmRyWlVv)Zgpb_mEa@ym;m`pObJ$c9+ML-qXJ$2Z>L;6Z^o9I0C)!AAWDL z(ECkkK|_Prtv-;m{_5VyJ*edrW>q#LN8~9?N{-o$0_VZKdK~rQiaT|rgE0uYYo=~H zT=h=7eEy@*IJ0iyJl(3IX==tVlANed7X-UZ9zuCTuMd;efu zb#Kl&Gv9pk&D=TqYR)s5-5GEKU#wA0@WI1n02Iu)3S;I<8O*fJSRD0-@@9? zTaXN2HbYSFdJ?Qgy-b3(atP@kiekcJk;e*atYwA$bCpMwU@V%s_@{m^yB~^*{|p>hil4HvoFcuGj*_Unhx4**i0$k4qis20`D%`33UVLkQg=0<0L6Sp zcw`%mypi0%ix(}o3Zx|fy^0#89f_8Iz&vX5vY&gZNLnoOQ9A#qQ1ta%Iv)dF<;}wO z3_9AzFSGWvEl)*F83_IElZd2+}Q^25*fBPk?Rp?!jtqUF@gwbvdQsA z-eGC&(EE_XAD^J{Oj?t?p-W7z7hb%0ab1z;@oDRZ$YX)Y*z)0e|;2d!M=P5PozYhY=;xS7`2#N!QU z`-e4s9k;O)Qc_#)rt0AR(6lBo2MjKm=Sx!zQ@5PF;CiL-T2bNZ?dY$ToI&Z58wS+t*}e|PMQPL>WD8AbSjbQGLv(#T^u zM)Jf}kJbdBdI?2ZaVjn-_>$1BWHYIR5mH$wPUmZAz)RTS5{)oQK*AJrPuk0c`{Rsa%NubHx1LXcR|G> zUk!hL(^VqF^kBk}3*K>$hsFVY$pQM|?x^~renW2;B7Ma%g0V8$LOw}v{E|dls(nwt z6LBC1pJKI86cTq|J>5O?sTFllN|3Om)`10O(FAmciOQKVh=Jj7ry~DCvuJS(G|nNU zH>?K}S|}$Ol6LlJ-dIK57pkndTAg#J;(2Mk7IBSN9Hu)@FSveG9ZmMXooF_CyfZy^ zp*=H3PE&t3Z1ou^7^@dzZ`M7Mw^D95l(~v6`um>0%eMOp2-8$)??0R_I>e9`DhYRg z%|r~bqo-kR3lgXoX~8H;n@#HyPB*A7XY=0Ut|Y#A&A2l|w!zNM9gUByiGYpKu%&>rJ0YogL40>T zVkbvC@@$Za50(Ox?|hV7=v5XSzLt28OO;?%<{5UjS*1Cg8rBy^4O{0dkJC!pS5{Su5qLaocbPg{;w(eGU&q!fb^d8(m$i2h zkMjr%2NglIZ;pJwz@^BGvHf;2l4Y@g;f0}AzdXwBi%(>lagW$cQ}k2izSl=N0F!z{ znLl~b3_o#-Ml;JlDzRCwF4&i?1oya~)D&lj>Tg^0$Tuihj|@>g)GsSMn_0Ei0Gmj$ zE3gT*HUa@0W@$Q0#08|oy&jI&8(v%KO=~r2nJv*>)XMPbjej>J2|fuYgLNIP-sd!~ zLE(lRj;`G2y4S`8?B~Uclb;H0)f;$8GdDFyQ+%OE6y2BFRHC*r*Tt!d#(CC{RQrOv z$mBEwlI%-6)655tgcMqbKR6#ywAN-Ev}(B^*+r%+hSA62=h{Dnkk0i2Lk$FDpi>i; zUv^Dh9SpICGK))D6Pfr;ElP}5=N+sVQ4A@h;p{d=Tty|7djzgI@zrVPUas}SpqRF@ zxAA5qUz^AkCfoe63O*IIW+mO{vb|1<7r@x-VH2jdrY2m^!)=UiIG)WYj7}A_K4`sp zOXTK{H1+;23&tv7=m4WO%!77H4>FH0G-*weja(5Qs6iQ0l+)t+l=EzRmgFz3?T)VP zlbN44e5^xbY<#EM%oZ5xVGK^THS4Od8*wgSjvYL!Lgf3cgc9lOsf*L0cqInJRC zXW_r5lj)Xd0-uvDU-95t9HWZruB7L5;?uNI=-PYc_^JGi2M6CqSsB#6I~C!?-^9%P zxaBXPPbdOzR&f3G@j*`($H~jaJtjd7Z{H72Uej?EH^BG6vw?Thf(wl!ih{U4S)5ZH zkYBfrFZ^_E!{Yk<8U9}4zdyO0CQq0Rcy`kC`wjO+v<$)LANk^UOA$g}Do$GrrzY)d zW;@?B+B(`iS{oPW37|_~jqg)BsiokHu!lXn)SNo~eX%0bLYkuBP;-SU#mgP7Bm}Mu6>LB9>=pg8 zCagf_9qC~gUH614i$C_tsx?>sT(MW4`YRWmpEnV^@Gv$MwdR*f^5D7XB!<{K;P})x zqwU}llit^8PZx{Tz zuyCK(pHKs4(cN(v8kUuy@9kg(bgD()s`?;cDz)qkw2MpG%zHF-Of>DnY%F$dD#Iy6 zB5x@BX^;(FK8tNaMmIXl?vC?w(+Q+SMJLC=gcPY;Op&SDoq-!|p63FR5M2+y7e|IA zb3QinvHn=R96C-BP0VpYrG#Zy06~#K)4A_eT@X{IsYjXb#3YXkYC!c!<-!UFLxO|N z10JG729Jyp6(+-^P1M7N%f^e=C>BJ6=m^MLqtDMUXLqzU|3Z(L#j0HPbO&ZHF*+b-1c$jk$ThJkq&Ukaj#P zy9{(5{Hcv99`^W}A?l09`2!!*0nquPa`f*jYb#WCrGyIF f`XD9@wJTC2H&Y*^P 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�xSoF;hPkBz4(et|+_#va4 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�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 z%0D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 OV~5Rt&pLGB>i-8_&eKHz literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_2.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3e96cae6d298fba3e21dcf5e9024e779262fef GIT binary patch literal 323068 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

    !@VN%b38)~)jj`Djt}T7d5QcZsguRW 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⪼Am-8iR1NodTwiM3){HACYjK}ZgCg5RAYyLlL0sAZWWCHyY3yicM~A| zWB{~37f1C*NNRhrt9_bK6DSRe1QH6D7X5yQQGfHIU4@?QIz~c@Mj`<*xr%iBTMNq6 z3(;O%voTbxJy$b>&tJGGApt;ACvX7yHNZLf5?>ep+c~l1xgX)71W}*FFTMB?S`RtW z; zqLQe|PS>+qkU4WV?{C;i@=R}Kq)JRW)Fg^Yo7u^?r5Gr}dM`Yb z0@Um8stCI7zSGso3%E`%jmJ{Z#sRPy;Bpnmsf>esHL&BUamQ&0;y>@vR$WmO`5YZG zg4gc&I|hbrvL_dsl*`IQv4w3>JTA*lMCc@o<`|M4tN(PyU7wX#wLkp6X88Y+_7z}J zZfo0uq%=yWASxk9Nr!-hv`CkdBHcBBh)9=oD!PPqyM`y7v~A(%-Yg$x zGA#aaSFdla5#CKIREX_*k>{5FxOS~nS4!(T>cf}ta_zDV09T^!PJ>seRkJtq-9~}; z*RB2jRq|2jn`5h=ss6mH{Ex38As%MXIB9JZK&KnS{54DOBpv(>>KDL=u9v3@y~(_C zheIz4?s1QxC{@!%GKf%=e%OLyXp#w`R ziwM0%kongIe?H=ex)nJ^B?r^>(vb`j2ZeU`*w?{{U{|%-4P||qyhxUR2bTP2)BbHc zJw-n{I?9UraM<{np01opPqzV37QW$t=^7=Oue%p?!doi&@k^Z_dxwch`*e`1__(U0`C3bd-< ze$IO5x!SE7Eg@icOJ^gs{w(WK;ffz;+bvxZ0)g6J84RS3W)99*KgM`COQt z9WR=%_r?2~w*zdA5_W13`NPicP6Z&kH3tw1{-LPjpDh++KUjo;mz8sYX608ipxmWP zM{qJ*W1GrhP$yqwznD=xV3+$eKyeS?73~RqvhOcwU+dLatHs0{)a?a$*l`^}go=|k zGe4QtD$1Cjb`AH7r*_vEJe>rzSJcE~|X)lX)6rR}VKn>0^sf!|J z8c)9PI+L+$Dg8vP0;}~C3Y)O!O8~YZ(p0lpqcNeH^05AOzH6Kdm z)jo-NgON-2NKXdv^DNZgYAnI@Fd?faRnBRb4~GDb6|}Y zK#u867pb*nPR}iJ&QsyBIdz!x^1sC|&k-kCF6qN(Gu@_nLo4CbgVhpa*mkCZMNOde zc>DywMt+ho7T1RVp;00Ek>s((`u#r`$FFhy?P(-u@$Rv(C^R`5+kj??0!e;<$YgCs z%OTp)a?_yvn`?dXiY^FFfdaE$($P9cQvpq8y*!&4rx!q1bjl}z%ddR5p`GnurcywM z;CMsiu?CIj9b?fKqwLB5*lAdjT53|J zYvf6__*Gr`pKdzZ3KQqFuPP{m?l&Xz*SVc

    ?n6&;kF{D(U}{N)G^S<*H^v?hfv) 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

  1. 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%0DaiwCUN@8>Fyq}?PV`I3Vcey~k+I;Au*GgQ% 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 Ux-o|B8t@}8ts+(U(&XL$0!jQw^8f$< literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_3.png b/x-pack/plugins/fleet/dev_docs/local_setup/screenshots/vm_fleet_server_3.png new file mode 100644 index 0000000000000000000000000000000000000000..bb328ecf9773bdc714471dd41c123d93b0376a74 GIT binary patch literal 584290 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
    0l9E1v<~B_u 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%0ALI^`+4h~R-iEW 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 Date: Tue, 4 Jun 2024 11:14:45 +0200 Subject: [PATCH 35/82] [Fleet] Remove FQDN beta badge from agent policies settings (#184650) Closes https://github.com/elastic/ingest-dev/issues/3368 ## Summary Remove FQDN beta badge from agent policies settings **Before** ![Screenshot 2024-06-03 at 15 34 10](https://github.com/elastic/kibana/assets/16084106/353c088e-5b8a-4c84-be88-25af7707a846) **After** ![Screenshot 2024-06-03 at 15 02 02](https://github.com/elastic/kibana/assets/16084106/596ca9d5-2d5c-4aec-902a-480ec32f56f0) ### Checklist - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/agent_policy_advanced_fields/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx index 9cd7a0b99af02..53d0042f0b05e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx @@ -631,8 +631,6 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent = id="xpack.fleet.agentPolicyForm.hostnameFormatLabel" defaultMessage="Host name format" /> -   -

    $eJye^)E&^B=Y615_z4{8QU9mKBLQr%@hq9`-!YYcZy&%k zl*f0;0kTZu1}(zxQ_qZ2oSpir>!==~NCe`<-c3)iZhp7Nn@BF0=L3u>3JQvbe=Hnfj)4$KoJ+Ic-(yOd7EZX zpZemIaMDrZ1N3knUqS2Si=+TvNmwaLx)+E|6PfeHBFH4PBrDk_7ftY|9**<5uG?lK zGL9k4FMhb@HW^L!|IzlmJtq&p#4LS3-pwY46$~qG z>lFKblHQu-hl`yx5AYqi_8c+P@lBUvK0cUA@=(*%#1WnDcgR|kLcpED+SG9|7<{eY(DK#&bq*gas z#XY`W%YRDZCGw>Yz3Q}78}r&*p?UlSm^5CIuh^YYdc&3mts7V~N)O&yw8$K`)Vopa zboPdyJ5P5zQ?&T~d{ahG@gj-SNT^y}YTZ~d4mJ37$uIROFZg02QHlkHiw5PYuYBWw zlZZr6>SkHbGHlv1ckbW5_U#^)_y67(ueCXx1@YuKB?0_fJs1jZ)V5z zQHfE6*JQ6Zp={CzOwwHzW$=wb(XRz>9l|q=RtgZ;NZ6e*Dit{(x>_4kQ^Nn|N>l)) zc<9b;@{%^mlzZ4@J6h7l`HTHSuXTCVN;roK`jnF$-SQa>4=8p#eSG3Z%Jv9dK0z4F z<=&*3W00~?MQ%;k5U;-_JaJcCoIx=C};;2Lq_b00sNrJDrA;g zj8{>Bc2^*azqE$>dCzl!okE+nGmStJOP%rKv3HJ5S0g&ZZ#?7f?*6gizT2BNx}Ej< zqpouruR8Qz>HxhkJ}L5_#-V^Gv59`6RDF8yCMkY@Zav zJ>3v8Y%({AhSzryzjv<+T}W+!Lhl~FiS1;<^e2f&6~{+h!^NilBlud3NBD2#wXzl; zk7sW|8?W0f#uym=mfS5VQ^U7-EJbz(!(wUv&ZKe!)ofqVS^1Pl%FFxDx}SYEe}q~N zKEV`36Xia=;R>mkF%1{yCZC73&rn5OCw0k?Pf>Ui$iAclb}G+iO(b&7sy2e5-!jHi zF(sxN83X`gb4T?n>$7X&+d*L3E;c@{ITBjPUBCHyk(*WXK*=wL#i+^Xv0AaEc@f*L z@%gEpxH|0w<|D4VlEuG;ETp~ap;KS(HU6+zrhG!Sy$Lr*mKfC!y=j zTFOq>s0(ChPha&SQ^~`4OD3US0ofJpu+e0WhkfFUGlYLdPEk+*jiGo>IJO#i%W3xF zU)%k^4x6XWoEA7apc{Tx(Zm0>-&MVpK*wi9@?vbYmeI5~g@mpnm|E6T*vE|1y4IRU zsqnVd5K_M?DthW3W&W7KPUc&g`?{7!l9qHIpAF<@C1j><3uT&s;Cvuc6FW`0#P{f6 zQZi#w1+~2JY)N#MKv3k4&`z*xm|~I)MUvc{3v)B__icKH>h6j5Ym&bCTY-z0 zK**g~VZl7Xq%=FrSlPP{Ar;{JY%0DK&E;SVxH1oI`Tjgd`F>-NqwDL7R~OCbMTu(K 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
    r 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

    • - {messagesByUniqueId.map(({ longMessage }, i) => ( + {messageGroup.map(({ longMessage }, i) => ( {longMessage} ))}
    diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 9fab715a08d82..c1ef27f63100d 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -299,7 +299,7 @@ type UserMessageDisplayLocation = export type UserMessagesDisplayLocationId = UserMessageDisplayLocation['id']; export interface UserMessage { - uniqueId?: string; + uniqueId: string; severity: 'error' | 'warning' | 'info'; shortMessage: string; longMessage: string | React.ReactNode | ((closePopover: () => void) => React.ReactNode); @@ -307,8 +307,6 @@ export interface UserMessage { displayLocations: UserMessageDisplayLocation[]; } -export type RemovableUserMessage = UserMessage & { uniqueId: string }; - export interface UserMessageFilters { severity?: UserMessage['severity']; dimensionId?: string; @@ -319,11 +317,7 @@ export type UserMessagesGetter = ( filters?: UserMessageFilters ) => UserMessage[]; -export type AddUserMessages = (messages: RemovableUserMessage[]) => () => void; - -export function isMessageRemovable(message: UserMessage): message is RemovableUserMessage { - return Boolean(message.uniqueId); -} +export type AddUserMessages = (messages: UserMessage[]) => () => void; /** * Interface for the datasource registry diff --git a/x-pack/plugins/lens/public/user_messages_ids.ts b/x-pack/plugins/lens/public/user_messages_ids.ts new file mode 100644 index 0000000000000..a57e5f871cbf9 --- /dev/null +++ b/x-pack/plugins/lens/public/user_messages_ids.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const PRECISION_ERROR_ACCURACY_MODE_ENABLED = 'layer_settings_accuracy_mode_enabled'; +export const PRECISION_ERROR_ACCURACY_MODE_DISABLED = 'layer_settings_accuracy_mode_disabled'; +export const PRECISION_ERROR_ASC_COUNT_PRECISION = 'precision_error_asc_count_precision'; +export const TSDB_UNSUPPORTED_COUNTER_OP = 'tsdb_unsupported_counter_op'; +export const LAYER_SETTINGS_RANDOM_SAMPLING_INFO = 'random_sampling_info'; +export const LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS = 'ignoring-global-filters-layers'; +export const EDITOR_MISSING_VIS_TYPE = 'editor_missing_vis_type'; +export const EDITOR_UNKNOWN_VIS_TYPE = 'editor_unknown_vis_type'; +export const EDITOR_UNKNOWN_DATASOURCE_TYPE = 'editor_unknown_datasource_type'; +export const EDITOR_MISSING_DATAVIEW = 'editor_missing_dataview'; +export const EDITOR_MISSING_EXPRESSION_DATAVIEW = 'editor_missing_expression_dataview'; +export const EDITOR_INVALID_DIMENSION = 'editor_invalid_dimension'; +export const TIMESHIFT_LT_INTERVAL = 'timeshift_smaller_then_interval'; +export const TIMESHIFT_NOT_MULTIPLE_INTERVAL = 'timeshift_not_multiple_interval'; +export const TERMS_WITH_MULTIPLE_TIMESHIFT = 'terms_with_multiple_timeshift'; +export const TERMS_MULTI_TERMS_AND_SCRIPTED_FIELDS = 'terms_wit_multiple_terms_scripted_fields'; + +export const REDUCED_TIME_RANGE_NO_DATE_HISTOGRAM = 'reduced_time_range_no_date_histogram'; +export const REDUCED_TIME_RANGE_DEFAULT_DATE_FIELD = 'reduced_time_range_default_date_field'; + +export const FIELD_NOT_FOUND = 'field_not_found'; +export const FIELD_WRONG_TYPE = 'field_wrong_type'; + +export const UNSUPPORTED_DOWNSAMPLED_INDEX_AGG_PREFIX = + 'unsupported_aggregation_on_downsampled_index-'; +/** + * A warning object for a search response with incomplete ES results + * ES returns incomplete results when: + * 1) Set timeout flag on search and the timeout expires on cluster + * 2) Some shard failures on a cluster + * 3) skipped remote(s) (skip_unavailable=true) + * a. all shards failed + * b. disconnected/not-connected + */ +export const INCOMPLETE_ES_RESULTS = 'incomplete_es_results'; + +export const CALCULATIONS_DATE_HISTOGRAM_REQUIRED = 'calculations_date_histogram_required'; +export const CALCULATIONS_MISSING_COLUMN_REFERENCE = 'calculations_missing_column_reference'; +export const CALCULATIONS_WRONG_DIMENSION_CONFIG = 'calculations_wrong_dimension_configuration'; + +export const TIME_SHIFT_MULTIPLE_DATE_HISTOGRAMS = 'time_shift_multiple_date_histograms'; + +export const INTERVAL_OP_MISSING_UI_SETTINGS_HISTOGRAM_BAR_TARGET = + 'missing_ui_settings_histogram_bar_target'; +export const INTERVAL_OP_MISSING_TIME_RANGE = 'interval_op_missing_time_range'; +export const INTERVAL_OP_MISSING_DATE_HISTOGRAM_TO_COMPUTE_INTERVAL = + 'missing_date_histogram_to_compute_interval'; + +export const TIMERANGE_OP_DATAVIEW_NOT_TIME_BASED = 'timerange_op_dataview_not_time_based'; +export const TIMERANGE_OP_MISSING_TIME_RANGE = 'timerange_op_missing_time_range'; + +export const LAST_VALUE_OP_SORT_FIELD_NOT_FOUND = 'last_value_op_sort_field_not_found'; +export const LAST_VALUE_OP_SORT_FIELD_INVALID_TYPE = 'last_value_op_sort_field_invalid_type'; +export const FORMULA_LAYER_ONLY_STATIC_VALUES = 'formula_layer_only_static_values'; +export const STATIC_VALUE_NOT_VALID_NUMBER = 'static_value_not_valid_number'; + +/** Annotations require a time based chart to work. Add a date histogram. */ +export const ANNOTATION_MISSING_DATE_HISTOGRAM = 'annotation_missing_date_histogram'; +export const ANNOTATION_MISSING_TIME_FIELD = 'annotation_missing_time_field'; +export const ANNOTATION_MISSING_TOOLTIP_FIELD = 'annotation_missing_tooltip_field'; +export const ANNOTATION_TIME_FIELD_NOT_FOUND = 'annotation_time_field_not_found_in_dataview'; +export const ANNOTATION_TEXT_FIELD_NOT_FOUND = 'annotation_text_field_not_found_in_dataview'; +export const ANNOTATION_INVALID_FILTER_QUERY = 'annotation_invalid_filter_query'; + +export const XY_BREAKDOWN_MISSING_AXIS = 'xy_breakdown_missing_axis'; +export const XY_Y_MISSING_AXIS = 'xy_y_missing_axis'; +export const XY_X_WRONG_DATA_TYPE = 'xy_x_wrong_data_type'; +export const XY_Y_WRONG_DATA_TYPE = 'xy_y_wrong_data_type'; +export const XY_RENDER_ARRAY_VALUES = 'xy_rendering_values_array'; +export const XY_MIXED_LOG_SCALE = 'xy_mixed_log_scale-groupid-'; +export const XY_MIXED_LOG_SCALE_DIMENSION = 'xy_mixed_log_scale-dimension-'; + +export const PIE_TOO_MANY_DIMENSIONS = 'pie_too_many_dimensions'; +export const PIE_RENDER_ARRAY_VALUES = 'pie_rendering_values_array'; + +export const WAFFLE_SMALL_VALUES = 'waffle_small_values'; + +export const METRIC_NUMERIC_MAX = 'metric_max_numeric'; + +export const HEATMAP_X_MISSING_AXIS = 'heatmap_x_missing_axis'; +export const HEATMAP_RENDER_ARRAY_VALUES = 'heatmap_rendering_values_array'; + +export const GAUGE_MIN_GT_MAX = 'gauge_min_gt_max'; +export const GAUGE_MIN_GT_METRIC = 'gauge_min_gt_metric'; +export const GAUGE_MIN_GT_GOAL = 'gauge_min_gt_goal'; +export const GAUGE_MIN_NE_MAX = 'gauge_min_ne_max'; +export const GAUGE_METRIC_GT_MAX = 'gauge_metric_gt_max'; +export const GAUGE_GOAL_GT_MAX = 'gauge_goal_gt_max'; + +export const TEXT_BASED_LANGUAGE_ERROR = 'text_based_lang_error'; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts index d14af61a17d6b..e5b908a6f4c76 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.test.ts @@ -565,6 +565,7 @@ describe('gauge', () => { "longMessage": "", "severity": "error", "shortMessage": "Minimum value may not be greater than maximum value", + "uniqueId": "gauge_min_gt_max", }, ] `); diff --git a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx index cbe425ff3088c..ca3c65252ec47 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/visualization.tsx @@ -48,6 +48,14 @@ import { applyPaletteParams } from '../../shared_components'; import { GaugeDimensionEditor } from './dimension_editor'; import { generateId } from '../../id_generator'; import { getAccessorsFromState } from './utils'; +import { + GAUGE_GOAL_GT_MAX, + GAUGE_METRIC_GT_MAX, + GAUGE_MIN_GT_GOAL, + GAUGE_MIN_GT_MAX, + GAUGE_MIN_GT_METRIC, + GAUGE_MIN_NE_MAX, +} from '../../user_messages_ids'; const groupLabelForGauge = i18n.translate('xpack.lens.metric.groupLabel', { defaultMessage: 'Goal and single value', @@ -131,6 +139,7 @@ const getErrorMessages = (row?: DatatableRow, state?: GaugeVisualizationState): if (maxValue !== null && maxValue !== undefined && minValue != null && minValue !== undefined) { if (maxValue < minValue) { errors.push({ + uniqueId: GAUGE_MIN_GT_MAX, severity: 'error', displayLocations: [ { id: 'dimensionButton', dimensionId: minAccessor! }, @@ -148,6 +157,7 @@ const getErrorMessages = (row?: DatatableRow, state?: GaugeVisualizationState): } if (maxValue === minValue) { errors.push({ + uniqueId: GAUGE_MIN_NE_MAX, severity: 'error', displayLocations: [ { id: 'dimensionButton', dimensionId: minAccessor! }, @@ -519,6 +529,7 @@ export const getGaugeVisualization = ({ if (typeof minValue === 'number') { if (minValue > metricValue) { warnings.push({ + uniqueId: GAUGE_MIN_GT_METRIC, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], @@ -533,6 +544,7 @@ export const getGaugeVisualization = ({ } if (minValue > goalValue) { warnings.push({ + uniqueId: GAUGE_MIN_GT_GOAL, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], @@ -550,6 +562,7 @@ export const getGaugeVisualization = ({ if (typeof maxValue === 'number') { if (metricValue > maxValue) { warnings.push({ + uniqueId: GAUGE_METRIC_GT_MAX, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], @@ -565,6 +578,7 @@ export const getGaugeVisualization = ({ if (typeof goalValue === 'number' && goalValue > maxValue) { warnings.push({ + uniqueId: GAUGE_GOAL_GT_MAX, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/heatmap/visualization.test.ts index 54663bd221509..531afe6a318a1 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/heatmap/visualization.test.ts @@ -626,6 +626,7 @@ describe('heatmap', () => { "longMessage": "Configuration for the horizontal axis is missing.", "severity": "error", "shortMessage": "Missing Horizontal axis.", + "uniqueId": "heatmap_x_missing_axis", }, ] `); diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx b/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx index 5d19c402a27e2..d434d58bdfa75 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/heatmap/visualization.tsx @@ -38,6 +38,7 @@ import { HeatmapToolbar } from './toolbar_component'; import { HeatmapDimensionEditor } from './dimension_editor'; import { getSafePaletteParams } from './utils'; import { FormBasedPersistedState } from '../..'; +import { HEATMAP_RENDER_ARRAY_VALUES, HEATMAP_X_MISSING_AXIS } from '../../user_messages_ids'; const groupLabelForHeatmap = i18n.translate('xpack.lens.heatmapVisualization.heatmapGroupLabel', { defaultMessage: 'Magnitude', @@ -428,6 +429,7 @@ export const getHeatmapVisualization = ({ if (!state.xAccessor) { errors.push({ + uniqueId: HEATMAP_X_MISSING_AXIS, severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], @@ -456,6 +458,7 @@ export const getHeatmapVisualization = ({ warnings = hasArrayValues ? [ { + uniqueId: HEATMAP_RENDER_ARRAY_VALUES, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], diff --git a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx index 28c547df25ebd..f60b1da51505d 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx @@ -34,6 +34,7 @@ import { Toolbar } from './toolbar'; import { generateId } from '../../id_generator'; import { toExpression } from './to_expression'; import { nonNullable } from '../../utils'; +import { METRIC_NUMERIC_MAX } from '../../user_messages_ids'; export const DEFAULT_MAX_COLUMNS = 3; @@ -719,6 +720,7 @@ export const getMetricVisualization = ({ ); if (isMetricNonNumeric) { errors.push({ + uniqueId: METRIC_NUMERIC_MAX, severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'dimensionButton', dimensionId: state.maxAccessor }], diff --git a/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx b/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx index 3c45371326932..71daba931f23d 100644 --- a/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx @@ -54,6 +54,11 @@ import { DatasourcePublicAPI } from '../..'; import { nonNullable, getColorMappingDefaults } from '../../utils'; import { getColorMappingTelemetryEvents } from '../../lens_ui_telemetry/color_telemetry_helpers'; import { PersistedPieVisualizationState, convertToRuntime } from './persistence'; +import { + PIE_RENDER_ARRAY_VALUES, + PIE_TOO_MANY_DIMENSIONS, + WAFFLE_SMALL_VALUES, +} from '../../user_messages_ids'; const metricLabel = i18n.translate('xpack.lens.pie.groupMetricLabelSingular', { defaultMessage: 'Metric', @@ -577,6 +582,7 @@ export const getPieVisualization = ({ const errors: UserMessage[] = hasTooManyBucketDimensions ? [ { + uniqueId: PIE_TOO_MANY_DIMENSIONS, severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], @@ -619,6 +625,7 @@ export const getPieVisualization = ({ checkTableForContainsSmallValues(frame.activeData[layerId], numericColumn.id, 1) ) { warningMessages.push({ + uniqueId: WAFFLE_SMALL_VALUES, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], @@ -646,6 +653,7 @@ export const getPieVisualization = ({ frame.datasourceLayers[layerId]?.getOperationForColumnId(colId)?.label || colId ); warningMessages.push({ + uniqueId: PIE_RENDER_ARRAY_VALUES, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], diff --git a/x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts b/x-pack/plugins/lens/public/visualizations/xy/state_helpers.tsx similarity index 64% rename from x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts rename to x-pack/plugins/lens/public/visualizations/xy/state_helpers.tsx index 5cfea011403a5..85cc732373d52 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/state_helpers.tsx @@ -4,6 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; @@ -14,7 +16,7 @@ import { i18n } from '@kbn/i18n'; import fastIsEqual from 'fast-deep-equal'; import { validateQuery } from '@kbn/visualization-ui-components'; import { DataViewsState } from '../../state_management'; -import { FramePublicAPI, DatasourcePublicAPI } from '../../types'; +import { FramePublicAPI, DatasourcePublicAPI, UserMessage } from '../../types'; import { visualizationTypes, XYLayerConfig, @@ -30,6 +32,13 @@ import { isDataLayer, isByReferenceAnnotationsLayer, } from './visualization_helpers'; +import { + ANNOTATION_INVALID_FILTER_QUERY, + ANNOTATION_MISSING_TIME_FIELD, + ANNOTATION_MISSING_TOOLTIP_FIELD, + ANNOTATION_TEXT_FIELD_NOT_FOUND, + ANNOTATION_TIME_FIELD_NOT_FOUND, +} from '../../user_messages_ids'; export function isHorizontalSeries(seriesType: SeriesType) { return ( @@ -142,11 +151,38 @@ export const annotationLayerHasUnsavedChanges = (layer: XYAnnotationLayerConfig) return !fastIsEqual(currentConfig, savedConfig); }; +function createAnnotationErrorMessage( + uniqueId: string, + errorMessage: string, + annotationId: string, + annotationName: string +): UserMessage { + return { + uniqueId, + severity: 'error', + fixableInEditor: true, + displayLocations: [ + { id: 'visualization' }, + { id: 'dimensionButton', dimensionId: annotationId }, + ], + shortMessage: errorMessage, + longMessage: ( + + ), + }; +} export function getAnnotationLayerErrors( layer: XYAnnotationLayerConfig, columnId: string, dataViews: DataViewsState -): string[] { +): UserMessage[] { if (!layer) { return []; } @@ -156,35 +192,57 @@ export function getAnnotationLayerErrors( } const layerDataView = dataViews.indexPatterns[layer.indexPatternId]; - const invalidMessages: string[] = []; + const invalidMessages: UserMessage[] = []; if (annotation.timeField == null || annotation.timeField === '') { invalidMessages.push( - i18n.translate('xpack.lens.xyChart.annotationError.timeFieldEmpty', { - defaultMessage: 'Time field is missing', - }) + createAnnotationErrorMessage( + ANNOTATION_MISSING_TIME_FIELD, + i18n.translate('xpack.lens.xyChart.annotationError.timeFieldEmpty', { + defaultMessage: 'Time field is missing', + }), + annotation.id, + annotation.label + ) ); } if (annotation.timeField && !Boolean(layerDataView.getFieldByName(annotation.timeField))) { invalidMessages.push( - i18n.translate('xpack.lens.xyChart.annotationError.timeFieldNotFound', { - defaultMessage: 'Time field {timeField} not found in data view {dataView}', - values: { timeField: annotation.timeField, dataView: layerDataView.title }, - }) + createAnnotationErrorMessage( + ANNOTATION_TIME_FIELD_NOT_FOUND, + i18n.translate('xpack.lens.xyChart.annotationError.timeFieldNotFound', { + defaultMessage: 'Time field {timeField} not found in data view {dataView}', + values: { timeField: annotation.timeField, dataView: layerDataView.title }, + }), + annotation.id, + annotation.label + ) ); } const { isValid, error } = validateQuery(annotation?.filter, layerDataView); if (!isValid && error) { - invalidMessages.push(error); + invalidMessages.push( + createAnnotationErrorMessage( + ANNOTATION_INVALID_FILTER_QUERY, + error, + annotation.id, + annotation.label + ) + ); } if (annotation.textField && !Boolean(layerDataView.getFieldByName(annotation.textField))) { invalidMessages.push( - i18n.translate('xpack.lens.xyChart.annotationError.textFieldNotFound', { - defaultMessage: 'Text field {textField} not found in data view {dataView}', - values: { textField: annotation.textField, dataView: layerDataView.title }, - }) + createAnnotationErrorMessage( + ANNOTATION_TEXT_FIELD_NOT_FOUND, + i18n.translate('xpack.lens.xyChart.annotationError.textFieldNotFound', { + defaultMessage: 'Text field {textField} not found in data view {dataView}', + values: { textField: annotation.textField, dataView: layerDataView.title }, + }), + annotation.id, + annotation.label + ) ); } if (annotation.extraFields?.length) { @@ -196,15 +254,20 @@ export function getAnnotationLayerErrors( } if (missingTooltipFields.length) { invalidMessages.push( - i18n.translate('xpack.lens.xyChart.annotationError.tooltipFieldNotFound', { - defaultMessage: - 'Tooltip {missingFields, plural, one {field} other {fields}} {missingTooltipFields} not found in data view {dataView}', - values: { - missingTooltipFields: missingTooltipFields.join(', '), - missingFields: missingTooltipFields.length, - dataView: layerDataView.title, - }, - }) + createAnnotationErrorMessage( + ANNOTATION_MISSING_TOOLTIP_FIELD, + i18n.translate('xpack.lens.xyChart.annotationError.tooltipFieldNotFound', { + defaultMessage: + 'Tooltip {missingFields, plural, one {field} other {fields}} {missingTooltipFields} not found in data view {dataView}', + values: { + missingTooltipFields: missingTooltipFields.join(', '), + missingFields: missingTooltipFields.length, + dataView: layerDataView.title, + }, + }), + annotation.id, + annotation.label + ) ); } } diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx index ed427f8452685..73802ac2b4c47 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.tsx @@ -7,7 +7,6 @@ import { type ExtraAppendLayerArg, getXyVisualization } from './visualization'; import { Position } from '@elastic/charts'; -import { EUIAmsterdamColorBlindPalette } from '@kbn/coloring'; import { Operation, OperationDescriptor, @@ -61,6 +60,7 @@ import { XYPersistedLinkedByValueAnnotationLayerConfig, XYPersistedState, } from './persistence'; +import { LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS } from '../../user_messages_ids'; const DATE_HISTORGRAM_COLUMN_ID = 'date_histogram_column'; const exampleAnnotation: EventAnnotationConfig = { @@ -230,7 +230,7 @@ describe('xy_visualization', () => { "colorMode": Object { "type": "categorical", }, - "paletteId": "${EUIAmsterdamColorBlindPalette.id}", + "paletteId": "eui_amsterdam_color_blind", "specialAssignments": Array [ Object { "color": Object { @@ -3144,6 +3144,7 @@ describe('xy_visualization', () => { "longMessage": "", "severity": "error", "shortMessage": "Annotations require a time based chart to work. Add a date histogram.", + "uniqueId": "annotation_missing_date_histogram", }, ] `); @@ -3308,6 +3309,7 @@ describe('xy_visualization', () => { />, "severity": "warning", "shortMessage": "", + "uniqueId": "xy_rendering_values_array", } `); }); @@ -3412,7 +3414,7 @@ describe('xy_visualization', () => { fixableInEditor: false, severity: 'info', shortMessage: 'Layers ignoring global filters', - uniqueId: 'ignoring-global-filters-layers', + uniqueId: LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS, }) ); }); diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 71b5dea315937..487e23e1224b7 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -119,6 +119,15 @@ import { LayerSettings } from './layer_settings'; import { IgnoredGlobalFiltersEntries } from '../../shared_components/ignore_global_filter'; import { getColorMappingTelemetryEvents } from '../../lens_ui_telemetry/color_telemetry_helpers'; import { XYPersistedState, convertToPersistable, convertToRuntime } from './persistence'; +import { + ANNOTATION_MISSING_DATE_HISTOGRAM, + LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS, + XY_MIXED_LOG_SCALE, + XY_MIXED_LOG_SCALE_DIMENSION, + XY_RENDER_ARRAY_VALUES, + XY_X_WRONG_DATA_TYPE, + XY_Y_WRONG_DATA_TYPE, +} from '../../user_messages_ids'; const XY_ID = 'lnsXY'; @@ -773,6 +782,7 @@ export const getXyVisualization = ({ layer.annotations.forEach((annotation) => { if (!hasDateHistogram) { errors.push({ + uniqueId: ANNOTATION_MISSING_DATE_HISTOGRAM, severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'dimensionButton', dimensionId: annotation.id }], @@ -788,72 +798,43 @@ export const getXyVisualization = ({ } const errorMessages = getAnnotationLayerErrors(layer, annotation.id, dataViews); - errors.push( - ...errorMessages.map((errorMessage) => { - const message: UserMessage = { - severity: 'error', - fixableInEditor: true, - displayLocations: [ - { id: 'visualization' }, - { id: 'dimensionButton', dimensionId: annotation.id }, - ], - shortMessage: errorMessage, - longMessage: ( - - ), - }; - return message; - }) - ); + errors.push(...errorMessages); }); }); - // Data error handling below here - const hasNoAccessors = ({ accessors }: XYDataLayerConfig) => - accessors == null || accessors.length === 0; - - const hasNoSplitAccessor = ({ splitAccessor, seriesType }: XYDataLayerConfig) => - seriesType.includes('percentage') && splitAccessor == null; - // check if the layers in the state are compatible with this type of chart if (state && state.layers.length > 1) { // Order is important here: Y Axis is fundamental to exist to make it valid - const checks: Array<[string, (layer: XYDataLayerConfig) => boolean]> = [ - ['Y', hasNoAccessors], - ['Break down', hasNoSplitAccessor], - ]; - - for (const [dimension, criteria] of checks) { - const result = validateLayersForDimension(dimension, state.layers, criteria); - if (!result.valid) { - errors.push({ - severity: 'error', - fixableInEditor: true, - displayLocations: [{ id: 'visualization' }], - shortMessage: result.payload.shortMessage, - longMessage: result.payload.longMessage, - }); - } + const yLayerValidation = validateLayersForDimension( + 'y', + state.layers, + ({ accessors }) => accessors == null || accessors.length === 0 // has no accessor + ); + if (!yLayerValidation.valid) { + errors.push(yLayerValidation.error); + } + + const breakDownLayerValidation = validateLayersForDimension( + 'break_down', + state.layers, + ({ splitAccessor, seriesType }) => + seriesType.includes('percentage') && splitAccessor == null // check if no split accessor + ); + if (!breakDownLayerValidation.valid) { + errors.push(breakDownLayerValidation.error); } } // temporary fix for #87068 errors.push( - ...checkXAccessorCompatibility(state, datasourceLayers).map( - ({ shortMessage, longMessage }) => - ({ - severity: 'error', - fixableInEditor: true, - displayLocations: [{ id: 'visualization' }], - shortMessage, - longMessage, - } as UserMessage) + ...checkXAccessorCompatibility(state, datasourceLayers).map( + ({ shortMessage, longMessage }) => ({ + severity: 'error', + uniqueId: XY_X_WRONG_DATA_TYPE, + fixableInEditor: true, + displayLocations: [{ id: 'visualization' }], + shortMessage, + longMessage, + }) ) ); @@ -864,6 +845,7 @@ export const getXyVisualization = ({ const operation = datasourceAPI.getOperationForColumnId(accessor); if (operation && operation.dataType !== 'number') { errors.push({ + uniqueId: XY_Y_WRONG_DATA_TYPE, severity: 'error', fixableInEditor: true, displayLocations: [{ id: 'visualization' }], @@ -914,6 +896,7 @@ export const getXyVisualization = ({ accessorsWithArrayValues.forEach((label) => warnings.push({ + uniqueId: XY_RENDER_ARRAY_VALUES, severity: 'warning', fixableInEditor: true, displayLocations: [{ id: 'toolbar' }], @@ -974,7 +957,8 @@ export const getXyVisualization = ({ const { groupId } = axisGroup; warnings.push({ - uniqueId: `mixedLogScale-${groupId}`, + // TODO: can we push the group into the metadata and use a correct unique ID here? + uniqueId: `${XY_MIXED_LOG_SCALE}${groupId}`, severity: 'warning', shortMessage: '', longMessage: ( @@ -1003,7 +987,8 @@ export const getXyVisualization = ({ axisGroup.mixedDomainSeries.forEach(({ accessor }) => { warnings.push({ - uniqueId: `mixedLogScale-dimension-${accessor}`, + // TODO: can we push the group into the metadata and use a correct unique ID here? + uniqueId: `${XY_MIXED_LOG_SCALE_DIMENSION}${accessor}`, severity: 'warning', shortMessage: '', longMessage: ( @@ -1276,7 +1261,7 @@ function getNotifiableFeatures( return [ { - uniqueId: 'ignoring-global-filters-layers', + uniqueId: LAYER_SETTINGS_IGNORE_GLOBAL_FILTERS, severity: 'info', fixableInEditor: false, shortMessage: i18n.translate('xpack.lens.xyChart.layerAnnotationsIgnoreTitle', { diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx index 2a0e7faf1106d..e627df3883391 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx @@ -13,6 +13,7 @@ import { DatasourceLayers, FramePublicAPI, OperationMetadata, + UserMessage, VisualizationType, } from '../../types'; import { @@ -30,6 +31,7 @@ import { import { isHorizontalChart } from './state_helpers'; import { layerTypes } from '../..'; import type { ExtraAppendLayerArg } from './visualization'; +import { XY_BREAKDOWN_MISSING_AXIS, XY_Y_MISSING_AXIS } from '../../user_messages_ids'; export function getAxisName( axis: 'x' | 'y' | 'yLeft' | 'yRight', @@ -256,15 +258,19 @@ export const supportedDataLayer = { }; // i18n ids cannot be dynamically generated, hence the function below -export function getMessageIdsForDimension( - dimension: string, +function getMessageIdsForDimension( + dimension: 'y' | 'break_down', layers: number[], isHorizontal: boolean -) { +): UserMessage { const layersList = layers.map((i: number) => i + 1).join(', '); switch (dimension) { - case 'Break down': + case 'break_down': return { + severity: 'error', + fixableInEditor: true, + displayLocations: [{ id: 'visualization' }], + uniqueId: XY_BREAKDOWN_MISSING_AXIS, shortMessage: i18n.translate('xpack.lens.xyVisualization.dataFailureSplitShort', { defaultMessage: `Missing {axis}.`, values: { axis: 'Break down by axis' }, @@ -274,8 +280,12 @@ export function getMessageIdsForDimension( values: { layers: layers.length, layersList, axis: 'Break down by axis' }, }), }; - case 'Y': + case 'y': return { + severity: 'error', + fixableInEditor: true, + displayLocations: [{ id: 'visualization' }], + uniqueId: XY_Y_MISSING_AXIS, shortMessage: i18n.translate('xpack.lens.xyVisualization.dataFailureYShort', { defaultMessage: `Missing {axis}.`, values: { axis: getAxisName('y', { isHorizontal }) }, @@ -286,7 +296,6 @@ export function getMessageIdsForDimension( }), }; } - return { shortMessage: '', longMessage: '' }; } const newLayerFn = { @@ -368,14 +377,14 @@ export function getLayersByType(state: State, byType?: string) { } export function validateLayersForDimension( - dimension: string, + dimension: 'y' | 'break_down', allLayers: XYLayerConfig[], missingCriteria: (layer: XYDataLayerConfig) => boolean ): | { valid: true } | { valid: false; - payload: { shortMessage: string; longMessage: React.ReactNode }; + error: UserMessage; } { const dataLayers = allLayers .map((layer, i) => ({ layer, originalIndex: i })) @@ -411,7 +420,7 @@ export function validateLayersForDimension( return { valid: false, - payload: getMessageIdsForDimension( + error: getMessageIdsForDimension( dimension, layerMissingAccessors, isHorizontalChart(dataLayers.map(({ layer }) => layer)) diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 11ed11bd9a763..17442f5c3ab82 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -22810,7 +22810,7 @@ "xpack.lens.indexPattern.formulaExpressionParseError": "La formule {expression} ne peut pas être analysée", "xpack.lens.indexPattern.formulaExpressionWrongType": "Les paramètres de l'opération {operation} dans la formule ont un type incorrect : {params}", "xpack.lens.indexPattern.formulaExpressionWrongTypeArgument": "Le type de l'argument {name} pour l'opération {operation} dans la formule est incorrect : {type} au lieu de {expectedType}", - "xpack.lens.indexPattern.formulaFieldNotFound": "{variablesLength, plural, one {Champ} other {Champs}} {variablesList} introuvable(s)", + "xpack.lens.indexPattern.formulaFieldNotFound": "{missingFieldCount, plural, one {Champ} other {Champs}} {missingFieldList} introuvable(s)", "xpack.lens.indexPattern.formulaFieldNotRequired": "L'opération {operation} n'accepte aucun champ comme argument", "xpack.lens.indexPattern.formulaMathMissingArgument": "L'opération {operation} dans la formule ne comprend pas les arguments {count} : {params}", "xpack.lens.indexPattern.formulaOperationDuplicateParams": "Les paramètres de l'opération {operation} ont été déclarés plusieurs fois : {params}", @@ -44863,4 +44863,4 @@ "xpack.serverlessObservability.nav.projectSettings": "Paramètres de projet", "xpack.serverlessObservability.nav.synthetics": "Synthetics" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 1875ea6d86efc..0223842043653 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -22786,7 +22786,7 @@ "xpack.lens.indexPattern.formulaExpressionNotHandled": "式{operation}の演算には次のパラメーターがありません:{params}", "xpack.lens.indexPattern.formulaExpressionParseError": "式{expression}を解析できません", "xpack.lens.indexPattern.formulaExpressionWrongType": "式の演算{operation}のパラメーターの型が正しくありません:{params}", - "xpack.lens.indexPattern.formulaFieldNotFound": "{variablesLength, plural, other {フィールド}} {variablesList}が見つかりません", + "xpack.lens.indexPattern.formulaFieldNotFound": "{missingFieldCount, plural, other {フィールド}} {missingFieldList}が見つかりません", "xpack.lens.indexPattern.formulaFieldNotRequired": "演算{operation}ではどのフィールドも引数として使用できません", "xpack.lens.indexPattern.formulaMathMissingArgument": "式{operation}の演算には{count}個の引数がありません:{params}", "xpack.lens.indexPattern.formulaOperationDuplicateParams": "演算{operation}のパラメーターが複数回宣言されました:{params}", @@ -44835,4 +44835,4 @@ "xpack.serverlessObservability.nav.projectSettings": "プロジェクト設定", "xpack.serverlessObservability.nav.synthetics": "Synthetics" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 95b7203e9d1dc..a448ac3bf66e7 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -22819,7 +22819,7 @@ "xpack.lens.indexPattern.formulaExpressionParseError": "公式 {expression} 无法解析", "xpack.lens.indexPattern.formulaExpressionWrongType": "公式中运算 {operation} 的参数的类型不正确:{params}", "xpack.lens.indexPattern.formulaExpressionWrongTypeArgument": "公式中运算 {operation} 的 {name} 参数的类型不正确:{type} 而非 {expectedType}", - "xpack.lens.indexPattern.formulaFieldNotFound": "找不到{variablesLength, plural, other {字段}} {variablesList}", + "xpack.lens.indexPattern.formulaFieldNotFound": "找不到{missingFieldCount, plural, other {字段}} {missingFieldList}", "xpack.lens.indexPattern.formulaFieldNotRequired": "运算 {operation} 不接受任何字段作为参数", "xpack.lens.indexPattern.formulaMathMissingArgument": "公式中的运算 {operation} 缺失 {count} 个参数:{params}", "xpack.lens.indexPattern.formulaOperationDuplicateParams": "运算 {operation} 的参数已声明多次:{params}", @@ -44883,4 +44883,4 @@ "xpack.serverlessObservability.nav.projectSettings": "项目设置", "xpack.serverlessObservability.nav.synthetics": "Synthetics" } -} +} \ No newline at end of file From d97331e93692acbd2bd8825fe9f49b88fb96addf Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 5 Jun 2024 15:26:07 +0200 Subject: [PATCH 78/82] [Synthetics] Fix editing enabled state for project monitor (#184775) ## Summary Fix editing enabled state for project monitor !! Fixes https://github.com/elastic/kibana/issues/184660 --- .../synthetics/public/apps/synthetics/state/monitor_list/api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts index f54b5ac839afe..9442d86265830 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts @@ -72,6 +72,7 @@ export const fetchUpsertMonitor = async ({ null, { version: INITIAL_REST_VERSION, + ui: true, } ); } else { From 3f13215f27d2a5b5dd586e230248224dd91a421c Mon Sep 17 00:00:00 2001 From: Paul Bianciardi <70908889+paulb-elastic@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:36:03 +0100 Subject: [PATCH 79/82] Update the docs to clarify the ID of the private location created (#184818) Update the docs to clarify that the `id` of the Private Location created via the API will be the same `id` as the agent policy --- .../private-locations/create-private-location.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/synthetics/private-locations/create-private-location.asciidoc b/docs/api/synthetics/private-locations/create-private-location.asciidoc index ae00c8a1f2133..61a71de535b9a 100644 --- a/docs/api/synthetics/private-locations/create-private-location.asciidoc +++ b/docs/api/synthetics/private-locations/create-private-location.asciidoc @@ -61,7 +61,7 @@ The API returns the created private location as follows: [source,json] -------------------------------------------------- { - "id": "unique-location-id", + "id": "abcd1234", "label": "Private Location 1", "agentPolicyId": "abcd1234", "tags": ["private", "testing"], From 93b519a90a5ea9e1e125f4c5cf228a3577ef3dfb Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Wed, 5 Jun 2024 15:44:53 +0200 Subject: [PATCH 80/82] [Obs AI Assistant] Evaluation framework improvements (#182941) Mostly more robust handling of function calls, retries in the evaluation framework, updating a couple of evaluation scenarios and removing some ambiguity in our prompts. --- .../get_system_message_instructions.ts | 44 +++--- .../catch_function_not_found_error.ts | 91 ++++++++--- .../client/operators/continue_conversation.ts | 6 +- .../evaluation/alert_templates/templates.ts | 2 +- .../scripts/evaluation/evaluation.ts | 9 ++ .../scripts/evaluation/kibana_client.ts | 142 +++++++++++++----- .../evaluation/scenarios/alerts/index.spec.ts | 35 ++++- .../evaluation/scenarios/apm/index.spec.ts | 7 +- .../evaluation/scenarios/esql/index.spec.ts | 2 +- .../scripts/evaluation/types.ts | 6 +- .../server/functions/query/index.ts | 93 ++++++++---- 11 files changed, 310 insertions(+), 127 deletions(-) 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 dae509e169e10..2bf1052ec30e5 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 @@ -33,45 +33,37 @@ export function getSystemMessageInstructions({ Given the following tool: - { - "name": "my_tool", - "description: "A tool to call", - "parameters": { - "type": "object", - "properties": { - "myProperty": { - "type": "string" - } - } - } - } + ${JSON.stringify({ + name: 'my_tool', + description: 'A tool to call', + parameters: { + type: 'object', + properties: { + myProperty: { + type: 'string', + }, + }, + }, + })} Use it the following way: ${TOOL_USE_START} \`\`\`json - { - "name": "my_tool", - "input": { - "myProperty": "myValue" - } - } + ${JSON.stringify({ name: 'my_tool', input: { myProperty: 'myValue' } })} \`\`\`\ ${TOOL_USE_END} Given the following tool: - { - "name": "my_tool_without_parameters", - "description": "A tool to call without parameters", - } + ${JSON.stringify({ + name: 'my_tool_without_parameters', + description: 'A tool to call without parameters', + })} Use it the following way: ${TOOL_USE_START} \`\`\`json - { - "name": "my_tool_without_parameters", - "input": {} - } + ${JSON.stringify({ name: 'my_tool_without_parameters', input: {} })} \`\`\`\ ${TOOL_USE_END} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts index 251bd3e67e20a..25b1b736c23d0 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts @@ -5,26 +5,83 @@ * 2.0. */ -import { catchError, of, OperatorFunction, throwError } from 'rxjs'; +import { catchError, filter, of, OperatorFunction, share, throwError } from 'rxjs'; +import { i18n } from '@kbn/i18n'; +import { MessageRole } from '../../../../common'; import { - createFunctionLimitExceededError, + ChatCompletionChunkEvent, isFunctionNotFoundError, - MessageAddEvent, + MessageOrChatEvent, + StreamingChatResponseEventType, } from '../../../../common/conversation_complete'; -import { createServerSideFunctionResponseError } from '../../util/create_server_side_function_response_error'; +import { emitWithConcatenatedMessage } from '../../../../common/utils/emit_with_concatenated_message'; -export function catchFunctionNotFoundError(): OperatorFunction { - return catchError((error) => { - if (isFunctionNotFoundError(error)) { - const functionLimitExceededError = createFunctionLimitExceededError(); - return of( - createServerSideFunctionResponseError({ - name: error.meta.name, - error: functionLimitExceededError, - }) - ); - } +function appendFunctionLimitExceededErrorMessageToAssistantResponse(): OperatorFunction< + MessageOrChatEvent, + MessageOrChatEvent +> { + return (source$) => { + return source$.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', + } + )}`, + // remove any function call from the response so the stream can close + function_call: { + name: '', + arguments: '', + trigger: MessageRole.Assistant, + }, + }, + }; + }) + ); + }; +} + +// we catch a function not found error, if: +// - the function limit has been exceeded, +// we append to the message to prevent the +// error going back to the LLM +// else: we complete the observable, and +// allow the LLM to correct the error +export function catchFunctionNotFoundError( + functionLimitExceeded: boolean +): OperatorFunction { + return (source$) => { + const shared$ = source$.pipe(share()); + const chunksWithoutErrors$ = shared$.pipe( + filter( + (event): event is ChatCompletionChunkEvent => + event.type === StreamingChatResponseEventType.ChatCompletionChunk + ), + catchError(() => of()) + ); - return throwError(() => error); - }); + return shared$.pipe( + catchError((error) => { + if (isFunctionNotFoundError(error)) { + if (functionLimitExceeded) { + return chunksWithoutErrors$.pipe( + appendFunctionLimitExceededErrorMessageToAssistantResponse() + ); + } + return chunksWithoutErrors$.pipe(emitWithConcatenatedMessage()); + } + return throwError(() => error); + }) + ); + }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts index d6ad705dd286d..ba9e8138fe95a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts @@ -13,7 +13,6 @@ import { concat, EMPTY, from, - identity, isObservable, Observable, of, @@ -218,10 +217,7 @@ export function continueConversation({ messages: messagesWithUpdatedSystemMessage, functions: definitions, tracer, - }).pipe( - emitWithConcatenatedMessage(), - functionLimitExceeded ? catchFunctionNotFoundError() : identity - ); + }).pipe(emitWithConcatenatedMessage(), catchFunctionNotFoundError(functionLimitExceeded)); } const functionCallName = lastMessage.function_call?.name; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts index e2571795a6e3b..c9a2c46a3b1f8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts @@ -21,7 +21,7 @@ export const customThresholdAIAssistantLogCount = { contentTypeId: 'index-pattern', data: { fieldAttrs: '{}', - title: '.ds-logs-apm.*', + title: 'logs-apm*', timeFieldName: '@timestamp', sourceFilters: '[]', fields: '[]', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts index 500189c94e726..4ec8a7714fd96 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts @@ -208,6 +208,15 @@ function runEvaluations() { score.reasoning, ]); }); + + if (result.errors.length) { + output.push(['Errors', '', '']); + + result.errors.forEach((error) => { + output.push([error.error.message, '', '']); + }); + } + log.write(table.table(output, tableConfig)); const totalResults = result.scores.length; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts index 9d136224b299a..4361caf828381 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts @@ -28,7 +28,7 @@ import { import { streamIntoObservable } from '@kbn/observability-ai-assistant-plugin/server'; import { ToolingLog } from '@kbn/tooling-log'; import axios, { AxiosInstance, AxiosResponse, isAxiosError } from 'axios'; -import { isArray, pick, remove } from 'lodash'; +import { isArray, omit, pick, remove } from 'lodash'; import pRetry from 'p-retry'; import { concatMap, @@ -42,6 +42,9 @@ import { switchMap, timer, toArray, + catchError, + Observable, + throwError, } from 'rxjs'; import { format, parse, UrlObject } from 'url'; import { inspect } from 'util'; @@ -65,16 +68,20 @@ type CompleteFunction = ( ...args: | [StringOrMessageList] | [StringOrMessageList, Options] - | [string, StringOrMessageList] - | [string, StringOrMessageList, Options] -) => Promise<{ conversationId?: string; messages: InnerMessage[] }>; + | [string | undefined, StringOrMessageList] + | [string | undefined, StringOrMessageList, Options] +) => Promise<{ + conversationId?: string; + messages: InnerMessage[]; + errors: ChatCompletionErrorEvent[]; +}>; export interface ChatClient { chat: (message: StringOrMessageList) => Promise; complete: CompleteFunction; evaluate: ( - {}: { conversationId?: string; messages: InnerMessage[] }, + {}: { conversationId?: string; messages: InnerMessage[]; errors: ChatCompletionErrorEvent[] }, criteria: string[] ) => Promise; getResults: () => EvaluationResult[]; @@ -127,6 +134,21 @@ export class KibanaClient { 'kbn-xsrf': 'true', 'x-elastic-internal-origin': 'foo', }, + }).catch((error) => { + if (isAxiosError(error)) { + const interestingPartsOfError = { + ...omit(error, 'request', 'response', 'config'), + ...pick( + error, + 'response.data', + 'response.headers', + 'response.status', + 'response.statusText' + ), + }; + this.log.error(inspect(interestingPartsOfError, { depth: 10 })); + } + throw error; }); } @@ -240,7 +262,15 @@ export class KibanaClient { retry({ count: 1, delay: (error) => { - that.log.error('Error in stream'); + if ( + isChatCompletionError(error) && + error.code !== ChatCompletionErrorCode.InternalError + ) { + that.log.info(`Not retrying error ${error.code}`); + return throwError(() => error); + } + + that.log.info('Caught retryable error'); if (isAxiosError(error)) { that.log.error( @@ -257,12 +287,10 @@ export class KibanaClient { that.log.error(inspect(error, { depth: 10 })); } - if ( - isChatCompletionError(error) && - error.code !== ChatCompletionErrorCode.InternalError - ) { - that.log.info(`Not retrying error ${error.code}`); - return of(); + if (error.message.includes('Status code: 429')) { + that.log.info(`429, backing off 20s`); + + return timer(20000); } that.log.info(`Retrying in 5s`); return timer(5000); @@ -342,7 +370,7 @@ export class KibanaClient { }, complete: async (...args) => { that.log.info(`Complete`); - let messagesArg: StringOrMessageList; + let messagesArg: StringOrMessageList | undefined; let conversationId: string | undefined; let options: Options = {}; @@ -359,7 +387,11 @@ export class KibanaClient { } else if (args.length === 2 && !isMessageList(args[1])) { messagesArg = args[0]; options = args[1]; - } else if (args.length === 2 && typeof args[0] === 'string' && isMessageList(args[1])) { + } else if ( + args.length === 2 && + (typeof args[0] === 'string' || typeof args[0] === 'undefined') && + isMessageList(args[1]) + ) { conversationId = args[0]; messagesArg = args[1]; } else if (args.length === 3) { @@ -398,27 +430,52 @@ export class KibanaClient { return streamIntoObservable(response.data); }), serializeAndHandleRetryableErrors(), + catchError((error): Observable => { + const errorEvent: ChatCompletionErrorEvent = { + error: { + message: error.message, + stack: error.stack, + code: isChatCompletionError(error) ? error.code : undefined, + meta: error.meta, + }, + type: StreamingChatResponseEventType.ChatCompletionError, + }; + + this.log.error('Error in stream'); + this.log.error(JSON.stringify(error)); + + return of(errorEvent); + }), filter( - (event): event is MessageAddEvent | ConversationCreateEvent => + ( + event + ): event is MessageAddEvent | ConversationCreateEvent | ChatCompletionErrorEvent => event.type === StreamingChatResponseEventType.MessageAdd || - event.type === StreamingChatResponseEventType.ConversationCreate + event.type === StreamingChatResponseEventType.ConversationCreate || + event.type === StreamingChatResponseEventType.ChatCompletionError ), toArray() ); const events = await lastValueFrom(stream$); + const messagesWithAdded = messages + .map((msg) => msg.message) + .concat( + events + .filter( + (event): event is MessageAddEvent => + event.type === StreamingChatResponseEventType.MessageAdd + ) + .map((event) => event.message.message) + ); + return { - messages: messages - .map((msg) => msg.message) - .concat( - events - .filter( - (event): event is MessageAddEvent => - event.type === StreamingChatResponseEventType.MessageAdd - ) - .map((event) => event.message.message) - ), + errors: events.filter( + (event): event is ChatCompletionErrorEvent => + event.type === StreamingChatResponseEventType.ChatCompletionError + ), + messages: messagesWithAdded, conversationId: conversationId || events.find( @@ -427,7 +484,7 @@ export class KibanaClient { )?.conversation.id, }; }, - evaluate: async ({ messages, conversationId }, criteria) => { + evaluate: async ({ messages, conversationId, errors }, criteria) => { const message = await chat('evaluate', { connectorIdOverride: evaluationConnectorId, messages: [ @@ -448,7 +505,7 @@ export class KibanaClient { '@timestamp': new Date().toString(), message: { role: MessageRole.User, - content: `Evaluate the conversation according to the following criteria: + content: `Evaluate the conversation according to the following criteria, using the "scores" tool: ${criteria.map((criterion, index) => { return `${index}: ${criterion}`; @@ -457,7 +514,9 @@ export class KibanaClient { This is the conversation: ${JSON.stringify( - messages.map((msg) => pick(msg, 'content', 'name', 'function_call', 'role')) + messages + .filter((msg) => msg.role !== MessageRole.System) + .map((msg) => omit(msg, 'data')) )}`, }, }, @@ -506,19 +565,30 @@ export class KibanaClient { } ).criteria; + const scores = scoredCriteria + .map(({ index, score, reasoning }) => { + return { + criterion: criteria[index], + score, + reasoning, + }; + }) + .concat({ + score: errors.length === 0 ? 1 : 0, + criterion: 'The conversation encountered errors', + reasoning: errors.length + ? `The following errors occurred: ${errors.map((error) => error.error.message)}` + : 'No errors occurred', + }); + const result: EvaluationResult = { name: currentTitle, category: firstSuiteName, conversationId, messages, passed: scoredCriteria.every(({ score }) => score >= 1), - scores: scoredCriteria.map(({ index, score, reasoning }) => { - return { - criterion: criteria[index], - score, - reasoning, - }; - }), + scores, + errors, }; results.push(result); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts index d0d6dbe17f124..8e466bbdbea4f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts @@ -31,6 +31,7 @@ describe('alert function', () => { ruleIds.push(responseApmRule.data.id); logger.info('Creating dataview'); + await kibanaClient.callKibana( 'post', { pathname: '/api/content_management/rpc/create' }, @@ -75,13 +76,32 @@ describe('alert function', () => { .outcome('success'), ]) ); + + logger.debug('Triggering a rule run'); + + await Promise.all( + ruleIds.map((ruleId) => + kibanaClient.callKibana('post', { + pathname: `/internal/alerting/rule/${ruleId}/_run_soon`, + }) + ) + ); + + logger.debug('Waiting 2.5s to make sure all indices are refreshed'); + + await new Promise((resolve) => { + setTimeout(resolve, 2500); + }); }); it('summary of active alerts', async () => { - const conversation = await chatClient.complete('Are there any active alerts?'); + const conversation = await chatClient.complete( + 'Are there any active alerts over the last 4 hours?' + ); const result = await chatClient.evaluate(conversation, [ - 'Uses alerts function to retrieve active alerts', + 'Correctly uses the `alerts` function to fetch data for the current time range', + 'Retrieves 2 alerts', 'Responds with a summary of the current active alerts', ]); @@ -90,7 +110,7 @@ describe('alert function', () => { it('filtered alerts', async () => { let conversation = await chatClient.complete( - 'Do I have any active alerts related to "Threshold surpassed in AI Assistant eval"?' + 'Do I have any active threshold alerts related to the AI Assistant?' ); conversation = await chatClient.complete( @@ -102,10 +122,11 @@ describe('alert function', () => { ); const result = await chatClient.evaluate(conversation, [ - 'Uses alerts function to retrieve active alerts for "Threshold surpassed in AI Assistant eval", uses "filter": "Threshold surpassed in AI Assistant eval" in the alert function', - 'Returns one or more alerts related to "Threshold surpassed in AI Assistant eval", does not return no active alerts related to "Threshold surpassed in AI Assistant eval"', - 'Uses alerts function to filtering on service.name my-service to retrieve active alerts for that service', - 'Returns one or more alerts related to my-service', + 'Uses the get_alerts_dataset_info function', + 'Correctly uses the alerts function without a filter', + 'Returns two alerts related to "Threshold surpassed in AI Assistant eval"', + 'After the second question, uses alerts function to filtering on service.name my-service to retrieve active alerts for that service. The filter should be `service.name:"my-service"` or `service.name:my-service`.', + 'Summarizes the active alerts for the `my-service` service', ]); expect(result.passed).to.be(true); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts index 9dfc11f290d79..361d436f8ecec 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts @@ -120,6 +120,7 @@ describe('apm', () => { expect(result.passed).to.be(true); }); + it('services in environment', async () => { let conversation = await chatClient.complete( 'What are the active services in the environment "test"?' @@ -152,8 +153,10 @@ describe('apm', () => { const result = await chatClient.evaluate(conversation, [ 'Responds with the active services in the environment "test"', - 'Executes get_apm_timeseries to obtain the error rate of the services for the last 4 hours, for the specified services in test environment', - 'Obtains the top 2 frequent errors of the services in the last hour, for the specified services in test environment', + 'Successfully executes a query that filters on service.environment and return service.name', + 'Mentions the two active services and their service names', + 'Succesfully executes a query that returns the error rate for the services in the last four hours', + 'Mentions the top 2 frequent errors of the services in the last hour, for the specified services in test environment', 'Returns the current alerts for the services, for the specified services in test environment', ]); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts index 3bd6fc6a0c207..6c2296316c333 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts @@ -181,7 +181,7 @@ describe('ES|QL query generation', () => { it('logs avg cpu', async () => { await evaluateEsqlQuery({ question: - '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.', + 'Assume 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) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts index 5a82159510b6e..83e42ab780dad 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts @@ -6,7 +6,10 @@ */ import type { Client } from '@elastic/elasticsearch'; -import type { Message } from '@kbn/observability-ai-assistant-plugin/public'; +import { + type Message, + ChatCompletionErrorEvent, +} from '@kbn/observability-ai-assistant-plugin/common'; import { KibanaClient } from './kibana_client'; import { SynthtraceEsClients } from './setup_synthtrace'; @@ -28,6 +31,7 @@ export interface EvaluationResult { reasoning: string; score: number; }>; + errors: ChatCompletionErrorEvent[]; } export type EvaluationFunction = (options: ScenarioOptions) => Promise; 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 a049279f7c4e4..6f3b300266c08 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 @@ -81,6 +81,8 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra 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. + If the user asks for a query, and one of the dataset info functions was called and returned no results, you should still call the query function to generate an example query. + 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. @@ -93,8 +95,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra { name: 'execute_query', 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.', + description: 'Display the results of an ES|QL query.', parameters: { type: 'object', properties: { @@ -148,17 +149,30 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra '@timestamp': new Date().toISOString(), message: { role: MessageRole.System, content: `${systemMessage}\n${message ?? ''}` }, }, - ...messages.slice(1), + // remove the query function request + ...messages.filter((msg) => msg.message.role !== MessageRole.System), ]; + const userQuestion = messages + .concat() + .reverse() + .find((message) => message.message.role === MessageRole.User && !message.message.name); + + const abbreviatedUserQuestion = userQuestion!.message.content!.substring(0, 50); + const source$ = ( await chat('classify_esql', { - messages: withEsqlSystemMessage().concat({ - '@timestamp': new Date().toISOString(), - message: { - role: MessageRole.User, - content: `Use the classify_esql function to classify the user's request - in the user message before this. + messages: withEsqlSystemMessage().concat( + createFunctionResponseMessage({ + name: 'query', + content: {}, + }).message, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: `Use the classify_esql tool attached to this conversation + to classify the user's request in the user message before this ("${abbreviatedUserQuestion}..."). and get more information about specific functions and commands you think are candidates for answering the question. @@ -212,8 +226,9 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra "I want a bar chart of ... " => ${VisualizeESQLUserIntention.visualizeBar} "I want to see a heat map of ..." => ${VisualizeESQLUserIntention.visualizeHeatmap} `, - }, - }), + }, + } + ), signal, functions: [ { @@ -241,14 +256,16 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra items: { type: 'string', }, - description: 'A list of processing or source commands', + description: + 'A list of processing or source commands that are referenced in the list of commands in this conversation', }, functions: { type: 'array', items: { type: 'string', }, - description: 'A list of functions.', + description: + 'A list of functions that are referenced in the list of functions in this conversation', }, intention: { type: 'string', @@ -267,7 +284,14 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra const response = await lastValueFrom(source$); if (!response.message.function_call.arguments) { - throw new Error('LLM did not call classify_esql function'); + resources.logger.debug( + `LLM should have called "classify_esql", but instead responded with the following message: ${JSON.stringify( + response.message + )}` + ); + throw new Error( + 'LLM did not call classify_esql function during query generation, execute the "query" function and try again' + ); } const args = JSON.parse(response.message.function_call.arguments) as { @@ -303,9 +327,22 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra break; } + const queryFunctionResponseMessage = createFunctionResponseMessage({ + name: 'query', + content: {}, + data: { + // add the included docs for debugging + documentation: { + intention: args.intention, + keywords, + files: messagesToInclude, + }, + }, + }); + const esqlResponse$ = await chat('answer_esql_question', { messages: [ - ...withEsqlSystemMessage(), + ...withEsqlSystemMessage().concat(queryFunctionResponseMessage.message), { '@timestamp': new Date().toISOString(), message: { @@ -328,11 +365,18 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra }), }, }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.Assistant, + content: 'Thank you for providing the ES|QL info. What can I help you with?', + }, + }, { '@timestamp': new Date().toISOString(), message: { role: MessageRole.User, - content: `Answer the user's question that was previously asked using the attached documentation. + content: `Answer the user's question that was previously asked ("${abbreviatedUserQuestion}...") using the attached documentation. Take into account any previous errors from the \`execute_query\` or \`visualize_query\` function. Format any ES|QL query as follows: \`\`\`esql @@ -341,7 +385,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra Respond in plain text. Do not attempt to use a function. - Prefer to use commands and functions for which you have requested documentation. + You must use commands and functions for which you have requested documentation. ${ args.intention !== VisualizeESQLUserIntention.generateQueryOnly @@ -427,20 +471,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra }, }; }), - startWith( - createFunctionResponseMessage({ - name: 'query', - content: {}, - data: { - // add the included docs for debugging - documentation: { - intention: args.intention, - keywords, - files: messagesToInclude, - }, - }, - }) - ) + startWith(queryFunctionResponseMessage) ); } ); From 673a942a22d425c1fc4d034f8984ffb9f8c45fa2 Mon Sep 17 00:00:00 2001 From: elena-shostak <165678770+elena-shostak@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:57:08 +0200 Subject: [PATCH 81/82] [Space] Added RolesAPIClient to Spaces plugin as runtime dependency (#184549) ## Summary Added `RolesAPIClient` to the Spaces plugin via dynamic runtime contract resolution. We need to make this client available to the Spaces plugin, in order to facilitate the new Spaces UX. ### 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 ### 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) __Fixes: https://github.com/elastic/kibana/issues/184425__ --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../security/plugin_types_public/index.ts | 1 + .../authorization/authorization_service.ts | 7 +++++++ .../plugin_types_public/src/roles/index.ts | 8 ++++++++ .../src/roles/roles_api_client.ts | 19 ++++++++++++++++++ .../public/authentication/index.mock.ts | 12 +++++++++++ .../authorization/authorization_service.ts | 16 +++++++++++++-- .../security/public/management/index.ts | 1 + .../management/roles/roles_api_client.ts | 20 +++++++++---------- .../plugins/security/public/plugin.test.tsx | 8 +++++++- x-pack/plugins/security/public/plugin.tsx | 1 + x-pack/plugins/spaces/kibana.jsonc | 5 +++-- .../management/management_service.test.ts | 4 ++++ .../public/management/management_service.tsx | 12 +++++++++-- .../management/roles_api_client.mock.ts | 19 ++++++++++++++++++ .../management/spaces_management_app.test.tsx | 2 ++ .../management/spaces_management_app.tsx | 2 ++ x-pack/plugins/spaces/public/plugin.tsx | 15 +++++++++++++- x-pack/plugins/spaces/tsconfig.json | 1 + 18 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 x-pack/packages/security/plugin_types_public/src/roles/index.ts create mode 100644 x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts create mode 100644 x-pack/plugins/spaces/public/management/roles_api_client.mock.ts diff --git a/x-pack/packages/security/plugin_types_public/index.ts b/x-pack/packages/security/plugin_types_public/index.ts index 682e1641a4c4c..0b326ce2ee664 100644 --- a/x-pack/packages/security/plugin_types_public/index.ts +++ b/x-pack/packages/security/plugin_types_public/index.ts @@ -16,3 +16,4 @@ export type { UserProfileSuggestParams, UserProfileAPIClient, } from './src/user_profile'; +export type { RolePutPayload, RolesAPIClient } from './src/roles'; diff --git a/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts b/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts index 16fd10a57d694..5ad462f8c2aa1 100644 --- a/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts +++ b/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts @@ -5,11 +5,18 @@ * 2.0. */ +import type { RolesAPIClient } from '../roles'; + export interface AuthorizationServiceSetup { /** * Determines if role management is enabled. */ isRoleManagementEnabled: () => boolean | undefined; + + /** + * A set of methods to work with Kibana user roles. + */ + roles: RolesAPIClient; } /** diff --git a/x-pack/packages/security/plugin_types_public/src/roles/index.ts b/x-pack/packages/security/plugin_types_public/src/roles/index.ts new file mode 100644 index 0000000000000..36a3e85fa8767 --- /dev/null +++ b/x-pack/packages/security/plugin_types_public/src/roles/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { RolePutPayload, RolesAPIClient } from './roles_api_client'; diff --git a/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts b/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts new file mode 100644 index 0000000000000..b5c45c5160fde --- /dev/null +++ b/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { Role } from '@kbn/security-plugin-types-common'; + +export interface RolePutPayload { + role: Role; + createOnly?: boolean; +} + +export interface RolesAPIClient { + getRoles: () => Promise; + getRole: (roleName: string) => Promise; + deleteRole: (roleName: string) => Promise; + saveRole: (payload: RolePutPayload) => Promise; +} diff --git a/x-pack/plugins/security/public/authentication/index.mock.ts b/x-pack/plugins/security/public/authentication/index.mock.ts index 58035767e0f2c..491b5b82e946a 100644 --- a/x-pack/plugins/security/public/authentication/index.mock.ts +++ b/x-pack/plugins/security/public/authentication/index.mock.ts @@ -26,8 +26,20 @@ export const authenticationMock = { export const authorizationMock = { createSetup: (): jest.Mocked => ({ isRoleManagementEnabled: jest.fn(), + roles: { + getRoles: jest.fn(), + getRole: jest.fn(), + deleteRole: jest.fn(), + saveRole: jest.fn(), + }, }), createStart: (): jest.Mocked => ({ isRoleManagementEnabled: jest.fn(), + roles: { + getRoles: jest.fn(), + getRole: jest.fn(), + deleteRole: jest.fn(), + saveRole: jest.fn(), + }, }), }; diff --git a/x-pack/plugins/security/public/authorization/authorization_service.ts b/x-pack/plugins/security/public/authorization/authorization_service.ts index 8f003dde8659f..6e0af055a6cda 100644 --- a/x-pack/plugins/security/public/authorization/authorization_service.ts +++ b/x-pack/plugins/security/public/authorization/authorization_service.ts @@ -5,18 +5,30 @@ * 2.0. */ +import type { HttpStart } from '@kbn/core/public'; import type { AuthorizationServiceSetup } from '@kbn/security-plugin-types-public'; import type { ConfigType } from '../config'; +import { RolesAPIClient } from '../management'; interface SetupParams { config: ConfigType; + http: HttpStart; } export class AuthorizationService { - public setup({ config }: SetupParams): AuthorizationServiceSetup { + public setup({ config, http }: SetupParams): AuthorizationServiceSetup { const isRoleManagementEnabled = () => config.roleManagementEnabled; + const rolesAPIClient = new RolesAPIClient(http); - return { isRoleManagementEnabled }; + return { + isRoleManagementEnabled, + roles: { + getRoles: rolesAPIClient.getRoles, + getRole: rolesAPIClient.getRole, + deleteRole: rolesAPIClient.deleteRole, + saveRole: rolesAPIClient.saveRole, + }, + }; } } diff --git a/x-pack/plugins/security/public/management/index.ts b/x-pack/plugins/security/public/management/index.ts index fc62c29b3047e..a47475485896d 100644 --- a/x-pack/plugins/security/public/management/index.ts +++ b/x-pack/plugins/security/public/management/index.ts @@ -7,3 +7,4 @@ export { ManagementService } from './management_service'; export { UserAPIClient } from './users/user_api_client'; +export { RolesAPIClient } from './roles'; diff --git a/x-pack/plugins/security/public/management/roles/roles_api_client.ts b/x-pack/plugins/security/public/management/roles/roles_api_client.ts index 3742569e9cc72..c870f99e24dd3 100644 --- a/x-pack/plugins/security/public/management/roles/roles_api_client.ts +++ b/x-pack/plugins/security/public/management/roles/roles_api_client.ts @@ -13,26 +13,26 @@ import { copyRole } from '../../../common/model'; export class RolesAPIClient { constructor(private readonly http: HttpStart) {} - public async getRoles() { + public getRoles = async () => { return await this.http.get('/api/security/role'); - } + }; - public async getRole(roleName: string) { + public getRole = async (roleName: string) => { return await this.http.get(`/api/security/role/${encodeURIComponent(roleName)}`); - } + }; - public async deleteRole(roleName: string) { + public deleteRole = async (roleName: string) => { await this.http.delete(`/api/security/role/${encodeURIComponent(roleName)}`); - } + }; - public async saveRole({ role, createOnly = false }: { role: Role; createOnly?: boolean }) { + public saveRole = async ({ role, createOnly = false }: { role: Role; createOnly?: boolean }) => { await this.http.put(`/api/security/role/${encodeURIComponent(role.name)}`, { body: JSON.stringify(this.transformRoleForSave(copyRole(role))), query: { createOnly }, }); - } + }; - private transformRoleForSave(role: Role) { + private transformRoleForSave = (role: Role) => { // Remove any placeholder index privileges const isPlaceholderPrivilege = ( indexPrivilege: RoleIndexPrivilege | RoleRemoteIndexPrivilege @@ -71,5 +71,5 @@ export class RolesAPIClient { delete role._transform_error; return role; - } + }; } diff --git a/x-pack/plugins/security/public/plugin.test.tsx b/x-pack/plugins/security/public/plugin.test.tsx index e58ff7ba5e325..874196f3e4c0e 100644 --- a/x-pack/plugins/security/public/plugin.test.tsx +++ b/x-pack/plugins/security/public/plugin.test.tsx @@ -40,7 +40,7 @@ describe('Security Plugin', () => { }) ).toEqual({ authc: { getCurrentUser: expect.any(Function), areAPIKeysEnabled: expect.any(Function) }, - authz: { isRoleManagementEnabled: expect.any(Function) }, + authz: { isRoleManagementEnabled: expect.any(Function), roles: expect.any(Object) }, license: { isLicenseAvailable: expect.any(Function), isEnabled: expect.any(Function), @@ -127,6 +127,12 @@ describe('Security Plugin', () => { }, "authz": Object { "isRoleManagementEnabled": [Function], + "roles": Object { + "deleteRole": [Function], + "getRole": [Function], + "getRoles": [Function], + "saveRole": [Function], + }, }, "navControlService": Object { "addUserMenuLinks": [Function], diff --git a/x-pack/plugins/security/public/plugin.tsx b/x-pack/plugins/security/public/plugin.tsx index 429437e9fa39a..a094082b6a430 100644 --- a/x-pack/plugins/security/public/plugin.tsx +++ b/x-pack/plugins/security/public/plugin.tsx @@ -115,6 +115,7 @@ export class SecurityPlugin this.authz = this.authorizationService.setup({ config: this.config, + http: core.http, }); this.securityApiClients = { diff --git a/x-pack/plugins/spaces/kibana.jsonc b/x-pack/plugins/spaces/kibana.jsonc index efa3f85cd5b77..e46747a401ea4 100644 --- a/x-pack/plugins/spaces/kibana.jsonc +++ b/x-pack/plugins/spaces/kibana.jsonc @@ -26,6 +26,7 @@ ], "extraPublicDirs": [ "common" - ] + ], + "runtimePluginDependencies": ["security"] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/spaces/public/management/management_service.test.ts b/x-pack/plugins/spaces/public/management/management_service.test.ts index 88b88b0e9e7dd..23c669ded0f4b 100644 --- a/x-pack/plugins/spaces/public/management/management_service.test.ts +++ b/x-pack/plugins/spaces/public/management/management_service.test.ts @@ -11,6 +11,7 @@ import type { ManagementSection } from '@kbn/management-plugin/public'; import { managementPluginMock } from '@kbn/management-plugin/public/mocks'; import { ManagementService } from './management_service'; +import { getRolesAPIClientMock } from './roles_api_client.mock'; import type { ConfigType } from '../config'; import type { PluginsStart } from '../plugin'; import { spacesManagerMock } from '../spaces_manager/mocks'; @@ -36,6 +37,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + getRolesAPIClient: getRolesAPIClientMock, }); expect(mockKibanaSection.registerApp).toHaveBeenCalledTimes(1); @@ -55,6 +57,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + getRolesAPIClient: getRolesAPIClientMock, }); }); }); @@ -75,6 +78,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + getRolesAPIClient: jest.fn(), }); service.stop(); diff --git a/x-pack/plugins/spaces/public/management/management_service.tsx b/x-pack/plugins/spaces/public/management/management_service.tsx index de9e7dfdeb717..e4836da797182 100644 --- a/x-pack/plugins/spaces/public/management/management_service.tsx +++ b/x-pack/plugins/spaces/public/management/management_service.tsx @@ -7,6 +7,7 @@ import type { StartServicesAccessor } from '@kbn/core/public'; import type { ManagementApp, ManagementSetup } from '@kbn/management-plugin/public'; +import type { RolesAPIClient } from '@kbn/security-plugin-types-public'; import { spacesManagementApp } from './spaces_management_app'; import type { ConfigType } from '../config'; @@ -18,14 +19,21 @@ interface SetupDeps { getStartServices: StartServicesAccessor; spacesManager: SpacesManager; config: ConfigType; + getRolesAPIClient: () => Promise; } export class ManagementService { private registeredSpacesManagementApp?: ManagementApp; - public setup({ getStartServices, management, spacesManager, config }: SetupDeps) { + public setup({ + getStartServices, + management, + spacesManager, + config, + getRolesAPIClient, + }: SetupDeps) { this.registeredSpacesManagementApp = management.sections.section.kibana.registerApp( - spacesManagementApp.create({ getStartServices, spacesManager, config }) + spacesManagementApp.create({ getStartServices, spacesManager, config, getRolesAPIClient }) ); } diff --git a/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts b/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts new file mode 100644 index 0000000000000..dd996814f9e51 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/roles_api_client.mock.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RolesAPIClient } from '@kbn/security-plugin-types-public'; + +export const createRolesAPIClientMock = (): RolesAPIClient => { + return { + getRoles: jest.fn(), + getRole: jest.fn(), + saveRole: jest.fn(), + deleteRole: jest.fn(), + }; +}; + +export const getRolesAPIClientMock = jest.fn().mockResolvedValue(createRolesAPIClientMock()); diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx index 649b74cb14ee1..89e1fc01d493e 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx @@ -52,6 +52,7 @@ async function mountApp(basePath: string, pathname: string, spaceId?: string) { spacesManager, getStartServices: async () => [coreStart, pluginsStart as PluginsStart, {}], config, + getRolesAPIClient: jest.fn(), }) .mount({ basePath, @@ -72,6 +73,7 @@ describe('spacesManagementApp', () => { spacesManager: spacesManagerMock.create(), getStartServices: coreMock.createSetup().getStartServices as any, config, + getRolesAPIClient: jest.fn(), }) ).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx index 1819b22cb7f3b..fe6776b33f920 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx @@ -14,6 +14,7 @@ import { i18n } from '@kbn/i18n'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import type { RegisterManagementAppArgs } from '@kbn/management-plugin/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import type { RolesAPIClient } from '@kbn/security-plugin-types-public'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; @@ -26,6 +27,7 @@ interface CreateParams { getStartServices: StartServicesAccessor; spacesManager: SpacesManager; config: ConfigType; + getRolesAPIClient: () => Promise; } export const spacesManagementApp = Object.freeze({ diff --git a/x-pack/plugins/spaces/public/plugin.tsx b/x-pack/plugins/spaces/public/plugin.tsx index 02aad20bee27b..14d816739b4c9 100644 --- a/x-pack/plugins/spaces/public/plugin.tsx +++ b/x-pack/plugins/spaces/public/plugin.tsx @@ -9,6 +9,7 @@ import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kb import type { FeaturesPluginStart } from '@kbn/features-plugin/public'; import type { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import type { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public'; +import type { SecurityPluginStart } from '@kbn/security-plugin-types-public'; import type { ConfigType } from './config'; import { createSpacesFeatureCatalogueEntry } from './create_feature_catalogue_entry'; @@ -54,7 +55,6 @@ export class SpacesPlugin implements Plugin, plugins: PluginsSetup) { const hasOnlyDefaultSpace = this.config.maxSpaces === 1; - this.spacesManager = new SpacesManager(core.http); this.spacesApi = { ui: getUiApi({ @@ -67,6 +67,18 @@ export class SpacesPlugin implements Plugin { + const { security } = await core.plugins.onSetup<{ security: SecurityPluginStart }>( + 'security' + ); + + if (!security.found) { + throw new Error('Security plugin is not available as runtime dependency.'); + } + + return security.contract.authz.roles; + }; + if (plugins.home) { plugins.home.featureCatalogue.register(createSpacesFeatureCatalogueEntry()); } @@ -78,6 +90,7 @@ export class SpacesPlugin implements Plugin Date: Wed, 5 Jun 2024 10:06:16 -0400 Subject: [PATCH 82/82] Fix typo in cURL documentation (#184701) ## Summary Line 37 already has the ending quote. ## Testing Steps I ran the same steps as in #182604 and saw that the typo was gone from the UI. I was able to copy and paste the cURL command directly from the UI to my terminal and it worked (with or without a pipeline). Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/application/components/languages/curl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts b/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts index 32c874ef32eb7..e5f7cfeaec65c 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts @@ -32,7 +32,7 @@ export API_KEY="${apiKey}"`, }, iconType: 'curl.svg', id: Languages.CURL, - ingestData: ({ ingestPipeline }) => `curl -X POST "\$\{ES_URL\}/_bulk?pretty"${ + ingestData: ({ ingestPipeline }) => `curl -X POST "\$\{ES_URL\}/_bulk?pretty${ ingestPipeline ? `&pipeline=${ingestPipeline}` : '' }" \\ -H "Authorization: ApiKey "\$\{API_KEY\}"" \\

    bTX|HOag^{v*Qo(5E(g;TJM~!TV(3h! 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