From d5b0ddda62205031696befed213d6abb2f4e0569 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Tue, 25 Jun 2024 12:37:20 -0500 Subject: [PATCH 01/40] [Security Solution][Notes] - add delete note to flyout notes tab (#186843) --- .../public/common/mock/global_state.ts | 2 + .../left/components/add_note.test.tsx | 31 +++- .../left/components/notes_list.test.tsx | 139 ++++++++++++++++-- .../left/components/notes_list.tsx | 65 +++++++- .../left/components/test_ids.ts | 1 + .../security_solution/public/notes/api/api.ts | 11 ++ .../public/notes/store/notes.slice.test.ts | 118 +++++++++++++-- .../public/notes/store/notes.slice.ts | 29 ++++ 8 files changed, 354 insertions(+), 42 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 7a865a4be9f04..4365a30c2f07d 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -521,10 +521,12 @@ export const mockGlobalState: State = { status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, }, error: { fetchNotesByDocumentId: null, createNote: null, + deleteNote: null, }, }, }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx index 95e6591dec9cb..e4c5264b249b5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx @@ -52,9 +52,16 @@ describe('AddNote', () => { }); it('should render the add note button in loading state while creating a new note', () => { - const state = { ...mockGlobalState }; - state.notes.status.createNote = ReqStatus.Loading; - const store = createMockStore(state); + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + createNote: ReqStatus.Loading, + }, + }, + }); const { container } = render( @@ -66,10 +73,20 @@ describe('AddNote', () => { }); it('should render error toast if create a note fails', () => { - const state = { ...mockGlobalState }; - state.notes.status.createNote = ReqStatus.Failed; - state.notes.error.createNote = { type: 'http', status: 500 }; - const store = createMockStore(state); + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + createNote: ReqStatus.Failed, + }, + error: { + ...mockGlobalState.notes.error, + createNote: { type: 'http', status: 500 }, + }, + }, + }); render( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx index 82dfeac7e60ad..5f561d34f15d9 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx @@ -7,9 +7,14 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { ADD_NOTE_LOADING_TEST_ID, NOTES_COMMENT_TEST_ID, NOTES_LOADING_TEST_ID } from './test_ids'; +import { + ADD_NOTE_LOADING_TEST_ID, + DELETE_NOTE_BUTTON_TEST_ID, + NOTES_COMMENT_TEST_ID, + NOTES_LOADING_TEST_ID, +} from './test_ids'; import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; -import { FETCH_NOTES_ERROR, NO_NOTES, NotesList } from './notes_list'; +import { DELETE_NOTE_ERROR, FETCH_NOTES_ERROR, NO_NOTES, NotesList } from './notes_list'; import { ReqStatus } from '../../../../notes/store/notes.slice'; const mockAddError = jest.fn(); @@ -19,6 +24,15 @@ jest.mock('../../../../common/hooks/use_app_toasts', () => ({ }), })); +const mockDispatch = jest.fn(); +jest.mock('react-redux', () => { + const original = jest.requireActual('react-redux'); + return { + ...original, + useDispatch: () => mockDispatch, + }; +}); + const renderNotesList = () => render( @@ -31,12 +45,20 @@ describe('NotesList', () => { const { getByTestId, getByText } = renderNotesList(); expect(getByTestId(`${NOTES_COMMENT_TEST_ID}-0`)).toBeInTheDocument(); expect(getByText('note-1')).toBeInTheDocument(); + expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toBeInTheDocument(); }); it('should render loading spinner if notes are being fetched', () => { - const state = { ...mockGlobalState }; - state.notes.status.fetchNotesByDocumentId = ReqStatus.Loading; - const store = createMockStore(state); + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + fetchNotesByDocumentId: ReqStatus.Loading, + }, + }, + }); const { getByTestId } = render( @@ -48,9 +70,16 @@ describe('NotesList', () => { }); it('should render no data message if no notes are present', () => { - const state = { ...mockGlobalState }; - state.notes.status.fetchNotesByDocumentId = ReqStatus.Succeeded; - const store = createMockStore(state); + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + fetchNotesByDocumentId: ReqStatus.Succeeded, + }, + }, + }); const { getByText } = render( @@ -62,10 +91,20 @@ describe('NotesList', () => { }); it('should render error toast if fetching notes fails', () => { - const state = { ...mockGlobalState }; - state.notes.status.fetchNotesByDocumentId = ReqStatus.Failed; - state.notes.error.fetchNotesByDocumentId = { type: 'http', status: 500 }; - const store = createMockStore(state); + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + fetchNotesByDocumentId: ReqStatus.Failed, + }, + error: { + ...mockGlobalState.notes.error, + fetchNotesByDocumentId: { type: 'http', status: 500 }, + }, + }, + }); render( @@ -78,10 +117,17 @@ describe('NotesList', () => { }); }); - it('should render create loading when user create a new note', () => { - const state = { ...mockGlobalState }; - state.notes.status.createNote = ReqStatus.Loading; - const store = createMockStore(state); + it('should render create loading when user creates a new note', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + createNote: ReqStatus.Loading, + }, + }, + }); const { getByTestId } = render( @@ -91,4 +137,65 @@ describe('NotesList', () => { expect(getByTestId(ADD_NOTE_LOADING_TEST_ID)).toBeInTheDocument(); }); + + it('should dispatch delete action when user deletes a new note', () => { + const { getByTestId } = renderNotesList(); + + const deleteIcon = getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`); + + expect(deleteIcon).toBeInTheDocument(); + expect(deleteIcon).not.toHaveAttribute('disabled'); + + deleteIcon.click(); + + expect(mockDispatch).toHaveBeenCalled(); + }); + + it('should have delete icons disabled and show spinner if a new note is being deleted', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + deleteNote: ReqStatus.Loading, + }, + }, + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toHaveAttribute('disabled'); + }); + + it('should render error toast if deleting a note fails', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + deleteNote: ReqStatus.Failed, + }, + error: { + ...mockGlobalState.notes.error, + deleteNote: { type: 'http', status: 500 }, + }, + }, + }); + + render( + + + + ); + + expect(mockAddError).toHaveBeenCalledWith(null, { + title: DELETE_NOTE_ERROR, + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx index a34afe6ad0e50..3ddff35c04bd3 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx @@ -5,17 +5,31 @@ * 2.0. */ -import React, { memo, useEffect } from 'react'; -import { EuiComment, EuiCommentList, EuiLoadingElastic, EuiMarkdownFormat } from '@elastic/eui'; -import { useSelector } from 'react-redux'; +import React, { memo, useCallback, useEffect, useState } from 'react'; +import { + EuiButtonIcon, + EuiComment, + EuiCommentList, + EuiLoadingElastic, + EuiMarkdownFormat, +} from '@elastic/eui'; +import { useDispatch, useSelector } from 'react-redux'; import { FormattedRelative } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; -import { ADD_NOTE_LOADING_TEST_ID, NOTES_COMMENT_TEST_ID, NOTES_LOADING_TEST_ID } from './test_ids'; +import { + ADD_NOTE_LOADING_TEST_ID, + DELETE_NOTE_BUTTON_TEST_ID, + NOTES_COMMENT_TEST_ID, + NOTES_LOADING_TEST_ID, +} from './test_ids'; import type { State } from '../../../../common/store'; import type { Note } from '../../../../../common/api/timeline'; import { + deleteNote, ReqStatus, selectCreateNoteStatus, + selectDeleteNoteError, + selectDeleteNoteStatus, selectFetchNotesByDocumentIdError, selectFetchNotesByDocumentIdStatus, selectNotesByDocumentId, @@ -34,6 +48,15 @@ export const FETCH_NOTES_ERROR = i18n.translate( export const NO_NOTES = i18n.translate('xpack.securitySolution.notes.noNotesLabel', { defaultMessage: 'No notes have been created for this document', }); +export const DELETE_NOTE = i18n.translate('xpack.securitySolution.notes.deleteNoteLabel', { + defaultMessage: 'Delete note', +}); +export const DELETE_NOTE_ERROR = i18n.translate( + 'xpack.securitySolution.notes.deleteNoteErrorLabel', + { + defaultMessage: 'Error deleting note', + } +); export interface NotesListProps { /** @@ -45,9 +68,11 @@ export interface NotesListProps { /** * Renders a list of notes for the document. * If a note belongs to a timeline, a timeline icon will be shown the top right corner. + * Also, a delete icon is shown in the top right corner to delete a note. * When a note is being created, the component renders a loading spinner when the new note is about to be added. */ export const NotesList = memo(({ eventId }: NotesListProps) => { + const dispatch = useDispatch(); const { addError: addErrorToast } = useAppToasts(); const fetchStatus = useSelector((state: State) => selectFetchNotesByDocumentIdStatus(state)); @@ -56,6 +81,18 @@ export const NotesList = memo(({ eventId }: NotesListProps) => { const createStatus = useSelector((state: State) => selectCreateNoteStatus(state)); + const deleteStatus = useSelector((state: State) => selectDeleteNoteStatus(state)); + const deleteError = useSelector((state: State) => selectDeleteNoteError(state)); + const [deletingNoteId, setDeletingNoteId] = useState(''); + + const deleteNoteFc = useCallback( + (noteId: string) => { + setDeletingNoteId(noteId); + dispatch(deleteNote({ id: noteId })); + }, + [dispatch] + ); + useEffect(() => { if (fetchStatus === ReqStatus.Failed && fetchError) { addErrorToast(null, { @@ -64,6 +101,14 @@ export const NotesList = memo(({ eventId }: NotesListProps) => { } }, [addErrorToast, fetchError, fetchStatus]); + useEffect(() => { + if (deleteStatus === ReqStatus.Failed && deleteError) { + addErrorToast(null, { + title: DELETE_NOTE_ERROR, + }); + } + }, [addErrorToast, deleteError, deleteStatus]); + if (fetchStatus === ReqStatus.Loading) { return ; } @@ -81,6 +126,18 @@ export const NotesList = memo(({ eventId }: NotesListProps) => { username={note.createdBy} timestamp={<>{note.created && }} event={ADDED_A_NOTE} + actions={ + deleteNoteFc(note.noteId)} + disabled={deletingNoteId !== note.noteId && deleteStatus === ReqStatus.Loading} + isLoading={deletingNoteId === note.noteId && deleteStatus === ReqStatus.Loading} + /> + } > {note.note || ''} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts index cd49334abea7e..9b5c670f1ba26 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts @@ -97,3 +97,4 @@ export const NOTES_COMMENT_TEST_ID = `${PREFIX}NotesComment` as const; export const ADD_NOTE_LOADING_TEST_ID = `${PREFIX}AddNotesLoading` as const; export const ADD_NOTE_MARKDOWN_TEST_ID = `${PREFIX}AddNotesMarkdown` as const; export const ADD_NOTE_BUTTON_TEST_ID = `${PREFIX}AddNotesButton` as const; +export const DELETE_NOTE_BUTTON_TEST_ID = `${PREFIX}DeleteNotesButton` as const; diff --git a/x-pack/plugins/security_solution/public/notes/api/api.ts b/x-pack/plugins/security_solution/public/notes/api/api.ts index c1090de4fe631..302e70185cfba 100644 --- a/x-pack/plugins/security_solution/public/notes/api/api.ts +++ b/x-pack/plugins/security_solution/public/notes/api/api.ts @@ -54,3 +54,14 @@ export const generateNoteMock = (documentId: string) => ({ updated: new Date().getTime(), updatedBy: 'elastic', }); + +/** + * Deletes a note + */ +export const deleteNote = async (noteId: string) => { + const response = await KibanaServices.get().http.delete<{ data: unknown }>(NOTE_URL, { + body: JSON.stringify({ noteId }), + version: '2023-10-31', + }); + return response; +}; diff --git a/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts b/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts index 6fd6437f00c27..57347c1562837 100644 --- a/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts +++ b/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts @@ -7,6 +7,7 @@ import { createNote, + deleteNote, fetchNotesByDocumentId, initialNotesState, notesReducer, @@ -14,6 +15,8 @@ import { selectAllNotes, selectCreateNoteError, selectCreateNoteStatus, + selectDeleteNoteError, + selectDeleteNoteStatus, selectFetchNotesByDocumentIdError, selectFetchNotesByDocumentIdStatus, selectNoteById, @@ -31,8 +34,12 @@ const initialNonEmptyState = { [mockNote.noteId]: mockNote, }, ids: [mockNote.noteId], - status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Idle }, - error: { fetchNotesByDocumentId: null, createNote: null }, + status: { + fetchNotesByDocumentId: ReqStatus.Idle, + createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, + }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }; describe('notesSlice', () => { @@ -41,13 +48,17 @@ describe('notesSlice', () => { expect(notesReducer(initalEmptyState, { type: 'unknown' })).toEqual({ entities: {}, ids: [], - status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Idle }, - error: { fetchNotesByDocumentId: null, createNote: null }, + status: { + fetchNotesByDocumentId: ReqStatus.Idle, + createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, + }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }); }); describe('fetchNotesByDocumentId', () => { - it('should set correct state when fetching notes by document id', () => { + it('should set correct status state when fetching notes by document id', () => { const action = { type: fetchNotesByDocumentId.pending.type }; expect(notesReducer(initalEmptyState, action)).toEqual({ @@ -56,8 +67,9 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Loading, createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, }, - error: { fetchNotesByDocumentId: null, createNote: null }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }); }); @@ -80,8 +92,9 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Succeeded, createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, }, - error: { fetchNotesByDocumentId: null, createNote: null }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }); }); @@ -105,12 +118,13 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Succeeded, createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, }, - error: { fetchNotesByDocumentId: null, createNote: null }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }); }); - it('should set correct state when error on fetch notes by document id', () => { + it('should set correct error state when failing to fetch notes by document id', () => { const action = { type: fetchNotesByDocumentId.rejected.type, error: 'error' }; expect(notesReducer(initalEmptyState, action)).toEqual({ @@ -119,14 +133,19 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Failed, createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, + }, + error: { + fetchNotesByDocumentId: 'error', + createNote: null, + deleteNote: null, }, - error: { fetchNotesByDocumentId: 'error', createNote: null }, }); }); }); describe('createNote', () => { - it('should set correct state when creating a note by document id', () => { + it('should set correct status state when creating a note by document id', () => { const action = { type: createNote.pending.type }; expect(notesReducer(initalEmptyState, action)).toEqual({ @@ -135,8 +154,9 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Loading, + deleteNote: ReqStatus.Idle, }, - error: { fetchNotesByDocumentId: null, createNote: null }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }); }); @@ -159,12 +179,13 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Succeeded, + deleteNote: ReqStatus.Idle, }, - error: { fetchNotesByDocumentId: null, createNote: null }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, }); }); - it('should set correct state when error on create a note by document id', () => { + it('should set correct error state when failing to create a note by document id', () => { const action = { type: createNote.rejected.type, error: 'error' }; expect(notesReducer(initalEmptyState, action)).toEqual({ @@ -173,8 +194,67 @@ describe('notesSlice', () => { status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Failed, + deleteNote: ReqStatus.Idle, + }, + error: { + fetchNotesByDocumentId: null, + createNote: 'error', + deleteNote: null, + }, + }); + }); + }); + + describe('deleteNote', () => { + it('should set correct status state when deleting a note', () => { + const action = { type: deleteNote.pending.type }; + + expect(notesReducer(initalEmptyState, action)).toEqual({ + entities: {}, + ids: [], + status: { + fetchNotesByDocumentId: ReqStatus.Idle, + createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Loading, + }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, + }); + }); + + it('should set correct state when success on deleting a note', () => { + const action = { + type: deleteNote.fulfilled.type, + payload: mockNote.noteId, + }; + + expect(notesReducer(initialNonEmptyState, action)).toEqual({ + entities: {}, + ids: [], + status: { + fetchNotesByDocumentId: ReqStatus.Idle, + createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Succeeded, + }, + error: { fetchNotesByDocumentId: null, createNote: null, deleteNote: null }, + }); + }); + + it('should set correct state when failing to create a note by document id', () => { + const action = { type: deleteNote.rejected.type, error: 'error' }; + + expect(notesReducer(initalEmptyState, action)).toEqual({ + entities: {}, + ids: [], + status: { + fetchNotesByDocumentId: ReqStatus.Idle, + createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Failed, + }, + error: { + fetchNotesByDocumentId: null, + createNote: null, + deleteNote: 'error', }, - error: { fetchNotesByDocumentId: null, createNote: 'error' }, }); }); }); @@ -218,6 +298,14 @@ describe('notesSlice', () => { expect(selectCreateNoteError(mockGlobalState)).toEqual(null); }); + it('should return delete note status', () => { + expect(selectDeleteNoteStatus(mockGlobalState)).toEqual(ReqStatus.Idle); + }); + + it('should return delete note error', () => { + expect(selectDeleteNoteError(mockGlobalState)).toEqual(null); + }); + it('should return all notes for an existing document id', () => { expect(selectNotesByDocumentId(mockGlobalState, '1')).toEqual([mockNote]); }); diff --git a/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts b/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts index d644539844dd5..52a2805e765f6 100644 --- a/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts +++ b/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts @@ -11,6 +11,7 @@ import { createSelector } from 'reselect'; import type { State } from '../../common/store'; import { createNote as createNoteApi, + deleteNote as deleteNoteApi, fetchNotesByDocumentId as fetchNotesByDocumentIdApi, } from '../api/api'; import type { NormalizedEntities, NormalizedEntity } from './normalize'; @@ -33,10 +34,12 @@ export interface NotesState extends EntityState { status: { fetchNotesByDocumentId: ReqStatus; createNote: ReqStatus; + deleteNote: ReqStatus; }; error: { fetchNotesByDocumentId: SerializedError | HttpError | null; createNote: SerializedError | HttpError | null; + deleteNote: SerializedError | HttpError | null; }; } @@ -48,10 +51,12 @@ export const initialNotesState: NotesState = notesAdapter.getInitialState({ status: { fetchNotesByDocumentId: ReqStatus.Idle, createNote: ReqStatus.Idle, + deleteNote: ReqStatus.Idle, }, error: { fetchNotesByDocumentId: null, createNote: null, + deleteNote: null, }, }); @@ -74,6 +79,15 @@ export const createNote = createAsyncThunk, { note: BareN } ); +export const deleteNote = createAsyncThunk( + 'notes/deleteNote', + async (args) => { + const { id } = args; + await deleteNoteApi(id); + return id; + } +); + const notesSlice = createSlice({ name: 'notes', initialState: initialNotesState, @@ -101,6 +115,17 @@ const notesSlice = createSlice({ .addCase(createNote.rejected, (state, action) => { state.status.createNote = ReqStatus.Failed; state.error.createNote = action.payload ?? action.error; + }) + .addCase(deleteNote.pending, (state) => { + state.status.deleteNote = ReqStatus.Loading; + }) + .addCase(deleteNote.fulfilled, (state, action) => { + notesAdapter.removeOne(state, action.payload); + state.status.deleteNote = ReqStatus.Succeeded; + }) + .addCase(deleteNote.rejected, (state, action) => { + state.status.deleteNote = ReqStatus.Failed; + state.error.deleteNote = action.payload ?? action.error; }); }, }); @@ -123,6 +148,10 @@ export const selectCreateNoteStatus = (state: State) => state.notes.status.creat export const selectCreateNoteError = (state: State) => state.notes.error.createNote; +export const selectDeleteNoteStatus = (state: State) => state.notes.status.deleteNote; + +export const selectDeleteNoteError = (state: State) => state.notes.error.deleteNote; + export const selectNotesByDocumentId = createSelector( [selectAllNotes, (state, documentId) => documentId], (notes, documentId) => notes.filter((note) => note.eventId === documentId) From e7c867f34a9d12b955f5c7df237b63bdfe2136e8 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 25 Jun 2024 12:28:32 -0700 Subject: [PATCH 02/40] [Maps] Use client-side authc.getCurrentUser from core.security (#186915) Part of https://github.com/elastic/kibana/issues/186574 Background: This PR serves as an example of a plugin migrating away from depending on the Security plugin, which is a high priority effort for the last release before 9.0. The Maps plugin uses the `authc.getCurrentUser` in the `es_search_source` utility. ### Checklist Delete any items that are not applicable to this PR. - [ ] [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 --- .../sources/es_search_source/es_search_source.tsx | 9 ++------- x-pack/plugins/maps/public/kibana_services.ts | 1 - x-pack/plugins/maps/public/plugin.ts | 2 -- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx index 161acd3e5db73..76b2e17cb002e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx @@ -19,12 +19,7 @@ import { Adapters } from '@kbn/inspector-plugin/common/adapters'; import { SortDirection, SortDirectionNumeric } from '@kbn/data-plugin/common'; import { getTileUrlParams } from '@kbn/maps-vector-tile-utils'; import { AbstractESSource } from '../es_source'; -import { - getHttp, - getSearchService, - getSecurityService, - getTimeFilter, -} from '../../../kibana_services'; +import { getCore, getHttp, getSearchService, getTimeFilter } from '../../../kibana_services'; import { addFieldToDSL, getField, @@ -532,7 +527,7 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource if (!(await this._isDrawingIndex())) { return {}; } - const user = await getSecurityService()?.authc.getCurrentUser(); + const user = await getCore().security.authc.getCurrentUser(); const timestamp = new Date().toISOString(); return { created: { diff --git a/x-pack/plugins/maps/public/kibana_services.ts b/x-pack/plugins/maps/public/kibana_services.ts index e7dfeb2e08957..9c11f56a7f5c7 100644 --- a/x-pack/plugins/maps/public/kibana_services.ts +++ b/x-pack/plugins/maps/public/kibana_services.ts @@ -90,7 +90,6 @@ export const getUrlForApp = () => coreStart.application.getUrlForApp; export const getNavigateToUrl = () => coreStart.application.navigateToUrl; export const getSavedObjectsTagging = () => pluginsStart.savedObjectsTagging; export const getPresentationUtilContext = () => pluginsStart.presentationUtil.ContextProvider; -export const getSecurityService = () => pluginsStart.security; export const getSpacesApi = () => pluginsStart.spaces; export const getTheme = () => coreStart.theme; export const getApplication = () => coreStart.application; diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index 42d40cc64e64a..169731af566fe 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -36,7 +36,6 @@ import type { FileUploadPluginStart } from '@kbn/file-upload-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import type { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; -import type { SecurityPluginStart } from '@kbn/security-plugin/public'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { CloudSetup } from '@kbn/cloud-plugin/public'; import type { LensPublicSetup } from '@kbn/lens-plugin/public'; @@ -123,7 +122,6 @@ export interface MapsPluginStartDependencies { visualizations: VisualizationsStart; savedObjectsTagging?: SavedObjectTaggingPluginStart; presentationUtil: PresentationUtilPluginStart; - security?: SecurityPluginStart; spaces?: SpacesPluginStart; mapsEms: MapsEmsPluginPublicStart; contentManagement: ContentManagementPublicStart; From 966b08247e209ac9b7fd6b0c386355322afb5a61 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 25 Jun 2024 12:29:23 -0700 Subject: [PATCH 03/40] [Data Visualizer] Use client-side authc.getCurrentUser from core.security (#186918) Part of https://github.com/elastic/kibana/issues/186574 Background: This PR serves as an example of a plugin migrating away from depending on the Security plugin, which is a high priority effort for the last release before 9.0. The Data Visualizer plugin uses the `authc.getCurrentUser` method as a means to use create FileBeat configuration example content. ### Checklist Delete any items that are not applicable to this PR. - [ ] [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 --- .../filebeat_config_flyout/filebeat_config_flyout.tsx | 8 +++----- .../application/common/types/data_visualizer_plugin.ts | 2 -- .../application/data_drift/data_drift_app_state.tsx | 2 -- .../file_data_visualizer/file_data_visualizer.tsx | 4 +--- .../grid_embeddable/field_stats_embeddable_wrapper.tsx | 2 -- .../index_data_visualizer/index_data_visualizer.tsx | 2 -- 6 files changed, 4 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx index a0053c6c64c1c..7682e771ac155 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx @@ -50,11 +50,9 @@ export const FilebeatConfigFlyout: FC = ({ } = useDataVisualizerKibana(); useEffect(() => { - if (security !== undefined) { - security.authc.getCurrentUser().then((user) => { - setUsername(user.username === undefined ? null : user.username); - }); - } + security.authc.getCurrentUser().then((user) => { + setUsername(user.username === undefined ? null : user.username); + }); }, [security]); useEffect(() => { diff --git a/x-pack/plugins/data_visualizer/public/application/common/types/data_visualizer_plugin.ts b/x-pack/plugins/data_visualizer/public/application/common/types/data_visualizer_plugin.ts index cb2c3d680e5b4..cb2e90f7d4bae 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/types/data_visualizer_plugin.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/types/data_visualizer_plugin.ts @@ -16,7 +16,6 @@ import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/publ import type { FileUploadPluginStart } from '@kbn/file-upload-plugin/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import type { MapsStartApi } from '@kbn/maps-plugin/public'; -import type { SecurityPluginSetup } from '@kbn/security-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; import type { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; @@ -35,7 +34,6 @@ export interface DataVisualizerStartDependencies { fileUpload: FileUploadPluginStart; maps: MapsStartApi; embeddable: EmbeddableStart; - security?: SecurityPluginSetup; share: SharePluginStart; lens?: LensPublicStart; charts: ChartsPluginStart; diff --git a/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx index a7d4af94a62c8..24c995ec0652d 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx @@ -68,7 +68,6 @@ export const DataDriftDetectionAppState: FC = ( maps, embeddable, share, - security, fileUpload, lens, dataViewFieldEditor, @@ -82,7 +81,6 @@ export const DataDriftDetectionAppState: FC = ( maps, embeddable, share, - security, fileUpload, lens, dataViewFieldEditor, diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx index 13b3511fc7fc1..01d9d2c37194f 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx @@ -25,15 +25,13 @@ export type FileDataVisualizerSpec = typeof FileDataVisualizer; export const FileDataVisualizer: FC = ({ getAdditionalLinks, resultLinks }) => { const coreStart = getCoreStart(); - const { data, maps, embeddable, share, security, fileUpload, cloud, fieldFormats } = - getPluginsStart(); + const { data, maps, embeddable, share, fileUpload, cloud, fieldFormats } = getPluginsStart(); const services = { ...coreStart, data, maps, embeddable, share, - security, fileUpload, fieldFormats, }; 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 4d547635eb504..a7e57e1e550b6 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 @@ -78,7 +78,6 @@ const FieldStatisticsWrapper = (props: FieldStatisticTableEmbeddableProps) => { maps, embeddable, share, - security, fileUpload, lens, dataViewFieldEditor, @@ -92,7 +91,6 @@ const FieldStatisticsWrapper = (props: FieldStatisticTableEmbeddableProps) => { maps, embeddable, share, - security, fileUpload, lens, dataViewFieldEditor, diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx index 2ad7500f7e693..9412f08172c48 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx @@ -311,7 +311,6 @@ export const IndexDataVisualizer: FC = ({ maps, embeddable, share, - security, fileUpload, lens, dataViewFieldEditor, @@ -325,7 +324,6 @@ export const IndexDataVisualizer: FC = ({ maps, embeddable, share, - security, fileUpload, lens, dataViewFieldEditor, From 53de504c6d54f5ceda2195a1a8b4e2c7ace92baf Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 25 Jun 2024 13:23:09 -0700 Subject: [PATCH 04/40] [Reporting] Unskip serverless functional test (#186676) ## Summary Partially address https://github.com/elastic/kibana/issues/186558 --- .../functional/test_suites/common/reporting/management.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/reporting/management.ts b/x-pack/test_serverless/functional/test_suites/common/reporting/management.ts index bb875e7fac186..50b8f0919694a 100644 --- a/x-pack/test_serverless/functional/test_suites/common/reporting/management.ts +++ b/x-pack/test_serverless/functional/test_suites/common/reporting/management.ts @@ -70,8 +70,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); - // Cant auth into the route as it's structured currently - xit(`user sees a job they've created`, async () => { + it(`user sees a job they've created`, async () => { const { job: { id: jobId }, } = await reportingAPI.createReportJobInternal( From 4ffd5307f7737b027c4b9831c621aa9aa1989fb8 Mon Sep 17 00:00:00 2001 From: Bharat Pasupula <123897612+bhapas@users.noreply.github.com> Date: Tue, 25 Jun 2024 22:27:18 +0200 Subject: [PATCH 05/40] [Security GenAI] [ Integration Assistant ] Add unit tests for Integration Assistant plugin files (#186512) --- .../__jest__/fixtures/build_integration.ts | 47 +++++++++++ .../categorization_route.test.ts | 20 +++++ .../common/api/ecs/ecs_route.test.ts | 20 +++++ .../common/api/model/api_test.mock.ts | 82 +++++++++++++++++++ .../common/api/related/related_route.test.ts | 20 +++++ .../graphs/categorization/validate.test.ts | 55 +++++++++++++ 6 files changed, 244 insertions(+) create mode 100644 x-pack/plugins/integration_assistant/__jest__/fixtures/build_integration.ts create mode 100644 x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.test.ts create mode 100644 x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.test.ts create mode 100644 x-pack/plugins/integration_assistant/common/api/model/api_test.mock.ts create mode 100644 x-pack/plugins/integration_assistant/common/api/related/related_route.test.ts create mode 100644 x-pack/plugins/integration_assistant/server/graphs/categorization/validate.test.ts diff --git a/x-pack/plugins/integration_assistant/__jest__/fixtures/build_integration.ts b/x-pack/plugins/integration_assistant/__jest__/fixtures/build_integration.ts new file mode 100644 index 0000000000000..78228d5a4cbca --- /dev/null +++ b/x-pack/plugins/integration_assistant/__jest__/fixtures/build_integration.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 { Integration } from '../../common/api/model/common_attributes'; + +export const testIntegration: Integration = { + name: 'integration', + title: 'Integration', + description: 'Integration description', + dataStreams: [ + { + name: 'datastream', + title: 'Datastream', + description: 'Datastream description', + inputTypes: ['filestream', 'tcp', 'udp'], + docs: [ + { + key: 'value', + anotherKey: 'anotherValue', + }, + ], + rawSamples: ['{"test1": "test1"}'], + pipeline: { + processors: [ + { + set: { + field: 'ecs.version', + value: '8.11.0', + }, + }, + { + rename: { + field: 'message', + target_field: 'event.original', + ignore_missing: true, + if: 'ctx.event?.original == null', + }, + }, + ], + }, + }, + ], +}; diff --git a/x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.test.ts b/x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.test.ts new file mode 100644 index 0000000000000..f7ef31f5fdb99 --- /dev/null +++ b/x-pack/plugins/integration_assistant/common/api/categorization/categorization_route.test.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. + */ + +import { expectParseSuccess } from '@kbn/zod-helpers'; +import { CategorizationRequestBody } from './categorization_route'; +import { getCategorizationRequestMock } from '../model/api_test.mock'; + +describe('Categorization request schema', () => { + test('full request validate', () => { + const payload: CategorizationRequestBody = getCategorizationRequestMock(); + + const result = CategorizationRequestBody.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.test.ts b/x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.test.ts new file mode 100644 index 0000000000000..770c3ff96f675 --- /dev/null +++ b/x-pack/plugins/integration_assistant/common/api/ecs/ecs_route.test.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. + */ + +import { expectParseSuccess } from '@kbn/zod-helpers'; +import { EcsMappingRequestBody } from './ecs_route'; +import { getEcsMappingRequestMock } from '../model/api_test.mock'; + +describe('Ecs Mapping request schema', () => { + test('full request validate', () => { + const payload: EcsMappingRequestBody = getEcsMappingRequestMock(); + + const result = EcsMappingRequestBody.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/integration_assistant/common/api/model/api_test.mock.ts b/x-pack/plugins/integration_assistant/common/api/model/api_test.mock.ts new file mode 100644 index 0000000000000..92208abd04832 --- /dev/null +++ b/x-pack/plugins/integration_assistant/common/api/model/api_test.mock.ts @@ -0,0 +1,82 @@ +/* + * 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 { BuildIntegrationRequestBody } from '../build_integration/build_integration'; +import type { CategorizationRequestBody } from '../categorization/categorization_route'; +import type { EcsMappingRequestBody } from '../ecs/ecs_route'; +import type { RelatedRequestBody } from '../related/related_route'; +import type { DataStream, Integration, Pipeline } from './common_attributes'; + +const rawSamples = ['{"test1": "test1"}']; + +export const getDataStreamMock = (): DataStream => ({ + description: 'Test description', + name: 'Test name', + inputTypes: ['filestream'], + title: 'Test title', + docs: [ + { + key: 'value', + anotherKey: 'anotherValue', + }, + ], + rawSamples, + pipeline: getPipelineMock(), +}); + +export const getIntegrationMock = (): Integration => ({ + description: 'Test description', + name: 'Test name', + title: 'Test title', + dataStreams: [getDataStreamMock()], +}); + +export const getPipelineMock = (): Pipeline => ({ + processors: [ + { + set: { + field: 'ecs.version', + value: '8.11.0', + }, + }, + { + rename: { + field: 'message', + target_field: 'event.original', + ignore_missing: true, + if: 'ctx.event?.original == null', + }, + }, + ], +}); + +export const getCategorizationRequestMock = (): CategorizationRequestBody => ({ + connectorId: 'test-connector-id', + currentPipeline: getPipelineMock(), + dataStreamName: 'test-data-stream-name', + packageName: 'test-package-name', + rawSamples, +}); + +export const getBuildIntegrationRequestMock = (): BuildIntegrationRequestBody => ({ + integration: getIntegrationMock(), +}); + +export const getEcsMappingRequestMock = (): EcsMappingRequestBody => ({ + rawSamples, + dataStreamName: 'test-data-stream-name', + packageName: 'test-package-name', + connectorId: 'test-connector-id', +}); + +export const getRelatedRequestMock = (): RelatedRequestBody => ({ + dataStreamName: 'test-data-stream-name', + packageName: 'test-package-name', + rawSamples, + connectorId: 'test-connector-id', + currentPipeline: getPipelineMock(), +}); diff --git a/x-pack/plugins/integration_assistant/common/api/related/related_route.test.ts b/x-pack/plugins/integration_assistant/common/api/related/related_route.test.ts new file mode 100644 index 0000000000000..8f69c13303056 --- /dev/null +++ b/x-pack/plugins/integration_assistant/common/api/related/related_route.test.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. + */ + +import { expectParseSuccess } from '@kbn/zod-helpers'; +import { RelatedRequestBody } from './related_route'; +import { getRelatedRequestMock } from '../model/api_test.mock'; + +describe('Related request schema', () => { + test('full request validate', () => { + const payload: RelatedRequestBody = getRelatedRequestMock(); + + const result = RelatedRequestBody.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.test.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.test.ts new file mode 100644 index 0000000000000..95c56c777a315 --- /dev/null +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.test.ts @@ -0,0 +1,55 @@ +/* + * 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 { handleCategorizationValidation } from './validate'; +import type { CategorizationState } from '../../types'; +import { categorizationTestState } from '../../../__jest__/fixtures/categorization'; + +const testState: CategorizationState = categorizationTestState; + +describe('Testing categorization invalid category', () => { + it('handleCategorizationValidation()', async () => { + testState.pipelineResults = [{ test: 'testresult', event: { category: ['foo'] } }]; + const response = handleCategorizationValidation(testState); + expect(response.invalidCategorization).toEqual([ + { + error: + "field event.category's values (foo) is not one of the allowed values (api, authentication, configuration, database, driver, email, file, host, iam, intrusion_detection, library, malware, network, package, process, registry, session, threat, vulnerability, web)", + }, + ]); + expect(response.lastExecutedChain).toBe('handleCategorizationValidation'); + }); +}); + +describe('Testing categorization invalid type', () => { + it('handleCategorizationValidation()', async () => { + testState.pipelineResults = [{ test: 'testresult', event: { type: ['foo'] } }]; + const response = handleCategorizationValidation(testState); + expect(response.invalidCategorization).toEqual([ + { + error: + "field event.type's values (foo) is not one of the allowed values (access, admin, allowed, change, connection, creation, deletion, denied, end, error, group, indicator, info, installation, protocol, start, user)", + }, + ]); + expect(response.lastExecutedChain).toBe('handleCategorizationValidation'); + }); +}); + +describe('Testing categorization invalid compatibility', () => { + it('handleCategorizationValidation()', async () => { + testState.pipelineResults = [ + { test: 'testresult', event: { category: ['authentication'], type: ['access'] } }, + ]; + const response = handleCategorizationValidation(testState); + expect(response.invalidCategorization).toEqual([ + { + error: 'event.type (access) not compatible with any of the event.category (authentication)', + }, + ]); + expect(response.lastExecutedChain).toBe('handleCategorizationValidation'); + }); +}); From 0d802cb247ee77d0246824310a6a4e32df8a2454 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 25 Jun 2024 16:10:25 -0500 Subject: [PATCH 06/40] [Security Solution][Detection Engine] ML Cypress Improvements (#186831) ## Summary This PR contains a collection of fixes, mainly cherry-picked from #181926. Since some of these tests are failing sporadically on main, I'm opening this "test fix" PR for expedience while #181926 is still in review. ### 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 - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed * [Cypress * 100](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6385) * [Serverless Cypress * 100](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6386) --- .../rule_creation/machine_learning_rule.cy.ts | 27 +++++++++++------- .../cypress/objects/rule.ts | 4 +-- .../cypress/support/machine_learning.ts | 28 +++++++++++++++++++ .../cypress/tasks/alerts_detection_rules.ts | 2 +- .../cypress/tasks/create_new_rule.ts | 28 +++++++++++++------ 5 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 x-pack/test/security_solution_cypress/cypress/support/machine_learning.ts diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts index 9121e524ddbb4..0f90e406682f3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts @@ -4,13 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { isArray } from 'lodash'; import { formatMitreAttackDescription, getHumanizedDuration } from '../../../../helpers/rules'; import { getMachineLearningRule } from '../../../../objects/rule'; import { - CUSTOM_RULES_BTN, RISK_SCORE, RULES_MANAGEMENT_TABLE, RULE_NAME, @@ -53,13 +51,27 @@ import { login } from '../../../../tasks/login'; import { visit } from '../../../../tasks/navigation'; import { openRuleManagementPageViaBreadcrumbs } from '../../../../tasks/rules_management'; import { CREATE_RULE_URL } from '../../../../urls/navigation'; +import { forceStopAndCloseJob } from '../../../../support/machine_learning'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; describe('Machine Learning rules', { tags: ['@ess', '@serverless'] }, () => { const expectedUrls = (getMachineLearningRule().references ?? []).join(''); const expectedFalsePositives = (getMachineLearningRule().false_positives ?? []).join(''); const expectedTags = (getMachineLearningRule().tags ?? []).join(''); const expectedMitre = formatMitreAttackDescription(getMachineLearningRule().threat ?? []); - const expectedNumberOfRules = 1; + const expectedJobText = [ + 'Unusual Linux Network Activity', + 'Anomalous Process for a Linux Population', + ].join(''); + + before(() => { + const machineLearningJobIds = ([] as string[]).concat( + getMachineLearningRule().machine_learning_job_id + ); + // ensure no ML jobs are started before the suite + machineLearningJobIds.forEach((jobId) => forceStopAndCloseJob({ jobId })); + deleteAlertsAndRules(); + }); beforeEach(() => { login(); @@ -75,9 +87,7 @@ describe('Machine Learning rules', { tags: ['@ess', '@serverless'] }, () => { createAndEnableRule(); openRuleManagementPageViaBreadcrumbs(); - cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); - - expectNumberOfRules(RULES_MANAGEMENT_TABLE, expectedNumberOfRules); + expectNumberOfRules(RULES_MANAGEMENT_TABLE, 1); cy.get(RULE_NAME).should('have.text', mlRule.name); cy.get(RISK_SCORE).should('have.text', mlRule.risk_score); @@ -104,15 +114,12 @@ describe('Machine Learning rules', { tags: ['@ess', '@serverless'] }, () => { getDetails(ANOMALY_SCORE_DETAILS).should('have.text', mlRule.anomaly_threshold); getDetails(RULE_TYPE_DETAILS).should('have.text', 'Machine Learning'); getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); - const machineLearningJobsArray = isArray(mlRule.machine_learning_job_id) - ? mlRule.machine_learning_job_id - : [mlRule.machine_learning_job_id]; // With the #1912 ML rule improvement changes we enable jobs on rule creation. // Though, in cypress jobs enabling does not work reliably and job can be started or stopped. // Thus, we disable next check till we fix the issue with enabling jobs in cypress. // Relevant ticket: https://github.com/elastic/security-team/issues/5389 // cy.get(MACHINE_LEARNING_JOB_STATUS).should('have.text', 'StoppedStopped'); - cy.get(MACHINE_LEARNING_JOB_ID).should('have.text', machineLearningJobsArray.join('')); + cy.get(MACHINE_LEARNING_JOB_ID).should('have.text', expectedJobText); }); cy.get(SCHEDULE_DETAILS).within(() => { getDetails(RUNS_EVERY_DETAILS) diff --git a/x-pack/test/security_solution_cypress/cypress/objects/rule.ts b/x-pack/test/security_solution_cypress/cypress/objects/rule.ts index 04ba983664952..50e358515d922 100644 --- a/x-pack/test/security_solution_cypress/cypress/objects/rule.ts +++ b/x-pack/test/security_solution_cypress/cypress/objects/rule.ts @@ -361,8 +361,8 @@ export const getMachineLearningRule = ( ): MachineLearningRuleCreateProps => ({ type: 'machine_learning', machine_learning_job_id: [ - 'Unusual Linux Network Activity', - 'Anomalous Process for a Linux Population', + 'v3_linux_anomalous_network_activity', + 'v3_linux_anomalous_process_all_hosts', ], anomaly_threshold: 20, name: 'New ML Rule Test', diff --git a/x-pack/test/security_solution_cypress/cypress/support/machine_learning.ts b/x-pack/test/security_solution_cypress/cypress/support/machine_learning.ts new file mode 100644 index 0000000000000..e562a693865e3 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/support/machine_learning.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 { rootRequest } from '../tasks/api_calls/common'; + +/** + * Calls the internal ML Jobs API to force stop the datafeed of, and force close + * the job with the given ID. + * + * @param jobId the ID of the ML job to stop and close + * @returns the response from the force stop and close job request + */ +export const forceStopAndCloseJob = ({ jobId }: { jobId: string }) => + rootRequest({ + headers: { + 'elastic-api-version': 1, + }, + method: 'POST', + url: '/internal/ml/jobs/force_stop_and_close_job', + failOnStatusCode: false, + body: { + jobId, + }, + }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts b/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts index 97d6c34fdd040..7304a23f75e77 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts @@ -384,7 +384,7 @@ export const expectNumberOfRules = ( expectedNumber: number ) => { cy.log(`Expecting rules table to contain #${expectedNumber} rules`); - cy.get(tableSelector).find(RULES_ROW).should('have.length', expectedNumber); + cy.get(tableSelector).find(RULES_ROW).its('length').should('be.gte', expectedNumber); }; export const expectToContainRule = ( diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts index d9f0120ab0199..e8be51d0d3731 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts @@ -802,21 +802,20 @@ export const continueFromDefineStep = () => { getDefineContinueButton().should('exist').click({ force: true }); }; -export const fillDefineMachineLearningRuleAndContinue = (rule: MachineLearningRuleCreateProps) => { +export const fillDefineMachineLearningRule = (rule: MachineLearningRuleCreateProps) => { const jobsAsArray = isArray(rule.machine_learning_job_id) ? rule.machine_learning_job_id : [rule.machine_learning_job_id]; - const text = jobsAsArray - .map((machineLearningJob) => `${machineLearningJob}{downArrow}{enter}`) - .join(''); cy.get(MACHINE_LEARNING_DROPDOWN_INPUT).click({ force: true }); - cy.get(MACHINE_LEARNING_DROPDOWN_INPUT).type(text); - - cy.get(MACHINE_LEARNING_DROPDOWN_INPUT).type('{esc}'); + cy.get(MACHINE_LEARNING_DROPDOWN_INPUT).type(optionsToComboboxText(jobsAsArray)); cy.get(ANOMALY_THRESHOLD_INPUT).type(`{selectall}${rule.anomaly_threshold}`, { force: true, }); +}; + +export const fillDefineMachineLearningRuleAndContinue = (rule: MachineLearningRuleCreateProps) => { + fillDefineMachineLearningRule(rule); getDefineContinueButton().should('exist').click({ force: true }); }; @@ -909,9 +908,20 @@ export const enablesAndPopulatesThresholdSuppression = ( cy.get(ALERT_SUPPRESSION_DURATION_PER_TIME_INTERVAL).should('be.enabled').should('be.checked'); }; +const optionsToComboboxText = (options: string[]) => { + return options.map((o) => `${o}{downArrow}{enter}{esc}`).join(''); +}; + export const fillAlertSuppressionFields = (fields: string[]) => { - fields.forEach((field) => { - cy.get(ALERT_SUPPRESSION_FIELDS_COMBO_BOX).type(`${field}{enter}`); + cy.get(ALERT_SUPPRESSION_FIELDS_COMBO_BOX).should('not.be.disabled'); + cy.get(ALERT_SUPPRESSION_FIELDS_COMBO_BOX).click(); + cy.get(ALERT_SUPPRESSION_FIELDS_COMBO_BOX).type(optionsToComboboxText(fields)); +}; + +export const clearAlertSuppressionFields = () => { + cy.get(ALERT_SUPPRESSION_FIELDS_COMBO_BOX).should('not.be.disabled'); + cy.get(ALERT_SUPPRESSION_FIELDS).within(() => { + cy.get(COMBO_BOX_CLEAR_BTN).click(); }); }; From ba1221904ce914aedcac8b1343ddc35523dce18c Mon Sep 17 00:00:00 2001 From: Khristinin Nikita Date: Wed, 26 Jun 2024 00:09:31 +0200 Subject: [PATCH 07/40] Manual rule run UX changes + copy (#186830) ## Manual rule run UX improvements - Change copy, mainly Backfill to Manual rule run - Move Manual run into separate sections - Not hide Manual run sections with empty state - Add tooltip for disabled manual rule run when open rule actions - Add limitations to modal window - Change auto-refresh to refresh button + add information about last update - Fix bug, when you run manual run and it's not showing in the manual rule run table - Change order for start finish date in execution log - Add technical preview to manual rule run section https://github.com/elastic/kibana/assets/7609147/d6616a87-7259-4ad8-b605-fb8ffb8c6e7e --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nastasha Solomon <79124755+nastasha-solomon@users.noreply.github.com> --- .../execution_log_columns.tsx | 4 +- .../execution_log_table.tsx | 5 +- .../execution_log_table/translations.ts | 3 +- .../pages/rule_details/index.tsx | 19 ++- .../hooks/use_schedule_rule_run_mutation.ts | 8 ++ .../components/manual_rule_run/index.tsx | 14 ++ .../manual_rule_run/translations.ts | 15 ++ .../components/rule_backfills_info/index.tsx | 129 ++++++++++++------ .../rule_gaps/translations.ts | 93 +++++++++++-- .../rules_table/use_rules_table_actions.tsx | 3 +- .../rules/rule_actions_overflow/index.tsx | 5 + .../detection_engine/rules/translations.ts | 7 + .../rule_gaps/manual_rule_run.cy.ts | 4 +- .../rule_details/backfill_group.cy.ts | 6 +- 14 files changed, 245 insertions(+), 70 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx index 4428d6cca6de6..984f0f5dee926 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx @@ -169,11 +169,11 @@ export const getSourceEventTimeRangeColumns = () => [ return backfill ? (
- +
{'-'}
- +
) : ( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx index 1444dc8e0fd40..981f80f36f744 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx @@ -78,7 +78,7 @@ import { getSourceEventTimeRangeColumns, } from './execution_log_columns'; import { ExecutionLogSearchBar } from './execution_log_search_bar'; -import { RuleBackfillsInfo } from '../../../../rule_gaps/components/rule_backfills_info'; + import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; const EXECUTION_UUID_FIELD_NAME = 'kibana.alert.rule.execution.uuid'; @@ -594,9 +594,6 @@ const ExecutionLogTableComponent: React.FC = ({ itemIdToExpandedRowMap={rows.itemIdToExpandedRowMap} data-test-subj="executionsTable" /> - - - ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts index f84e0b6b859c2..76b3f5483baad 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts @@ -93,7 +93,8 @@ export const COLUMN_SOURCE_EVENT_TIME_RANGE = i18n.translate( export const COLUMN_SOURCE_EVENT_TIME_RANGE_TOOLTIP = i18n.translate( 'xpack.securitySolution.detectionEngine.ruleDetails.ruleExecutionLog.sourceEventTimeRangeTooltip', { - defaultMessage: "Only for manual rule runs. Don't include additional lookback time.", + defaultMessage: + "Only applies to manual rule executions. If the rule has look-back time, it's included in the logged time range.", } ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx index 43491a1969fff..da80b8ff6d015 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx @@ -112,6 +112,7 @@ import { } from '../../../../detections/components/rules/rule_execution_status'; import { ExecutionEventsTable } from '../../../rule_monitoring'; import { ExecutionLogTable } from './execution_log_table/execution_log_table'; +import { RuleBackfillsInfo } from '../../../rule_gaps/components/rule_backfills_info'; import * as ruleI18n from '../../../../detections/pages/detection_engine/rules/translations'; @@ -785,13 +786,17 @@ const RuleDetailsPageComponent: React.FC = ({ /> - + <> + + + + diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.ts index 78e3c5cbe6ca5..98c8a436393ad 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_schedule_rule_run_mutation.ts @@ -9,6 +9,7 @@ import type { UseMutationOptions } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query'; import type { ScheduleBackfillProps } from '../../types'; import { scheduleRuleRun } from '../api'; +import { useInvalidateFindBackfillQuery } from './use_find_backfills_for_rules'; export const SCHEDULE_RULE_RUN_MUTATION_KEY = [ 'POST', @@ -18,8 +19,15 @@ export const SCHEDULE_RULE_RUN_MUTATION_KEY = [ export const useScheduleRuleRunMutation = ( options?: UseMutationOptions ) => { + const invalidateBackfillQuery = useInvalidateFindBackfillQuery(); return useMutation((scheduleOptions: ScheduleBackfillProps) => scheduleRuleRun(scheduleOptions), { ...options, + onSettled: (...args) => { + invalidateBackfillQuery(); + if (options?.onSettled) { + options.onSettled(...args); + } + }, mutationKey: SCHEDULE_RULE_RUN_MUTATION_KEY, }); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/index.tsx index 00a3e4b262aa7..37a4762254329 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/index.tsx @@ -14,6 +14,8 @@ import { EuiForm, EuiFormRow, useGeneratedHtmlId, + EuiCallOut, + EuiSpacer, } from '@elastic/eui'; import moment from 'moment'; import React, { useCallback, useMemo, useState } from 'react'; @@ -118,6 +120,18 @@ const ManualRuleRunModalComponent = ({ onCancel, onConfirm }: ManualRuleRunModal /> + + + + + + + + ); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/translations.ts index 737a992b3a5a3..d9833232deb11 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/manual_rule_run/translations.ts @@ -68,3 +68,18 @@ export const MANUAL_RULE_RUN_START_DATE_OUT_OF_RANGE_ERROR = (maxDaysLookback: n defaultMessage: 'Manual rule run cannot be scheduled earlier than {maxDaysLookback, plural, =1 {# day} other {# days}} ago', }); + +export const MANUAL_RULE_RUN_ALERT_LIMITATIONS = i18n.translate( + 'xpack.securitySolution.manualRuleRun.alertLimitations', + { + defaultMessage: + 'To view alerts generated by this run, filter the Alerts page by the time range that was selected for this manual rule run.', + } +); + +export const MANUAL_RULE_RUN_NOTIFIACTIONS_LIMITATIONS = i18n.translate( + 'xpack.securitySolution.manualRuleRun.notificationsLimitations', + { + defaultMessage: 'Rule actions are not performed during manual rule runs.', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx index 1c8a180207d2a..3a2a608d84431 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx @@ -6,12 +6,15 @@ */ import React, { useState } from 'react'; -import { EuiAutoRefresh, EuiBasicTable, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import type { - EuiBasicTableColumn, - CriteriaWithPagination, - OnRefreshChangeProps, +import { + EuiButton, + EuiBasicTable, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiBetaBadge, } from '@elastic/eui'; +import type { EuiBasicTableColumn, CriteriaWithPagination } from '@elastic/eui'; import { useFindBackfillsForRules } from '../../api/hooks/use_find_backfills_for_rules'; import { StopBackfill } from './stop_backfill'; import { BackfillStatusInfo } from './backfill_status'; @@ -23,12 +26,15 @@ import { useUserData } from '../../../../detections/components/user_info'; import { getBackfillRowsFromResponse } from './utils'; import { HeaderSection } from '../../../../common/components/header_section'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; +import { TableHeaderTooltipCell } from '../../../rule_management_ui/components/rules_table/table_header_tooltip_cell'; +import { TECHNICAL_PREVIEW, TECHNICAL_PREVIEW_TOOLTIP } from '../../../../common/translations'; +import { useKibana } from '../../../../common/lib/kibana'; -const AUTO_REFRESH_INTERVAL = 3000; const DEFAULT_PAGE_SIZE = 10; const getBackfillsTableColumns = (hasCRUDPermissions: boolean) => { const stopAction = { + name: i18n.BACKFILLS_TABLE_COLUMN_ACTION, render: (item: BackfillRow) => , width: '10%', }; @@ -36,18 +42,33 @@ const getBackfillsTableColumns = (hasCRUDPermissions: boolean) => { const columns: Array> = [ { field: 'status', - name: i18n.BACKFILLS_TABLE_COLUMN_STATUS, + name: ( + + ), render: (value: BackfillStatus) => , width: '10%', }, { field: 'created_at', - name: i18n.BACKFILLS_TABLE_COLUMN_CREATED_AT, + name: ( + + ), render: (value: 'string') => , width: '20%', }, { - name: i18n.BACKFILLS_TABLE_COLUMN_SOURCE_TIME_RANCE, + name: ( + + ), render: (value: BackfillRow) => ( <> @@ -60,31 +81,56 @@ const getBackfillsTableColumns = (hasCRUDPermissions: boolean) => { { field: 'error', align: 'right', - name: i18n.BACKFILLS_TABLE_COLUMN_ERROR, + name: ( + + ), 'data-test-subj': 'rule-backfills-column-error', }, { field: 'pending', align: 'right', - name: i18n.BACKFILLS_TABLE_COLUMN_PENDING, + name: ( + + ), 'data-test-subj': 'rule-backfills-column-pending', }, { field: 'running', align: 'right', - name: i18n.BACKFILLS_TABLE_COLUMN_RUNNING, + name: ( + + ), 'data-test-subj': 'rule-backfills-column-running', }, { field: 'complete', align: 'right', - name: i18n.BACKFILLS_TABLE_COLUMN_COMPLETED, + name: ( + + ), 'data-test-subj': 'rule-backfills-column-completed', }, { field: 'total', align: 'right', - name: i18n.BACKFILLS_TABLE_COLUMN_TOTAL, + name: ( + + ), 'data-test-subj': 'rule-backfills-column-total', }, ]; @@ -98,21 +144,18 @@ const getBackfillsTableColumns = (hasCRUDPermissions: boolean) => { export const RuleBackfillsInfo = React.memo<{ ruleId: string }>(({ ruleId }) => { const isManualRuleRunEnabled = useIsExperimentalFeatureEnabled('manualRuleRunEnabled'); - const [autoRefreshInterval, setAutoRefreshInterval] = useState(AUTO_REFRESH_INTERVAL); - const [isAutoRefresh, setIsAutoRefresh] = useState(false); const [pageIndex, setPageIndex] = useState(0); const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE); const [{ canUserCRUD }] = useUserData(); const hasCRUDPermissions = hasUserCRUDPermission(canUserCRUD); - - const { data, isLoading, isError } = useFindBackfillsForRules( + const { timelines } = useKibana().services; + const { data, isLoading, isError, refetch, dataUpdatedAt } = useFindBackfillsForRules( { ruleIds: [ruleId], page: pageIndex + 1, perPage: pageSize, }, { - refetchInterval: isAutoRefresh ? autoRefreshInterval : false, enabled: isManualRuleRunEnabled, } ); @@ -131,13 +174,6 @@ export const RuleBackfillsInfo = React.memo<{ ruleId: string }>(({ ruleId }) => totalItemCount: data?.total ?? 0, }; - if (data?.total === 0) return null; - - const handleRefreshChange = ({ isPaused, refreshInterval }: OnRefreshChangeProps) => { - setIsAutoRefresh(!isPaused); - setAutoRefreshInterval(refreshInterval); - }; - const handleTableChange: (params: CriteriaWithPagination) => void = ({ page, sort, @@ -148,23 +184,39 @@ export const RuleBackfillsInfo = React.memo<{ ruleId: string }>(({ ruleId }) => } }; + const handleRefresh = () => { + refetch(); + }; + return ( -
- + + - + + + + + + + + + {i18n.BACKFILL_TABLE_REFRESH} + + + + - + {timelines.getLastUpdated({ + showUpdating: isLoading, + updatedAt: dataUpdatedAt, + })} + (({ ruleId }) => error={isError ? 'error' : undefined} loading={isLoading} onChange={handleTableChange} - noItemsMessage={'not found'} /> -
+ ); }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts index cb77ec89524fc..c2297e237100b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts @@ -14,6 +14,13 @@ export const BACKFILLS_TABLE_COLUMN_STATUS = i18n.translate( } ); +export const BACKFILLS_TABLE_COLUMN_STATUS_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.statusTooltip', + { + defaultMessage: 'Overall status of execution', + } +); + export const BACKFILLS_TABLE_COLUMN_CREATED_AT = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.createdAt', { @@ -21,13 +28,27 @@ export const BACKFILLS_TABLE_COLUMN_CREATED_AT = i18n.translate( } ); -export const BACKFILLS_TABLE_COLUMN_SOURCE_TIME_RANCE = i18n.translate( +export const BACKFILLS_TABLE_COLUMN_CREATED_AT_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.createdAtTooltip', + { + defaultMessage: 'When the manual run started', + } +); + +export const BACKFILLS_TABLE_COLUMN_SOURCE_TIME_RANGE = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.sourceTimeRange', { defaultMessage: 'Source event time range', } ); +export const BACKFILLS_TABLE_COLUMN_SOURCE_TIME_RANGE_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.sourceTimeRangeTooltip', + { + defaultMessage: 'The date and time range selected for the manual run', + } +); + export const BACKFILLS_TABLE_COLUMN_ERROR = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.error', { @@ -35,6 +56,13 @@ export const BACKFILLS_TABLE_COLUMN_ERROR = i18n.translate( } ); +export const BACKFILLS_TABLE_COLUMN_ERROR_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.errorTooltip', + { + defaultMessage: 'The number of failed manual run rule executions', + } +); + export const BACKFILLS_TABLE_COLUMN_COMPLETED = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.completed', { @@ -42,6 +70,13 @@ export const BACKFILLS_TABLE_COLUMN_COMPLETED = i18n.translate( } ); +export const BACKFILLS_TABLE_COLUMN_COMPLETED_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.completedTooltip', + { + defaultMessage: 'The number of completed manual run rule executions', + } +); + export const BACKFILLS_TABLE_COLUMN_RUNNING = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.running', { @@ -49,6 +84,13 @@ export const BACKFILLS_TABLE_COLUMN_RUNNING = i18n.translate( } ); +export const BACKFILLS_TABLE_COLUMN_RUNNING_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.runningTooltip', + { + defaultMessage: 'The number of manual run rule executions that are in progress', + } +); + export const BACKFILLS_TABLE_COLUMN_PENDING = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.pending', { @@ -56,6 +98,13 @@ export const BACKFILLS_TABLE_COLUMN_PENDING = i18n.translate( } ); +export const BACKFILLS_TABLE_COLUMN_PENDING_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.pendingTooltip', + { + defaultMessage: 'The number of manual run rule executions that are waiting to execute', + } +); + export const BACKFILLS_TABLE_COLUMN_TOTAL = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.column.total', { @@ -63,17 +112,25 @@ export const BACKFILLS_TABLE_COLUMN_TOTAL = i18n.translate( } ); +export const BACKFILLS_TABLE_COLUMN_TOTAL_TOOLTIP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.totalTooltip', + { + defaultMessage: + 'The total number of rule executions that will occur during the selected date and time range', + } +); + export const BACKFILLS_TABLE_STOP = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.stop', { - defaultMessage: 'Stop', + defaultMessage: 'Stop run', } ); export const BACKFILLS_TABLE_STOP_CONFIRMATION_TITLE = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.stop.confirmationTitle', { - defaultMessage: 'Are you sure you want to stop this run?', + defaultMessage: 'Stop this rule run', } ); @@ -87,42 +144,49 @@ export const BACKFILLS_TABLE_STOP_CONFIRMATION_CANCEL = i18n.translate( export const BACKFILLS_TABLE_STOP_CONFIRMATION_STOP_RUNS = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.stop.stopRuns', { - defaultMessage: 'Stop runs', + defaultMessage: 'Stop run', } ); export const BACKFILLS_TABLE_STOP_CONFIRMATION_BODY = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.stop.description', { - defaultMessage: 'All remaining rule runs will be stopped', + defaultMessage: 'All the pending rule executions for this manual rule run will be stopped', } ); export const BACKFILLS_TABLE_STOP_CONFIRMATION_SUCCESS = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.stop.confirmationSuccess', { - defaultMessage: 'Run stopped', + defaultMessage: 'Rule run stopped', } ); export const BACKFILLS_TABLE_STOP_CONFIRMATION_ERROR = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillsTable.stop.confirmationError', { - defaultMessage: 'Error stopping run', + defaultMessage: 'Error stopping rule run', } ); export const BACKFILL_TABLE_TITLE = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillTable.title', { - defaultMessage: 'Backfill runs', + defaultMessage: 'Manual runs', + } +); + +export const BACKFILL_TABLE_REFRESH = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillTable.refresh', + { + defaultMessage: 'Refresh', } ); export const BACKFILL_TABLE_SUBTITLE = i18n.translate( 'xpack.securitySolution.rule_gaps.backfillTable.subtitle', { - defaultMessage: 'View and manage backfill runs', + defaultMessage: 'View and manage active manual runs', } ); @@ -132,13 +196,20 @@ export const BACKFILL_SCHEDULE_SUCCESS = (numRules: number) => { values: { numRules }, defaultMessage: - 'Successfully scheduled backfill for {numRules, plural, =1 {# rule} other {# rules}}', + 'Successfully scheduled manual run for {numRules, plural, =1 {# rule} other {# rules}}', } ); export const BACKFILL_SCHEDULE_ERROR_TITLE = i18n.translate( 'xpack.securitySolution.containers.detectionEngine.backfillSchedule.scheduleRuleRunErrorTitle', { - defaultMessage: 'Error while scheduling backfill', + defaultMessage: 'Error while scheduling manual run', + } +); + +export const BACKFILLS_TABLE_COLUMN_ACTION = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.action', + { + defaultMessage: 'Action', } ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rules_table_actions.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rules_table_actions.tsx index dc4a0cb429b87..4af2fdd7ef356 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rules_table_actions.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_rules_table_actions.tsx @@ -122,7 +122,8 @@ export const useRulesTableActions = ({ { type: 'icon', 'data-test-subj': 'manualRuleRunAction', - description: i18n.MANUAL_RULE_RUN, + description: (rule) => + !rule.enabled ? i18n.MANUAL_RULE_RUN_TOOLTIP : i18n.MANUAL_RULE_RUN, icon: 'play', name: i18n.MANUAL_RULE_RUN, onClick: async (rule: Rule) => { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx index 5be000d508195..6ed110483ecc4 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx @@ -155,6 +155,11 @@ const RuleActionsOverflowComponent = ({ key={i18nActions.MANUAL_RULE_RUN} icon="play" disabled={!userHasPermissions || !rule.enabled} + toolTipContent={ + !userHasPermissions || !rule.enabled + ? i18nActions.MANUAL_RULE_RUN_TOOLTIP + : '' + } data-test-subj="rules-details-manual-rule-run" onClick={async () => { startTransaction({ name: SINGLE_RULE_ACTIONS.MANUAL_RULE_RUN }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index eb2d6b01b492f..b8e4063abb600 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -584,6 +584,13 @@ export const MANUAL_RULE_RUN = i18n.translate( } ); +export const MANUAL_RULE_RUN_TOOLTIP = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.allRules.actions.manualRuleRunTooltip', + { + defaultMessage: 'Manual run available only for enabled rules', + } +); + export const COLUMN_RULE = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.allRules.columns.ruleTitle', { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_gaps/manual_rule_run.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_gaps/manual_rule_run.cy.ts index 28eaef22cc2e7..29e2379367c0b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_gaps/manual_rule_run.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_gaps/manual_rule_run.cy.ts @@ -32,7 +32,7 @@ describe('Manual rule run', { tags: ['@ess', '@serverless', '@skipInServerlessMK ); manualRuleRunFromDetailsPage(); - cy.get(TOASTER).should('have.text', 'Successfully scheduled backfill for 1 rule'); + cy.get(TOASTER).should('have.text', 'Successfully scheduled manual run for 1 rule'); }); it('schedule from rules management table', () => { @@ -42,7 +42,7 @@ describe('Manual rule run', { tags: ['@ess', '@serverless', '@skipInServerlessMK disableAutoRefresh(); manuallyRunFirstRule(); - cy.get(TOASTER).should('have.text', 'Successfully scheduled backfill for 1 rule'); + cy.get(TOASTER).should('have.text', 'Successfully scheduled manual run for 1 rule'); } ); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts index 7413b8a8f02c7..2f97e2f3c0721 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts @@ -58,7 +58,7 @@ describe( interceptFindBackfills(); goToExecutionLogTab(); - cy.get(RULE_BACKFILLS_INFO_HEADEAR).contains('Backfill runs'); + cy.get(RULE_BACKFILLS_INFO_HEADEAR).contains('Manual runs'); getBackfillsTableRows().should('have.length', 2); getBackfillsTableRows().eq(0).contains('Pending'); getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_COLUMN_ERROR).contains('1'); @@ -76,11 +76,11 @@ describe( getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_DELETE_BUTTON).click(); - cy.get(RULE_BACKFILLS_DELETE_MODAL).contains('Are you sure you want to stop this run?'); + cy.get(RULE_BACKFILLS_DELETE_MODAL).contains('Stop this rule run'); interceptDeleteBackfill(FIRST_BACKFILL_ID, 'deleteBackfill'); cy.get(RULE_BACKFILL_DELETE_MODAL_CONFIRM_BUTTON).click(); cy.wait('@deleteBackfill'); - cy.get(TOASTER).contains('Run stopped'); + cy.get(TOASTER).contains('Rule run stopped'); }); } ); From f775a6a3f16758d22f8d94a006f0d155f66839ac Mon Sep 17 00:00:00 2001 From: Andrew Macri Date: Tue, 25 Jun 2024 19:42:13 -0400 Subject: [PATCH 08/40] [Security Solution] [Attack discovery] Improves Attack discovery code coverage (#186679) ## [Security Solution] [Attack discovery] Improves Attack discovery code coverage ### Summary This PR improves unit test coverage for the [Attack discovery](https://github.com/elastic/kibana/pull/181818) feature. ### Desk testing Run `node scripts/jest --watch x-pack/plugins/security_solution/public/attack_discovery --coverage` --- .../__mocks__/raw_attack_discoveries.ts | 24 + .../routes/attack_discovery/helpers.test.ts | 723 ++++++++++-------- .../attack_chain/axis_tick/index.test.tsx | 29 + .../attack/attack_chain/index.test.tsx | 30 + .../attack/attack_chain/tactic/index.test.tsx | 43 ++ .../attack/mini_attack_chain/index.test.tsx | 28 + .../helpers.test.ts | 30 + .../index.test.tsx | 102 +++ .../get_host_flyout_panel_props.test.ts | 44 ++ .../get_user_flyout_panel_props.test.ts | 26 + .../field_markdown_renderer/helpers.test.ts | 58 ++ .../field_markdown_renderer/index.test.tsx | 110 +++ .../index.test.tsx | 63 ++ .../actionable_summary/index.test.tsx | 109 +++ .../actions_placeholder/index.test.tsx | 23 + .../actions/alerts_badge/index.test.tsx | 21 + .../actions/index.test.tsx | 46 ++ .../actions/take_action/helpers.test.ts | 43 ++ .../actions/take_action/index.test.tsx | 47 ++ .../actions/use_add_to_case/index.test.tsx | 87 +++ .../use_add_to_existing_case/index.test.tsx | 142 ++++ .../attack_discovery_panel/index.test.tsx | 63 ++ .../tabs/alerts_tab/index.test.tsx | 27 + .../tabs/attack_discovery_tab/index.test.tsx | 139 ++++ .../tabs/attack_discovery_tab/index.tsx | 2 +- .../tabs/get_tabs.test.tsx | 63 ++ .../attack_discovery_panel/tabs/get_tabs.tsx | 2 +- .../tabs/index.test.tsx | 38 + .../title/index.test.tsx | 36 + .../view_in_ai_assistant/index.test.tsx | 66 ++ .../use_view_in_ai_assistant.test.ts | 86 +++ .../get_attack_discovery_markdown.test.tsx | 188 +++++ .../public/attack_discovery/helpers.test.tsx | 96 +++ .../public/attack_discovery/helpers.ts | 2 +- .../mock/mock_attack_discovery.ts | 37 + .../mock/mock_use_attack_discovery.ts | 84 ++ .../animated_counter/index.test.tsx | 25 + .../empty_prompt/animated_counter/index.tsx | 4 +- .../pages/empty_prompt/index.test.tsx | 150 ++++ .../pages/header/index.test.tsx | 183 +++++ .../loading_callout/countdown/index.test.tsx | 84 ++ .../generation_timing/index.test.tsx | 40 + .../last_times_popover/helpers.test.ts | 74 ++ .../last_times_popover/index.test.tsx | 59 ++ .../pages/loading_callout/index.test.tsx | 73 ++ .../info_popover_body/index.test.tsx | 55 ++ .../loading_messages/index.test.tsx | 43 ++ .../pages/page_title/index.test.tsx | 22 + .../pages/summary/index.test.tsx | 56 ++ .../pages/summary_count/index.test.tsx | 51 ++ .../pages/upgrade/index.test.tsx | 63 ++ .../use_attack_discovery/helpers.test.ts | 284 +++++++ .../get_anonymized_alerts.test.ts | 171 +++++ .../attack_discovery/get_anonymized_alerts.ts | 2 +- .../get_attack_discovery_prompt.test.ts | 30 + .../get_output_parser.test.ts | 31 + .../tools/attack_discovery/helpers.ts | 21 - 57 files changed, 3945 insertions(+), 333 deletions(-) create mode 100644 x-pack/plugins/elastic_assistant/server/__mocks__/raw_attack_discoveries.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/axis_tick/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/tactic/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_host_flyout_panel_props.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_user_flyout_panel_props.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actionable_summary/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/actions_placeholder/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/alerts_badge/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_case/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/alerts_tab/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/title/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/get_attack_discovery_markdown/get_attack_discovery_markdown.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/helpers.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/mock/mock_attack_discovery.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/generation_timing/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/info_popover_body/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/loading_messages/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/page_title/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/summary/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/summary_count/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/pages/upgrade/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/attack_discovery/use_attack_discovery/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.test.ts create mode 100644 x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_attack_discovery_prompt.test.ts create mode 100644 x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_output_parser.test.ts delete mode 100644 x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/helpers.ts diff --git a/x-pack/plugins/elastic_assistant/server/__mocks__/raw_attack_discoveries.ts b/x-pack/plugins/elastic_assistant/server/__mocks__/raw_attack_discoveries.ts new file mode 100644 index 0000000000000..1c43f112da2bb --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/__mocks__/raw_attack_discoveries.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. + */ + +/** + * A mock response from invoking the `attack-discovery` tool. + * This is a JSON string that represents the response from the tool + */ +export const getRawAttackDiscoveriesMock = () => + '{\n "alertsContextCount": 20,\n "attackDiscoveries": [\n {\n "alertIds": [\n "9bb601522d0c0b83783488a27a3ede5bd6a788f4f1ceef07cc8f12ac55f27563",\n "b9d6df8ab34e36c6868c097ff28dd01075df85a5ac1f084ef569ee8c6a4cf660",\n "014b433c3436ef5325cadacc35b6cb2ba8932a9c2ea0ba26d899f95c6fb61395",\n "28017987e64abb6ac486f1410f977d97ebd3a7172189cfdf943a48a59b968066"\n ],\n "detailsMarkdown": "- {{ host.name cb186c4a-3d70-4878-8ffe-18d84b5df86f }} (macOS {{ host.os.version 13.4 }}) executed a suspicious process {{ process.name unix1 }} with command line {{ process.command_line /Users/james/unix1 /Users/james/library/Keychains/login.keychain-db TempTemp1234!! }}\\\\n- The process was spawned by another suspicious process {{ process.parent.name My Go Application.app }} with command line {{ process.parent.command_line /private/var/folders/_b/rmcpc65j6nv11ygrs50ctcjr0000gn/T/AppTranslocation/6D63F08A-011C-4511-8556-EAEF9AFD6340/d/Setup.app/Contents/MacOS/My Go Application.app }}\\\\n- The parent process was launched by the system process {{ process.parent.parent.name launchd }}\\\\n- Both the child and parent processes had untrusted code signatures\\\\n- The child process attempted to access the user\'s login keychain, potentially indicating credential theft",\n "entitySummaryMarkdown": "Suspicious activity on {{ host.name cb186c4a-3d70-4878-8ffe-18d84b5df86f }} by {{ user.name 3c8c81bd-0e52-4ce7-a836-48e718dfb6e4 }}",\n "mitreAttackTactics": [\n "Credential Access",\n "Defense Evasion",\n "Execution"\n ],\n "summaryMarkdown": "Suspicious activity detected on a macOS host involving a potentially malicious process attempting to access user credentials. The process was spawned by another untrusted process launched by the system, indicating a multi-stage attack potentially involving credential theft and defense evasion techniques.",\n "title": "Potential Credential Theft on macOS Host"\n },\n {\n "alertIds": [\n "64bcd8a322e6e6aebaee252982d0249cc96bdd75023ea05f58c228a7417c0dfc"\n ],\n "detailsMarkdown": "- {{ host.name cb186c4a-3d70-4878-8ffe-18d84b5df86f }} (macOS {{ host.os.version 13.4 }}) executed the system utility {{ process.name osascript }} with command line {{ process.command_line osascript -e display dialog \\"MacOS wants to access System Preferences\\\\n\\\\t\\\\t\\\\nPlease enter your password.\\" with title \\"System Preferences\\" with icon file \\"System:Library:CoreServices:CoreTypes.bundle:Contents:Resources:ToolbarAdvanced.icns\\" default answer \\"\\" giving up after 30 with hidden answer ¬ }}\\\\n- This appears to be an attempt to phish for user credentials by displaying a fake system dialog\\\\n- The osascript process was spawned by the suspicious process {{ process.parent.name My Go Application.app }} with untrusted code signature",\n "entitySummaryMarkdown": "Potential credential phishing attempt on {{ host.name cb186c4a-3d70-4878-8ffe-18d84b5df86f }} targeting {{ user.name 3c8c81bd-0e52-4ce7-a836-48e718dfb6e4 }}",\n "mitreAttackTactics": [\n "Credential Access",\n "Initial Access",\n "Execution"\n ],\n "summaryMarkdown": "A credential phishing attempt was detected on a macOS host, likely initiated by a malicious process. The attack used osascript to display a fake system dialog prompting the user to enter their password.",\n "title": "Credential Phishing Attempt on macOS"\n },\n {\n "alertIds": [\n "245b60b908ddd84cad06671e273aa7be50699abd27e59423be4415f38c4aeb99",\n "616ac711e967e07a9b725e66aa93321eabf29e4b51f9598a4a11f21ab7ed0f12",\n "035c0295b1c64fd2ebba1b751a3565fd6759942247e9df6e1496c5e332d51840"\n ],\n "detailsMarkdown": "- {{ host.name cb186c4a-3d70-4878-8ffe-18d84b5df86f }} (macOS {{ host.os.version 13.4 }}) executed a suspicious process {{ process.name My Go Application.app }} with command line {{ process.command_line xpcproxy application.Appify by Machine Box.My Go Application.20.23 }}\\\\n- This process had an untrusted code signature and was launched by the system process {{ process.parent.name launchd }}\\\\n- It appears to have spawned the process {{ process.name unix1 }} in an attempt to obfuscate its activities\\\\n- The unix1 process attempted to make itself executable by running {{ process.name chmod }} with arguments {{ process.command_line chmod 777 /Users/james/unix1 }}",\n "entitySummaryMarkdown": "Suspicious activity involving process obfuscation on {{ host.name cb186c4a-3d70-4878-8ffe-18d84b5df86f }} by {{ user.name fec12d87-2476-4b82-a50d-0829f3815a42 }}",\n "mitreAttackTactics": [\n "Defense Evasion",\n "Execution"\n ],\n "summaryMarkdown": "A suspicious process was detected on a macOS host that appeared to be attempting to obfuscate its activities by spawning other processes and making them executable. The initial process had an untrusted code signature, indicating potentially malicious intent.",\n "title": "Process Obfuscation on macOS Host"\n },\n {\n "alertIds": [\n "54901fb5b0ed88f0c8d737613868a3d62ebc541d31b757349bbe7999d868ce48"\n ],\n "detailsMarkdown": "- {{ host.name 23166d28-d6da-4801-b701-d21ce1a489e5 }} (Windows {{ host.os.version 21H2 (10.0.20348.1607) }}) created a suspicious script file {{ file.path C:\\\\ProgramData\\\\WindowsAppPool\\\\AppPool.vbs }}\\\\n- The file was created by a Microsoft Word process ({{ process.name WINWORD.EXE }}) with trusted code signature\\\\n- This may indicate an attempt to establish persistence or command-and-control through scripting",\n "entitySummaryMarkdown": "Suspicious script file created on {{ host.name 23166d28-d6da-4801-b701-d21ce1a489e5 }} by {{ user.name 45bec1b8-eb98-4ddc-aafb-e3f7e02236dc }}",\n "mitreAttackTactics": [\n "Command and Control",\n "Execution"\n ],\n "summaryMarkdown": "A suspicious VBScript file was created on a Windows host, potentially by an compromised Microsoft Word process. This may be an attempt to establish persistence or command-and-control capabilities through scripting.",\n "title": "Suspicious Script File Creation on Windows"\n },\n {\n "alertIds": [\n "7fe0025f2d2b0d32f04b0e533466666967a21a98adae7499cb05add3355b48fc",\n "3875cbad10604636b892d15f7ff753a02a37d3e4bbe91a39a0fcf72f89101e31",\n "bb2767ebef06a5dc2511e2b865f5ed012dfdf20081bc33cab5c9f20b99e01d8f",\n "76d99c72442819a019dfbf3936cda9a6c5713d84a9ae685b2c4e0bb55e5b9862",\n "0f985965cb3d3b14007873290b9fc8f26f1b6ca0945499dfb693787ea6569265"\n ],\n "detailsMarkdown": "- {{ host.name 9a0ea998-7ce5-4dbb-a690-9856eca617ac }} (Windows {{ host.os.version 21H2 (10.0.20348.1607) }}) executed a suspicious PowerShell script {{ process.command_line \\"C:\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\\" -exec bypass -file C:\\\\ProgramData\\\\WindowsAppPool\\\\AppPool.ps1 }}\\\\n- The script was launched by the wscript process, which was spawned by a Microsoft Word process ({{ process.parent.name WINWORD.EXE }})\\\\n- The Word process also created a scheduled task to periodically execute the script\\\\n- The PowerShell script appears to be obfuscated, potentially to hide malicious activities\\\\n- This chain of events indicates a multi-stage attack potentially initiated by a malicious Office document",\n "entitySummaryMarkdown": "Suspicious PowerShell activity on {{ host.name 9a0ea998-7ce5-4dbb-a690-9856eca617ac }} by {{ user.name 45bec1b8-eb98-4ddc-aafb-e3f7e02236dc }}",\n "mitreAttackTactics": [\n "Initial Access",\n "Execution",\n "Defense Evasion"\n ],\n "summaryMarkdown": "A multi-stage attack was detected on a Windows host, potentially initiated by a malicious Microsoft Office document. The attack involved creating a scheduled task to execute an obfuscated PowerShell script, likely to hide malicious activities. This indicates techniques for initial access, execution, and defense evasion.",\n "title": "Multi-Stage Attack on Windows Host"\n },\n {\n "alertIds": [\n "a0c49fb228eca1685bd41df0ab66ca1977140de7916663e7a0918087220dd402",\n "a252ca3096831e3eeab07ab70e9269f98b5a66617b44d709425898813326ca63",\n "0ff7d411ca25a5b851e43562c9c660062624498f908ff4b63590d4b5304682af",\n "4d612c721e432598a5b7ea7bbeb2aaa2944c0a35e263d9984297b5416530c88f"\n ],\n "detailsMarkdown": "- {{ host.name 634eb7d8-0ce0-4591-b5f5-fb65803b89d8 }} (Windows {{ host.os.version 21H2 (10.0.20348.1607) }}) executed a suspicious PowerShell script {{ process.command_line \\"C:\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\\" -ep bypass -file \\"C:\\\\Users\\\\ADMINI~1\\\\AppData\\\\Local\\\\Temp\\\\2\\\\Package Installation Dir\\\\chch.ps1\\" }}\\\\n- The script was launched by the msiexec.exe process, which may indicate an attempt to use a trusted Windows utility for defense evasion\\\\n- Elastic Endpoint detected the Bb malware family in the PowerShell process memory\\\\n- The PowerShell process also made network connections, potentially for command-and-control or data exfiltration",\n "entitySummaryMarkdown": "Malware detected on {{ host.name 634eb7d8-0ce0-4591-b5f5-fb65803b89d8 }} targeting {{ user.name 45bec1b8-eb98-4ddc-aafb-e3f7e02236dc }}",\n "mitreAttackTactics": [\n "Defense Evasion",\n "Execution"\n ],\n "summaryMarkdown": "The B malware was detected on a Windows host, executed through a PowerShell script launched by the msiexec.exe process. This appears to be an attempt to use a trusted Windows utility for defense evasion. The malware process also made network connections, potentially for command-and-control or data exfiltration.",\n "title": "Bb Malware Execution on Windows"\n },\n {\n "alertIds": [\n "764c0944288db1704f7a0fff2db7fe19e8285fa4272dec828ae4186ba0dfd3b3",\n "85672064aeb762a1121139a6d98fd3c5f6be8f18b49e4504c3f5e5a36679afe7"\n ],\n "detailsMarkdown": "- {{ host.name d813c7ba-6141-4292-8f40-c800c27645a4 }} (Linux {{ host.os.version 22.04.1 }}) executed a suspicious process {{ process.command_line sh -c /bin/rm -f /dev/shm/kdmtmpflush;/bin/cp ./74ef6cc38f5a1a80148752b63c117e6846984debd2af806c65887195a8eccc56 /dev/shm/kdmtmpflush && /bin/chmod 755 /dev/shm/kdmtmpflush && /dev/shm/kdmtmpflush --init && /bin/rm -f /dev/shm/kdmtmpflush }}\\\\n- This copied a file with SHA256 hash {{ file.hash.sha256 74ef6cc38f5a1a80148752b63c117e6846984debd2af806c65887195a8eccc56 }} to /dev/shm/kdmtmpflush, made it executable, and executed it\\\\n- Elastic Endpoint detected the Door malware family associated with this file",\n "entitySummaryMarkdown": "Malware executed on {{ host.name d813c7ba-6141-4292-8f40-c800c27645a4 }} by {{ user.name fec12d87-2476-4b82-a50d-0829f3815a42 }}",\n "mitreAttackTactics": [\n "Execution"\n ],\n "summaryMarkdown": "The Door malware was executed on a Linux host by copying an untrusted file to a temporary path, making it executable, and running it. This indicates malicious code execution on the compromised system.",\n "title": "Door Malware Execution on Linux"\n }\n ]\n}'; + +export const getRawAttackDiscoveriesReplacementsMock = () => ({ + '3c8c81bd-0e52-4ce7-a836-48e718dfb6e4': 'james', + 'cb186c4a-3d70-4878-8ffe-18d84b5df86f': 'SRVMAC08', + 'fec12d87-2476-4b82-a50d-0829f3815a42': 'root', + '45bec1b8-eb98-4ddc-aafb-e3f7e02236dc': 'Administrator', + '23166d28-d6da-4801-b701-d21ce1a489e5': 'SRVWIN07-PRIV', + '9a0ea998-7ce5-4dbb-a690-9856eca617ac': 'SRVWIN07', + '634eb7d8-0ce0-4591-b5f5-fb65803b89d8': 'SRVWIN06', + 'd813c7ba-6141-4292-8f40-c800c27645a4': 'SRVNIX05', +}); diff --git a/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts b/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts index 086af015d76e2..7f4baec88e60e 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { AuthenticatedUser } from '@kbn/core-security-common'; import moment from 'moment'; import { @@ -30,6 +31,12 @@ import { import { coreMock } from '@kbn/core/server/mocks'; import { transformESSearchToAttackDiscovery } from '../../ai_assistant_data_clients/attack_discovery/transforms'; import { getAttackDiscoverySearchEsMock } from '../../__mocks__/attack_discovery_schema.mock'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + getAnonymizationFieldMock, + getUpdateAnonymizationFieldSchemaMock, +} from '../../__mocks__/anonymization_fields_schema.mock'; jest.mock('lodash/fp', () => ({ uniq: jest.fn((arr) => Array.from(new Set(arr))), @@ -61,6 +68,7 @@ const mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); const mockLogger = loggerMock.create(); const mockTelemetry = coreMock.createSetup().analytics; const mockError = new Error('Test error'); + const mockAuthenticatedUser = { username: 'user', profile_uid: '1234', @@ -69,13 +77,25 @@ const mockAuthenticatedUser = { name: 'my_realm_name', }, } as AuthenticatedUser; + const mockApiConfig = { connectorId: 'connector-id', actionTypeId: '.bedrock', model: 'model', provider: OpenAiProviderType.OpenAi, }; + const mockCurrentAd = transformESSearchToAttackDiscovery(getAttackDiscoverySearchEsMock())[0]; + +const mockActions: ActionsPluginStart = {} as ActionsPluginStart; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const mockRequest: KibanaRequest = {} as unknown as KibanaRequest< + unknown, + unknown, + any, // eslint-disable-line @typescript-eslint/no-explicit-any + any // eslint-disable-line @typescript-eslint/no-explicit-any +>; + describe('helpers', () => { const date = '2024-03-28T22:27:28.000Z'; beforeAll(() => { @@ -92,6 +112,22 @@ describe('helpers', () => { updateAttackDiscovery.mockResolvedValue({}); }); describe('getAssistantToolParams', () => { + const alertsIndexPattern = '.alerts-security.alerts-default'; + const esClient = elasticsearchClientMock.createElasticsearchClient(); + const langChainTimeout = 1000; + const latestReplacements = {}; + const llm = new ActionsClientLlm({ + actions: mockActions, + connectorId: 'test-connecter-id', + llmType: 'bedrock', + logger: mockLogger, + request: mockRequest, + temperature: 0, + timeout: 580000, + }); + const onNewReplacements = jest.fn(); + const size = 20; + const mockParams = { actions: {} as unknown as ActionsPluginStart, alertsIndexPattern: 'alerts-*', @@ -127,364 +163,439 @@ describe('helpers', () => { ...REQUIRED_FOR_ATTACK_DISCOVERY, ]); }); - }); - - describe('addGenerationInterval', () => { - const generationInterval = { date: '2024-01-01T00:00:00Z', durationMs: 1000 }; - const existingIntervals = [ - { date: '2024-01-02T00:00:00Z', durationMs: 2000 }, - { date: '2024-01-03T00:00:00Z', durationMs: 3000 }, - ]; - - it('should add new interval and maintain length within MAX_GENERATION_INTERVALS', () => { - const result = addGenerationInterval(existingIntervals, generationInterval); - expect(result.length).toBeLessThanOrEqual(5); - expect(result).toContain(generationInterval); - }); - - it('should remove the oldest interval if exceeding MAX_GENERATION_INTERVALS', () => { - const longExistingIntervals = [...Array(5)].map((_, i) => ({ - date: `2024-01-0${i + 2}T00:00:00Z`, - durationMs: (i + 2) * 1000, - })); - const result = addGenerationInterval(longExistingIntervals, generationInterval); - expect(result.length).toBe(5); - expect(result).not.toContain(longExistingIntervals[4]); - }); - }); - - describe('updateAttackDiscoveryStatusToRunning', () => { - it('should update existing attack discovery to running', async () => { - const existingAd = { id: 'existing-id', backingIndex: 'index' }; - findAttackDiscoveryByConnectorId.mockResolvedValue(existingAd); - updateAttackDiscovery.mockResolvedValue(existingAd); - const result = await updateAttackDiscoveryStatusToRunning( - mockDataClient, - mockAuthenticatedUser, - mockApiConfig - ); - - expect(findAttackDiscoveryByConnectorId).toHaveBeenCalledWith({ - connectorId: mockApiConfig.connectorId, - authenticatedUser: mockAuthenticatedUser, + it('returns the expected AssistantToolParams when anonymizationFields are provided', () => { + const anonymizationFields = [ + getAnonymizationFieldMock(getUpdateAnonymizationFieldSchemaMock()), + ]; + + const result = getAssistantToolParams({ + actions: mockParams.actions, + alertsIndexPattern, + apiConfig: mockApiConfig, + anonymizationFields, + connectorTimeout: 1000, + latestReplacements, + esClient, + langChainTimeout, + logger: mockLogger, + onNewReplacements, + request: mockRequest, + size, }); - expect(updateAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryUpdateProps: expect.objectContaining({ - status: attackDiscoveryStatus.running, - }), - authenticatedUser: mockAuthenticatedUser, - }); - expect(result).toEqual({ attackDiscoveryId: existingAd.id, currentAd: existingAd }); - }); - it('should create a new attack discovery if none exists', async () => { - const newAd = { id: 'new-id', backingIndex: 'index' }; - findAttackDiscoveryByConnectorId.mockResolvedValue(null); - createAttackDiscovery.mockResolvedValue(newAd); - - const result = await updateAttackDiscoveryStatusToRunning( - mockDataClient, - mockAuthenticatedUser, - mockApiConfig - ); - - expect(createAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryCreate: expect.objectContaining({ - status: attackDiscoveryStatus.running, - }), - authenticatedUser: mockAuthenticatedUser, + expect(result).toEqual({ + alertsIndexPattern, + anonymizationFields: [...anonymizationFields, ...REQUIRED_FOR_ATTACK_DISCOVERY], + isEnabledKnowledgeBase: false, + chain: undefined, + esClient, + langChainTimeout, + llm, + logger: mockLogger, + modelExists: false, + onNewReplacements, + replacements: latestReplacements, + request: mockRequest, + size, }); - expect(result).toEqual({ attackDiscoveryId: newAd.id, currentAd: newAd }); }); - it('should throw an error if updating or creating attack discovery fails', async () => { - findAttackDiscoveryByConnectorId.mockResolvedValue(null); - createAttackDiscovery.mockResolvedValue(null); + it('returns the expected AssistantToolParams when anonymizationFields is undefined', () => { + const anonymizationFields = undefined; + + const result = getAssistantToolParams({ + actions: mockParams.actions, + alertsIndexPattern, + apiConfig: mockApiConfig, + anonymizationFields, + connectorTimeout: 1000, + latestReplacements, + esClient, + langChainTimeout, + logger: mockLogger, + onNewReplacements, + request: mockRequest, + size, + }); - await expect( - updateAttackDiscoveryStatusToRunning(mockDataClient, mockAuthenticatedUser, mockApiConfig) - ).rejects.toThrow('Could not create attack discovery for connectorId: connector-id'); + expect(result).toEqual({ + alertsIndexPattern, + anonymizationFields: [...REQUIRED_FOR_ATTACK_DISCOVERY], + isEnabledKnowledgeBase: false, + chain: undefined, + esClient, + langChainTimeout, + llm, + logger: mockLogger, + modelExists: false, + onNewReplacements, + replacements: latestReplacements, + request: mockRequest, + size, + }); }); - }); - - describe('updateAttackDiscoveryStatusToCanceled', () => { - const existingAd = { - id: 'existing-id', - backingIndex: 'index', - status: attackDiscoveryStatus.running, - }; - it('should update existing attack discovery to canceled', async () => { - findAttackDiscoveryByConnectorId.mockResolvedValue(existingAd); - updateAttackDiscovery.mockResolvedValue(existingAd); - - const result = await updateAttackDiscoveryStatusToCanceled( - mockDataClient, - mockAuthenticatedUser, - mockApiConfig.connectorId - ); - expect(findAttackDiscoveryByConnectorId).toHaveBeenCalledWith({ - connectorId: mockApiConfig.connectorId, - authenticatedUser: mockAuthenticatedUser, + describe('addGenerationInterval', () => { + const generationInterval = { date: '2024-01-01T00:00:00Z', durationMs: 1000 }; + const existingIntervals = [ + { date: '2024-01-02T00:00:00Z', durationMs: 2000 }, + { date: '2024-01-03T00:00:00Z', durationMs: 3000 }, + ]; + + it('should add new interval and maintain length within MAX_GENERATION_INTERVALS', () => { + const result = addGenerationInterval(existingIntervals, generationInterval); + expect(result.length).toBeLessThanOrEqual(5); + expect(result).toContain(generationInterval); }); - expect(updateAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryUpdateProps: expect.objectContaining({ - status: attackDiscoveryStatus.canceled, - }), - authenticatedUser: mockAuthenticatedUser, + + it('should remove the oldest interval if exceeding MAX_GENERATION_INTERVALS', () => { + const longExistingIntervals = [...Array(5)].map((_, i) => ({ + date: `2024-01-0${i + 2}T00:00:00Z`, + durationMs: (i + 2) * 1000, + })); + const result = addGenerationInterval(longExistingIntervals, generationInterval); + expect(result.length).toBe(5); + expect(result).not.toContain(longExistingIntervals[4]); }); - expect(result).toEqual(existingAd); }); - it('should throw an error if attack discovery is not running', async () => { - findAttackDiscoveryByConnectorId.mockResolvedValue({ - ...existingAd, - status: attackDiscoveryStatus.succeeded, - }); - await expect( - updateAttackDiscoveryStatusToCanceled( + describe('updateAttackDiscoveryStatusToRunning', () => { + it('should update existing attack discovery to running', async () => { + const existingAd = { id: 'existing-id', backingIndex: 'index' }; + findAttackDiscoveryByConnectorId.mockResolvedValue(existingAd); + updateAttackDiscovery.mockResolvedValue(existingAd); + + const result = await updateAttackDiscoveryStatusToRunning( mockDataClient, mockAuthenticatedUser, - mockApiConfig.connectorId - ) - ).rejects.toThrow( - 'Connector id connector-id does not have a running attack discovery, and therefore cannot be canceled.' - ); - }); + mockApiConfig + ); + + expect(findAttackDiscoveryByConnectorId).toHaveBeenCalledWith({ + connectorId: mockApiConfig.connectorId, + authenticatedUser: mockAuthenticatedUser, + }); + expect(updateAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryUpdateProps: expect.objectContaining({ + status: attackDiscoveryStatus.running, + }), + authenticatedUser: mockAuthenticatedUser, + }); + expect(result).toEqual({ attackDiscoveryId: existingAd.id, currentAd: existingAd }); + }); + + it('should create a new attack discovery if none exists', async () => { + const newAd = { id: 'new-id', backingIndex: 'index' }; + findAttackDiscoveryByConnectorId.mockResolvedValue(null); + createAttackDiscovery.mockResolvedValue(newAd); - it('should throw an error if attack discovery does not exist', async () => { - findAttackDiscoveryByConnectorId.mockResolvedValue(null); - await expect( - updateAttackDiscoveryStatusToCanceled( + const result = await updateAttackDiscoveryStatusToRunning( mockDataClient, mockAuthenticatedUser, - mockApiConfig.connectorId - ) - ).rejects.toThrow('Could not find attack discovery for connector id: connector-id'); + mockApiConfig + ); + + expect(createAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryCreate: expect.objectContaining({ + status: attackDiscoveryStatus.running, + }), + authenticatedUser: mockAuthenticatedUser, + }); + expect(result).toEqual({ attackDiscoveryId: newAd.id, currentAd: newAd }); + }); + + it('should throw an error if updating or creating attack discovery fails', async () => { + findAttackDiscoveryByConnectorId.mockResolvedValue(null); + createAttackDiscovery.mockResolvedValue(null); + + await expect( + updateAttackDiscoveryStatusToRunning(mockDataClient, mockAuthenticatedUser, mockApiConfig) + ).rejects.toThrow('Could not create attack discovery for connectorId: connector-id'); + }); }); - it('should throw error if updateAttackDiscovery returns null', async () => { - findAttackDiscoveryByConnectorId.mockResolvedValue(existingAd); - updateAttackDiscovery.mockResolvedValue(null); - await expect( - updateAttackDiscoveryStatusToCanceled( + describe('updateAttackDiscoveryStatusToCanceled', () => { + const existingAd = { + id: 'existing-id', + backingIndex: 'index', + status: attackDiscoveryStatus.running, + }; + it('should update existing attack discovery to canceled', async () => { + findAttackDiscoveryByConnectorId.mockResolvedValue(existingAd); + updateAttackDiscovery.mockResolvedValue(existingAd); + + const result = await updateAttackDiscoveryStatusToCanceled( mockDataClient, mockAuthenticatedUser, mockApiConfig.connectorId - ) - ).rejects.toThrow('Could not update attack discovery for connector id: connector-id'); - }); - }); - - describe('updateAttackDiscoveries', () => { - const mockAttackDiscoveryId = 'attack-discovery-id'; - const mockLatestReplacements = {}; - const mockRawAttackDiscoveries = JSON.stringify({ - alertsContextCount: 5, - attackDiscoveries: [{ alertIds: ['alert-1', 'alert-2'] }, { alertIds: ['alert-3'] }], - }); - const mockSize = 10; - const mockStartTime = moment('2024-03-28T22:25:28.000Z'); - - const mockArgs = { - apiConfig: mockApiConfig, - attackDiscoveryId: mockAttackDiscoveryId, - authenticatedUser: mockAuthenticatedUser, - dataClient: mockDataClient, - latestReplacements: mockLatestReplacements, - logger: mockLogger, - rawAttackDiscoveries: mockRawAttackDiscoveries, - size: mockSize, - startTime: mockStartTime, - telemetry: mockTelemetry, - }; - - it('should update attack discoveries and report success telemetry', async () => { - await updateAttackDiscoveries(mockArgs); + ); + + expect(findAttackDiscoveryByConnectorId).toHaveBeenCalledWith({ + connectorId: mockApiConfig.connectorId, + authenticatedUser: mockAuthenticatedUser, + }); + expect(updateAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryUpdateProps: expect.objectContaining({ + status: attackDiscoveryStatus.canceled, + }), + authenticatedUser: mockAuthenticatedUser, + }); + expect(result).toEqual(existingAd); + }); - expect(updateAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryUpdateProps: { - alertsContextCount: 5, - attackDiscoveries: [{ alertIds: ['alert-1', 'alert-2'] }, { alertIds: ['alert-3'] }], + it('should throw an error if attack discovery is not running', async () => { + findAttackDiscoveryByConnectorId.mockResolvedValue({ + ...existingAd, status: attackDiscoveryStatus.succeeded, - id: mockAttackDiscoveryId, - replacements: mockLatestReplacements, - backingIndex: mockCurrentAd.backingIndex, - generationIntervals: [{ date, durationMs: 120000 }, ...mockCurrentAd.generationIntervals], - }, - authenticatedUser: mockAuthenticatedUser, + }); + await expect( + updateAttackDiscoveryStatusToCanceled( + mockDataClient, + mockAuthenticatedUser, + mockApiConfig.connectorId + ) + ).rejects.toThrow( + 'Connector id connector-id does not have a running attack discovery, and therefore cannot be canceled.' + ); }); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_success', { - actionTypeId: mockApiConfig.actionTypeId, - alertsContextCount: 5, - alertsCount: 3, - configuredAlertsCount: mockSize, - discoveriesGenerated: 2, - durationMs: 120000, - model: mockApiConfig.model, - provider: mockApiConfig.provider, + it('should throw an error if attack discovery does not exist', async () => { + findAttackDiscoveryByConnectorId.mockResolvedValue(null); + await expect( + updateAttackDiscoveryStatusToCanceled( + mockDataClient, + mockAuthenticatedUser, + mockApiConfig.connectorId + ) + ).rejects.toThrow('Could not find attack discovery for connector id: connector-id'); + }); + it('should throw error if updateAttackDiscovery returns null', async () => { + findAttackDiscoveryByConnectorId.mockResolvedValue(existingAd); + updateAttackDiscovery.mockResolvedValue(null); + + await expect( + updateAttackDiscoveryStatusToCanceled( + mockDataClient, + mockAuthenticatedUser, + mockApiConfig.connectorId + ) + ).rejects.toThrow('Could not update attack discovery for connector id: connector-id'); }); }); - it('should update attack discoveries without generation interval if no discoveries are found', async () => { - const noDiscoveriesRaw = JSON.stringify({ - alertsContextCount: 0, - attackDiscoveries: [], + describe('updateAttackDiscoveries', () => { + const mockAttackDiscoveryId = 'attack-discovery-id'; + const mockLatestReplacements = {}; + const mockRawAttackDiscoveries = JSON.stringify({ + alertsContextCount: 5, + attackDiscoveries: [{ alertIds: ['alert-1', 'alert-2'] }, { alertIds: ['alert-3'] }], }); + const mockSize = 10; + const mockStartTime = moment('2024-03-28T22:25:28.000Z'); - await updateAttackDiscoveries({ - ...mockArgs, - rawAttackDiscoveries: noDiscoveriesRaw, + const mockArgs = { + apiConfig: mockApiConfig, + attackDiscoveryId: mockAttackDiscoveryId, + authenticatedUser: mockAuthenticatedUser, + dataClient: mockDataClient, + latestReplacements: mockLatestReplacements, + logger: mockLogger, + rawAttackDiscoveries: mockRawAttackDiscoveries, + size: mockSize, + startTime: mockStartTime, + telemetry: mockTelemetry, + }; + + it('should update attack discoveries and report success telemetry', async () => { + await updateAttackDiscoveries(mockArgs); + + expect(updateAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryUpdateProps: { + alertsContextCount: 5, + attackDiscoveries: [{ alertIds: ['alert-1', 'alert-2'] }, { alertIds: ['alert-3'] }], + status: attackDiscoveryStatus.succeeded, + id: mockAttackDiscoveryId, + replacements: mockLatestReplacements, + backingIndex: mockCurrentAd.backingIndex, + generationIntervals: [ + { date, durationMs: 120000 }, + ...mockCurrentAd.generationIntervals, + ], + }, + authenticatedUser: mockAuthenticatedUser, + }); + + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_success', { + actionTypeId: mockApiConfig.actionTypeId, + alertsContextCount: 5, + alertsCount: 3, + configuredAlertsCount: mockSize, + discoveriesGenerated: 2, + durationMs: 120000, + model: mockApiConfig.model, + provider: mockApiConfig.provider, + }); }); - expect(updateAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryUpdateProps: { + it('should update attack discoveries without generation interval if no discoveries are found', async () => { + const noDiscoveriesRaw = JSON.stringify({ alertsContextCount: 0, attackDiscoveries: [], - status: attackDiscoveryStatus.succeeded, - id: mockAttackDiscoveryId, - replacements: mockLatestReplacements, - backingIndex: mockCurrentAd.backingIndex, - }, - authenticatedUser: mockAuthenticatedUser, + }); + + await updateAttackDiscoveries({ + ...mockArgs, + rawAttackDiscoveries: noDiscoveriesRaw, + }); + + expect(updateAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryUpdateProps: { + alertsContextCount: 0, + attackDiscoveries: [], + status: attackDiscoveryStatus.succeeded, + id: mockAttackDiscoveryId, + replacements: mockLatestReplacements, + backingIndex: mockCurrentAd.backingIndex, + }, + authenticatedUser: mockAuthenticatedUser, + }); + + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_success', { + actionTypeId: mockApiConfig.actionTypeId, + alertsContextCount: 0, + alertsCount: 0, + configuredAlertsCount: mockSize, + discoveriesGenerated: 0, + durationMs: 120000, + model: mockApiConfig.model, + provider: mockApiConfig.provider, + }); }); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_success', { - actionTypeId: mockApiConfig.actionTypeId, - alertsContextCount: 0, - alertsCount: 0, - configuredAlertsCount: mockSize, - discoveriesGenerated: 0, - durationMs: 120000, - model: mockApiConfig.model, - provider: mockApiConfig.provider, + it('should catch and log an error if raw attack discoveries is null', async () => { + await updateAttackDiscoveries({ + ...mockArgs, + rawAttackDiscoveries: null, + }); + expect(mockLogger.error).toHaveBeenCalledTimes(1); + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { + actionTypeId: mockArgs.apiConfig.actionTypeId, + errorMessage: 'tool returned no attack discoveries', + model: mockArgs.apiConfig.model, + provider: mockArgs.apiConfig.provider, + }); }); - }); - it('should catch and log an error if raw attack discoveries is null', async () => { - await updateAttackDiscoveries({ - ...mockArgs, - rawAttackDiscoveries: null, - }); - expect(mockLogger.error).toHaveBeenCalledTimes(1); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { - actionTypeId: mockArgs.apiConfig.actionTypeId, - errorMessage: 'tool returned no attack discoveries', - model: mockArgs.apiConfig.model, - provider: mockArgs.apiConfig.provider, - }); - }); + it('should return and not call updateAttackDiscovery when getAttackDiscovery returns a canceled response', async () => { + getAttackDiscovery.mockResolvedValue({ + ...mockCurrentAd, + status: attackDiscoveryStatus.canceled, + }); + await updateAttackDiscoveries(mockArgs); - it('should return and not call updateAttackDiscovery when getAttackDiscovery returns a canceled response', async () => { - getAttackDiscovery.mockResolvedValue({ - ...mockCurrentAd, - status: attackDiscoveryStatus.canceled, + expect(mockLogger.error).not.toHaveBeenCalled(); + expect(updateAttackDiscovery).not.toHaveBeenCalled(); }); - await updateAttackDiscoveries(mockArgs); - expect(mockLogger.error).not.toHaveBeenCalled(); - expect(updateAttackDiscovery).not.toHaveBeenCalled(); - }); - - it('should log the error and report telemetry when getAttackDiscovery rejects', async () => { - getAttackDiscovery.mockRejectedValue(mockError); - await updateAttackDiscoveries(mockArgs); - - expect(mockLogger.error).toHaveBeenCalledWith(mockError); - expect(updateAttackDiscovery).not.toHaveBeenCalled(); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { - actionTypeId: mockArgs.apiConfig.actionTypeId, - errorMessage: mockError.message, - model: mockArgs.apiConfig.model, - provider: mockArgs.apiConfig.provider, + it('should log the error and report telemetry when getAttackDiscovery rejects', async () => { + getAttackDiscovery.mockRejectedValue(mockError); + await updateAttackDiscoveries(mockArgs); + + expect(mockLogger.error).toHaveBeenCalledWith(mockError); + expect(updateAttackDiscovery).not.toHaveBeenCalled(); + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { + actionTypeId: mockArgs.apiConfig.actionTypeId, + errorMessage: mockError.message, + model: mockArgs.apiConfig.model, + provider: mockArgs.apiConfig.provider, + }); }); }); - }); - - describe('handleToolError', () => { - const mockArgs = { - apiConfig: mockApiConfig, - attackDiscoveryId: 'discovery-id', - authenticatedUser: mockAuthenticatedUser, - backingIndex: 'backing-index', - dataClient: mockDataClient, - err: mockError, - latestReplacements: {}, - logger: mockLogger, - telemetry: mockTelemetry, - }; - - it('should log the error and update attack discovery status to failed', async () => { - await handleToolError(mockArgs); - expect(mockLogger.error).toHaveBeenCalledWith(mockError); - expect(updateAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryUpdateProps: { - status: attackDiscoveryStatus.failed, - attackDiscoveries: [], - backingIndex: 'foo', - failureReason: 'Test error', - id: 'discovery-id', - replacements: {}, - }, - authenticatedUser: mockArgs.authenticatedUser, - }); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { - actionTypeId: mockArgs.apiConfig.actionTypeId, - errorMessage: mockError.message, - model: mockArgs.apiConfig.model, - provider: mockArgs.apiConfig.provider, + describe('handleToolError', () => { + const mockArgs = { + apiConfig: mockApiConfig, + attackDiscoveryId: 'discovery-id', + authenticatedUser: mockAuthenticatedUser, + backingIndex: 'backing-index', + dataClient: mockDataClient, + err: mockError, + latestReplacements: {}, + logger: mockLogger, + telemetry: mockTelemetry, + }; + + it('should log the error and update attack discovery status to failed', async () => { + await handleToolError(mockArgs); + + expect(mockLogger.error).toHaveBeenCalledWith(mockError); + expect(updateAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryUpdateProps: { + status: attackDiscoveryStatus.failed, + attackDiscoveries: [], + backingIndex: 'foo', + failureReason: 'Test error', + id: 'discovery-id', + replacements: {}, + }, + authenticatedUser: mockArgs.authenticatedUser, + }); + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { + actionTypeId: mockArgs.apiConfig.actionTypeId, + errorMessage: mockError.message, + model: mockArgs.apiConfig.model, + provider: mockArgs.apiConfig.provider, + }); }); - }); - - it('should log the error and report telemetry when updateAttackDiscovery rejects', async () => { - updateAttackDiscovery.mockRejectedValue(mockError); - await handleToolError(mockArgs); - expect(mockLogger.error).toHaveBeenCalledWith(mockError); - expect(updateAttackDiscovery).toHaveBeenCalledWith({ - attackDiscoveryUpdateProps: { - status: attackDiscoveryStatus.failed, - attackDiscoveries: [], - backingIndex: 'foo', - failureReason: 'Test error', - id: 'discovery-id', - replacements: {}, - }, - authenticatedUser: mockArgs.authenticatedUser, + it('should log the error and report telemetry when updateAttackDiscovery rejects', async () => { + updateAttackDiscovery.mockRejectedValue(mockError); + await handleToolError(mockArgs); + + expect(mockLogger.error).toHaveBeenCalledWith(mockError); + expect(updateAttackDiscovery).toHaveBeenCalledWith({ + attackDiscoveryUpdateProps: { + status: attackDiscoveryStatus.failed, + attackDiscoveries: [], + backingIndex: 'foo', + failureReason: 'Test error', + id: 'discovery-id', + replacements: {}, + }, + authenticatedUser: mockArgs.authenticatedUser, + }); + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { + actionTypeId: mockArgs.apiConfig.actionTypeId, + errorMessage: mockError.message, + model: mockArgs.apiConfig.model, + provider: mockArgs.apiConfig.provider, + }); }); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { - actionTypeId: mockArgs.apiConfig.actionTypeId, - errorMessage: mockError.message, - model: mockArgs.apiConfig.model, - provider: mockArgs.apiConfig.provider, - }); - }); - it('should return and not call updateAttackDiscovery when getAttackDiscovery returns a canceled response', async () => { - getAttackDiscovery.mockResolvedValue({ - ...mockCurrentAd, - status: attackDiscoveryStatus.canceled, - }); - await handleToolError(mockArgs); + it('should return and not call updateAttackDiscovery when getAttackDiscovery returns a canceled response', async () => { + getAttackDiscovery.mockResolvedValue({ + ...mockCurrentAd, + status: attackDiscoveryStatus.canceled, + }); + await handleToolError(mockArgs); - expect(mockTelemetry.reportEvent).not.toHaveBeenCalled(); - expect(updateAttackDiscovery).not.toHaveBeenCalled(); - }); + expect(mockTelemetry.reportEvent).not.toHaveBeenCalled(); + expect(updateAttackDiscovery).not.toHaveBeenCalled(); + }); - it('should log the error and report telemetry when getAttackDiscovery rejects', async () => { - getAttackDiscovery.mockRejectedValue(mockError); - await handleToolError(mockArgs); - - expect(mockLogger.error).toHaveBeenCalledWith(mockError); - expect(updateAttackDiscovery).not.toHaveBeenCalled(); - expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { - actionTypeId: mockArgs.apiConfig.actionTypeId, - errorMessage: mockError.message, - model: mockArgs.apiConfig.model, - provider: mockArgs.apiConfig.provider, + it('should log the error and report telemetry when getAttackDiscovery rejects', async () => { + getAttackDiscovery.mockRejectedValue(mockError); + await handleToolError(mockArgs); + + expect(mockLogger.error).toHaveBeenCalledWith(mockError); + expect(updateAttackDiscovery).not.toHaveBeenCalled(); + expect(mockTelemetry.reportEvent).toHaveBeenCalledWith('attack_discovery_error', { + actionTypeId: mockArgs.apiConfig.actionTypeId, + errorMessage: mockError.message, + model: mockArgs.apiConfig.model, + provider: mockArgs.apiConfig.provider, + }); }); }); }); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/axis_tick/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/axis_tick/index.test.tsx new file mode 100644 index 0000000000000..4dcd772d783bd --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/axis_tick/index.test.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 { render } from '@testing-library/react'; +import React from 'react'; + +import { AxisTick } from '.'; + +describe('AxisTick', () => { + it('renders the top cell', async () => { + const { getByTestId } = render(); + + const topCell = getByTestId('topCell'); + + expect(topCell).toBeInTheDocument(); + }); + + it('renders the bottom cell', async () => { + const { getByTestId } = render(); + + const bottomCell = getByTestId('bottomCell'); + + expect(bottomCell).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/index.test.tsx new file mode 100644 index 0000000000000..195a5fe49dd19 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/index.test.tsx @@ -0,0 +1,30 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { getTacticMetadata } from '../../helpers'; +import { AttackChain } from '.'; + +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; + +describe('AttackChain', () => { + it('renders the expected tactics', () => { + // get detected tactics from the attack discovery: + const tacticMetadata = getTacticMetadata(mockAttackDiscovery).filter( + (tactic) => tactic.detected + ); + expect(tacticMetadata.length).toBeGreaterThan(0); // test pre-condition + + render(); + + tacticMetadata?.forEach((tactic) => { + expect(screen.getByText(tactic.name)).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/tactic/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/tactic/index.test.tsx new file mode 100644 index 0000000000000..9c4166a43d620 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack/attack_chain/tactic/index.test.tsx @@ -0,0 +1,43 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Tactic } from '.'; + +describe('Tactic', () => { + const tactic = 'Privilege Escalation'; + + it('renders the tactic name', () => { + render(); + + const tacticText = screen.getByTestId('tacticText'); + + expect(tacticText).toHaveTextContent(tactic); + }); + + const detectedTestCases: boolean[] = [true, false]; + + detectedTestCases.forEach((detected) => { + it(`renders the inner circle when detected is ${detected}`, () => { + render(); + + const innerCircle = screen.getByTestId('innerCircle'); + + expect(innerCircle).toBeInTheDocument(); + }); + + it(`renders the outerCircle circle when detected is ${detected}`, () => { + render(); + + const outerCircle = screen.getByTestId('outerCircle'); + + expect(outerCircle).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/index.test.tsx new file mode 100644 index 0000000000000..c9923754d25da --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/index.test.tsx @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import type { TacticMetadata } from '../../helpers'; +import { getTacticMetadata } from '../../helpers'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; +import { MiniAttackChain } from '.'; + +describe('MiniAttackChain', () => { + it('displays the expected number of circles', () => { + // get detected tactics from the attack discovery: + const tacticMetadata: TacticMetadata[] = getTacticMetadata(mockAttackDiscovery); + expect(tacticMetadata.length).toBeGreaterThan(0); // test pre-condition + + render(); + + const circles = screen.getAllByTestId('circle'); + + expect(circles.length).toEqual(tacticMetadata.length); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/helpers.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/helpers.test.ts new file mode 100644 index 0000000000000..fd3ada8f6bdd9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/helpers.test.ts @@ -0,0 +1,30 @@ +/* + * 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 { getIconFromFieldName } from './helpers'; + +describe('helpers', () => { + describe('getIconFromFieldName', () => { + it('returns the expected icon for a known field name', () => { + const fieldName = 'host.name'; + const expectedIcon = 'desktop'; + + const icon = getIconFromFieldName(fieldName); + + expect(icon).toEqual(expectedIcon); + }); + + it('returns an empty string for an unknown field name', () => { + const fieldName = 'unknown.field'; + const emptyIcon = ''; + + const icon = getIconFromFieldName(fieldName); + + expect(icon).toEqual(emptyIcon); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/index.test.tsx new file mode 100644 index 0000000000000..5772272673b67 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/attack_discovery_markdown_parser/index.test.tsx @@ -0,0 +1,102 @@ +/* + * 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 { + EuiMarkdownFormat, + getDefaultEuiMarkdownParsingPlugins, + getDefaultEuiMarkdownProcessingPlugins, +} from '@elastic/eui'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../common/mock'; +import { getFieldMarkdownRenderer } from '../field_markdown_renderer'; +import { AttackDiscoveryMarkdownParser } from '.'; + +describe('AttackDiscoveryMarkdownParser', () => { + it('parsees markdown with valid fields', () => { + const attackDiscoveryParsingPluginList = [ + ...getDefaultEuiMarkdownParsingPlugins(), + AttackDiscoveryMarkdownParser, + ]; + + const markdownWithValidFields = ` + The following attack chain was detected involving Microsoft Office documents on multiple hosts: + +- On {{ host.name 39054a91-67f9-46fa-b9d1-85f928d4cd1b }}, a malicious Microsoft Office document was opened by {{ user.name 2c13d131-8fab-41b9-841e-669c66315a23 }}. +- This document launched a child process to write and execute a malicious script file named "AppPool.vbs". +- The "AppPool.vbs" script then spawned PowerShell to execute an obfuscated script payload from "AppPool.ps1". +- On {{ host.name 5149b291-72d0-4373-93ec-c117477932fe }}, a similar attack involving a malicious Office document and the creation of "AppPool.vbs" was detected and prevented. + +This appears to be a malware attack delivered via spearphishing, likely exploiting a vulnerability in Microsoft Office to gain initial access and then using PowerShell for execution and obfuscation. The attacker employed defense evasion techniques like script obfuscation and system binary proxies like "wscript.exe" and "mshta.exe". Mitigations should focus on patching Office vulnerabilities, restricting script execution, and enhancing email security controls. + `; + + const processingPluginList = getDefaultEuiMarkdownProcessingPlugins(); + processingPluginList[1][1].components.fieldPlugin = getFieldMarkdownRenderer(false); + + render( + + + {markdownWithValidFields} + + + ); + + const result = screen.getByTestId('attackDiscoveryMarkdownFormatter'); + + expect(result).toHaveTextContent( + 'The following attack chain was detected involving Microsoft Office documents on multiple hosts: On 39054a91-67f9-46fa-b9d1-85f928d4cd1b, a malicious Microsoft Office document was opened by 2c13d131-8fab-41b9-841e-669c66315a23. This document launched a child process to write and execute a malicious script file named "AppPool.vbs". The "AppPool.vbs" script then spawned PowerShell to execute an obfuscated script payload from "AppPool.ps1". On 5149b291-72d0-4373-93ec-c117477932fe, a similar attack involving a malicious Office document and the creation of "AppPool.vbs" was detected and prevented. This appears to be a malware attack delivered via spearphishing, likely exploiting a vulnerability in Microsoft Office to gain initial access and then using PowerShell for execution and obfuscation. The attacker employed defense evasion techniques like script obfuscation and system binary proxies like "wscript.exe" and "mshta.exe". Mitigations should focus on patching Office vulnerabilities, restricting script execution, and enhancing email security controls.' + ); + }); + + it('parsees markdown with invalid fields', () => { + const attackDiscoveryParsingPluginList = [ + ...getDefaultEuiMarkdownParsingPlugins(), + AttackDiscoveryMarkdownParser, + ]; + + const markdownWithInvalidFields = ` + The following attack chain was detected involving Microsoft Office documents on multiple hosts: + +- On {{ host.name 39054a91-67f9-46fa-b9d1-85f928d4cd1b }}, a malicious Microsoft Office document was opened by {{ user.name }}. +- This document launched a child process to write and execute a malicious script file named "AppPool.vbs". +- The "AppPool.vbs" script then spawned PowerShell to execute an obfuscated script payload from "AppPool.ps1". +- On {{ 5149b291-72d0-4373-93ec-c117477932fe }}, a similar attack involving a malicious Office document and the creation of "AppPool.vbs" was detected and prevented. + +This appears to be a malware attack delivered via spearphishing, likely exploiting a vulnerability in Microsoft Office to gain initial access and then using PowerShell for execution and obfuscation. The attacker employed defense evasion techniques like script obfuscation and system binary proxies like "wscript.exe" and "mshta.exe". Mitigations should focus on patching Office vulnerabilities, restricting script execution, and enhancing email security controls. {{ foo.bar baz }} + `; + + const processingPluginList = getDefaultEuiMarkdownProcessingPlugins(); + processingPluginList[1][1].components.fieldPlugin = getFieldMarkdownRenderer(false); + + render( + + + {markdownWithInvalidFields} + + + ); + + const result = screen.getByTestId('attackDiscoveryMarkdownFormatter'); + + expect(result).toHaveTextContent( + 'The following attack chain was detected involving Microsoft Office documents on multiple hosts: On 39054a91-67f9-46fa-b9d1-85f928d4cd1b, a malicious Microsoft Office document was opened by . This document launched a child process to write and execute a malicious script file named "AppPool.vbs". The "AppPool.vbs" script then spawned PowerShell to execute an obfuscated script payload from "AppPool.ps1". On (Empty string), a similar attack involving a malicious Office document and the creation of "AppPool.vbs" was detected and prevented. This appears to be a malware attack delivered via spearphishing, likely exploiting a vulnerability in Microsoft Office to gain initial access and then using PowerShell for execution and obfuscation. The attacker employed defense evasion techniques like script obfuscation and system binary proxies like "wscript.exe" and "mshta.exe". Mitigations should focus on patching Office vulnerabilities, restricting script execution, and enhancing email security controls. baz' + ); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_host_flyout_panel_props.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_host_flyout_panel_props.test.ts new file mode 100644 index 0000000000000..ea42a7ec1b045 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_host_flyout_panel_props.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getHostFlyoutPanelProps, isHostName } from './get_host_flyout_panel_props'; + +describe('getHostFlyoutPanelProps', () => { + describe('isHostName', () => { + it('returns true for "host.name"', () => { + const result = isHostName('host.name'); + + expect(result).toBe(true); + }); + + it('returns true for "host.hostname"', () => { + const result = isHostName('host.hostname'); + + expect(result).toBe(true); + }); + + it('returns false for other field names', () => { + const result = isHostName('some.other.field'); + + expect(result).toBe(false); + }); + }); + + describe('getHostFlyoutPanelProps', () => { + it('returns the correct FlyoutPanelProps', () => { + const contextId = 'contextId'; + const hostName = 'foo'; + + const result = getHostFlyoutPanelProps({ contextId, hostName }); + + expect(result).toEqual({ + id: 'host-panel', + params: { contextID: contextId, hostName, scopeId: 'alerts-page' }, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_user_flyout_panel_props.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_user_flyout_panel_props.test.ts new file mode 100644 index 0000000000000..92cb21e1f5dee --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/get_user_flyout_panel_props.test.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 { isUserName } from './get_user_flyout_panel_props'; + +describe('getUserFlyoutPanelProps', () => { + describe('isUserName', () => { + it('returns true when fieldName is "user.name"', () => { + const fieldName = 'user.name'; + const result = isUserName(fieldName); + + expect(result).toBe(true); + }); + + it('returns false when fieldName is NOT "user.name"', () => { + const fieldName = 'other.field'; + const result = isUserName(fieldName); + + expect(result).toBe(false); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/helpers.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/helpers.test.ts new file mode 100644 index 0000000000000..e6e001d290afe --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/helpers.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getFlyoutPanelProps } from './helpers'; + +describe('helpers', () => { + describe('getFlyoutPanelProps', () => { + it('returns FlyoutPanelProps for a valid host name', () => { + const contextId = 'contextId'; + const fieldName = 'host.name'; + const value = 'example.com'; + + const flyoutPanelProps = getFlyoutPanelProps({ contextId, fieldName, value }); + + expect(flyoutPanelProps).toEqual({ + id: 'host-panel', + params: { contextID: contextId, hostName: value, scopeId: 'alerts-page' }, + }); + }); + + it('returns FlyoutPanelProps for a valid user name', () => { + const contextId = 'contextId'; + const fieldName = 'user.name'; + const value = 'administator'; + + const flyoutPanelProps = getFlyoutPanelProps({ contextId, fieldName, value }); + + expect(flyoutPanelProps).toEqual({ + id: 'user-panel', + params: { contextID: contextId, userName: value, scopeId: 'alerts-page' }, + }); + }); + + it('returns null for an unknown field name', () => { + const contextId = 'contextId'; + const fieldName = 'unknown.field'; + const value = 'example'; + + const flyoutPanelProps = getFlyoutPanelProps({ contextId, fieldName, value }); + + expect(flyoutPanelProps).toBeNull(); + }); + + it('returns null when value is not a string', () => { + const contextId = 'contextId'; + const fieldName = 'host.name'; + const value = 123; + + const flyoutPanelProps = getFlyoutPanelProps({ contextId, fieldName, value }); + + expect(flyoutPanelProps).toBeNull(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/index.test.tsx new file mode 100644 index 0000000000000..8f647d02a626f --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/field_markdown_renderer/index.test.tsx @@ -0,0 +1,110 @@ +/* + * 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 { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { fireEvent, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../common/mock'; +import { getFieldMarkdownRenderer } from '.'; + +jest.mock('@kbn/expandable-flyout', () => ({ + useExpandableFlyoutApi: jest.fn(), +})); + +describe('getFieldMarkdownRenderer', () => { + const mockOpenRightPanel = jest.fn(); + const mockUseExpandableFlyoutApi = useExpandableFlyoutApi as jest.MockedFunction< + typeof useExpandableFlyoutApi + >; + + beforeEach(() => { + jest.clearAllMocks(); + + mockUseExpandableFlyoutApi.mockReturnValue({ + closeFlyout: jest.fn(), + closeLeftPanel: jest.fn(), + closePreviewPanel: jest.fn(), + closeRightPanel: jest.fn(), + previousPreviewPanel: jest.fn(), + openFlyout: jest.fn(), + openLeftPanel: jest.fn(), + openPreviewPanel: jest.fn(), + openRightPanel: mockOpenRightPanel, + }); + }); + + it('renders the field value', () => { + const FieldMarkdownRenderer = getFieldMarkdownRenderer(false); + const icon = ''; + const name = 'some.field'; + const value = 'some.value'; + + render( + + + + ); + + const fieldValue = screen.getByText(value); + + expect(fieldValue).toBeInTheDocument(); + }); + + it('opens the right panel when the entity button is clicked', () => { + const FieldMarkdownRenderer = getFieldMarkdownRenderer(false); + const icon = 'user'; + const name = 'user.name'; + const value = 'some.user'; + + render( + + + + ); + + const entityButton = screen.getByTestId('entityButton'); + + fireEvent.click(entityButton); + + expect(mockOpenRightPanel).toHaveBeenCalledTimes(1); + }); + + it('does NOT render the entity button when flyoutPanelProps is null', () => { + const FieldMarkdownRenderer = getFieldMarkdownRenderer(false); + const icon = ''; + const name = 'some.field'; + const value = 'some.value'; + + render( + + + + ); + + const entityButton = screen.queryByTestId('entityButton'); + + expect(entityButton).not.toBeInTheDocument(); + }); + + it('renders disabled actions badge when disableActions is true', () => { + const FieldMarkdownRenderer = getFieldMarkdownRenderer(true); // disable actions + const icon = 'user'; + const name = 'user.name'; + const value = 'some.user'; + + render( + + + + ); + + const disabledActionsBadge = screen.getByTestId('disabledActionsBadge'); + + expect(disabledActionsBadge).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/index.test.tsx new file mode 100644 index 0000000000000..5013ce646fe28 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_markdown_formatter/index.test.tsx @@ -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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { AttackDiscoveryMarkdownFormatter } from '.'; + +describe('AttackDiscoveryMarkdownFormatter', () => { + const markdown = ` + The following attack chain was detected involving Microsoft Office documents on multiple hosts: + +- On {{ host.name 39054a91-67f9-46fa-b9d1-85f928d4cd1b }}, a malicious Microsoft Office document was opened by {{ user.name 2c13d131-8fab-41b9-841e-669c66315a23 }}. +- This document launched a child process to write and execute a malicious script file named "AppPool.vbs". +- The "AppPool.vbs" script then spawned PowerShell to execute an obfuscated script payload from "AppPool.ps1". +- On {{ host.name 5149b291-72d0-4373-93ec-c117477932fe }}, a similar attack involving a malicious Office document and the creation of "AppPool.vbs" was detected and prevented. + +This appears to be a malware attack delivered via spearphishing, likely exploiting a vulnerability in Microsoft Office to gain initial access and then using PowerShell for execution and obfuscation. The attacker employed defense evasion techniques like script obfuscation and system binary proxies like "wscript.exe" and "mshta.exe". Mitigations should focus on patching Office vulnerabilities, restricting script execution, and enhancing email security controls. + `; + + it('renders the expected markdown', () => { + render( + + + + ); + + const result = screen.getByTestId('attackDiscoveryMarkdownFormatter'); + + expect(result).toHaveTextContent( + 'The following attack chain was detected involving Microsoft Office documents on multiple hosts: On 39054a91-67f9-46fa-b9d1-85f928d4cd1b, a malicious Microsoft Office document was opened by 2c13d131-8fab-41b9-841e-669c66315a23. This document launched a child process to write and execute a malicious script file named "AppPool.vbs". The "AppPool.vbs" script then spawned PowerShell to execute an obfuscated script payload from "AppPool.ps1". On 5149b291-72d0-4373-93ec-c117477932fe, a similar attack involving a malicious Office document and the creation of "AppPool.vbs" was detected and prevented. This appears to be a malware attack delivered via spearphishing, likely exploiting a vulnerability in Microsoft Office to gain initial access and then using PowerShell for execution and obfuscation. The attacker employed defense evasion techniques like script obfuscation and system binary proxies like "wscript.exe" and "mshta.exe". Mitigations should focus on patching Office vulnerabilities, restricting script execution, and enhancing email security controls.' + ); + }); + + it('renders interactive host entities', () => { + render( + + + + ); + + const entities = screen.getAllByTestId('entityButton'); + + expect(entities.length).toEqual(3); + }); + + it('renders NON-interactive host entities when disableActions is true', () => { + render( + + + + ); + + const entities = screen.queryAllByTestId('entityButton'); + + expect(entities.length).toEqual(0); // <-- no interactive buttons + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actionable_summary/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actionable_summary/index.test.tsx new file mode 100644 index 0000000000000..55d636bf35270 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actionable_summary/index.test.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { ActionableSummary } from '.'; +import { TestProviders } from '../../../common/mock'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; + +describe('ActionableSummary', () => { + const mockReplacements = { + '5e454c38-439c-4096-8478-0a55511c76e3': 'foo.hostname', + '3bdc7952-a334-4d95-8092-cd176546e18a': 'bar.username', + }; + + describe('when entities with replacements are provided', () => { + beforeEach(() => { + render( + + + + ); + }); + + it('renders a hostname with the expected value from replacements', () => { + expect(screen.getAllByTestId('entityButton')[0]).toHaveTextContent('foo.hostname'); + }); + + it('renders a username with the expected value from replacements', () => { + expect(screen.getAllByTestId('entityButton')[1]).toHaveTextContent('bar.username'); + }); + }); + + describe('when entities that do NOT have replacements are provided', () => { + beforeEach(() => { + render( + + + + ); + }); + + it('renders a hostname with with the original hostname value', () => { + expect(screen.getAllByTestId('entityButton')[0]).toHaveTextContent( + '5e454c38-439c-4096-8478-0a55511c76e3' + ); + }); + + it('renders a username with the original username value', () => { + expect(screen.getAllByTestId('entityButton')[1]).toHaveTextContent( + '3bdc7952-a334-4d95-8092-cd176546e18a' + ); + }); + }); + + describe('when showAnonymized is true', () => { + beforeEach(() => { + render( + + + + ); + }); + + it('renders a disabled badge with the original hostname value', () => { + expect(screen.getAllByTestId('disabledActionsBadge')[0]).toHaveTextContent( + '5e454c38-439c-4096-8478-0a55511c76e3' + ); + }); + + it('renders a disabled badge with the original username value', () => { + expect(screen.getAllByTestId('disabledActionsBadge')[1]).toHaveTextContent( + '3bdc7952-a334-4d95-8092-cd176546e18a' + ); + }); + }); + + describe('View in AI assistant', () => { + beforeEach(() => { + render( + + + + ); + }); + + it('renders the View in AI assistant button', () => { + expect(screen.getByTestId('viewInAiAssistantCompact')).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/actions_placeholder/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/actions_placeholder/index.test.tsx new file mode 100644 index 0000000000000..ac2494f050d88 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/actions_placeholder/index.test.tsx @@ -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. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { ActionsPlaceholder } from '.'; + +describe('ActionsPlaceholder', () => { + beforeEach(() => render()); + + const expectedSkeletonTitles = ['skeletonTitle1', 'skeletonTitle2', 'skeletonTitle3']; + + expectedSkeletonTitles.forEach((expectedSkeletonTitle) => { + it(`renders the ${expectedSkeletonTitle} skeleton title`, () => { + expect(screen.getByTestId(expectedSkeletonTitle)).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/alerts_badge/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/alerts_badge/index.test.tsx new file mode 100644 index 0000000000000..bc45d195aacfa --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/alerts_badge/index.test.tsx @@ -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 { render } from '@testing-library/react'; +import React from 'react'; + +import { AlertsBadge } from '.'; + +describe('AlertsBadge', () => { + it('render the expected alerts count', () => { + const alertsCount = 5; + + const { getByTestId } = render(); + const badgeElement = getByTestId('alertsBadge'); + + expect(badgeElement.textContent).toBe(`${alertsCount}`); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/index.test.tsx new file mode 100644 index 0000000000000..30096f33dde90 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/index.test.tsx @@ -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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Actions } from '.'; +import { TestProviders } from '../../../common/mock'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; +import { ATTACK_CHAIN, ALERTS } from './translations'; + +describe('Actions', () => { + beforeEach(() => + render( + + + + ) + ); + + it('renders the attack chain label', () => { + expect(screen.getByTestId('attackChainLabel')).toHaveTextContent(ATTACK_CHAIN); + }); + + it('renders the mini attack chain component', () => { + expect(screen.getByTestId('miniAttackChain')).toBeInTheDocument(); + }); + + it('renders the alerts label', () => { + expect(screen.getByTestId('alertsLabel')).toHaveTextContent(ALERTS); + }); + + it('renders the alerts badge with the expected count', () => { + expect(screen.getByTestId('alertsBadge')).toHaveTextContent( + `${mockAttackDiscovery.alertIds.length}` + ); + }); + + it('renders the take action dropdown', () => { + expect(screen.getByTestId('takeAction')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/helpers.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/helpers.test.ts new file mode 100644 index 0000000000000..9d58a1487d0ca --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/helpers.test.ts @@ -0,0 +1,43 @@ +/* + * 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 { getOriginalAlertIds } from './helpers'; + +describe('helpers', () => { + describe('getOriginalAlertIds', () => { + const alertIds = ['alert1', 'alert2', 'alert3']; + + it('returns the original alertIds when no replacements are provided', () => { + const result = getOriginalAlertIds({ alertIds }); + + expect(result).toEqual(alertIds); + }); + + it('returns the replaced alertIds when replacements are provided', () => { + const replacements = { + alert1: 'replaced1', + alert3: 'replaced3', + }; + const expected = ['replaced1', 'alert2', 'replaced3']; + + const result = getOriginalAlertIds({ alertIds, replacements }); + + expect(result).toEqual(expected); + }); + + it('returns the original alertIds when replacements are provided but no replacement is found', () => { + const replacements = { + alert4: 'replaced4', + alert5: 'replaced5', + }; + + const result = getOriginalAlertIds({ alertIds, replacements }); + + expect(result).toEqual(alertIds); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/index.test.tsx new file mode 100644 index 0000000000000..2772aa6e0c7a2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/take_action/index.test.tsx @@ -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 { fireEvent, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../../common/mock'; +import { mockAttackDiscovery } from '../../../mock/mock_attack_discovery'; +import { TakeAction } from '.'; + +describe('TakeAction', () => { + beforeEach(() => { + jest.clearAllMocks(); + + render( + + + + ); + + const takeActionButtons = screen.getAllByTestId('takeActionPopoverButton'); + + fireEvent.click(takeActionButtons[0]); // open the popover + }); + + it('renders the Add to new case action', () => { + const addToCase = screen.getByTestId('addToCase'); + + expect(addToCase).toBeInTheDocument(); + }); + + it('renders the Add to existing case action', () => { + const addToCase = screen.getByTestId('addToExistingCase'); + + expect(addToCase).toBeInTheDocument(); + }); + + it('renders the View in AI Assistant action', () => { + const addToCase = screen.getByTestId('viewInAiAssistant'); + + expect(addToCase).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_case/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_case/index.test.tsx new file mode 100644 index 0000000000000..d1c2e84049e9a --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_case/index.test.tsx @@ -0,0 +1,87 @@ +/* + * 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 { act, renderHook } from '@testing-library/react-hooks'; + +import { useAddToNewCase } from '.'; +import { TestProviders } from '../../../../common/mock'; + +jest.mock('../../../../common/lib/kibana', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + cases: { + hooks: { + useCasesAddToNewCaseFlyout: jest.fn().mockReturnValue({ + open: jest.fn(), + }), + }, + }, + }, + }), +})); + +describe('useAddToNewCase', () => { + it('disables the action when a user can NOT create and read cases', () => { + const canUserCreateAndReadCases = jest.fn().mockReturnValue(false); + + const { result } = renderHook( + () => + useAddToNewCase({ + canUserCreateAndReadCases, + title: 'Persistent Execution of Malicious Application', + }), + { + wrapper: TestProviders, + } + ); + + expect(result.current.disabled).toBe(true); + }); + + it('enables the action when a user can create and read cases', () => { + const canUserCreateAndReadCases = jest.fn().mockReturnValue(true); + + const { result } = renderHook( + () => + useAddToNewCase({ + canUserCreateAndReadCases, + title: 'Persistent Execution of Malicious Application', + }), + { + wrapper: TestProviders, + } + ); + + expect(result.current.disabled).toBe(false); + }); + + it('calls the onClick callback when provided', () => { + const onClick = jest.fn(); + const canUserCreateAndReadCases = jest.fn().mockReturnValue(true); + + const { result } = renderHook( + () => + useAddToNewCase({ + canUserCreateAndReadCases, + title: 'Persistent Execution of Malicious Application', + onClick, + }), + { + wrapper: TestProviders, + } + ); + + act(() => { + result.current.onAddToNewCase({ + alertIds: ['alert1', 'alert2'], + markdownComments: ['Comment 1', 'Comment 2'], + }); + }); + + expect(onClick).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx new file mode 100644 index 0000000000000..80245d371f412 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/actions/use_add_to_existing_case/index.test.tsx @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { act, renderHook } from '@testing-library/react-hooks'; + +import { useAddToExistingCase } from '.'; +import { useKibana } from '../../../../common/lib/kibana'; +import { TestProviders } from '../../../../common/mock'; + +jest.mock('../../../../common/lib/kibana', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + cases: { + hooks: { + useCasesAddToExistingCaseModal: jest.fn().mockReturnValue({ + open: jest.fn(), + }), + }, + }, + }, + }), +})); + +describe('useAddToExistingCase', () => { + const mockCanUserCreateAndReadCases = jest.fn(); + const mockOnClick = jest.fn(); + const mockAlertIds = ['alert1', 'alert2']; + const mockMarkdownComments = ['Comment 1', 'Comment 2']; + const mockReplacements = { alert1: 'replacement1', alert2: 'replacement2' }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('disables the action when a user can NOT create and read cases', () => { + mockCanUserCreateAndReadCases.mockReturnValue(false); + + const { result } = renderHook( + () => + useAddToExistingCase({ + canUserCreateAndReadCases: mockCanUserCreateAndReadCases, + onClick: mockOnClick, + }), + { + wrapper: TestProviders, + } + ); + + expect(result.current.disabled).toBe(true); + }); + + it('enables the action when a user can create and read cases', () => { + mockCanUserCreateAndReadCases.mockReturnValue(true); + + const { result } = renderHook( + () => + useAddToExistingCase({ + canUserCreateAndReadCases: mockCanUserCreateAndReadCases, + onClick: mockOnClick, + }), + { + wrapper: TestProviders, + } + ); + + expect(result.current.disabled).toBe(false); + }); + + it('calls the openSelectCaseModal function with the expected attachments', () => { + mockCanUserCreateAndReadCases.mockReturnValue(true); + const mockOpenSelectCaseModal = jest.fn(); + (useKibana as jest.Mock).mockReturnValue({ + services: { + cases: { + hooks: { + useCasesAddToExistingCaseModal: jest.fn().mockReturnValue({ + open: mockOpenSelectCaseModal, + }), + }, + }, + }, + }); + + const { result } = renderHook( + () => + useAddToExistingCase({ + canUserCreateAndReadCases: mockCanUserCreateAndReadCases, + onClick: mockOnClick, + }), + { + wrapper: TestProviders, + } + ); + + act(() => { + result.current.onAddToExistingCase({ + alertIds: mockAlertIds, + markdownComments: mockMarkdownComments, + replacements: mockReplacements, + }); + }); + + expect(mockOpenSelectCaseModal).toHaveBeenCalledWith({ + getAttachments: expect.any(Function), + }); + + const getAttachments = mockOpenSelectCaseModal.mock.calls[0][0].getAttachments; + const attachments = getAttachments(); + + expect(attachments).toHaveLength(4); + expect(attachments[0]).toEqual({ + comment: 'Comment 1', + type: 'user', + }); + expect(attachments[1]).toEqual({ + comment: 'Comment 2', + type: 'user', + }); + expect(attachments[2]).toEqual({ + alertId: 'replacement1', // <-- case attachment uses the replacement values + index: '', + rule: { + id: null, + name: null, + }, + type: 'alert', + }); + expect(attachments[3]).toEqual({ + alertId: 'replacement2', + index: '', + rule: { + id: null, + name: null, + }, + type: 'alert', + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/index.test.tsx new file mode 100644 index 0000000000000..d65dd87117ca3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/index.test.tsx @@ -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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { AttackDiscoveryPanel } from '.'; +import { TestProviders } from '../../common/mock'; +import { mockAttackDiscovery } from '../mock/mock_attack_discovery'; + +describe('AttackDiscoveryPanel', () => { + it('renders the attack discovery accordion', () => { + render( + + + + ); + + const attackDiscoveryAccordion = screen.getByTestId('attackDiscoveryAccordion'); + + expect(attackDiscoveryAccordion).toBeInTheDocument(); + }); + + it('renders empty accordion content', () => { + render( + + + + ); + + const emptyAccordionContent = screen.getByTestId('emptyAccordionContent'); + + expect(emptyAccordionContent).toBeInTheDocument(); + }); + + it('renders the attack discovery summary', () => { + render( + + + + ); + + const actionableSummary = screen.getByTestId('actionableSummary'); + + expect(actionableSummary).toBeInTheDocument(); + }); + + it('renders the attack discovery tabs panel when accordion is open', () => { + render( + + + + ); + + const attackDiscoveryTabsPanel = screen.getByTestId('attackDiscoveryTabsPanel'); + + expect(attackDiscoveryTabsPanel).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/alerts_tab/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/alerts_tab/index.test.tsx new file mode 100644 index 0000000000000..c505aafa6631b --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/alerts_tab/index.test.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../../common/mock'; +import { mockAttackDiscovery } from '../../../mock/mock_attack_discovery'; +import { AlertsTab } from '.'; + +describe('AlertsTab', () => { + it('renders the alerts tab', () => { + render( + + + + ); + + const alertsTab = screen.getByTestId('alertsTab'); + + expect(alertsTab).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.test.tsx new file mode 100644 index 0000000000000..3c05a10a6eb06 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.test.tsx @@ -0,0 +1,139 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { AttackDiscoveryTab } from '.'; +import type { Replacements } from '@kbn/elastic-assistant-common'; +import { TestProviders } from '../../../../common/mock'; +import { mockAttackDiscovery } from '../../../mock/mock_attack_discovery'; +import { ATTACK_CHAIN, DETAILS, SUMMARY } from './translations'; + +describe('AttackDiscoveryTab', () => { + const mockReplacements: Replacements = { + '5e454c38-439c-4096-8478-0a55511c76e3': 'foo.hostname', + '3bdc7952-a334-4d95-8092-cd176546e18a': 'bar.username', + }; + + describe('when showAnonymized is false', () => { + const showAnonymized = false; + + beforeEach(() => + render( + + + + ) + ); + + it('renders the summary using the real host and username', () => { + const markdownFormatters = screen.getAllByTestId('attackDiscoveryMarkdownFormatter'); + const summaryMarkdown = markdownFormatters[0]; + + expect(summaryMarkdown).toHaveTextContent( + 'A multi-stage malware attack was detected on foo.hostname involving bar.username. A suspicious application delivered malware, attempted credential theft, and established persistence.' + ); + }); + + it('renders the details using the real host and username', () => { + const markdownFormatters = screen.getAllByTestId('attackDiscoveryMarkdownFormatter'); + const detailsMarkdown = markdownFormatters[1]; + + expect(detailsMarkdown).toHaveTextContent( + `The following attack progression appears to have occurred on the host foo.hostname involving the user bar.username: A suspicious application named "My Go Application.app" was launched, likely through a malicious download or installation. This application spawned child processes to copy a malicious file named "unix1" to the user's home directory and make it executable. The malicious "unix1" file was then executed, attempting to access the user's login keychain and potentially exfiltrate credentials. The suspicious application also launched the "osascript" utility to display a fake system dialog prompting the user for their password, a technique known as credentials phishing. This appears to be a multi-stage attack involving malware delivery, privilege escalation, credential access, and potentially data exfiltration. The attacker may have used social engineering techniques like phishing to initially compromise the system. The suspicious "My Go Application.app" exhibits behavior characteristic of malware families that attempt to steal user credentials and maintain persistence. Mitigations should focus on removing the malicious files, resetting credentials, and enhancing security controls around application whitelisting, user training, and data protection.` + ); + }); + }); + + describe('when showAnonymized is true', () => { + const showAnonymized = true; + + beforeEach(() => + render( + + + + ) + ); + + it('renders the summary using the anonymized host and username', () => { + const markdownFormatters = screen.getAllByTestId('attackDiscoveryMarkdownFormatter'); + const summaryMarkdown = markdownFormatters[0]; + + expect(summaryMarkdown).toHaveTextContent( + 'A multi-stage malware attack was detected on 5e454c38-439c-4096-8478-0a55511c76e3 involving 3bdc7952-a334-4d95-8092-cd176546e18a. A suspicious application delivered malware, attempted credential theft, and established persistence.' + ); + }); + + it('renders the details using the anonymized host and username', () => { + const markdownFormatters = screen.getAllByTestId('attackDiscoveryMarkdownFormatter'); + const detailsMarkdown = markdownFormatters[1]; + + expect(detailsMarkdown).toHaveTextContent( + `The following attack progression appears to have occurred on the host 5e454c38-439c-4096-8478-0a55511c76e3 involving the user 3bdc7952-a334-4d95-8092-cd176546e18a: A suspicious application named "My Go Application.app" was launched, likely through a malicious download or installation. This application spawned child processes to copy a malicious file named "unix1" to the user's home directory and make it executable. The malicious "unix1" file was then executed, attempting to access the user's login keychain and potentially exfiltrate credentials. The suspicious application also launched the "osascript" utility to display a fake system dialog prompting the user for their password, a technique known as credentials phishing. This appears to be a multi-stage attack involving malware delivery, privilege escalation, credential access, and potentially data exfiltration. The attacker may have used social engineering techniques like phishing to initially compromise the system. The suspicious "My Go Application.app" exhibits behavior characteristic of malware families that attempt to steal user credentials and maintain persistence. Mitigations should focus on removing the malicious files, resetting credentials, and enhancing security controls around application whitelisting, user training, and data protection.` + ); + }); + }); + + describe('common cases', () => { + beforeEach(() => + render( + + + + ) + ); + + it('renders the expected summary title', () => { + const summaryTitle = screen.getByTestId('summaryTitle'); + + expect(summaryTitle).toHaveTextContent(SUMMARY); + }); + + it('renders the expected details title', () => { + const detailsTitle = screen.getByTestId('detailsTitle'); + + expect(detailsTitle).toHaveTextContent(DETAILS); + }); + + it('renders the expected attack chain title', () => { + const attackChainTitle = screen.getByTestId('attackChainTitle'); + + expect(attackChainTitle).toHaveTextContent(ATTACK_CHAIN); + }); + + it('renders the attack chain', () => { + const attackChain = screen.getByTestId('attackChain'); + + expect(attackChain).toBeInTheDocument(); + }); + + it('renders the "View in AI Assistant" button', () => { + const viewInAiAssistantButton = screen.getByTestId('viewInAiAssistant'); + + expect(viewInAiAssistantButton).toBeInTheDocument(); + }); + + it('renders the "Investigate in Timeline" button', () => { + const investigateInTimelineButton = screen.getByTestId('investigateInTimelineButton'); + + expect(investigateInTimelineButton).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.tsx index bd36a047c5a1b..23a63d0503db3 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/attack_discovery_tab/index.tsx @@ -85,7 +85,7 @@ const AttackDiscoveryTabComponent: React.FC = ({ {tacticMetadata.length > 0 && ( <> - +

{i18n.ATTACK_CHAIN}

diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.test.tsx new file mode 100644 index 0000000000000..d002c0bde5324 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.test.tsx @@ -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 type { Replacements } from '@kbn/elastic-assistant-common'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { getTabs } from './get_tabs'; +import { TestProviders } from '../../../common/mock'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; +import { ALERTS, ATTACK_DISCOVERY } from './translations'; + +describe('getTabs', () => { + const mockReplacements: Replacements = { + '5e454c38-439c-4096-8478-0a55511c76e3': 'foo.hostname', + '3bdc7952-a334-4d95-8092-cd176546e18a': 'bar.username', + }; + + const tabs = getTabs({ + attackDiscovery: mockAttackDiscovery, + replacements: mockReplacements, + }); + + describe('Attack discovery tab', () => { + const attackDiscoveryTab = tabs.find((tab) => tab.id === 'attackDiscovery--id'); + + it('includes the Attack discovery tab', () => { + expect(attackDiscoveryTab).not.toBeUndefined(); + }); + + it('has the expected tab name', () => { + expect(attackDiscoveryTab?.name).toEqual(ATTACK_DISCOVERY); + }); + + it('renders the expected content', () => { + render({attackDiscoveryTab?.content}); + + expect(screen.getByTestId('attackDiscoveryTab')).toBeInTheDocument(); + }); + }); + + describe('Alerts tab', () => { + const alertsTab = tabs.find((tab) => tab.id === 'alerts--id'); + + it('includes the Alerts tab', () => { + expect(alertsTab).not.toBeUndefined(); + }); + + it('has the expected tab name', () => { + expect(alertsTab?.name).toEqual(ALERTS); + }); + + it('renders the expected content', () => { + render({alertsTab?.content}); + + expect(screen.getByTestId('alertsTab')).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.tsx index 2cf7905b0c3ca..09708d0880c8a 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/get_tabs.tsx @@ -13,7 +13,7 @@ import { AttackDiscoveryTab } from './attack_discovery_tab'; import { AlertsTab } from './alerts_tab'; import * as i18n from './translations'; -interface TabInfo { +export interface TabInfo { content: JSX.Element; id: string; name: string; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/index.test.tsx new file mode 100644 index 0000000000000..3b155d704708c --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/tabs/index.test.tsx @@ -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 { fireEvent, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Tabs } from '.'; +import { TestProviders } from '../../../common/mock'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; + +describe('Tabs', () => { + beforeEach(() => { + render( + + + + ); + }); + + it('renders the attack discovery tab', () => { + const attackDiscoveryTab = screen.getByTestId('attackDiscoveryTab'); + + expect(attackDiscoveryTab).toBeInTheDocument(); + }); + + it("renders the alerts tab when it's selected", () => { + const alertsTabButton = screen.getByText('Alerts'); + + fireEvent.click(alertsTabButton); + const alertsTab = screen.getByTestId('alertsTab'); + + expect(alertsTab).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/title/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/title/index.test.tsx new file mode 100644 index 0000000000000..8648d861b0352 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/title/index.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Title } from '.'; + +describe('Title', () => { + const title = 'Malware Delivery and Credentials Access on macOS'; + + it('renders the assistant avatar', () => { + render(); + const assistantAvatar = screen.getByTestId('assistantAvatar'); + + expect(assistantAvatar).toBeInTheDocument(); + }); + + it('renders the expected title', () => { + render(<Title isLoading={false} title={title} />); + const titleText = screen.getByTestId('titleText'); + + expect(titleText).toHaveTextContent(title); + }); + + it('renders the skeleton title when isLoading is true', () => { + render(<Title isLoading={true} title={title} />); + const skeletonTitle = screen.getByTestId('skeletonTitle'); + + expect(skeletonTitle).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/index.test.tsx new file mode 100644 index 0000000000000..322e26cb4df48 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/index.test.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { ViewInAiAssistant } from '.'; +import { TestProviders } from '../../../common/mock'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; +import { VIEW_IN_AI_ASSISTANT } from './translations'; + +describe('ViewInAiAssistant', () => { + it('renders the assistant avatar', () => { + render( + <TestProviders> + <ViewInAiAssistant attackDiscovery={mockAttackDiscovery} /> + </TestProviders> + ); + + const assistantAvatar = screen.getByTestId('assistantAvatar'); + + expect(assistantAvatar).toBeInTheDocument(); + }); + + it('renders the expected button label', () => { + render( + <TestProviders> + <ViewInAiAssistant attackDiscovery={mockAttackDiscovery} /> + </TestProviders> + ); + + const viewInAiAssistantLabel = screen.getByTestId('viewInAiAssistantLabel'); + + expect(viewInAiAssistantLabel).toHaveTextContent(VIEW_IN_AI_ASSISTANT); + }); + + describe('compact mode', () => { + it('does NOT render the assistant avatar', () => { + render( + <TestProviders> + <ViewInAiAssistant attackDiscovery={mockAttackDiscovery} compact={true} /> + </TestProviders> + ); + + const assistantAvatar = screen.queryByTestId('assistantAvatar'); + + expect(assistantAvatar).not.toBeInTheDocument(); + }); + + it('renders the expected button text', () => { + render( + <TestProviders> + <ViewInAiAssistant attackDiscovery={mockAttackDiscovery} compact={true} /> + </TestProviders> + ); + + const viewInAiAssistantCompact = screen.getByTestId('viewInAiAssistantCompact'); + + expect(viewInAiAssistantCompact).toHaveTextContent(VIEW_IN_AI_ASSISTANT); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts new file mode 100644 index 0000000000000..cc7058c8f3fe6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.test.ts @@ -0,0 +1,86 @@ +/* + * 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 { useAssistantOverlay } from '@kbn/elastic-assistant'; + +import { useAssistantAvailability } from '../../../assistant/use_assistant_availability'; +import { getAttackDiscoveryMarkdown } from '../../get_attack_discovery_markdown/get_attack_discovery_markdown'; +import { mockAttackDiscovery } from '../../mock/mock_attack_discovery'; +import { useViewInAiAssistant } from './use_view_in_ai_assistant'; + +jest.mock('@kbn/elastic-assistant'); +jest.mock('../../../assistant/use_assistant_availability'); +jest.mock('../../get_attack_discovery_markdown/get_attack_discovery_markdown'); + +describe('useViewInAiAssistant', () => { + beforeEach(() => { + jest.clearAllMocks(); + + (useAssistantOverlay as jest.Mock).mockReturnValue({ + promptContextId: 'prompt-context-id', + showAssistantOverlay: jest.fn(), + }); + + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: true, + isAssistantEnabled: true, + }); + + (getAttackDiscoveryMarkdown as jest.Mock).mockResolvedValue('Test markdown'); + }); + + it('returns the expected promptContextId', () => { + const { result } = renderHook(() => + useViewInAiAssistant({ + attackDiscovery: mockAttackDiscovery, + }) + ); + + expect(result.current.promptContextId).toBe('prompt-context-id'); + }); + + it('returns disabled: false when the user has assistant privileges and promptContextId is provided', () => { + const { result } = renderHook(() => + useViewInAiAssistant({ + attackDiscovery: mockAttackDiscovery, + }) + ); + + expect(result.current.disabled).toBe(false); + }); + + it('returns disabled: true when the user does NOT have assistant privileges', () => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: false, // <-- the user does NOT have assistant privileges + isAssistantEnabled: true, + }); + + const { result } = renderHook(() => + useViewInAiAssistant({ + attackDiscovery: mockAttackDiscovery, + }) + ); + + expect(result.current.disabled).toBe(true); + }); + + it('returns disabled: true when promptContextId is null', () => { + (useAssistantOverlay as jest.Mock).mockReturnValue({ + promptContextId: null, // <-- promptContextId is null + showAssistantOverlay: jest.fn(), + }); + + const { result } = renderHook(() => + useViewInAiAssistant({ + attackDiscovery: mockAttackDiscovery, + }) + ); + + expect(result.current.disabled).toBe(true); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/get_attack_discovery_markdown/get_attack_discovery_markdown.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/get_attack_discovery_markdown/get_attack_discovery_markdown.test.tsx new file mode 100644 index 0000000000000..4af83edba69aa --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/get_attack_discovery_markdown/get_attack_discovery_markdown.test.tsx @@ -0,0 +1,188 @@ +/* + * 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 { + getAttackChainMarkdown, + getAttackDiscoveryMarkdown, + getMarkdownFields, + getMarkdownWithOriginalValues, +} from './get_attack_discovery_markdown'; +import { mockAttackDiscovery } from '../mock/mock_attack_discovery'; + +describe('getAttackDiscoveryMarkdown', () => { + describe('getMarkdownFields', () => { + it('replaces markdown fields with formatted values', () => { + const markdown = 'This is a {{ field1 value1 }} and {{ field2 value2 }}.'; + const expected = 'This is a `value1` and `value2`.'; + + const result = getMarkdownFields(markdown); + + expect(result).toBe(expected); + }); + + it('handles multiple occurrences of markdown fields', () => { + const markdown = + 'This is a {{ field1 value1 }} and {{ field2 value2 }}. Also, {{ field1 value3 }}.'; + const expected = 'This is a `value1` and `value2`. Also, `value3`.'; + + const result = getMarkdownFields(markdown); + + expect(result).toBe(expected); + }); + + it('handles markdown fields with no spaces around them', () => { + const markdown = 'This is a {{field1 value1}} and {{field2 value2}}.'; + const expected = 'This is a `value1` and `value2`.'; + + const result = getMarkdownFields(markdown); + + expect(result).toBe(expected); + }); + + it('handles empty markdown', () => { + const markdown = ''; + const expected = ''; + + const result = getMarkdownFields(markdown); + + expect(result).toBe(expected); + }); + }); + + describe('getAttackChainMarkdown', () => { + it('returns an empty string when no tactics are detected', () => { + const noTactics = { + ...mockAttackDiscovery, + mitreAttackTactics: [], + }; + + const result = getAttackChainMarkdown(noTactics); + + expect(result).toBe(''); + }); + + it('returns the expected attack chain markdown when tactics are detected', () => { + const result = getAttackChainMarkdown(mockAttackDiscovery); + + expect(result).toBe(`### Attack Chain +- Initial Access +- Execution +- Persistence +- Privilege Escalation +`); + }); + }); + + describe('getMarkdownWithOriginalValues', () => { + const markdown = mockAttackDiscovery.summaryMarkdown; + + it('returns the same markdown when no replacements are provided', () => { + const result = getMarkdownWithOriginalValues({ markdown }); + + expect(result).toBe(markdown); + }); + + it('replaces the UUIDs with the original values when replacements are provided ', () => { + const replacements = { + '5e454c38-439c-4096-8478-0a55511c76e3': 'foo.hostname', + '3bdc7952-a334-4d95-8092-cd176546e18a': 'bar.username', + }; + const expected = + 'A multi-stage malware attack was detected on {{ host.name foo.hostname }} involving {{ user.name bar.username }}. A suspicious application delivered malware, attempted credential theft, and established persistence.'; + + const result = getMarkdownWithOriginalValues({ markdown, replacements }); + + expect(result).toBe(expected); + }); + + it('only replaces values when there are corresponding entries in the replacements', () => { + // The UUID '3bdc7952-a334-4d95-8092-cd176546e18a' is not in the replacements: + const replacements = { + '5e454c38-439c-4096-8478-0a55511c76e3': 'foo.hostname', + }; + + const expected = + 'A multi-stage malware attack was detected on {{ host.name foo.hostname }} involving {{ user.name 3bdc7952-a334-4d95-8092-cd176546e18a }}. A suspicious application delivered malware, attempted credential theft, and established persistence.'; + + const result = getMarkdownWithOriginalValues({ markdown, replacements }); + + expect(result).toBe(expected); + }); + }); + + describe('getAttackDiscoveryMarkdown', () => { + it('returns the expected markdown when replacements are NOT provided', () => { + const expectedMarkdown = `## Malware Attack With Credential Theft Attempt + +Suspicious activity involving the host \`5e454c38-439c-4096-8478-0a55511c76e3\` and user \`3bdc7952-a334-4d95-8092-cd176546e18a\`. + +### Summary +A multi-stage malware attack was detected on \`5e454c38-439c-4096-8478-0a55511c76e3\` involving \`3bdc7952-a334-4d95-8092-cd176546e18a\`. A suspicious application delivered malware, attempted credential theft, and established persistence. + +### Details +The following attack progression appears to have occurred on the host \`5e454c38-439c-4096-8478-0a55511c76e3\` involving the user \`3bdc7952-a334-4d95-8092-cd176546e18a\`: + +- A suspicious application named "My Go Application.app" was launched, likely through a malicious download or installation. +- This application spawned child processes to copy a malicious file named "unix1" to the user's home directory and make it executable. +- The malicious "unix1" file was then executed, attempting to access the user's login keychain and potentially exfiltrate credentials. +- The suspicious application also launched the "osascript" utility to display a fake system dialog prompting the user for their password, a technique known as credentials phishing. + +This appears to be a multi-stage attack involving malware delivery, privilege escalation, credential access, and potentially data exfiltration. The attacker may have used social engineering techniques like phishing to initially compromise the system. The suspicious "My Go Application.app" exhibits behavior characteristic of malware families that attempt to steal user credentials and maintain persistence. Mitigations should focus on removing the malicious files, resetting credentials, and enhancing security controls around application whitelisting, user training, and data protection. + +### Attack Chain +- Initial Access +- Execution +- Persistence +- Privilege Escalation + +`; + + const markdown = getAttackDiscoveryMarkdown({ attackDiscovery: mockAttackDiscovery }); + + expect(markdown).toBe(expectedMarkdown); + }); + + it('returns the expected markdown when replacements are provided', () => { + const replacements = { + '5e454c38-439c-4096-8478-0a55511c76e3': 'foo.hostname', + '3bdc7952-a334-4d95-8092-cd176546e18a': 'bar.username', + }; + + const expectedMarkdown = `## Malware Attack With Credential Theft Attempt + +Suspicious activity involving the host \`foo.hostname\` and user \`bar.username\`. + +### Summary +A multi-stage malware attack was detected on \`foo.hostname\` involving \`bar.username\`. A suspicious application delivered malware, attempted credential theft, and established persistence. + +### Details +The following attack progression appears to have occurred on the host \`foo.hostname\` involving the user \`bar.username\`: + +- A suspicious application named "My Go Application.app" was launched, likely through a malicious download or installation. +- This application spawned child processes to copy a malicious file named "unix1" to the user's home directory and make it executable. +- The malicious "unix1" file was then executed, attempting to access the user's login keychain and potentially exfiltrate credentials. +- The suspicious application also launched the "osascript" utility to display a fake system dialog prompting the user for their password, a technique known as credentials phishing. + +This appears to be a multi-stage attack involving malware delivery, privilege escalation, credential access, and potentially data exfiltration. The attacker may have used social engineering techniques like phishing to initially compromise the system. The suspicious "My Go Application.app" exhibits behavior characteristic of malware families that attempt to steal user credentials and maintain persistence. Mitigations should focus on removing the malicious files, resetting credentials, and enhancing security controls around application whitelisting, user training, and data protection. + +### Attack Chain +- Initial Access +- Execution +- Persistence +- Privilege Escalation + +`; + + const markdown = getAttackDiscoveryMarkdown({ + attackDiscovery: mockAttackDiscovery, + replacements, + }); + + expect(markdown).toBe(expectedMarkdown); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/helpers.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/helpers.test.tsx new file mode 100644 index 0000000000000..4f5e43323333f --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/helpers.test.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + COMMAND_AND_CONTROL, + DISCOVERY, + EXECUTION, + EXFILTRATION, + getTacticLabel, + getTacticMetadata, + INITIAL_ACCESS, + LATERAL_MOVEMENT, + PERSISTENCE, + PRIVILEGE_ESCALATION, + RECONNAISSANCE, + replaceNewlineLiterals, +} from './helpers'; +import { mockAttackDiscovery } from './mock/mock_attack_discovery'; +import * as i18n from './translations'; + +const expectedTactics = { + [RECONNAISSANCE]: i18n.RECONNAISSANCE, + [INITIAL_ACCESS]: i18n.INITIAL_ACCESS, + [EXECUTION]: i18n.EXECUTION, + [PERSISTENCE]: i18n.PERSISTENCE, + [PRIVILEGE_ESCALATION]: i18n.PRIVILEGE_ESCALATION, + [DISCOVERY]: i18n.DISCOVERY, + [LATERAL_MOVEMENT]: i18n.LATERAL_MOVEMENT, + [COMMAND_AND_CONTROL]: i18n.COMMAND_AND_CONTROL, + [EXFILTRATION]: i18n.EXFILTRATION, + unknown: 'unknown', +}; + +describe('helpers', () => { + describe('getTacticLabel', () => { + Object.entries(expectedTactics).forEach(([tactic, expectedLabel]) => { + it(`returns the expected label for ${tactic}`, () => { + const label = getTacticLabel(tactic); + + expect(label).toBe(expectedLabel); + }); + }); + }); + + describe('getTacticMetadata', () => { + const expectedDetected = ['Initial Access', 'Execution', 'Persistence', 'Privilege Escalation']; + + expectedDetected.forEach((tactic) => { + it(`sets the detected property to true for the '${tactic}' tactic`, () => { + const result = getTacticMetadata(mockAttackDiscovery); + const metadata = result.find(({ name }) => name === tactic); + + expect(metadata?.detected).toBe(true); + }); + }); + + it('sets the detected property to false for all tactics that were not detected', () => { + const result = getTacticMetadata(mockAttackDiscovery); + const filtered = result.filter(({ name }) => !expectedDetected.includes(name)); + + filtered.forEach((metadata) => { + expect(metadata.detected).toBe(false); + }); + }); + + it('sets the expected "index" property for each tactic', () => { + const result = getTacticMetadata(mockAttackDiscovery); + + result.forEach((metadata, i) => { + expect(metadata.index).toBe(i); + }); + }); + }); + + describe('replaceNewlineLiterals', () => { + it('replaces multiple newline literals with actual newlines', () => { + const input = 'Multiple\\nnewline\\nliterals'; + const expected = 'Multiple\nnewline\nliterals'; + + const result = replaceNewlineLiterals(input); + + expect(result).toEqual(expected); + }); + + it('does NOT replace anything if there are no newline literals', () => { + const input = 'This is a string without newlines'; + const result = replaceNewlineLiterals(input); + + expect(result).toEqual(input); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/helpers.ts b/x-pack/plugins/security_solution/public/attack_discovery/helpers.ts index 731f1985c7b13..aa56835d5a1ed 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/helpers.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/helpers.ts @@ -56,7 +56,7 @@ export const getTacticLabel = (tactic: string): string => { } }; -interface TacticMetadata { +export interface TacticMetadata { detected: boolean; index: number; name: string; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_attack_discovery.ts b/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_attack_discovery.ts new file mode 100644 index 0000000000000..d5de6e8d7cc06 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_attack_discovery.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 { AttackDiscovery } from '@kbn/elastic-assistant-common'; + +export const mockAttackDiscovery: AttackDiscovery = { + alertIds: [ + '639801cdb10a93610be4a91fe0eac94cd3d4d292cf0c2a6d7b3674d7f7390357', + 'bdcf649846dc3ed0ca66537e1c1dc62035a35a208ba4d9853a93e9be4b0dbea3', + 'cdbd13134bbd371cd045e5f89970b21ab866a9c3817b2aaba8d8e247ca88b823', + '58571e1653b4201c4f35d49b6eb4023fc0219d5885ff7c385a9253a692a77104', + '06fcb3563de7dad14137c0bb4e5bae17948c808b8a3b8c60d9ec209a865b20ed', + '8bd3fcaeca5698ee26df402c8bc40df0404d34a278bc0bd9355910c8c92a4aee', + '59ff4efa1a03b0d1cb5c0640f5702555faf5c88d273616c1b6e22dcfc47ac46c', + 'f352f8ca14a12062cde77ff2b099202bf74f4a7d757c2ac75ac63690b2f2f91a', + ], + detailsMarkdown: + 'The following attack progression appears to have occurred on the host {{ host.name 5e454c38-439c-4096-8478-0a55511c76e3 }} involving the user {{ user.name 3bdc7952-a334-4d95-8092-cd176546e18a }}:\n\n- A suspicious application named "My Go Application.app" was launched, likely through a malicious download or installation.\n- This application spawned child processes to copy a malicious file named "unix1" to the user\'s home directory and make it executable.\n- The malicious "unix1" file was then executed, attempting to access the user\'s login keychain and potentially exfiltrate credentials.\n- The suspicious application also launched the "osascript" utility to display a fake system dialog prompting the user for their password, a technique known as credentials phishing.\n\nThis appears to be a multi-stage attack involving malware delivery, privilege escalation, credential access, and potentially data exfiltration. The attacker may have used social engineering techniques like phishing to initially compromise the system. The suspicious "My Go Application.app" exhibits behavior characteristic of malware families that attempt to steal user credentials and maintain persistence. Mitigations should focus on removing the malicious files, resetting credentials, and enhancing security controls around application whitelisting, user training, and data protection.', + entitySummaryMarkdown: + 'Suspicious activity involving the host {{ host.name 5e454c38-439c-4096-8478-0a55511c76e3 }} and user {{ user.name 3bdc7952-a334-4d95-8092-cd176546e18a }}.', + id: 'e6d1f8ef-7c1d-42d6-ba6a-11610bab72b1', + mitreAttackTactics: [ + 'Initial Access', + 'Execution', + 'Persistence', + 'Privilege Escalation', + 'Credential Access', + ], + summaryMarkdown: + 'A multi-stage malware attack was detected on {{ host.name 5e454c38-439c-4096-8478-0a55511c76e3 }} involving {{ user.name 3bdc7952-a334-4d95-8092-cd176546e18a }}. A suspicious application delivered malware, attempted credential theft, and established persistence.', + timestamp: '2024-06-25T21:14:40.098Z', + title: 'Malware Attack With Credential Theft Attempt', +}; diff --git a/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_use_attack_discovery.ts b/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_use_attack_discovery.ts index 617f599e09c8f..4f8be970f40a1 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_use_attack_discovery.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/mock/mock_use_attack_discovery.ts @@ -195,3 +195,87 @@ export const getMockUseAttackDiscoveriesWithNoAttackDiscoveriesLoading = ( replacements: {}, isLoading: true, // <-- attack discoveries are being generated }); + +export const getRawAttackDiscoveryResponse = () => ({ + alertsContextCount: 20, + attackDiscoveries: [ + { + alertIds: [ + '382d546a7ba5ab35c050f106bece236e87e3d51076a479f0beae8b2015b8fb26', + 'ca9da6b3b77b7038d958b9e144f0a406c223a862c0c991ce9782b98e03a98c87', + '5301f4fb014538df7ce1eb9929227dde3adc0bf5b4f28aa15c8aa4e4fda95f35', + '1459af4af8b92e1710c0ee075b1c444eaa927583dfd71b42e9a10de37c8b9cf0', + '468457e9c5132aadae501b75ec5b766e1465ab865ad8d79e03f66593a76fccdf', + 'fb92e7fa5679db3e91d84d998faddb7ed269f1c8cdc40443f35e67c930383d34', + '03e0f8f1598018da8143bba6b60e6ddea30551a2286ba76d717568eed3d17a66', + '28021a7aca7de03018d820182c9784f8d5f2e1b99e0159177509a69bee1c3ac0', + ], + detailsMarkdown: + 'The following attack progression appears to have occurred on the host {{ host.name 05207978-1585-4e46-9b36-69c4bb85a768 }} involving the user {{ user.name ddc8db29-46eb-44fe-80b6-1ea642c338ac }}:\\n\\n- A suspicious application named "My Go Application.app" was launched, likely through a malicious download or installation\\n- This application attempted to run various malicious scripts and commands, including:\\n - Spawning a child process to run the "osascript" utility to display a fake system dialog prompting for user credentials ({{ process.command_line osascript -e display dialog "MacOS wants to access System Preferences\\n\\t\\t\\nPlease enter your password." with title "System Preferences" with icon file "System:Library:CoreServices:CoreTypes.bundle:Contents:Resources:ToolbarAdvanced.icns" default answer "" giving up after 30 with hidden answer ¬ }})\\n - Modifying permissions on a suspicious file named "unix1" ({{ process.command_line chmod 777 /Users/james/unix1 }})\\n - Executing the suspicious "unix1" file and passing it the user\'s login keychain file and a hardcoded password ({{ process.command_line /Users/james/unix1 /Users/james/library/Keychains/login.keychain-db TempTemp1234!! }})\\n\\nThis appears to be a multi-stage malware attack, potentially aimed at credential theft and further malicious execution on the compromised host. The tactics used align with Credential Access ({{ threat.tactic.name Credential Access }}) and Execution ({{ threat.tactic.name Execution }}) based on MITRE ATT&CK.', + entitySummaryMarkdown: + 'Suspicious activity detected on {{ host.name 05207978-1585-4e46-9b36-69c4bb85a768 }} involving {{ user.name ddc8db29-46eb-44fe-80b6-1ea642c338ac }}.', + mitreAttackTactics: ['Credential Access', 'Execution'], + summaryMarkdown: + 'A multi-stage malware attack was detected on a macOS host, likely initiated through a malicious application download. The attack involved credential phishing attempts, suspicious file modifications, and the execution of untrusted binaries potentially aimed at credential theft. {{ host.name 05207978-1585-4e46-9b36-69c4bb85a768 }} and {{ user.name ddc8db29-46eb-44fe-80b6-1ea642c338ac }} were involved.', + title: 'Credential Theft Malware Attack on macOS', + }, + { + alertIds: [ + '8772effc4970e371a26d556556f68cb8c73f9d9d9482b7f20ee1b1710e642a23', + '63c761718211fa51ea797669d845c3d4f23b1a28c77a101536905e6fd0b4aaa6', + '55f4641a9604e1088deae4897e346e63108bde9167256c7cb236164233899dcc', + 'eaf9991c83feef7798983dc7cacda86717d77136a3a72c9122178a03ce2f15d1', + 'f7044f707ac119256e5a0ccd41d451b51bca00bdc6899c7e5e8e1edddfeb6774', + 'fad83b4223f3c159646ad22df9877b9c400f9472655e49781e2a5951b641088e', + ], + detailsMarkdown: + 'The following attack progression appears to have occurred on the host {{ host.name b775910b-4b71-494d-bfb1-4be3fe88c2b0 }} involving the user {{ user.name e411fe2e-aeea-44b5-b09a-4336dabb3969 }}:\\n\\n- A malicious Microsoft Office document was opened, spawning a child process to write a suspicious VBScript file named "AppPool.vbs" ({{ file.path C:\\ProgramData\\WindowsAppPool\\AppPool.vbs }})\\n- The VBScript launched PowerShell and executed an obfuscated script from "AppPool.ps1"\\n- Additional malicious activities were performed, including:\\n - Creating a scheduled task to periodically execute the VBScript\\n - Spawning a cmd.exe process to create the scheduled task\\n - Executing the VBScript directly\\n\\nThis appears to be a multi-stage malware attack initiated through malicious Office documents, employing script obfuscation, scheduled task persistence, and defense evasion tactics. The activities map to Initial Access ({{ threat.tactic.name Initial Access }}), Execution ({{ threat.tactic.name Execution }}), and Defense Evasion ({{ threat.tactic.name Defense Evasion }}) based on MITRE ATT&CK.', + entitySummaryMarkdown: + 'Suspicious activity detected on {{ host.name b775910b-4b71-494d-bfb1-4be3fe88c2b0 }} involving {{ user.name e411fe2e-aeea-44b5-b09a-4336dabb3969 }}.', + mitreAttackTactics: ['Initial Access', 'Execution', 'Defense Evasion'], + summaryMarkdown: + 'A multi-stage malware attack was detected on a Windows host, likely initiated through a malicious Microsoft Office document. The attack involved script obfuscation, scheduled task persistence, and other defense evasion tactics. {{ host.name b775910b-4b71-494d-bfb1-4be3fe88c2b0 }} and {{ user.name e411fe2e-aeea-44b5-b09a-4336dabb3969 }} were involved.', + title: 'Malicious Office Document Initiates Malware Attack', + }, + { + alertIds: [ + 'd1b8b1c6f891fd181af236d0a81b8769c4569016d5b341cdf6a3fefb7cf9cbfd', + '005f2dfb7efb08b34865b308876ecad188fc9a3eebf35b5e3af3c3780a3fb239', + '7e41ddd221831544c5ff805e0ec31fc3c1f22c04257de1366112cfef14df9f63', + ], + detailsMarkdown: + 'The following attack progression appears to have occurred on the host {{ host.name c1e00157-c636-4222-b3a2-5d9ea667a3a8 }} involving the user {{ user.name e411fe2e-aeea-44b5-b09a-4336dabb3969 }}:\\n\\n- A suspicious process launched by msiexec.exe spawned a PowerShell session\\n- The PowerShell process exhibited the following malicious behaviors:\\n - Shellcode injection detected, indicating the presence of the "Windows.Trojan.Bumblebee" malware\\n - Establishing network connections, suggesting command and control or data exfiltration\\n\\nThis appears to be a case of malware delivery and execution via an MSI package, potentially initiated through a software supply chain compromise or social engineering attack. The tactics employed align with Defense Evasion ({{ threat.tactic.name Defense Evasion }}) through system binary proxy execution, as well as potential Command and Control ({{ threat.tactic.name Command and Control }}) based on MITRE ATT&CK.', + entitySummaryMarkdown: + 'Suspicious activity detected on {{ host.name c1e00157-c636-4222-b3a2-5d9ea667a3a8 }} involving {{ user.name e411fe2e-aeea-44b5-b09a-4336dabb3969 }}.', + mitreAttackTactics: ['Defense Evasion', 'Command and Control'], + summaryMarkdown: + 'A malware attack was detected on a Windows host, likely delivered through a compromised MSI package. The attack involved shellcode injection, network connections, and the use of system binaries for defense evasion. {{ host.name c1e00157-c636-4222-b3a2-5d9ea667a3a8 }} and {{ user.name e411fe2e-aeea-44b5-b09a-4336dabb3969 }} were involved.', + title: 'Malware Delivery via Compromised MSI Package', + }, + { + alertIds: [ + '12057d82e79068080f6acf268ca45c777d3f80946b466b59954320ec5f86f24a', + '81c7c57a360bee531b1398b0773e7c4a2332fbdda4e66f135e01fc98ec7f4e3d', + ], + detailsMarkdown: + 'The following attack progression appears to have occurred on the host {{ host.name d4c92b0d-b82f-4702-892d-dd06ad8418e8 }} involving the user {{ user.name 7245f867-9a09-48d7-9165-84a69fa0727d }}:\\n\\n- A malicious file named "kdmtmpflush" with the SHA256 hash {{ file.hash.sha256 74ef6cc38f5a1a80148752b63c117e6846984debd2af806c65887195a8eccc56 }} was copied to the /dev/shm directory\\n- Permissions were modified to make the file executable\\n- The file was then executed with the "--init" argument, likely to initialize malicious components\\n\\nThis appears to be a case of the "Linux.Trojan.BPFDoor" malware being deployed on the Linux host. The tactics employed align with Execution ({{ threat.tactic.name Execution }}) based on MITRE ATT&CK.', + entitySummaryMarkdown: + 'Suspicious activity detected on {{ host.name d4c92b0d-b82f-4702-892d-dd06ad8418e8 }} involving {{ user.name 7245f867-9a09-48d7-9165-84a69fa0727d }}.', + mitreAttackTactics: ['Execution'], + summaryMarkdown: + 'The "Linux.Trojan.BPFDoor" malware was detected being deployed on a Linux host. A malicious file was copied, permissions were modified, and the file was executed to likely initialize malicious components. {{ host.name d4c92b0d-b82f-4702-892d-dd06ad8418e8 }} and {{ user.name 7245f867-9a09-48d7-9165-84a69fa0727d }} were involved.', + title: 'Linux.Trojan.BPFDoor Malware Deployment Detected', + }, + ], + connector_id: 'pmeClaudeV3SonnetUsEast1', + replacements: { + 'ddc8db29-46eb-44fe-80b6-1ea642c338ac': 'james', + '05207978-1585-4e46-9b36-69c4bb85a768': 'SRVMAC08', + '7245f867-9a09-48d7-9165-84a69fa0727d': 'root', + 'e411fe2e-aeea-44b5-b09a-4336dabb3969': 'Administrator', + '5a63f6dc-4e40-41fe-a92c-7898e891025e': 'SRVWIN07-PRIV', + 'b775910b-4b71-494d-bfb1-4be3fe88c2b0': 'SRVWIN07', + 'c1e00157-c636-4222-b3a2-5d9ea667a3a8': 'SRVWIN06', + 'd4c92b0d-b82f-4702-892d-dd06ad8418e8': 'SRVNIX05', + }, +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.test.tsx new file mode 100644 index 0000000000000..a70bfaa5c9951 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.test.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { AnimatedCounter } from '.'; + +describe('AnimatedCounter', () => { + it('renders the expected final count', async () => { + const animationDurationMs = 10; // ms + const count = 20; + + render(<AnimatedCounter animationDurationMs={animationDurationMs} count={count} />); + await new Promise((resolve) => setTimeout(resolve, animationDurationMs + 10)); + + const animatedCounter = screen.getByTestId('animatedCounter'); + + expect(animatedCounter).toHaveTextContent(`${count}`); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.tsx index 2428158aa5b71..5dd4cb8fc4267 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/animated_counter/index.tsx @@ -11,14 +11,14 @@ import * as d3 from 'd3'; import React, { useRef, useEffect } from 'react'; interface Props { + animationDurationMs?: number; count: number; } -const AnimatedCounterComponent: React.FC<Props> = ({ count }) => { +const AnimatedCounterComponent: React.FC<Props> = ({ animationDurationMs = 1000 * 1, count }) => { const { euiTheme } = useEuiTheme(); const d3Ref = useRef(null); const zero = 0; // counter starts at zero - const animationDurationMs = 1000 * 1; useEffect(() => { if (d3Ref.current) { diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.test.tsx new file mode 100644 index 0000000000000..70acc1dbb2ca8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.test.tsx @@ -0,0 +1,150 @@ +/* + * 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 { fireEvent, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { EmptyPrompt } from '.'; +import { useAssistantAvailability } from '../../../assistant/use_assistant_availability'; +import { TestProviders } from '../../../common/mock'; + +jest.mock('../../../assistant/use_assistant_availability'); + +describe('EmptyPrompt', () => { + const alertsCount = 20; + const onGenerate = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('when the user has the assistant privilege', () => { + beforeEach(() => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: true, + isAssistantEnabled: true, + }); + + render( + <TestProviders> + <EmptyPrompt + alertsCount={alertsCount} + isLoading={false} + isDisabled={false} + onGenerate={onGenerate} + /> + </TestProviders> + ); + }); + + it('renders the empty prompt avatar', () => { + const emptyPromptAvatar = screen.getByTestId('emptyPromptAvatar'); + + expect(emptyPromptAvatar).toBeInTheDocument(); + }); + + it('renders the animated counter', () => { + const emptyPromptAnimatedCounter = screen.getByTestId('emptyPromptAnimatedCounter'); + + expect(emptyPromptAnimatedCounter).toBeInTheDocument(); + }); + + it('renders the expected statement', () => { + const emptyPromptAlertsWillBeAnalyzed = screen.getByTestId('emptyPromptAlertsWillBeAnalyzed'); + + expect(emptyPromptAlertsWillBeAnalyzed).toHaveTextContent('alerts will be analyzed'); + }); + + it('calls onGenerate when the generate button is clicked', () => { + const generateButton = screen.getByTestId('generate'); + + fireEvent.click(generateButton); + + expect(onGenerate).toHaveBeenCalled(); + }); + }); + + describe('when the user does NOT have the assistant privilege', () => { + it('disables the generate button when the user does NOT have the assistant privilege', () => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: false, // <-- the user does NOT have the assistant privilege + isAssistantEnabled: true, + }); + + render( + <TestProviders> + <EmptyPrompt + alertsCount={alertsCount} + isLoading={false} + isDisabled={false} + onGenerate={onGenerate} + /> + </TestProviders> + ); + + const generateButton = screen.getByTestId('generate'); + + expect(generateButton).toBeDisabled(); + }); + }); + + describe('when loading is true', () => { + const isLoading = true; + + beforeEach(() => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: true, + isAssistantEnabled: true, + }); + + render( + <TestProviders> + <EmptyPrompt + alertsCount={alertsCount} + isLoading={isLoading} + isDisabled={false} + onGenerate={onGenerate} + /> + </TestProviders> + ); + }); + + it('disables the generate button while loading', () => { + const generateButton = screen.getByTestId('generate'); + + expect(generateButton).toBeDisabled(); + }); + }); + + describe('when isDisabled is true', () => { + const isDisabled = true; + + beforeEach(() => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: true, + isAssistantEnabled: true, + }); + + render( + <TestProviders> + <EmptyPrompt + alertsCount={alertsCount} + isLoading={false} + isDisabled={isDisabled} + onGenerate={onGenerate} + /> + </TestProviders> + ); + }); + + it('disables the generate button when isDisabled is true', () => { + const generateButton = screen.getByTestId('generate'); + + expect(generateButton).toBeDisabled(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.test.tsx new file mode 100644 index 0000000000000..18dddaea3abdc --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.test.tsx @@ -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 { fireEvent, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Header } from '.'; +import { useAssistantAvailability } from '../../../assistant/use_assistant_availability'; +import { TestProviders } from '../../../common/mock'; + +jest.mock('../../../assistant/use_assistant_availability'); + +describe('Header', () => { + beforeEach(() => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: true, + isAssistantEnabled: true, + }); + }); + + it('renders the connector selector', () => { + render( + <TestProviders> + <Header + connectorId="testConnectorId" + connectorsAreConfigured={true} + isDisabledActions={false} + isLoading={false} + onCancel={jest.fn()} + onGenerate={jest.fn()} + onConnectorIdSelected={jest.fn()} + /> + </TestProviders> + ); + + const connectorSelector = screen.getByTestId('connectorSelectorPlaceholderButton'); + + expect(connectorSelector).toBeInTheDocument(); + }); + + it('does NOT render the connector selector when connectors are NOT configured', () => { + const connectorsAreConfigured = false; + + render( + <TestProviders> + <Header + connectorId="testConnectorId" + connectorsAreConfigured={connectorsAreConfigured} + isDisabledActions={false} + isLoading={false} + onCancel={jest.fn()} + onGenerate={jest.fn()} + onConnectorIdSelected={jest.fn()} + /> + </TestProviders> + ); + + const connectorSelector = screen.queryByTestId('connectorSelectorPlaceholderButton'); + + expect(connectorSelector).not.toBeInTheDocument(); + }); + + it('invokes onGenerate when the generate button is clicked', () => { + const onGenerate = jest.fn(); + + render( + <TestProviders> + <Header + connectorId="testConnectorId" + connectorsAreConfigured={true} + isDisabledActions={false} + isLoading={false} + onCancel={jest.fn()} + onConnectorIdSelected={jest.fn()} + onGenerate={onGenerate} + /> + </TestProviders> + ); + + const generate = screen.getByTestId('generate'); + + fireEvent.click(generate); + + expect(onGenerate).toHaveBeenCalled(); + }); + + it('disables the generate button when the user does NOT have the assistant privilege', () => { + (useAssistantAvailability as jest.Mock).mockReturnValue({ + hasAssistantPrivilege: false, + isAssistantEnabled: true, + }); + + render( + <TestProviders> + <Header + connectorId="testConnectorId" + connectorsAreConfigured={true} + isDisabledActions={false} + isLoading={false} + onCancel={jest.fn()} + onConnectorIdSelected={jest.fn()} + onGenerate={jest.fn()} + /> + </TestProviders> + ); + + const generate = screen.getByTestId('generate'); + + expect(generate).toBeDisabled(); + }); + + it('displays the cancel button when loading', () => { + const isLoading = true; + + render( + <TestProviders> + <Header + connectorId="testConnectorId" + connectorsAreConfigured={true} + isDisabledActions={false} + isLoading={isLoading} + onCancel={jest.fn()} + onConnectorIdSelected={jest.fn()} + onGenerate={jest.fn()} + /> + </TestProviders> + ); + + const cancel = screen.getByTestId('cancel'); + + expect(cancel).toBeInTheDocument(); + }); + + it('invokes onCancel when the cancel button is clicked', () => { + const isLoading = true; + const onCancel = jest.fn(); + + render( + <TestProviders> + <Header + connectorId="testConnectorId" + connectorsAreConfigured={true} + isDisabledActions={false} + isLoading={isLoading} + onCancel={onCancel} + onConnectorIdSelected={jest.fn()} + onGenerate={jest.fn()} + /> + </TestProviders> + ); + + const cancel = screen.getByTestId('cancel'); + fireEvent.click(cancel); + + expect(onCancel).toHaveBeenCalled(); + }); + + it('disables the generate button when connectorId is undefined', () => { + const connectorId = undefined; + + render( + <TestProviders> + <Header + connectorId={connectorId} + connectorsAreConfigured={true} + isDisabledActions={false} + isLoading={false} + onCancel={jest.fn()} + onConnectorIdSelected={jest.fn()} + onGenerate={jest.fn()} + /> + </TestProviders> + ); + + const generate = screen.getByTestId('generate'); + + expect(generate).toBeDisabled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/index.test.tsx new file mode 100644 index 0000000000000..14a707958b888 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/index.test.tsx @@ -0,0 +1,84 @@ +/* + * 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 moment from 'moment'; + +import { act, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Countdown } from '.'; +import { TestProviders } from '../../../../common/mock'; +import { APPROXIMATE_TIME_REMAINING } from './translations'; +import type { GenerationInterval } from '@kbn/elastic-assistant-common'; + +describe('Countdown', () => { + const connectorIntervals: GenerationInterval[] = [ + { + date: '2024-05-16T14:13:09.838Z', + durationMs: 173648, + }, + { + date: '2024-05-16T13:59:49.620Z', + durationMs: 146605, + }, + { + date: '2024-05-16T13:47:00.629Z', + durationMs: 255163, + }, + ]; + + beforeAll(() => { + jest.useFakeTimers({ legacyFakeTimers: true }); + }); + + beforeEach(() => { + jest.clearAllTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it('returns null when connectorIntervals is empty', () => { + const { container } = render( + <TestProviders> + <Countdown approximateFutureTime={null} connectorIntervals={[]} /> + </TestProviders> + ); + + expect(container.innerHTML).toEqual(''); + }); + + it('renders the expected prefix', () => { + render( + <TestProviders> + <Countdown approximateFutureTime={null} connectorIntervals={connectorIntervals} /> + </TestProviders> + ); + + expect(screen.getByTestId('prefix')).toHaveTextContent(APPROXIMATE_TIME_REMAINING); + }); + + it('renders the expected the timer text', () => { + const approximateFutureTime = moment().add(1, 'minute').toDate(); + + render( + <TestProviders> + <Countdown + approximateFutureTime={approximateFutureTime} + connectorIntervals={connectorIntervals} + /> + </TestProviders> + ); + + act(() => { + jest.runOnlyPendingTimers(); + }); + + expect(screen.getByTestId('timerText')).toHaveTextContent('00:59'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/generation_timing/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/generation_timing/index.test.tsx new file mode 100644 index 0000000000000..35a72d6455f2b --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/generation_timing/index.test.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../../../../common/mock'; +import { GenerationTiming } from '.'; + +describe('GenerationTiming', () => { + const interval = { + connectorId: 'claudeV3SonnetUsEast1', + date: '2024-04-15T13:48:44.397Z', + durationMs: 5000, + }; + + beforeEach(() => { + render( + <TestProviders> + <GenerationTiming interval={interval} /> + </TestProviders> + ); + }); + + it('renders the expected duration in seconds', () => { + const durationText = screen.getByTestId('clockBadge').textContent; + + expect(durationText).toEqual('5s'); + }); + + it('displays the expected date', () => { + const date = screen.getByTestId('date').textContent; + + expect(date).toEqual('Apr 15, 2024 @ 13:48:44.397'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/helpers.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/helpers.test.ts new file mode 100644 index 0000000000000..6e7b12f0a51c7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/helpers.test.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 moment from 'moment'; + +import { getAverageIntervalSeconds, getTimerPrefix } from './helpers'; +import { APPROXIMATE_TIME_REMAINING, ABOVE_THE_AVERAGE_TIME } from '../translations'; +import type { GenerationInterval } from '@kbn/elastic-assistant-common'; + +describe('helpers', () => { + describe('getAverageIntervalSeconds', () => { + it('returns 0 when the intervals array is empty', () => { + const intervals: GenerationInterval[] = []; + + const average = getAverageIntervalSeconds(intervals); + + expect(average).toEqual(0); + }); + + it('calculates the average interval in seconds', () => { + const intervals: GenerationInterval[] = [ + { + date: '2024-04-15T13:48:44.397Z', + durationMs: 85807, + }, + { + date: '2024-04-15T12:41:15.255Z', + durationMs: 12751, + }, + { + date: '2024-04-12T20:59:13.238Z', + durationMs: 46169, + }, + { + date: '2024-04-12T19:34:56.701Z', + durationMs: 86674, + }, + ]; + + const average = getAverageIntervalSeconds(intervals); + + expect(average).toEqual(57); + }); + }); + + describe('getTimerPrefix', () => { + it('returns APPROXIMATE_TIME_REMAINING when approximateFutureTime is null', () => { + const approximateFutureTime: Date | null = null; + + const result = getTimerPrefix(approximateFutureTime); + + expect(result).toEqual(APPROXIMATE_TIME_REMAINING); + }); + + it('returns APPROXIMATE_TIME_REMAINING when approximateFutureTime is in the future', () => { + const approximateFutureTime = moment().add(1, 'minute').toDate(); + const result = getTimerPrefix(approximateFutureTime); + + expect(result).toEqual(APPROXIMATE_TIME_REMAINING); + }); + + it('returns ABOVE_THE_AVERAGE_TIME when approximateFutureTime is in the past', () => { + const approximateFutureTime = moment().subtract(1, 'minute').toDate(); + + const result = getTimerPrefix(approximateFutureTime); + + expect(result).toEqual(ABOVE_THE_AVERAGE_TIME); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/index.test.tsx new file mode 100644 index 0000000000000..45ea68f2a780c --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/index.test.tsx @@ -0,0 +1,59 @@ +/* + * 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 { GenerationInterval } from '@kbn/elastic-assistant-common'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { LastTimesPopover } from '.'; +import { TestProviders } from '../../../../../common/mock'; + +describe('LastTimesPopover', () => { + const connectorIntervals: GenerationInterval[] = [ + { + date: '2024-05-16T14:13:09.838Z', + durationMs: 173648, + }, + { + date: '2024-05-16T13:59:49.620Z', + durationMs: 146605, + }, + { + date: '2024-05-16T13:47:00.629Z', + durationMs: 255163, + }, + ]; + + beforeEach(() => { + render( + <TestProviders> + <LastTimesPopover connectorIntervals={connectorIntervals} /> + </TestProviders> + ); + }); + + it('renders average time calculated message', () => { + const averageTimeIsCalculated = screen.getByTestId('averageTimeIsCalculated'); + + expect(averageTimeIsCalculated).toHaveTextContent( + 'Remaining time is based on the average speed of the last 3 times the same connector generated results.' + ); + }); + + it('renders generation timing for each connector interval', () => { + const generationTimings = screen.getAllByTestId('generationTiming'); + expect(generationTimings.length).toEqual(connectorIntervals.length); + + const expectedDates = [ + 'May 16, 2024 @ 14:13:09.838', + 'May 16, 2024 @ 13:59:49.620', + 'May 16, 2024 @ 13:47:00.629', + ]; + + generationTimings.forEach((timing, i) => expect(timing).toHaveTextContent(expectedDates[i])); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/index.test.tsx new file mode 100644 index 0000000000000..af6efafb3c1dd --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/index.test.tsx @@ -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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { LoadingCallout } from '.'; +import type { GenerationInterval } from '@kbn/elastic-assistant-common'; +import { TestProviders } from '../../../common/mock'; + +describe('LoadingCallout', () => { + const connectorIntervals: GenerationInterval[] = [ + { + date: '2024-05-16T14:13:09.838Z', + durationMs: 173648, + }, + { + date: '2024-05-16T13:59:49.620Z', + durationMs: 146605, + }, + { + date: '2024-05-16T13:47:00.629Z', + durationMs: 255163, + }, + ]; + + const defaultProps = { + alertsCount: 30, + approximateFutureTime: new Date(), + connectorIntervals, + }; + + it('renders the animated loading icon', () => { + render( + <TestProviders> + <LoadingCallout {...defaultProps} /> + </TestProviders> + ); + + const loadingElastic = screen.getByTestId('loadingElastic'); + + expect(loadingElastic).toBeInTheDocument(); + }); + + it('renders loading messages with the expected count', () => { + render( + <TestProviders> + <LoadingCallout {...defaultProps} /> + </TestProviders> + ); + + const aisCurrentlyAnalyzing = screen.getByTestId('aisCurrentlyAnalyzing'); + + expect(aisCurrentlyAnalyzing).toHaveTextContent( + 'AI is analyzing up to 30 alerts in the last 24 hours to generate discoveries.' + ); + }); + + it('renders the countdown', () => { + render( + <TestProviders> + <LoadingCallout {...defaultProps} /> + </TestProviders> + ); + const countdown = screen.getByTestId('countdown'); + + expect(countdown).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/info_popover_body/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/info_popover_body/index.test.tsx new file mode 100644 index 0000000000000..b264af94dcb1b --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/info_popover_body/index.test.tsx @@ -0,0 +1,55 @@ +/* + * 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 { GenerationInterval } from '@kbn/elastic-assistant-common'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { InfoPopoverBody } from '.'; +import { TestProviders } from '../../../../common/mock'; +import { AVERAGE_TIME } from '../countdown/translations'; + +describe('InfoPopoverBody', () => { + const connectorIntervals: GenerationInterval[] = [ + { + date: '2024-05-16T14:13:09.838Z', + durationMs: 173648, + }, + { + date: '2024-05-16T13:59:49.620Z', + durationMs: 146605, + }, + { + date: '2024-05-16T13:47:00.629Z', + durationMs: 255163, + }, + ]; + + it('renders the expected average time', () => { + render( + <TestProviders> + <InfoPopoverBody connectorIntervals={connectorIntervals} /> + </TestProviders> + ); + + const averageTimeBadge = screen.getByTestId('averageTimeBadge'); + + expect(averageTimeBadge).toHaveTextContent('191s'); + }); + + it('renders the expected explanation', () => { + render( + <TestProviders> + <InfoPopoverBody connectorIntervals={connectorIntervals} /> + </TestProviders> + ); + + const averageTimeIsCalculated = screen.getAllByTestId('averageTimeIsCalculated'); + + expect(averageTimeIsCalculated[0]).toHaveTextContent(AVERAGE_TIME); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/loading_messages/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/loading_messages/index.test.tsx new file mode 100644 index 0000000000000..250a25055791a --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/loading_messages/index.test.tsx @@ -0,0 +1,43 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { LoadingMessages } from '.'; +import { TestProviders } from '../../../../common/mock'; +import { ATTACK_DISCOVERY_GENERATION_IN_PROGRESS } from '../translations'; + +describe('LoadingMessages', () => { + it('renders the expected loading message', () => { + render( + <TestProviders> + <LoadingMessages alertsCount={20} /> + </TestProviders> + ); + const attackDiscoveryGenerationInProgress = screen.getByTestId( + 'attackDiscoveryGenerationInProgress' + ); + + expect(attackDiscoveryGenerationInProgress).toHaveTextContent( + ATTACK_DISCOVERY_GENERATION_IN_PROGRESS + ); + }); + + it('renders the loading message with the expected alerts count', () => { + render( + <TestProviders> + <LoadingMessages alertsCount={20} /> + </TestProviders> + ); + const aiCurrentlyAnalyzing = screen.getByTestId('aisCurrentlyAnalyzing'); + + expect(aiCurrentlyAnalyzing).toHaveTextContent( + 'AI is analyzing up to 20 alerts in the last 24 hours to generate discoveries.' + ); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/page_title/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/page_title/index.test.tsx new file mode 100644 index 0000000000000..0c8ea0501f2d3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/page_title/index.test.tsx @@ -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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { PageTitle } from '.'; +import { ATTACK_DISCOVERY_PAGE_TITLE } from './translations'; + +describe('PageTitle', () => { + it('renders the expected title', () => { + render(<PageTitle />); + + const attackDiscoveryPageTitle = screen.getByTestId('attackDiscoveryPageTitle'); + + expect(attackDiscoveryPageTitle).toHaveTextContent(ATTACK_DISCOVERY_PAGE_TITLE); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/summary/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/summary/index.test.tsx new file mode 100644 index 0000000000000..43134b14f616d --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/summary/index.test.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { fireEvent, render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Summary } from '.'; + +describe('Summary', () => { + const defaultProps = { + alertsCount: 20, + attackDiscoveriesCount: 5, + lastUpdated: new Date(), + onToggleShowAnonymized: jest.fn(), + showAnonymized: false, + }; + + beforeEach(() => jest.clearAllMocks()); + + it('renders the expected summary counts', () => { + render(<Summary {...defaultProps} />); + + const summaryCount = screen.getByTestId('summaryCount'); + + expect(summaryCount).toHaveTextContent('5 discoveries|20 alerts|Generated: a few seconds ago'); + }); + + it('renders the expected button icon when showAnonymized is false', () => { + render(<Summary {...defaultProps} />); + + const toggleAnonymized = screen.getByTestId('toggleAnonymized').querySelector('span'); + + expect(toggleAnonymized).toHaveAttribute('data-euiicon-type', 'eyeClosed'); + }); + + it('renders the expected button icon when showAnonymized is true', () => { + render(<Summary {...defaultProps} showAnonymized={true} />); + + const toggleAnonymized = screen.getByTestId('toggleAnonymized').querySelector('span'); + + expect(toggleAnonymized).toHaveAttribute('data-euiicon-type', 'eye'); + }); + + it('calls onToggleShowAnonymized when toggle button is clicked', () => { + render(<Summary {...defaultProps} />); + + const toggleAnonymized = screen.getByTestId('toggleAnonymized'); + fireEvent.click(toggleAnonymized); + + expect(defaultProps.onToggleShowAnonymized).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/summary_count/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/summary_count/index.test.tsx new file mode 100644 index 0000000000000..b8460eafef87b --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/summary_count/index.test.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { SummaryCount } from '.'; + +describe('SummaryCount', () => { + const defaultProps = { + alertsCount: 20, + attackDiscoveriesCount: 5, + lastUpdated: new Date(), + }; + + it('renders the expected count of attack discoveries', () => { + render(<SummaryCount {...defaultProps} />); + + const discoveriesCount = screen.getByTestId('discoveriesCount'); + + expect(discoveriesCount).toHaveTextContent('5 discoveries'); + }); + + it('renders the expected alerts count', () => { + render(<SummaryCount {...defaultProps} />); + + const alertsCount = screen.getByTestId('alertsCount'); + + expect(alertsCount).toHaveTextContent('20 alerts'); + }); + + it('renders a humanized last generated when lastUpdated is provided', () => { + render(<SummaryCount {...defaultProps} />); + + const lastGenerated = screen.getByTestId('lastGenerated'); + + expect(lastGenerated).toHaveTextContent('Generated: a few seconds ago'); + }); + + it('should NOT render the last generated date when lastUpdated is null', () => { + render(<SummaryCount {...defaultProps} lastUpdated={null} />); + + const lastGenerated = screen.queryByTestId('lastGenerated'); + + expect(lastGenerated).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/upgrade/index.test.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/upgrade/index.test.tsx new file mode 100644 index 0000000000000..e72f53e9062d7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/upgrade/index.test.tsx @@ -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 { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Upgrade } from '.'; +import { TestProviders } from '../../../common/mock'; +import { + ATTACK_DISCOVERY_IS_AVAILABLE, + FIND_POTENTIAL_ATTACKS_WITH_AI, + PLEASE_UPGRADE, +} from './translations'; + +describe('Upgrade', () => { + beforeEach(() => { + render( + <TestProviders> + <Upgrade /> + </TestProviders> + ); + }); + + it('renders the assistant avatar', () => { + const assistantAvatar = screen.getByTestId('assistantAvatar'); + + expect(assistantAvatar).toBeInTheDocument(); + }); + + it('renders the expected upgrade title', () => { + const upgradeTitle = screen.getByTestId('upgradeTitle'); + + expect(upgradeTitle).toHaveTextContent(FIND_POTENTIAL_ATTACKS_WITH_AI); + }); + + it('renders the attack discovery availability text', () => { + const attackDiscoveryIsAvailable = screen.getByTestId('attackDiscoveryIsAvailable'); + + expect(attackDiscoveryIsAvailable).toHaveTextContent(ATTACK_DISCOVERY_IS_AVAILABLE); + }); + + it('renders the please upgrade text', () => { + const pleaseUpgrade = screen.getByTestId('pleaseUpgrade'); + + expect(pleaseUpgrade).toHaveTextContent(PLEASE_UPGRADE); + }); + + it('renders the upgrade subscription plans (docs) link', () => { + const upgradeDocs = screen.getByRole('link', { name: 'Subscription plans' }); + + expect(upgradeDocs).toBeInTheDocument(); + }); + + it('renders the upgrade Manage license call to action', () => { + const upgradeCta = screen.getByRole('link', { name: 'Manage license' }); + + expect(upgradeCta).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/use_attack_discovery/helpers.test.ts b/x-pack/plugins/security_solution/public/attack_discovery/use_attack_discovery/helpers.test.ts new file mode 100644 index 0000000000000..a15cb7090f6cc --- /dev/null +++ b/x-pack/plugins/security_solution/public/attack_discovery/use_attack_discovery/helpers.test.ts @@ -0,0 +1,284 @@ +/* + * 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 { OpenAiProviderType } from '@kbn/stack-connectors-plugin/public/common'; +import type { ActionConnector } from '@kbn/triggers-actions-ui-plugin/public'; +import { omit } from 'lodash/fp'; + +import { getGenAiConfig, getRequestBody } from './helpers'; + +const connector: ActionConnector = { + actionTypeId: '.gen-ai', + config: { + apiProvider: 'Azure OpenAI', + apiUrl: + 'https://example.com/openai/deployments/example/chat/completions?api-version=2024-02-15-preview', + }, + id: '15b4f8df-e2ca-4060-81a1-3bd2a2bffc7e', + isDeprecated: false, + isMissingSecrets: false, + isPreconfigured: false, + isSystemAction: false, + name: 'Azure OpenAI GPT-4o', + secrets: { secretTextField: 'a secret' }, +}; + +describe('getGenAiConfig', () => { + it('returns undefined when the connector is preconfigured', () => { + const preconfigured = { + ...connector, + isPreconfigured: true, + }; + + const result = getGenAiConfig(preconfigured); + + expect(result).toBeUndefined(); + }); + + it('returns the expected GenAiConfig when the connector is NOT preconfigured', () => { + const result = getGenAiConfig(connector); + + expect(result).toEqual({ + apiProvider: connector.config.apiProvider, + apiUrl: connector.config.apiUrl, + defaultModel: '2024-02-15-preview', + }); + }); + + it('returns the expected defaultModel for Azure OpenAI', () => { + const result = getGenAiConfig(connector); + + expect(result).toEqual({ + apiProvider: connector.config.apiProvider, + apiUrl: connector.config.apiUrl, + defaultModel: '2024-02-15-preview', + }); + }); + + it('returns the an undefined defaultModel for NON-Azure OpenAI when the config does NOT include a default model', () => { + const apiProvider = 'OpenAI'; // <-- NON-Azure OpenAI + const openAiConnector = { + ...connector, + config: { + ...connector.config, + apiProvider, + // config does NOT have a default model + }, + }; + + const result = getGenAiConfig(openAiConnector); + + expect(result).toEqual({ + apiProvider, + apiUrl: connector.config.apiUrl, + defaultModel: undefined, // <-- because the config does not have a default model + }); + }); + + it('returns the expected defaultModel for NON-Azure OpenAi when the config has a default model', () => { + const apiProvider = 'OpenAI'; // <-- NON-Azure OpenAI + const withDefaultModel = { + ...connector, + config: { + ...connector.config, + apiProvider, + defaultModel: 'aDefaultModel', // <-- default model is specified + }, + }; + + const result = getGenAiConfig(withDefaultModel); + + expect(result).toEqual({ + apiProvider, + apiUrl: connector.config.apiUrl, + defaultModel: 'aDefaultModel', + }); + }); + + it('returns the expected GenAiConfig when the connector config is undefined', () => { + const connectorWithoutConfig = omit('config', connector) as ActionConnector< + Record<string, unknown>, + Record<string, unknown> + >; + + const result = getGenAiConfig(connectorWithoutConfig); + + expect(result).toEqual({ + apiProvider: undefined, + apiUrl: undefined, + defaultModel: undefined, + }); + }); +}); + +describe('getRequestBody', () => { + const alertsIndexPattern = 'test-index-pattern'; + const anonymizationFields = { + page: 1, + perPage: 10, + total: 100, + data: [ + { + id: '1', + field: 'field1', + }, + { + id: '2', + field: 'field2', + }, + ], + }; + const knowledgeBase = { + isEnabledKnowledgeBase: true, + isEnabledRAGAlerts: true, + latestAlerts: 20, + }; + const traceOptions = { + apmUrl: '/app/apm', + langSmithProject: '', + langSmithApiKey: '', + }; + + it('returns the expected AttackDiscoveryPostRequestBody', () => { + const result = getRequestBody({ + alertsIndexPattern, + anonymizationFields, + knowledgeBase, + traceOptions, + }); + + expect(result).toEqual({ + alertsIndexPattern, + anonymizationFields: anonymizationFields.data, + apiConfig: { + actionTypeId: '', + connectorId: '', + model: undefined, + provider: undefined, + }, + langSmithProject: undefined, + langSmithApiKey: undefined, + size: knowledgeBase.latestAlerts, + replacements: {}, + subAction: 'invokeAI', + }); + }); + + it('returns the expected AttackDiscoveryPostRequestBody when alertsIndexPattern is undefined', () => { + const result = getRequestBody({ + alertsIndexPattern: undefined, + anonymizationFields, + knowledgeBase, + traceOptions, + }); + + expect(result).toEqual({ + alertsIndexPattern: '', + anonymizationFields: anonymizationFields.data, + apiConfig: { + actionTypeId: '', + connectorId: '', + model: undefined, + provider: undefined, + }, + langSmithProject: undefined, + langSmithApiKey: undefined, + size: knowledgeBase.latestAlerts, + replacements: {}, + subAction: 'invokeAI', + }); + }); + + it('returns the expected AttackDiscoveryPostRequestBody when LangSmith details are provided', () => { + const withLangSmith = { + alertsIndexPattern, + anonymizationFields, + knowledgeBase, + traceOptions: { + apmUrl: '/app/apm', + langSmithProject: 'A project', + langSmithApiKey: 'an API key', + }, + }; + + const result = getRequestBody(withLangSmith); + + expect(result).toEqual({ + alertsIndexPattern, + anonymizationFields: anonymizationFields.data, + apiConfig: { + actionTypeId: '', + connectorId: '', + model: undefined, + provider: undefined, + }, + langSmithApiKey: withLangSmith.traceOptions.langSmithApiKey, + langSmithProject: withLangSmith.traceOptions.langSmithProject, + size: knowledgeBase.latestAlerts, + replacements: {}, + subAction: 'invokeAI', + }); + }); + + it('returns the expected AttackDiscoveryPostRequestBody with the expected apiConfig when selectedConnector is provided', () => { + const result = getRequestBody({ + alertsIndexPattern, + anonymizationFields, + knowledgeBase, + selectedConnector: connector, // <-- selectedConnector is provided + traceOptions, + }); + + expect(result).toEqual({ + alertsIndexPattern, + anonymizationFields: anonymizationFields.data, + apiConfig: { + actionTypeId: connector.actionTypeId, + connectorId: connector.id, + model: undefined, + provider: undefined, + }, + langSmithProject: undefined, + langSmithApiKey: undefined, + size: knowledgeBase.latestAlerts, + replacements: {}, + subAction: 'invokeAI', + }); + }); + + it('returns the expected AttackDiscoveryPostRequestBody with the expected apiConfig when genAiConfig is provided', () => { + const genAiConfig = { + apiProvider: OpenAiProviderType.AzureAi, + defaultModel: '2024-02-15-preview', + }; + + const result = getRequestBody({ + alertsIndexPattern, + anonymizationFields, + genAiConfig, // <-- genAiConfig is provided + knowledgeBase, + selectedConnector: connector, // <-- selectedConnector is provided + traceOptions, + }); + + expect(result).toEqual({ + alertsIndexPattern, + anonymizationFields: anonymizationFields.data, + apiConfig: { + actionTypeId: connector.actionTypeId, + connectorId: connector.id, + model: genAiConfig.defaultModel, + provider: genAiConfig.apiProvider, + }, + langSmithProject: undefined, + langSmithApiKey: undefined, + size: knowledgeBase.latestAlerts, + replacements: {}, + subAction: 'invokeAI', + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.test.ts new file mode 100644 index 0000000000000..6b7526870eb9f --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.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 { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; + +import { getAnonymizedAlerts } from './get_anonymized_alerts'; +import { mockOpenAndAcknowledgedAlertsQueryResults } from '../mock/mock_open_and_acknowledged_alerts_query_results'; +import { getOpenAndAcknowledgedAlertsQuery } from '../open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query'; +import { MIN_SIZE } from '../open_and_acknowledged_alerts/helpers'; + +jest.mock('../open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query', () => { + const original = jest.requireActual( + '../open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query' + ); + + return { + getOpenAndAcknowledgedAlertsQuery: jest.fn(() => original), + }; +}); + +describe('getAnonymizedAlerts', () => { + const alertsIndexPattern = '.alerts-security.alerts-default'; + const mockAnonymizationFields = [ + { + id: '9f95b649-f20e-4edf-bd76-1d21ab6f8e2e', + timestamp: '2024-05-06T22:16:48.489Z', + field: '_id', + allowed: true, + anonymized: false, + createdAt: '2024-05-06T22:16:48.489Z', + namespace: 'default', + }, + { + id: '22f23471-4f6a-4cec-9b2a-cf270ffb53d5', + timestamp: '2024-05-06T22:16:48.489Z', + field: 'host.name', + allowed: true, + anonymized: true, + createdAt: '2024-05-06T22:16:48.489Z', + namespace: 'default', + }, + ]; + const mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); + const mockReplacements = { + replacement1: 'SRVMAC08', + replacement2: 'SRVWIN01', + replacement3: 'SRVWIN02', + }; + const size = 10; + + beforeEach(() => { + jest.clearAllMocks(); + + (mockEsClient.search as unknown as jest.Mock).mockResolvedValue( + mockOpenAndAcknowledgedAlertsQueryResults + ); + }); + + it('returns an empty array when alertsIndexPattern is not provided', async () => { + const result = await getAnonymizedAlerts({ + esClient: mockEsClient, + size, + }); + + expect(result).toEqual([]); + }); + + it('should return an empty array when size is not provided', async () => { + const result = await getAnonymizedAlerts({ + alertsIndexPattern, + esClient: mockEsClient, + }); + + expect(result).toEqual([]); + }); + + it('should return an empty array when size is out of range', async () => { + const outOfRange = MIN_SIZE - 1; + + const result = await getAnonymizedAlerts({ + alertsIndexPattern, + esClient: mockEsClient, + size: outOfRange, + }); + + expect(result).toEqual([]); + }); + + it('calls getOpenAndAcknowledgedAlertsQuery with the provided anonymizationFields', async () => { + await getAnonymizedAlerts({ + alertsIndexPattern, + anonymizationFields: mockAnonymizationFields, + esClient: mockEsClient, + replacements: mockReplacements, + size, + }); + + expect(getOpenAndAcknowledgedAlertsQuery).toHaveBeenCalledWith({ + alertsIndexPattern, + anonymizationFields: mockAnonymizationFields, + size, + }); + }); + + it('calls getOpenAndAcknowledgedAlertsQuery with empty anonymizationFields when they are NOT provided', async () => { + await getAnonymizedAlerts({ + alertsIndexPattern, + esClient: mockEsClient, + replacements: mockReplacements, + size, + }); + + expect(getOpenAndAcknowledgedAlertsQuery).toHaveBeenCalledWith({ + alertsIndexPattern, + anonymizationFields: [], + size, + }); + }); + + it('returns the expected transformed (anonymized) raw data', async () => { + const result = await getAnonymizedAlerts({ + alertsIndexPattern, + anonymizationFields: mockAnonymizationFields, + esClient: mockEsClient, + replacements: mockReplacements, + size, + }); + + expect(result).toEqual([ + '_id,b6e883c29b32571aaa667fa13e65bbb4f95172a2b84bdfb85d6f16c72b2d2560\nhost.name,replacement1', + '_id,0215a6c5cc9499dd0290cd69a4947efb87d3ddd8b6385a766d122c2475be7367\nhost.name,replacement1', + '_id,600eb9eca925f4c5b544b4e9d3cf95d83b7829f8f74c5bd746369cb4c2968b9a\nhost.name,replacement1', + '_id,e1f4a4ed70190eb4bd256c813029a6a9101575887cdbfa226ac330fbd3063f0c\nhost.name,replacement1', + '_id,2a7a4809ca625dfe22ccd35fbef7a7ba8ed07f109e5cbd17250755cfb0bc615f\nhost.name,replacement1', + '_id,2a9f7602de8656d30dda0ddcf79e78037ac2929780e13d5b2047b3bedc40bb69\nhost.name,replacement1', + '_id,4615c3a90e8057ae5cc9b358bbbf4298e346277a2f068dda052b0b43ef6d5bbd\nhost.name,replacement1', + '_id,449322a72d3f19efbdf983935a1bdd21ebd6b9c761ce31e8b252003017d7e5db\nhost.name,replacement1', + '_id,f465ca9fbfc8bc3b1871e965c9e111cac76ff3f4076fed6bc9da88d49fb43014\nhost.name,replacement3', + '_id,aa283e6a13be77b533eceffb09e48254c8f91feeccc39f7eed80fd3881d053f4\nhost.name,replacement3', + '_id,dd9e4ea23961ccfdb7a9c760ee6bedd19a013beac3b0d38227e7ae77ba4ce515\nhost.name,replacement3', + '_id,f30d55e503b1d848b34ee57741b203d8052360dd873ea34802f3fa7a9ef34d0a\nhost.name,replacement3', + '_id,6f8cd5e8021dbb64598f2b7ec56bee21fd00d1e62d4e08905f86bf234873ee66\nhost.name,replacement3', + '_id,ce110da958fe0cf0c07599a21c68d90a64c93b7607aa27970a614c7f49598316\nhost.name,replacement3', + '_id,0866787b0027b4d908767ac16e35a1da00970c83632ba85be65f2ad371132b4f\nhost.name,replacement3', + '_id,b0fdf96721e361e1137d49a67e26d92f96b146392d7f44322bddc3d660abaef1\nhost.name,replacement3', + '_id,7b4f49f21cf141e67856d3207fb4ea069c8035b41f0ea501970694cf8bd43cbe\nhost.name,replacement3', + '_id,ea81d79104cbd442236b5bcdb7a3331de897aa4ce1523e622068038d048d0a9e\nhost.name,replacement3', + '_id,cdf3b5510bb5ed622e8cefd1ce6bedc52bdd99a4c1ead537af0603469e713c8b\nhost.name,replacement2', + '_id,6abe81eb6350fb08031761be029e7ab19f7e577a7c17a9c5ea1ed010ba1620e3\nhost.name,replacement2', + ]); + }); + + it('calls onNewReplacements for every alert', async () => { + const onNewReplacements = jest.fn(); + + await getAnonymizedAlerts({ + alertsIndexPattern, + anonymizationFields: mockAnonymizationFields, + esClient: mockEsClient, + onNewReplacements, + replacements: mockReplacements, + size, + }); + + expect(onNewReplacements).toHaveBeenCalledTimes(20); // 20 alerts in mockOpenAndAcknowledgedAlertsQueryResults + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.ts b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.ts index 933a7ab55b924..5989caf439518 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_anonymized_alerts.ts @@ -28,7 +28,7 @@ export const getAnonymizedAlerts = async ({ onNewReplacements?: (replacements: Replacements) => void; replacements?: Replacements; size?: number; -}) => { +}): Promise<string[]> => { if (alertsIndexPattern == null || size == null || sizeIsOutOfRange(size)) { return []; } diff --git a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_attack_discovery_prompt.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_attack_discovery_prompt.test.ts new file mode 100644 index 0000000000000..bc290bf172382 --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_attack_discovery_prompt.test.ts @@ -0,0 +1,30 @@ +/* + * 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 { getAttackDiscoveryPrompt } from './get_attack_discovery_prompt'; + +describe('getAttackDiscoveryPrompt', () => { + it('should generate the correct attack discovery prompt', () => { + const anonymizedAlerts = ['Alert 1', 'Alert 2', 'Alert 3']; + + const expected = `You are a cyber security analyst tasked with analyzing security events from Elastic Security to identify and report on potential cyber attacks or progressions. Your report should focus on high-risk incidents that could severely impact the organization, rather than isolated alerts. Present your findings in a way that can be easily understood by anyone, regardless of their technical expertise, as if you were briefing the CISO. Break down your response into sections based on timing, hosts, and users involved. When correlating alerts, use kibana.alert.original_time when it's available, otherwise use @timestamp. Include appropriate context about the affected hosts and users. Describe how the attack progression might have occurred and, if feasible, attribute it to known threat groups. Prioritize high and critical alerts, but include lower-severity alerts if desired. In the description field, provide as much detail as possible, in a bulleted list explaining any attack progressions. Accuracy is of utmost importance. Escape backslashes to respect JSON validation. New lines must always be escaped with double backslashes, i.e. \\\\n to ensure valid JSON. Only return JSON output, as described above. Do not add any additional text to describe your output. + +Use context from the following open and acknowledged alerts to provide insights: + +""" +Alert 1 + +Alert 2 + +Alert 3 +""" +`; + + const prompt = getAttackDiscoveryPrompt({ anonymizedAlerts }); + + expect(prompt).toEqual(expected); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_output_parser.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_output_parser.test.ts new file mode 100644 index 0000000000000..446611f87ea6a --- /dev/null +++ b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/get_output_parser.test.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 { getOutputParser } from './get_output_parser'; + +describe('getOutputParser', () => { + it('returns a structured output parser with the expected format instructions', () => { + const outputParser = getOutputParser(); + + const expected = `You must format your output as a JSON value that adheres to a given \"JSON Schema\" instance. + +\"JSON Schema\" is a declarative language that allows you to annotate and validate JSON documents. + +For example, the example \"JSON Schema\" instance {{\"properties\": {{\"foo\": {{\"description\": \"a list of test words\", \"type\": \"array\", \"items\": {{\"type\": \"string\"}}}}}}, \"required\": [\"foo\"]}}}} +would match an object with one required property, \"foo\". The \"type\" property specifies \"foo\" must be an \"array\", and the \"description\" property semantically describes it as \"a list of test words\". The items within \"foo\" must be strings. +Thus, the object {{\"foo\": [\"bar\", \"baz\"]}} is a well-formatted instance of this example \"JSON Schema\". The object {{\"properties\": {{\"foo\": [\"bar\", \"baz\"]}}}} is not well-formatted. + +Your output will be parsed and type-checked according to the provided schema instance, so make sure all fields in your output match the schema exactly and there are no trailing commas! + +Here is the JSON Schema instance your output must adhere to. Include the enclosing markdown codeblock: +\`\`\`json +{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"alertIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The alert IDs that the insight is based on.\"},\"detailsMarkdown\":{\"type\":\"string\",\"description\":\"A detailed insight with markdown that always uses special {{ field.name fieldValue1 fieldValue2 fieldValueN }} syntax for field names and values from the source data. Examples of CORRECT syntax (includes field names and values): {{ host.name hostNameValue }} {{ user.name userNameValue }} {{ source.ip sourceIpValue }} Examples of INCORRECT syntax (bad, because the field names are not included): {{ hostNameValue }} {{ userNameValue }} {{ sourceIpValue }}\"},\"entitySummaryMarkdown\":{\"type\":\"string\",\"description\":\"A short (no more than a sentence) summary of the insight featuring only the host.name and user.name fields (when they are applicable), using the same {{ field.name fieldValue1 fieldValue2 fieldValueN }} syntax\"},\"mitreAttackTactics\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"An array of MITRE ATT&CK tactic for the insight, using one of the following values: Reconnaissance,Initial Access,Execution,Persistence,Privilege Escalation,Discovery,Lateral Movement,Command and Control,Exfiltration\"},\"summaryMarkdown\":{\"type\":\"string\",\"description\":\"A markdown summary of insight, using the same {{ field.name fieldValue1 fieldValue2 fieldValueN }} syntax\"},\"title\":{\"type\":\"string\",\"description\":\"A short, no more than 7 words, title for the insight, NOT formatted with special syntax or markdown. This must be as brief as possible.\"}},\"required\":[\"alertIds\",\"detailsMarkdown\",\"summaryMarkdown\",\"title\"],\"additionalProperties\":false},\"description\":\"Insights with markdown that always uses special {{ field.name fieldValue1 fieldValue2 fieldValueN }} syntax for field names and values from the source data. Examples of CORRECT syntax (includes field names and values): {{ host.name hostNameValue }} {{ user.name userNameValue }} {{ source.ip sourceIpValue }} Examples of INCORRECT syntax (bad, because the field names are not included): {{ hostNameValue }} {{ userNameValue }} {{ sourceIpValue }}\",\"$schema\":\"http://json-schema.org/draft-07/schema#\"} +\`\`\` +`; + + expect(outputParser.getFormatInstructions()).toEqual(expected); + }); +}); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/helpers.ts b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/helpers.ts deleted file mode 100644 index fd5d4cc668df8..0000000000000 --- a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/helpers.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { Replacements } from '@kbn/elastic-assistant-common'; - -export const getReplacementsRecords = ( - replacements: Array<{ value: string; uuid: string }> -): Replacements => - replacements.reduce<Record<string, string>>( - (acc, { value, uuid }) => ({ ...acc, [uuid]: value }), - {} - ); - -export const getReplacementsArray = ( - replacements: Replacements -): Array<{ value: string; uuid: string }> => - Object.entries(replacements).map(([uuid, value]) => ({ uuid, value })); From 97c57b6e5e0d581afa832a80f5925918b143ddf4 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:05:55 +1000 Subject: [PATCH 09/40] [api-docs] 2024-06-26 Daily api_docs build (#186941) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/749 --- 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 | 4 +- 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 | 7 +- api_docs/deprecations_by_plugin.mdx | 4 +- 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.devdocs.json | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.devdocs.json | 6 +- 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/fields_metadata.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/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/investigate.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_collection_utils.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 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- .../kbn_core_analytics_browser.devdocs.json | 52 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- .../kbn_core_analytics_server.devdocs.json | 52 +- 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 | 8 + 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.devdocs.json | 52 +- api_docs/kbn_ebt.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 +- .../kbn_elastic_assistant_common.devdocs.json | 384 ++++- api_docs/kbn_elastic_assistant_common.mdx | 4 +- 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_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- 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 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.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 +- ...n_security_api_key_management.devdocs.json | 1259 +++++++++++++++++ api_docs/kbn_security_api_key_management.mdx | 39 + .../kbn_security_form_components.devdocs.json | 727 ++++++++++ api_docs/kbn_security_form_components.mdx | 36 + api_docs/kbn_security_hardening.mdx | 2 +- ..._security_plugin_types_common.devdocs.json | 510 +++++++ api_docs/kbn_security_plugin_types_common.mdx | 4 +- ..._security_plugin_types_public.devdocs.json | 12 - api_docs/kbn_security_plugin_types_public.mdx | 2 +- ..._security_plugin_types_server.devdocs.json | 340 +++++ api_docs/kbn_security_plugin_types_server.mdx | 4 +- 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_unsaved_changes_prompt.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.devdocs.json | 305 +--- api_docs/observability.mdx | 7 +- 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 | 20 +- 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_homepage.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.devdocs.json | 77 +- api_docs/security.mdx | 4 +- 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 +- 715 files changed, 4216 insertions(+), 1083 deletions(-) create mode 100644 api_docs/kbn_security_api_key_management.devdocs.json create mode 100644 api_docs/kbn_security_api_key_management.mdx create mode 100644 api_docs/kbn_security_form_components.devdocs.json create mode 100644 api_docs/kbn_security_form_components.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 09effcc15af47..3ef2b2c496a05 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-25 +date: 2024-06-26 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 48b12cc676e37..62d47283f9ab1 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-25 +date: 2024-06-26 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 f605d5d9e57a4..dba116e3caa06 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-25 +date: 2024-06-26 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 20975c87cb9f2..31060eb64d799 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-25 +date: 2024-06-26 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 0ec3086f3f527..a93f6b38c2c5f 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.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 | |-------------------|-----------|------------------------|-----------------| -| 868 | 1 | 836 | 54 | +| 868 | 1 | 836 | 52 | ## Client diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index ff183ce581e53..80985ba0dc051 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-25 +date: 2024-06-26 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 dcdaecf32f2c7..468e11668d99e 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-25 +date: 2024-06-26 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 69fd08bb29522..c0b8edc34d032 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-25 +date: 2024-06-26 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 6dbb347ac11de..19b4157343964 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-25 +date: 2024-06-26 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 738294d2c30c5..209c7695ca893 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-25 +date: 2024-06-26 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 dd8917ee7a9b5..c0be563d174e3 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-25 +date: 2024-06-26 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 c5be47417d2f7..f77526228d134 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-25 +date: 2024-06-26 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 724038e9c7a21..f2bcceb644b68 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-25 +date: 2024-06-26 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 beafd08efa8ba..79cbe0081b402 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-25 +date: 2024-06-26 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 ad1714a4df84e..64638ed59922a 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-25 +date: 2024-06-26 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 c7c82da516b1d..86a4e03e2145f 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-25 +date: 2024-06-26 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 3ae901b64378e..0bcd8635d0b15 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-25 +date: 2024-06-26 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 be4dd137fb094..7fdc7e7c2c81d 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-25 +date: 2024-06-26 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 01e9aff3e226f..4372f9bcb9599 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-25 +date: 2024-06-26 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 6c67b8414c935..e46fa3d66c8c5 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-25 +date: 2024-06-26 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 beaa579ae1344..ef76d532876ff 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-25 +date: 2024-06-26 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 8d4f10f17d3a0..2f432ddb602e2 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-25 +date: 2024-06-26 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 fad021c4ef14d..bf0601e2ae19a 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-25 +date: 2024-06-26 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 adc7ea958c63d..f09873b00f6fe 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-25 +date: 2024-06-26 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 8e63d3a47eccb..19f044031fd34 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-25 +date: 2024-06-26 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 3a92ada15257a..deed8dbdaaa6a 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-25 +date: 2024-06-26 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 33e5dc706f470..525b7e1ac6a42 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-25 +date: 2024-06-26 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 c50fe3222ed9b..20286f2260754 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-25 +date: 2024-06-26 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 e05f16328e36e..89a6d3496bbaa 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-25 +date: 2024-06-26 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 1bac0c37fc642..faffcf8fff74d 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-25 +date: 2024-06-26 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 a2fc2abe24162..7dfc13ecbd9df 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-25 +date: 2024-06-26 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 c6ca168d93386..2120e2a767d7d 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-25 +date: 2024-06-26 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 9a6c35d7ada99..c2e2adab9a422 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-25 +date: 2024-06-26 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 da378dbbbf881..b034b5a027e1d 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-25 +date: 2024-06-26 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 69f42503ddbdd..2fe52912d71c3 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-25 +date: 2024-06-26 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 718d37eb4a914..165846fd25365 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -50,7 +50,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibTimelinesPluginApi" section="def-common.IndexFieldsStrategyResponse" text="IndexFieldsStrategyResponse"/> | securitySolution | - | | <DocLink id="kibKbnCoreSavedObjectsCommonPluginApi" section="def-common.SavedObject" text="SavedObject"/> | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, home, savedObjectsTagging, canvas, savedObjects, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-import-export-server-internal, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-ui-settings-server-internal | - | | <DocLink id="kibKbnCoreSavedObjectsServerPluginApi" section="def-common.SavedObjectsType.convertToMultiNamespaceTypeVersion" text="convertToMultiNamespaceTypeVersion"/> | @kbn/core-saved-objects-migration-server-internal, actions, dataViews, data, alerting, lens, cases, savedSearch, canvas, savedObjectsTagging, graph, lists, maps, visualizations, securitySolution, dashboard, @kbn/core-test-helpers-so-type-serializer | - | -| <DocLink id="kibKbnSecurityPluginTypesPublicPluginApi" section="def-public.SecurityPluginStart.authc" text="authc"/> | dataViews, security, maps, imageEmbeddable, securitySolution, serverlessSearch, cloudLinks, observabilityAIAssistantApp, cases, apm | - | +| <DocLink id="kibKbnSecurityPluginTypesPublicPluginApi" section="def-public.SecurityPluginStart.authc" text="authc"/> | dataViews, security, imageEmbeddable, securitySolution, serverlessSearch, cloudLinks, observabilityAIAssistantApp, cases, apm | - | | <DocLink id="kibKbnSecurityPluginTypesPublicPluginApi" section="def-public.SecurityPluginStart.userProfiles" text="userProfiles"/> | security, cases, searchPlayground, securitySolution | - | | <DocLink id="kibKbnSecuritysolutionListConstantsPluginApi" section="def-common.ENDPOINT_TRUSTED_APPS_LIST_ID" text="ENDPOINT_TRUSTED_APPS_LIST_ID"/> | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - | | <DocLink id="kibKbnSecuritysolutionListConstantsPluginApi" section="def-common.ENDPOINT_TRUSTED_APPS_LIST_NAME" text="ENDPOINT_TRUSTED_APPS_LIST_NAME"/> | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - | @@ -118,7 +118,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnPresentationPublishingPluginApi" section="def-common.apiHasLegacyLibraryTransforms" text="apiHasLegacyLibraryTransforms"/> | dashboard | - | | <DocLink id="kibKbnPresentationPublishingPluginApi" section="def-common.HasLegacyLibraryTransforms" text="HasLegacyLibraryTransforms"/> | embeddable, dashboard | - | | <DocLink id="kibKbnPresentationPublishingPluginApi" section="def-common.HasLibraryTransforms" text="HasLibraryTransforms"/> | dashboard, maps | - | -| <DocLink id="kibSecurityPluginApi" section="def-public.SecurityPluginSetup.authc" text="authc"/> | dataVisualizer, security | - | | <DocLink id="kibDataPluginApi" section="def-common.DataView.flattenHit" text="flattenHit"/> | dataViews, maps | - | | <DocLink id="kibDataPluginApi" section="def-common.DataView.removeScriptedField" text="removeScriptedField"/> | dataViews, dataViewManagement | - | | <DocLink id="kibDataPluginApi" section="def-common.DataView.getScriptedFields" text="getScriptedFields"/> | dataViews, dataViewManagement | - | @@ -151,6 +150,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibExpressionPartitionVisPluginApi" section="def-common.LabelsParams.truncate" text="truncate"/> | visTypePie | - | | <DocLink id="kibExpressionPartitionVisPluginApi" section="def-common.LabelsParams.last_level" text="last_level"/> | visTypePie | - | | <DocLink id="kibKbnCoreLoggingServerPluginApi" section="def-common.NumericRollingStrategyConfig.max" text="max"/> | @kbn/core-logging-server-internal, security | - | +| <DocLink id="kibKbnSecurityPluginTypesPublicPluginApi" section="def-public.SecurityPluginSetup.authc" text="authc"/> | security | - | | <DocLink id="kibKibanaReactPluginApi" section="def-public.toMountPoint" text="toMountPoint"/> | observabilityShared | - | | <DocLink id="kibKibanaReactPluginApi" section="def-common.KibanaStyledComponentsThemeProviderDecorator" text="KibanaStyledComponentsThemeProviderDecorator"/> | @kbn/react-kibana-context-styled, kibanaReact | - | | <DocLink id="kibKbnCoreSavedObjectsServerPluginApi" section="def-common.SavedObjectMigrationContext.convertToMultiNamespaceTypeVersion" text="convertToMultiNamespaceTypeVersion"/> | encryptedSavedObjects | - | @@ -232,6 +232,7 @@ Safe to remove. | <DocLink id="kibListsPluginApi" section="def-server.ListClient.setListPolicy" text="setListPolicy"/> | lists | | <DocLink id="kibListsPluginApi" section="def-server.ListClient.setListItemPolicy" text="setListItemPolicy"/> | lists | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectsStart.SavedObjectClass" text="SavedObjectClass"/> | savedObjects | +| <DocLink id="kibSecurityPluginApi" section="def-public.SecurityPluginSetup.authc" text="authc"/> | security | | <DocLink id="kibServerlessPluginApi" section="def-public.ServerlessPluginStart.setSideNavComponentDeprecated" text="setSideNavComponentDeprecated"/> | serverless | | <DocLink id="kibTaskManagerPluginApi" section="def-server.ConcreteTaskInstance.interval" text="interval"/> | taskManager | | <DocLink id="kibTaskManagerPluginApi" section="def-server.ConcreteTaskInstance.numSkippedRuns" text="numSkippedRuns"/> | taskManager | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 611c05d483811..6a9c021aa0aad 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -713,7 +713,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | <DocLink id="kibDataPluginApi" section="def-public.DataPublicPluginStart.fieldFormats" text="fieldFormats"/> | [document_stats.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/document_stats.tsx#:~:text=fieldFormats), [distinct_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/distinct_values.tsx#:~:text=fieldFormats), [top_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx#:~:text=fieldFormats), [choropleth_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx#:~:text=fieldFormats), [default_value_formatter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts#:~:text=fieldFormats) | - | | <DocLink id="kibDataViewsPluginApi" section="def-common.AbstractDataView.title" text="title"/> | [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title) | - | -| <DocLink id="kibSecurityPluginApi" section="def-public.SecurityPluginSetup.authc" text="authc"/> | [filebeat_config_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx#:~:text=authc), [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=authc), [filebeat_config_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx#:~:text=authc), [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=authc) | - | | <DocLink id="kibKbnCoreLifecycleBrowserPluginApi" section="def-common.CoreStart.savedObjects" text="savedObjects"/> | [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=savedObjects) | - | | <DocLink id="kibKbnCoreSavedObjectsApiBrowserPluginApi" section="def-common.SimpleSavedObject" text="SimpleSavedObject"/> | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject) | - | @@ -1078,7 +1077,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnCoreSavedObjectsServerPluginApi" section="def-common.SavedObjectsType.migrations" text="migrations"/> | [setup_saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts#:~:text=migrations) | - | | <DocLink id="kibKbnCoreSavedObjectsServerPluginApi" section="def-common.SavedObjectsType.convertToMultiNamespaceTypeVersion" text="convertToMultiNamespaceTypeVersion"/> | [setup_saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | | <DocLink id="kibKbnPresentationPublishingPluginApi" section="def-common.HasLibraryTransforms" text="HasLibraryTransforms"/> | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/react_embeddable/types.ts#:~:text=HasLibraryTransforms), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/react_embeddable/types.ts#:~:text=HasLibraryTransforms), [library_transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/react_embeddable/library_transforms.ts#:~:text=HasLibraryTransforms), [library_transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/react_embeddable/library_transforms.ts#:~:text=HasLibraryTransforms) | - | -| <DocLink id="kibKbnSecurityPluginTypesPublicPluginApi" section="def-public.SecurityPluginStart.authc" text="authc"/> | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=authc) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0bfc05484d357..e877b7cdd5c8d 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index a8b40ae0098bc..28b657f608f0a 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-25 +date: 2024-06-26 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 10c2f66afeef5..d27dcb0c6139f 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-25 +date: 2024-06-26 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 3fd6c6649a60e..2a44324508a68 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-25 +date: 2024-06-26 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 2640f05cc8fbb..36b405044c23e 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-25 +date: 2024-06-26 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 b7a3e2d32f549..025cc7cffe416 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.devdocs.json b/api_docs/elastic_assistant.devdocs.json index e543e43a16801..595bd103d2f58 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -1609,7 +1609,7 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - "<unknown, unknown, { actionTypeId: string; subAction: \"invokeAI\" | \"invokeStream\"; replacements: {} & { [k: string]: string; }; conversationId?: string | undefined; message?: string | undefined; model?: string | undefined; alertsIndexPattern?: string | undefined; allow?: string[] | undefined; allowReplacement?: string[] | undefined; isEnabledKnowledgeBase?: boolean | undefined; isEnabledRAGAlerts?: boolean | undefined; size?: number | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; } | { connectorId: string; actionTypeId: string; size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }, any>" + "<unknown, unknown, { actionTypeId: string; subAction: \"invokeAI\" | \"invokeStream\"; replacements: {} & { [k: string]: string; }; conversationId?: string | undefined; message?: string | undefined; model?: string | undefined; alertsIndexPattern?: string | undefined; allow?: string[] | undefined; allowReplacement?: string[] | undefined; isEnabledKnowledgeBase?: boolean | undefined; isEnabledRAGAlerts?: boolean | undefined; size?: number | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; } | { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }, any>" ], "path": "x-pack/plugins/elastic_assistant/server/types.ts", "deprecated": false, diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index a27396eceb10f..0fb7c1937c495 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-25 +date: 2024-06-26 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 4a1e1892ac1f2..3c424595ae96c 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-25 +date: 2024-06-26 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 800f74a30629e..651a1579787e7 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-25 +date: 2024-06-26 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 325761a3d9299..4e8f583f003ec 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-25 +date: 2024-06-26 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 a98d68f483e1e..7df2979fd0bc2 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-25 +date: 2024-06-26 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 044157fb69d1a..5120eb114e92d 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 56d8ec14e06f7..2139d70dfc720 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index ed65e311f907e..0c426207a66f6 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-25 +date: 2024-06-26 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 7b5b2548279c0..6e43569ae6c21 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.devdocs.json b/api_docs/event_log.devdocs.json index 76c10e0330333..5ffc692e82fb7 100644 --- a/api_docs/event_log.devdocs.json +++ b/api_docs/event_log.devdocs.json @@ -1450,7 +1450,7 @@ "label": "data", "description": [], "signature": [ - "(Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; category?: string | undefined; description?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" + "(Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; category?: string | undefined; description?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; provider?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" ], "path": "x-pack/plugins/event_log/server/es/cluster_client_adapter.ts", "deprecated": false, @@ -1470,7 +1470,7 @@ "label": "IEvent", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; category?: string | undefined; description?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; category?: string | undefined; description?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; provider?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, @@ -1485,7 +1485,7 @@ "label": "IValidatedEvent", "description": [], "signature": [ - "Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; category?: string | undefined; description?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined" + "Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; category?: string | undefined; description?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; provider?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index cf2c837e2df51..096325f1df979 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-25 +date: 2024-06-26 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 058ae8b436beb..86843f83c7398 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-25 +date: 2024-06-26 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 b039d717055c2..7af6805150c9f 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-25 +date: 2024-06-26 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 194234ca12f5e..400b3977786b1 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-25 +date: 2024-06-26 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 186ac111cb751..cc4d834468359 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-25 +date: 2024-06-26 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 b279b857c9a7b..44ff5376821d7 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-25 +date: 2024-06-26 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 e91310eeaa622..795795580e440 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-25 +date: 2024-06-26 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 5f548c1262f3c..43b3035131f31 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-25 +date: 2024-06-26 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 b5cdd1685781d..9e273411c9ddc 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-25 +date: 2024-06-26 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 4e08f879dd534..0822896e61de6 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-25 +date: 2024-06-26 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 519cb3beabd68..1c719338ebcc8 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-25 +date: 2024-06-26 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 21e94f7aa02c9..16313ea72c09b 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-25 +date: 2024-06-26 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 815a3ea90e84d..3ea992543c042 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-25 +date: 2024-06-26 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 dd60c91a6bdb6..2cda4ca2b45cf 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-25 +date: 2024-06-26 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 b86a9be6c6ba6..1f2bc205e49d0 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-25 +date: 2024-06-26 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 239c549026403..0c523ac8e2745 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-25 +date: 2024-06-26 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 b13a2e8a72d8d..ea62ae268aba7 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-25 +date: 2024-06-26 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 8505bc3ef0a3e..cefe41affc3a1 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 0a27caa5cb388..faac006668565 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 80e85505ce52d..b40c5450cf277 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-25 +date: 2024-06-26 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 b2293153f57bf..1533bb0157c12 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-25 +date: 2024-06-26 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 6c1b4b229a45a..591f9f3512554 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-25 +date: 2024-06-26 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 84d3ad6837eda..878196bce5ea8 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-25 +date: 2024-06-26 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 cc9ce1336dcc9..3e6daed0dca81 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-25 +date: 2024-06-26 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 e1451f1948073..56499fc799ed4 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-25 +date: 2024-06-26 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 a689c15c47ab9..d2d1d4bc2ea48 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-25 +date: 2024-06-26 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 1176005e99c7e..e28009d221159 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-25 +date: 2024-06-26 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 b4b839eb5c336..9b696f8500762 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-25 +date: 2024-06-26 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 28bad43e7b19d..4533c6fc4e1d0 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-25 +date: 2024-06-26 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 7407fef64c9af..6cad27c00382a 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-25 +date: 2024-06-26 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 c16107e0c8a3f..74c022f35593b 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-25 +date: 2024-06-26 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 f88f5ad0c01aa..e13de7f5536b8 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 5a70a1b9876fc..3841fa26f2be8 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index ec5048dfddf98..83adee7e67870 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 1963db52769f5..31538e33c0f11 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index abd87a53eeb85..d7454d209d38a 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-25 +date: 2024-06-26 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 ea725af2ce7a9..8cdb49b90933a 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-25 +date: 2024-06-26 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 eff4a9084c4b4..f96c4535f1122 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-25 +date: 2024-06-26 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 ff1ec9fa9e73d..ca39ac8051e10 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-25 +date: 2024-06-26 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 794d739d88c95..a26f1fd924138 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-25 +date: 2024-06-26 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 b0150d9ed1116..6de793df55de1 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-25 +date: 2024-06-26 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 7d8591c4dff2b..71b3b357e38a2 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-25 +date: 2024-06-26 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 36be974c5a293..91bc0afd721e8 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-25 +date: 2024-06-26 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 aeb1f64e12772..1729db6f15bab 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-25 +date: 2024-06-26 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 3cb1343c59103..4c58645535eaf 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-25 +date: 2024-06-26 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 a1b9de6236c45..4e8a810fbbc29 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-25 +date: 2024-06-26 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 86318835796d3..87faa2d3adb9f 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 4a1f7b47d1e48..b86d1f742c7c7 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 029027b8a5b04..590f90cd70c1a 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-25 +date: 2024-06-26 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 3bb4612e55ecc..b37a9e175ccea 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-25 +date: 2024-06-26 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 24e6aa68f9a05..d597ff4b9df6e 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-25 +date: 2024-06-26 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 88101d196d0d3..310b82c235b01 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-25 +date: 2024-06-26 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 a66a306d2acda..d0bfdaeba168b 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-25 +date: 2024-06-26 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 3e3948573f3f8..362cc53a01729 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-25 +date: 2024-06-26 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 0938994a490da..81d0db5a518ad 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-25 +date: 2024-06-26 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 fdad547a55a74..060e29fed34cb 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-25 +date: 2024-06-26 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 bd6a49a1c815c..2349c07b01c2d 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-25 +date: 2024-06-26 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 03430ffccae61..a519ef30e7cbd 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-25 +date: 2024-06-26 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 6da52d4d8973b..32ca109fcc4ab 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-25 +date: 2024-06-26 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 84735c77e1854..9f6df7bf76ea5 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-25 +date: 2024-06-26 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 1099bcff9685e..97db00b5526d9 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-25 +date: 2024-06-26 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 26572da1fca0f..00d45e078cea5 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-25 +date: 2024-06-26 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 d97bb26f2cd7d..449e5aa0aa25e 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-25 +date: 2024-06-26 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 4b8cd4a7dbd15..53bfc9d5761a0 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-25 +date: 2024-06-26 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 f31d8b65ded80..ec72a50bd3116 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-25 +date: 2024-06-26 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 a1f046eb47840..390efaccf375b 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-25 +date: 2024-06-26 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 0d749bfc88ca5..a91531a61adf9 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-25 +date: 2024-06-26 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 9c6bf7b5f2300..a38efab35b8cf 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-25 +date: 2024-06-26 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 779045f856559..c1e1ab2988962 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-25 +date: 2024-06-26 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 04aea81959d4f..3ab0d365180f6 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-25 +date: 2024-06-26 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 86cf94b989283..e96faaa0ef9b4 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-25 +date: 2024-06-26 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 264badf08232a..4d66c3732f4f1 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-25 +date: 2024-06-26 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 98a38d120f25d..93d9d06f0e809 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-25 +date: 2024-06-26 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 1f9f099e8c655..2f8b037786fbf 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-25 +date: 2024-06-26 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 2d870c3943818..ce8de97333afd 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-25 +date: 2024-06-26 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 4eea179826ddd..5bb5732e5e8b2 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-25 +date: 2024-06-26 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 0525beb90b6bc..2d0b4c7f495a1 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-25 +date: 2024-06-26 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_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 39c978a05318e..93ec961ff480d 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index aff4936f874d9..5edb408b71e8a 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-25 +date: 2024-06-26 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.devdocs.json b/api_docs/kbn_core_analytics_browser.devdocs.json index 7f19ef23a3e2d..39750c189b184 100644 --- a/api_docs/kbn_core_analytics_browser.devdocs.json +++ b/api_docs/kbn_core_analytics_browser.devdocs.json @@ -731,6 +731,22 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/lib/langchain/elasticsearch_store/elasticsearch_store.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" @@ -907,10 +923,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts" @@ -1183,6 +1195,38 @@ "plugin": "security", "path": "x-pack/plugins/security/server/analytics/analytics_service.test.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, { "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/public/services/telemetry/telemetry_service.test.ts" diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 2adc2b868833d..9e3926f63fd75 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-25 +date: 2024-06-26 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 64593528107eb..7a7e41dcfbc9c 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-25 +date: 2024-06-26 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 31592bcfd9d68..27f69739ff8f3 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-25 +date: 2024-06-26 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.devdocs.json b/api_docs/kbn_core_analytics_server.devdocs.json index 5c4760eb2c883..d65f4d6171a88 100644 --- a/api_docs/kbn_core_analytics_server.devdocs.json +++ b/api_docs/kbn_core_analytics_server.devdocs.json @@ -731,6 +731,22 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/lib/langchain/elasticsearch_store/elasticsearch_store.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" @@ -907,10 +923,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts" @@ -1183,6 +1195,38 @@ "plugin": "security", "path": "x-pack/plugins/security/server/analytics/analytics_service.test.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, { "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/public/services/telemetry/telemetry_service.test.ts" diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 6d0c931f36913..ef4a46ab4236d 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-25 +date: 2024-06-26 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 9944c753972ba..539d99683f706 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-25 +date: 2024-06-26 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 bf70f65d079f1..4c9c4c06d7f8c 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-25 +date: 2024-06-26 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 204b728e5392a..221092861f17f 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-25 +date: 2024-06-26 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 7516893ed6f8a..ea8f1ee3a473b 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-25 +date: 2024-06-26 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 700c2f4a467f1..a34b007d00008 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-25 +date: 2024-06-26 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 f4094609e083b..04a3059c5847e 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-25 +date: 2024-06-26 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 876dd82081ce1..097710a940f28 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-25 +date: 2024-06-26 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 02f02263a5a7d..3564a272e97b9 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-25 +date: 2024-06-26 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 65dbc90710661..7997672d6ce09 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-25 +date: 2024-06-26 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 1ef6677142632..825e58de270c4 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-25 +date: 2024-06-26 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 a71c9027827a2..b16096e887e54 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-25 +date: 2024-06-26 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 9c7e35483d920..503df4cd3bd6f 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-25 +date: 2024-06-26 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 63d72714a8143..b171839b6948d 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-25 +date: 2024-06-26 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 c66a5c67511c1..e2008bd13c888 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-25 +date: 2024-06-26 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 105cbfd180048..77854db23aa70 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-25 +date: 2024-06-26 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 fe73f11a83d6e..07d9e92b3d1f8 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-25 +date: 2024-06-26 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 a4d21787f2b99..f7557b4c3a948 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-25 +date: 2024-06-26 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 2eb8c8861b427..bb44696cad63d 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-25 +date: 2024-06-26 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 b30dc71ae5ad8..29c418e82a055 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-25 +date: 2024-06-26 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 00b98a7cf8d64..6451a22568a46 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-25 +date: 2024-06-26 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 bf0b92b433f47..b4b06df21502b 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-25 +date: 2024-06-26 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 a8ea6b0e124c5..6b81b6423753a 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-25 +date: 2024-06-26 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 c4b392b2b3f64..65c8d0cab5686 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-25 +date: 2024-06-26 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 af5939bdd4a92..138ffd506865d 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-25 +date: 2024-06-26 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 23dd0e90b9090..10fde66dc8609 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-25 +date: 2024-06-26 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 87018781af486..4aaed34e6b773 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-25 +date: 2024-06-26 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 c084420fc789e..5a8aeaed5f10f 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-25 +date: 2024-06-26 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 cbd67dc50b680..93784931295a7 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-25 +date: 2024-06-26 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 6747d00759b8d..9b1601b6ad638 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-25 +date: 2024-06-26 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 48c3300d7623d..9fc116833ef5e 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-25 +date: 2024-06-26 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 ab9056d47548c..550cf07831a4b 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-25 +date: 2024-06-26 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 75bc9fe57f2fd..e80690275ca77 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-25 +date: 2024-06-26 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 b0012fcd602dc..9dd35a615fa8f 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-25 +date: 2024-06-26 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 ffcc60aa92b55..d514dbb4c3f76 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-25 +date: 2024-06-26 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 9314a5e3eb1a8..67b1e15581d91 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-25 +date: 2024-06-26 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 cbf160d8d3080..2cacdb5c689b7 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-25 +date: 2024-06-26 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 29147308f7df5..dd8407f8a224e 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-25 +date: 2024-06-26 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 53829043e40ea..417f1090ff108 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-25 +date: 2024-06-26 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 19cf8e79d068d..8676c82397faa 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-25 +date: 2024-06-26 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 c7b1f89c151ad..c567e853ffdd0 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-25 +date: 2024-06-26 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 64c90ee43a750..443e8801939a8 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-25 +date: 2024-06-26 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 48f395a16f1db..fcda7a5f21026 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-25 +date: 2024-06-26 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 5565339907128..b29faf17c9ba3 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-25 +date: 2024-06-26 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 e03a218fdb0b8..dde4b3c3a57a2 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-25 +date: 2024-06-26 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 9d18545cc2a5c..a084cd9a24082 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-25 +date: 2024-06-26 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 f2a1a3a306090..d2892d0a83735 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-25 +date: 2024-06-26 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 489294f6cfab8..c9b48238a1288 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-25 +date: 2024-06-26 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 24eb957479991..071f9f876f6be 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-25 +date: 2024-06-26 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 73557d75597ff..4eb83e0e0790f 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-25 +date: 2024-06-26 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 57cf32fc2fb4f..9802ffa0379b3 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-25 +date: 2024-06-26 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 9fb5c7fd802e8..531d1ab56f7af 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-25 +date: 2024-06-26 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 9381f3287b61d..f58be494fa958 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-25 +date: 2024-06-26 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 7e7544f3b24c5..bf6819d4c2fc1 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-25 +date: 2024-06-26 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 f16f340832958..ccdf8d8b861b1 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-25 +date: 2024-06-26 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 f2417ebcc4406..1ccd335ef9cf5 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-25 +date: 2024-06-26 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 d79686b49cb0a..c3221b1de619c 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-25 +date: 2024-06-26 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 6964fc72f7f55..2813af7164e71 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-25 +date: 2024-06-26 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 793283bb287b2..6eec62cf74d4c 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-25 +date: 2024-06-26 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 d9e5ea0f55403..5c76803d6b62e 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-25 +date: 2024-06-26 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 6bc6978fd0c86..c2c3d7eb0950c 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-25 +date: 2024-06-26 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 af970eac350e4..8ab944be3b963 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-25 +date: 2024-06-26 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 ca451598c8b7c..a3b6878226f1f 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-25 +date: 2024-06-26 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 bc041046b7a03..f7a22f07c5714 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-25 +date: 2024-06-26 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 3df41783fe35e..013fb8ee7f3c0 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-25 +date: 2024-06-26 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 028f436ac52b8..9c97eb7183e30 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-25 +date: 2024-06-26 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 38e820536eba9..b2fdab00057fd 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -14514,6 +14514,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/management.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/get_attack_discovery.ts" + }, { "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/user_conversations/read_route.ts" @@ -15281,6 +15285,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/inference_models.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/cancel_attack_discovery.ts" + }, { "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/user_conversations/update_route.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 31a48995198eb..e8bcfe531bbbd 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-25 +date: 2024-06-26 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 9dab9b6beba03..edb90e3d2eab9 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-25 +date: 2024-06-26 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 6e060a4f4dc57..96a238c8ca13f 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-25 +date: 2024-06-26 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 fc22c8a634e02..91f7b5d09831c 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-25 +date: 2024-06-26 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 d848a23a5c025..e4315933c86ff 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-25 +date: 2024-06-26 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 2a9d387070ff2..641f8a6dbcf7a 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-25 +date: 2024-06-26 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 bf17fe8ff97a3..d966fe364c5d7 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-25 +date: 2024-06-26 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 9cc120b70f11f..2af026b8966a9 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-25 +date: 2024-06-26 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 51619a29dd2e7..6a6703b366fb1 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-25 +date: 2024-06-26 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 465d0d447c28b..21eec775b8199 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-25 +date: 2024-06-26 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 5aa661b011931..5c19c1069a4b3 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-25 +date: 2024-06-26 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 99a07974f69ff..25b397790fc72 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-25 +date: 2024-06-26 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 cc764e9f724e0..af2fe5ad1499a 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-25 +date: 2024-06-26 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 f6dee670906ff..ab2eb58bc359a 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-25 +date: 2024-06-26 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 b0fba6644d175..1700ad7cecd11 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-25 +date: 2024-06-26 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 3fdf110d65e77..0f9e84bb27adb 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-25 +date: 2024-06-26 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 8f0fd1cbd7385..cd6d9648ff76c 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-25 +date: 2024-06-26 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 58e0f8daee792..73fb1d23f9287 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-25 +date: 2024-06-26 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 795614105db1b..9e42cccb3e430 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-25 +date: 2024-06-26 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 e51badc2b9787..a89c9f940e108 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-25 +date: 2024-06-26 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 59c9944ff359f..e87cb1281fae8 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-25 +date: 2024-06-26 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 a9d1bf5da2abc..100c6cf690663 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-25 +date: 2024-06-26 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 4df4607c93f53..e22beef47a058 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-25 +date: 2024-06-26 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 50e5400c11772..9d128ac242dd0 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-25 +date: 2024-06-26 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 6a676df5794bf..9a9bbd7bc0d22 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-25 +date: 2024-06-26 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 9a5dfb4140991..098ad0d7208e7 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-25 +date: 2024-06-26 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 89174827de71f..e629a23b67b61 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-25 +date: 2024-06-26 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 39e41b72d7417..ecb30ace5794c 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-25 +date: 2024-06-26 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 7b68311826dc6..9ea5a15b02a71 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-25 +date: 2024-06-26 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 4ca733b436629..e0b966079b556 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-25 +date: 2024-06-26 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 d6f220c085655..50ea410f8c27e 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-25 +date: 2024-06-26 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 ec35831d6fbee..d365149076f9a 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-25 +date: 2024-06-26 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 bf01ec19b49cc..e239cddb67f74 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-25 +date: 2024-06-26 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 259b37411158f..d72a29791ec0f 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-25 +date: 2024-06-26 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 b2e11af835f81..9913224f315c9 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-25 +date: 2024-06-26 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 879dc24b30258..3794fef8649e8 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-25 +date: 2024-06-26 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 4f5f1747b390e..00e4c03ba55e9 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-25 +date: 2024-06-26 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 b16efdbb7a4c2..75cbbbebd606e 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-25 +date: 2024-06-26 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 1cdd375e4e4ae..59fc4e4e8f17f 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-25 +date: 2024-06-26 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 edf2e1125d817..89735bfc1763a 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-25 +date: 2024-06-26 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 93d9e8b55c4f2..8c2ec99e3b6b3 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-25 +date: 2024-06-26 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 02f635d008a10..fec5bf7e2ac16 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-25 +date: 2024-06-26 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 330d40aab5284..af0ae4a215d55 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-25 +date: 2024-06-26 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 a937fa12b33db..ed63070af4d5c 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-25 +date: 2024-06-26 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 63e92bcc755bf..f6f3e0b6e327f 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-25 +date: 2024-06-26 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 d69df5e81ba72..3773a9f836cc1 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-25 +date: 2024-06-26 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 8e76e307c220d..5daeb13d9d6a9 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-25 +date: 2024-06-26 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 61897f6a82435..2ef188cb8d913 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-25 +date: 2024-06-26 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 f23a15b9c168f..272802ae63d70 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-25 +date: 2024-06-26 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 08493d6d5c890..bb608deacf562 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-25 +date: 2024-06-26 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 52655e4129dec..7db8955b08c63 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-25 +date: 2024-06-26 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 07cabbd809443..999313d3b0b2c 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-25 +date: 2024-06-26 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 c8ff1e3c9695e..7a164a58215d5 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-25 +date: 2024-06-26 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 92dade7bc471a..3715a31dc06cd 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-25 +date: 2024-06-26 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 e7dce3e4dd67e..7cf10ae0ba056 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-25 +date: 2024-06-26 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 637d11a4c7095..36348e6ce86e7 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-25 +date: 2024-06-26 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 7bcbd57055f6f..fe7f1d9ae047d 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-25 +date: 2024-06-26 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 3aca9298b7ac9..141bdc82eb59e 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-25 +date: 2024-06-26 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 a7ed676987f72..b6e4b1d7f84c8 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-25 +date: 2024-06-26 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 f06afc8e50195..e639673a5336e 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-25 +date: 2024-06-26 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 b0ba68b33d07e..136c9e6e27881 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-25 +date: 2024-06-26 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 7430aba330175..44c78f74bcd84 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-25 +date: 2024-06-26 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 273b7aa1a273d..4c69c2a3cead3 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-25 +date: 2024-06-26 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 6b588fd8f2537..60cc7895fedf4 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-25 +date: 2024-06-26 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 80299a1648897..f8a9b738b3de3 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-25 +date: 2024-06-26 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 ec2a5467d3875..d7aa4fc8c52dc 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-25 +date: 2024-06-26 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 9d67d8aeb704b..fff414d122ff6 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-25 +date: 2024-06-26 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 f71329052eabc..2e7fdf3ee37ae 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-25 +date: 2024-06-26 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 29d8d817aed66..627b4c07d6e25 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-25 +date: 2024-06-26 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 fe650884ccc73..9da15d25adcab 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-25 +date: 2024-06-26 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 3dfd9ffb8c697..974f112aadc89 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-25 +date: 2024-06-26 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 c1e3e35ed5c51..08569be995c50 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-25 +date: 2024-06-26 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 9ca6035f5b1a4..9c8804f9441d0 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-25 +date: 2024-06-26 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 2e56b331aabad..582d307bfecf0 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-25 +date: 2024-06-26 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 5c1ce43b01fc5..8ca9f5e75d4c5 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-25 +date: 2024-06-26 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 f9f1d91bdbcce..3233fa430a0cc 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-25 +date: 2024-06-26 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 a861f5fabce9e..e2cc70a015e1d 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-25 +date: 2024-06-26 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 bb6b7e7197268..723c484e0cd22 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-25 +date: 2024-06-26 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 0fd8f152bf039..7a81dcfc877d9 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-25 +date: 2024-06-26 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 4e8fec23edc46..dd6dd635b082a 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-25 +date: 2024-06-26 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 b2dfc63ca5ecc..42675573d0067 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-25 +date: 2024-06-26 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 eab6bea5703fd..119ef703b386a 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-25 +date: 2024-06-26 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 0c7f4f3783442..b76219d880058 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-25 +date: 2024-06-26 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 d158d835d5000..ae2520fda748a 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-25 +date: 2024-06-26 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 bf018d7119959..993907ce7371d 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-25 +date: 2024-06-26 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 8a9565cbf402d..2654f768b20e9 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-25 +date: 2024-06-26 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 a0dfea50aab14..b47c2f9be181f 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-25 +date: 2024-06-26 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 d8065be548a1f..d2963a94cef48 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-25 +date: 2024-06-26 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 f7bf40d00a067..2b74a5de4cb3b 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-25 +date: 2024-06-26 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 5774087f48d89..81a8256c22605 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-25 +date: 2024-06-26 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 6ac2eed76db99..7bec683321740 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-25 +date: 2024-06-26 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 9fd3c275de806..f67d06b379c6f 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-25 +date: 2024-06-26 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 8e41e8ea04536..29360fc8a1711 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-25 +date: 2024-06-26 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 af611c80bb8f7..22e44607ff24b 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-25 +date: 2024-06-26 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 e0f0fde32d1fe..63de05d139884 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-25 +date: 2024-06-26 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 9a98d1310e006..ff6988716c6ef 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-25 +date: 2024-06-26 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 2c6c99fd12a6c..88c34eafafb76 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-25 +date: 2024-06-26 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 5b2bbeeb430be..233173f686b81 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-25 +date: 2024-06-26 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 368387abb0971..2d70d90ee9968 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-25 +date: 2024-06-26 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 c9df40c14a6d0..ed3d1587c57c8 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-25 +date: 2024-06-26 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 6fd0a6a46e8de..7fa716af3e261 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-25 +date: 2024-06-26 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 9cd980b7ec274..04d77a8fca7f5 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-25 +date: 2024-06-26 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 a5ac572bb3ce1..7216c172cd9ba 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-25 +date: 2024-06-26 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 5b043729102cd..6d101ba0330bd 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-25 +date: 2024-06-26 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 70c2e56b45331..ce5434e07da39 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-25 +date: 2024-06-26 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 f305f06a7f5f7..26efcd119a86d 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-25 +date: 2024-06-26 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 3d6fca2a0f50b..1947d3be29383 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-25 +date: 2024-06-26 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 d5ab7a2846f4c..1b03fb8e8d19b 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-25 +date: 2024-06-26 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 cf3ba7d267e1e..b844a916fcd09 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-25 +date: 2024-06-26 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 1b1025f1288b2..000a58945eae4 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-25 +date: 2024-06-26 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 c71a7749df581..0e9c7df7f9b89 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-25 +date: 2024-06-26 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 61a5d34112b31..61c574f94fb5f 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-25 +date: 2024-06-26 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 7aa016375fb1c..db7c839f0e5c5 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-25 +date: 2024-06-26 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 796c594c32203..16bdbfe2b20a5 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-25 +date: 2024-06-26 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 3289697059fd0..568da8477941d 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-25 +date: 2024-06-26 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 042a19a477777..898127d1cafc3 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-25 +date: 2024-06-26 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 e0123aa5f15a5..5bddf7fc0d9a8 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-25 +date: 2024-06-26 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 66ea5c066c036..3f0053324dcce 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-25 +date: 2024-06-26 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 93fde0ca5fb8d..5fae9c44f400e 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-25 +date: 2024-06-26 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 019c5e147acf7..a06c09443692f 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-25 +date: 2024-06-26 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 d733af699fb1f..5eca1ae3764b8 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-25 +date: 2024-06-26 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 954a8c816bea9..e2b38484d2c79 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-25 +date: 2024-06-26 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 aeb8706e3ff46..db2ebc1631fd3 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-25 +date: 2024-06-26 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 15bd6c86b1d7e..94435a5c00514 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-25 +date: 2024-06-26 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 d29a95aefc6a6..6883eae8510c5 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-25 +date: 2024-06-26 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 949b9ba9325bd..98c923207a8cc 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-25 +date: 2024-06-26 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 2398a43ec7fc4..bc961d75a43e4 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-25 +date: 2024-06-26 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 f284fd4497f62..4d5887fc232ca 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-25 +date: 2024-06-26 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 cf95aae082bee..c4ec82547cf7a 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-25 +date: 2024-06-26 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 9c02c01cba875..e9f2d27397999 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-25 +date: 2024-06-26 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 6457526831824..a57b6049750f3 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-25 +date: 2024-06-26 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 a8055499813e0..9ba1f68e6a89d 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-25 +date: 2024-06-26 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 67c3a80c9cfec..b49fb8a59df80 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-25 +date: 2024-06-26 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 abfd5d93a2726..f0b93301823b9 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-25 +date: 2024-06-26 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.devdocs.json b/api_docs/kbn_ebt.devdocs.json index 82e6770af4fac..82e5dbb2ad965 100644 --- a/api_docs/kbn_ebt.devdocs.json +++ b/api_docs/kbn_ebt.devdocs.json @@ -1866,6 +1866,22 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/lib/langchain/elasticsearch_store/elasticsearch_store.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.ts" + }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" @@ -2042,10 +2058,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upload_csv.ts" @@ -2174,6 +2186,38 @@ "plugin": "security", "path": "x-pack/plugins/security/server/analytics/analytics_service.test.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/attack_discovery/helpers.test.ts" + }, { "plugin": "apm", "path": "x-pack/plugins/observability_solution/apm/public/services/telemetry/telemetry_service.test.ts" diff --git a/api_docs/kbn_ebt.mdx b/api_docs/kbn_ebt.mdx index ab81064b8ea53..7297cb9ea03f8 100644 --- a/api_docs/kbn_ebt.mdx +++ b/api_docs/kbn_ebt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt title: "@kbn/ebt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt'] --- import kbnEbtObj from './kbn_ebt.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 85345fe802729..1bf7dc9f60c01 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-25 +date: 2024-06-26 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 6866cbef051b3..a9a87c80a7f73 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-25 +date: 2024-06-26 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 0b17030083bfc..baf196e416949 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-25 +date: 2024-06-26 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 d83f3905e6a32..ad273ccd01b94 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-25 +date: 2024-06-26 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.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index 7f5b1cccc8780..2e245eee05c74 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -851,6 +851,23 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveries", + "type": "Type", + "tags": [], + "label": "AttackDiscoveries", + "description": [ + "\nArray of attack discoveries" + ], + "signature": [ + "{ timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.AttackDiscovery", @@ -861,9 +878,114 @@ "\nAn attack discovery generated from one or more alerts" ], "signature": [ - "{ title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }" + "{ timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }" ], - "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCancelRequestParams", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryCancelRequestParams", + "description": [], + "signature": [ + "{ connectorId: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCancelRequestParamsInput", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryCancelRequestParamsInput", + "description": [], + "signature": [ + "{ connectorId: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCancelResponse", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryCancelResponse", + "description": [], + "signature": [ + "{ id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCreateProps", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryCreateProps", + "description": [], + "signature": [ + "{ status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryGetRequestParams", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryGetRequestParams", + "description": [], + "signature": [ + "{ connectorId: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryGetRequestParamsInput", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryGetRequestParamsInput", + "description": [], + "signature": [ + "{ connectorId: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryGetResponse", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryGetResponse", + "description": [], + "signature": [ + "{ entryExists: boolean; data?: { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; } | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -876,7 +998,7 @@ "label": "AttackDiscoveryPostRequestBody", "description": [], "signature": [ - "{ connectorId: string; actionTypeId: string; size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }" + "{ size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, @@ -891,7 +1013,7 @@ "label": "AttackDiscoveryPostRequestBodyInput", "description": [], "signature": [ - "{ connectorId: string; actionTypeId: string; size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; }" + "{ size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, @@ -906,13 +1028,75 @@ "label": "AttackDiscoveryPostResponse", "description": [], "signature": [ - "{ connector_id?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }[] | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; status?: string | undefined; trace_data?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }" + "{ id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryResponse", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryResponse", + "description": [], + "signature": [ + "{ id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryStatus", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryStatus", + "description": [ + "\nThe status of the attack discovery." + ], + "signature": [ + "\"running\" | \"succeeded\" | \"failed\" | \"canceled\"" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryStatusEnum", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryStatusEnum", + "description": [], + "signature": [ + "{ running: \"running\"; succeeded: \"succeeded\"; failed: \"failed\"; canceled: \"canceled\"; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryUpdateProps", + "type": "Type", + "tags": [], + "label": "AttackDiscoveryUpdateProps", + "description": [], + "signature": [ + "{ id: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; backingIndex: string; apiConfig?: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; } | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; failureReason?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.BulkActionBase", @@ -1967,6 +2151,23 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.GenerationInterval", + "type": "Type", + "tags": [], + "label": "GenerationInterval", + "description": [ + "\nRun durations for the attack discovery" + ], + "signature": [ + "{ date: string; durationMs: number; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.GetCapabilitiesResponse", @@ -3088,6 +3289,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveries", + "type": "Object", + "tags": [], + "label": "AttackDiscoveries", + "description": [], + "signature": [ + "Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.AttackDiscovery", @@ -3096,9 +3312,84 @@ "label": "AttackDiscovery", "description": [], "signature": [ - "Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }>" + "Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>" ], - "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCancelRequestParams", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryCancelRequestParams", + "description": [], + "signature": [ + "Zod.ZodObject<{ connectorId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; }, { connectorId: string; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCancelResponse", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryCancelResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional<Zod.ZodString>; updatedAt: Zod.ZodOptional<Zod.ZodString>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; createdAt: Zod.ZodString; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodOptional<Zod.ZodString>; name: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray<Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/cancel_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryCreateProps", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryCreateProps", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodOptional<Zod.ZodString>; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; attackDiscoveries: Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; }, \"strip\", Zod.ZodTypeAny, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }, { status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; id?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryGetRequestParams", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryGetRequestParams", + "description": [], + "signature": [ + "Zod.ZodObject<{ connectorId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; }, { connectorId: string; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryGetResponse", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryGetResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ data: Zod.ZodOptional<Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional<Zod.ZodString>; updatedAt: Zod.ZodOptional<Zod.ZodString>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; createdAt: Zod.ZodString; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodOptional<Zod.ZodString>; name: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray<Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }>>; entryExists: Zod.ZodBoolean; }, \"strip\", Zod.ZodTypeAny, { entryExists: boolean; data?: { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; } | undefined; }, { entryExists: boolean; data?: { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; } | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/get_attack_discovery_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -3111,7 +3402,7 @@ "label": "AttackDiscoveryPostRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ alertsIndexPattern: Zod.ZodString; anonymizationFields: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional<Zod.ZodString>; field: Zod.ZodString; allowed: Zod.ZodOptional<Zod.ZodBoolean>; anonymized: Zod.ZodOptional<Zod.ZodBoolean>; updatedAt: Zod.ZodOptional<Zod.ZodString>; updatedBy: Zod.ZodOptional<Zod.ZodString>; createdAt: Zod.ZodOptional<Zod.ZodString>; createdBy: Zod.ZodOptional<Zod.ZodString>; namespace: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }, { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }>, \"many\">; connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; langSmithProject: Zod.ZodOptional<Zod.ZodString>; langSmithApiKey: Zod.ZodOptional<Zod.ZodString>; model: Zod.ZodOptional<Zod.ZodString>; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; size: Zod.ZodNumber; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }, { connectorId: string; actionTypeId: string; size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; }>" + "Zod.ZodObject<{ alertsIndexPattern: Zod.ZodString; anonymizationFields: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional<Zod.ZodString>; field: Zod.ZodString; allowed: Zod.ZodOptional<Zod.ZodBoolean>; anonymized: Zod.ZodOptional<Zod.ZodBoolean>; updatedAt: Zod.ZodOptional<Zod.ZodString>; updatedBy: Zod.ZodOptional<Zod.ZodString>; createdAt: Zod.ZodOptional<Zod.ZodString>; createdBy: Zod.ZodOptional<Zod.ZodString>; namespace: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }, { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>; langSmithProject: Zod.ZodOptional<Zod.ZodString>; langSmithApiKey: Zod.ZodOptional<Zod.ZodString>; model: Zod.ZodOptional<Zod.ZodString>; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; size: Zod.ZodNumber; subAction: Zod.ZodEnum<[\"invokeAI\", \"invokeStream\"]>; }, \"strip\", Zod.ZodTypeAny, { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; }, { size: number; subAction: \"invokeAI\" | \"invokeStream\"; alertsIndexPattern: string; anonymizationFields: { id: string; field: string; timestamp?: string | undefined; allowed?: boolean | undefined; anonymized?: boolean | undefined; updatedAt?: string | undefined; updatedBy?: string | undefined; createdAt?: string | undefined; createdBy?: string | undefined; namespace?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; model?: string | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, @@ -3126,13 +3417,73 @@ "label": "AttackDiscoveryPostResponse", "description": [], "signature": [ - "Zod.ZodObject<{ connector_id: Zod.ZodOptional<Zod.ZodString>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; attackDiscoveries: Zod.ZodOptional<Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }, { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }>, \"many\">>; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; status: Zod.ZodOptional<Zod.ZodString>; trace_data: Zod.ZodOptional<Zod.ZodObject<{ transactionId: Zod.ZodOptional<Zod.ZodString>; traceId: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { transactionId?: string | undefined; traceId?: string | undefined; }, { transactionId?: string | undefined; traceId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { connector_id?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }[] | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; status?: string | undefined; trace_data?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }, { connector_id?: string | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; mitreAttackTactics?: string[] | undefined; }[] | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; status?: string | undefined; trace_data?: { transactionId?: string | undefined; traceId?: string | undefined; } | undefined; }>" + "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional<Zod.ZodString>; updatedAt: Zod.ZodOptional<Zod.ZodString>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; createdAt: Zod.ZodString; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodOptional<Zod.ZodString>; name: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray<Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/post_attack_discovery_route.gen.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryResponse", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; timestamp: Zod.ZodOptional<Zod.ZodString>; updatedAt: Zod.ZodOptional<Zod.ZodString>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; createdAt: Zod.ZodString; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; users: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodOptional<Zod.ZodString>; name: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id?: string | undefined; name?: string | undefined; }, { id?: string | undefined; name?: string | undefined; }>, \"many\">; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; attackDiscoveries: Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">; apiConfig: Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>; namespace: Zod.ZodString; backingIndex: Zod.ZodString; generationIntervals: Zod.ZodArray<Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>, \"many\">; averageIntervalMs: Zod.ZodNumber; failureReason: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }, { id: string; namespace: string; createdAt: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; users: { id?: string | undefined; name?: string | undefined; }[]; apiConfig: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }; attackDiscoveries: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[]; backingIndex: string; generationIntervals: { date: string; durationMs: number; }[]; averageIntervalMs: number; timestamp?: string | undefined; updatedAt?: string | undefined; alertsContextCount?: number | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; failureReason?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryStatus", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryStatus", + "description": [], + "signature": [ + "Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryStatusEnum", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryStatusEnum", + "description": [], + "signature": [ + "{ running: \"running\"; succeeded: \"succeeded\"; failed: \"failed\"; canceled: \"canceled\"; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.AttackDiscoveryUpdateProps", + "type": "Object", + "tags": [], + "label": "AttackDiscoveryUpdateProps", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodString; apiConfig: Zod.ZodOptional<Zod.ZodObject<{ connectorId: Zod.ZodString; actionTypeId: Zod.ZodString; defaultSystemPromptId: Zod.ZodOptional<Zod.ZodString>; provider: Zod.ZodOptional<Zod.ZodEnum<[\"OpenAI\", \"Azure OpenAI\"]>>; model: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }, { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; }>>; alertsContextCount: Zod.ZodOptional<Zod.ZodNumber>; attackDiscoveries: Zod.ZodOptional<Zod.ZodArray<Zod.ZodObject<{ alertIds: Zod.ZodArray<Zod.ZodString, \"many\">; id: Zod.ZodOptional<Zod.ZodString>; detailsMarkdown: Zod.ZodString; entitySummaryMarkdown: Zod.ZodString; mitreAttackTactics: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; summaryMarkdown: Zod.ZodString; title: Zod.ZodString; timestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }, { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }>, \"many\">>; status: Zod.ZodEnum<[\"running\", \"succeeded\", \"failed\", \"canceled\"]>; replacements: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodString, Zod.objectOutputType<{}, Zod.ZodString, \"strip\">, Zod.objectInputType<{}, Zod.ZodString, \"strip\">>>; generationIntervals: Zod.ZodOptional<Zod.ZodArray<Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>, \"many\">>; backingIndex: Zod.ZodString; failureReason: Zod.ZodOptional<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { id: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; backingIndex: string; apiConfig?: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; } | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; replacements?: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; failureReason?: string | undefined; }, { id: string; status: \"running\" | \"succeeded\" | \"failed\" | \"canceled\"; backingIndex: string; apiConfig?: { connectorId: string; actionTypeId: string; defaultSystemPromptId?: string | undefined; provider?: \"OpenAI\" | \"Azure OpenAI\" | undefined; model?: string | undefined; } | undefined; alertsContextCount?: number | undefined; attackDiscoveries?: { timestamp: string; title: string; alertIds: string[]; detailsMarkdown: string; entitySummaryMarkdown: string; summaryMarkdown: string; id?: string | undefined; mitreAttackTactics?: string[] | undefined; }[] | undefined; replacements?: Zod.objectInputType<{}, Zod.ZodString, \"strip\"> | undefined; generationIntervals?: { date: string; durationMs: number; }[] | undefined; failureReason?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.BulkActionBase", @@ -3810,6 +4161,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.GenerationInterval", + "type": "Object", + "tags": [], + "label": "GenerationInterval", + "description": [], + "signature": [ + "Zod.ZodObject<{ date: Zod.ZodString; durationMs: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { date: string; durationMs: number; }, { date: string; durationMs: number; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/attack_discovery/common_attributes.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.GetCapabilitiesResponse", diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 2a47e5325d47f..942d9d63a39d6 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 305 | 0 | 286 | 0 | +| 329 | 0 | 307 | 0 | ## Common diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index b5efa062eed7b..dbe6d7810b941 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-25 +date: 2024-06-26 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 36008c1d52edd..0a17b1b9c57f2 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-25 +date: 2024-06-26 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 8c97edb1a7b3d..c36f2ebaff934 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-25 +date: 2024-06-26 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 c6de64fc8f21b..5b9217b194a93 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-25 +date: 2024-06-26 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 a3455fa33de93..89e47be6af7c7 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-25 +date: 2024-06-26 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 56754c4c3268d..3fde5d36b9d28 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-25 +date: 2024-06-26 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 2066ecda55ac9..0c74b839f6dca 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-25 +date: 2024-06-26 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 07bb5be54dbf1..940d0c66a7ee1 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-25 +date: 2024-06-26 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 269b6b2d39d6a..7d263e2cf2111 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-25 +date: 2024-06-26 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 e4b58d95fe8fd..0c6afe5f1b14a 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-25 +date: 2024-06-26 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 ccc246a6a1786..acd8f91383fe9 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-25 +date: 2024-06-26 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 3cae2992368fc..6cc7e27b88cb7 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-25 +date: 2024-06-26 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 afbdfe8185a2b..b8e0adbb14453 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-25 +date: 2024-06-26 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 35cf43fe73e8e..1b356d021779e 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-25 +date: 2024-06-26 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 cdee4a5b8939d..a3ae5c91a18a8 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-25 +date: 2024-06-26 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 ff404f570a250..5a9505fb0845d 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-25 +date: 2024-06-26 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 dc164379999cc..e8f7c1957dfd8 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-25 +date: 2024-06-26 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 b35a983c54892..f16437af4aa92 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-25 +date: 2024-06-26 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 86c7e7ac446fb..1b4ab6ccd8d45 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-25 +date: 2024-06-26 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 7dcfd78972417..39495ae8aad0a 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-25 +date: 2024-06-26 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 61dfa7494c9b3..7fec07f3b2eb5 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-25 +date: 2024-06-26 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 f0a06a87d1cf9..239fc053a0337 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-25 +date: 2024-06-26 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 1e9cc4f1c5dec..a98d8aa20ed30 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-25 +date: 2024-06-26 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 07a08aa7f91ce..ec2c5b533a1fd 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-25 +date: 2024-06-26 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 1f392431a1882..29eef29aa4e7f 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-25 +date: 2024-06-26 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 837c8435b692d..90e600e7e6852 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-25 +date: 2024-06-26 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 a5106fd4e37d4..6e47d39165ee7 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-25 +date: 2024-06-26 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 ddaf6d2e74730..cf92ef0146bfa 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-25 +date: 2024-06-26 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 841c43201705e..10850e73da780 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-25 +date: 2024-06-26 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 2d56d082e8a1a..9f3c0c6bc74a1 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-25 +date: 2024-06-26 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 85d776ce38da6..5e7cee6f41413 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-25 +date: 2024-06-26 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 654ee13c31347..68db8af24627d 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-25 +date: 2024-06-26 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 cfe7dfecd9744..360fe02b7a088 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-25 +date: 2024-06-26 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 72b428e6a7fea..572394251c513 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-25 +date: 2024-06-26 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 894eaf0e762e3..06b0060fd10bd 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-25 +date: 2024-06-26 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 951bcd8f2375c..6092e1cb866e6 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-25 +date: 2024-06-26 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 225776a467601..546ccd5a3a3c4 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-25 +date: 2024-06-26 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 1750a7c8e6e17..45f7836787255 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-25 +date: 2024-06-26 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 58d2e7a066c5c..85d905261b452 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-25 +date: 2024-06-26 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 df1ecd8309793..149b31c0bc043 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-25 +date: 2024-06-26 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 998cf6891a563..18bcaf779eeae 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 4f3ff01365039..58c13144367e7 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index dcbac16db1cf7..b767137bed3fd 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-25 +date: 2024-06-26 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 e875525db15ab..73df9f96f17ac 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-25 +date: 2024-06-26 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 fa93e8a9552ba..f4c7ab248785b 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-25 +date: 2024-06-26 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 4f2a328b239ea..b793c0f062718 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-25 +date: 2024-06-26 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 7a0e2da03cced..a82ccbf788f7c 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-25 +date: 2024-06-26 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 c4e1f76965e9b..afbc1e8478f64 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-25 +date: 2024-06-26 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 1bb237e06806a..12e15af2fa1da 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-25 +date: 2024-06-26 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 18fe70c7efc4d..f64f4b6dc5d7e 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-25 +date: 2024-06-26 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 e3a8480446bcd..14edc43011671 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-25 +date: 2024-06-26 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 1db20eb0fb7b8..8acab4ee39918 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-25 +date: 2024-06-26 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 e4ac1142588cc..dd7c863ddb721 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-25 +date: 2024-06-26 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 0378879c97b20..d7fdd414930ca 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-25 +date: 2024-06-26 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 dd6384492b8c1..146e6c209f17f 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-25 +date: 2024-06-26 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 e1c62acf69b2f..09d93df163e5c 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-25 +date: 2024-06-26 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 dd932811ff7ea..11ce2adee07fa 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-25 +date: 2024-06-26 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 9c570bf7416fa..44a0c20a18a40 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-25 +date: 2024-06-26 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 7cff7e254c887..cd55c93d7695f 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-25 +date: 2024-06-26 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 a8c3f0e6356c5..4c656b6d54371 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-25 +date: 2024-06-26 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 2104ff5d600c0..2209ef079b00c 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-25 +date: 2024-06-26 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 312515ac170db..ca6223a7320af 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-25 +date: 2024-06-26 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 ab7f199a2037a..1b70879987a20 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-25 +date: 2024-06-26 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 f530ff79fe640..591a043e1504c 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-25 +date: 2024-06-26 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 d08c1bc90e84b..b3294895def9d 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-25 +date: 2024-06-26 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 88679d1520d03..9978493487053 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-25 +date: 2024-06-26 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 c3fbf9e6853fd..ca2d5ccc67bb1 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-25 +date: 2024-06-26 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 d5d05318c49ef..c96b97fcc030b 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-25 +date: 2024-06-26 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 dde6cc0d50095..5a92f91db202d 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-25 +date: 2024-06-26 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 b6f4efe0b797d..c7b9b62cd18fa 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-25 +date: 2024-06-26 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 ceb962cdbc6c0..1cd002fbfb460 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-25 +date: 2024-06-26 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 760d8769b5bd9..7d1885e427b4d 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-25 +date: 2024-06-26 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 e15caf2cd8ba1..b3b5f0c35e3a7 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-25 +date: 2024-06-26 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 f6354fcd6beb9..0fbdd5c2a0716 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-25 +date: 2024-06-26 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 62f5582f4ecad..13c13a67058ee 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-25 +date: 2024-06-26 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 e965cd0c80d47..b934c0209f6a6 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-25 +date: 2024-06-26 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 cff3122afafbd..f8b71f8dc039a 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-25 +date: 2024-06-26 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 67964c6cabb56..fb4bff3950fe1 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-25 +date: 2024-06-26 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 4811d5018eee8..4e27a9c1bd619 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-25 +date: 2024-06-26 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 6d857674947ac..0475533b38f30 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-25 +date: 2024-06-26 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 24f0139458a55..34bf94cb0b09f 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-25 +date: 2024-06-26 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 28547eefc8249..24e66f9cf0e5b 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-25 +date: 2024-06-26 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 dcafbafcfcaef..5a7ce65d3fb1a 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-25 +date: 2024-06-26 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 f9cb2036b389f..7155dc8a9db33 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-25 +date: 2024-06-26 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 d6742d8f211d9..10fb3bd11ebfc 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-25 +date: 2024-06-26 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 884ea580ec499..47aa098a38465 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-25 +date: 2024-06-26 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 b1dd16a7a0936..1fa08ba39bb4d 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-25 +date: 2024-06-26 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 5f0a78cab0d82..8c25ed9db6c3b 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-25 +date: 2024-06-26 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 255d61d571de5..243e408ef65b7 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-25 +date: 2024-06-26 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 4bad0bb0977f0..304c8153d70db 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-25 +date: 2024-06-26 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 a3048399cd2cb..5a36a0a30a877 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-25 +date: 2024-06-26 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 198bbace24390..235c6536ac34e 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-25 +date: 2024-06-26 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 1b0d4e76934b2..07c35c68c0285 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-25 +date: 2024-06-26 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 0384f1b33d609..d1f17f36bace4 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-25 +date: 2024-06-26 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 883a09d3854a7..f37d6f5b679f2 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-25 +date: 2024-06-26 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 1cf5e3e4aee80..3db1ad8b83015 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-25 +date: 2024-06-26 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 597d7ba62502a..a64627109d0dd 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-25 +date: 2024-06-26 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 fe3cb8e1fff7d..3428436f09ebf 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-25 +date: 2024-06-26 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 408a316925252..e9128f5fc1340 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-25 +date: 2024-06-26 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 cfeac573dcdf5..7ac8e2561ac34 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-25 +date: 2024-06-26 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 121131be0c7c5..15f3fc0fe9e1b 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-25 +date: 2024-06-26 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 0da8f25c6bf62..91dc215211b0c 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-25 +date: 2024-06-26 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 6d5a54bae5cdd..6d57babf6b141 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-25 +date: 2024-06-26 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 6fa41d6fc2202..0fc775561dd10 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-25 +date: 2024-06-26 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 9c34f56d091a8..3835aedae256e 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-25 +date: 2024-06-26 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 6aee3abcd7a87..7266c6afaceb8 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-25 +date: 2024-06-26 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 abb475a635b62..2f73c594ea9a7 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-25 +date: 2024-06-26 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 b54ed78c429a2..5c1ca5cb3b649 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-25 +date: 2024-06-26 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 6a2d810022107..2f776a33c1930 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-25 +date: 2024-06-26 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 d3a23410f47ce..895a050a2f832 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-25 +date: 2024-06-26 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 2f5c5443af3d2..129e8a052908c 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-25 +date: 2024-06-26 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 7296f2bf62294..7d80fd3c30386 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-25 +date: 2024-06-26 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 434af433d7f29..bb86ac55a1333 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-25 +date: 2024-06-26 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 03e0f8d4821e4..49e6cf1c4b210 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-25 +date: 2024-06-26 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 5fad2b53b8397..0f4fb12aa7834 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-25 +date: 2024-06-26 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 9df478dcce520..bb5514e3950db 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-25 +date: 2024-06-26 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 bf3b8356ac603..6739436e95596 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-25 +date: 2024-06-26 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 d644c9f91135d..07d03e433a78e 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-25 +date: 2024-06-26 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 608b2291b8cbe..36e4427a87f58 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-25 +date: 2024-06-26 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 2aebc0e808331..5b2d8bb37347f 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-25 +date: 2024-06-26 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 7b69b9f70cea8..5aca2d42fd0fb 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-25 +date: 2024-06-26 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 71b24931d057f..aca6413a2cb93 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-25 +date: 2024-06-26 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 ad6094b1273c3..eb220a1d983af 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-25 +date: 2024-06-26 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 bd4abc6182bd3..42a5013a8fdb5 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-25 +date: 2024-06-26 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 3071c5536805c..21a728c8cc295 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-25 +date: 2024-06-26 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 cb6af41bf87a9..41f748b6ba874 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-25 +date: 2024-06-26 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 2bb2df1601b1d..1743a9932c077 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-25 +date: 2024-06-26 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 7734c42024065..77b77503a4d91 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-25 +date: 2024-06-26 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 7af8185df6767..e1637105e27d9 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-25 +date: 2024-06-26 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 7cdc739f78386..575707bda5bdf 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-25 +date: 2024-06-26 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 4b17b10cc5c7a..0297766649140 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-25 +date: 2024-06-26 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 b8dfd4335de9f..ef2ea64a7f4f8 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-25 +date: 2024-06-26 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 675c8472aef30..0cdb8536d86df 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-25 +date: 2024-06-26 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 172c0bc64d8bc..08bca57416382 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 55d79fdacab25..8b33c9c69a8ff 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index aa773e604fe5d..9d6ac1bb7d9b1 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index e773e9afbc362..384d8bc424365 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 34feaad2fc107..ed370b0788d53 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-25 +date: 2024-06-26 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 82ed280891c2b..eb37924a7593a 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-25 +date: 2024-06-26 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 99505b6630f86..d8c3f8dec7c48 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-25 +date: 2024-06-26 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 da77e0e06f180..b7e0f4e5d717f 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-25 +date: 2024-06-26 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 20ea2158f21a4..6a4c14ca2247e 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-25 +date: 2024-06-26 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 391caab0f8279..88fbdc8526d38 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-25 +date: 2024-06-26 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 5b6b7fed9a06b..8c0bcb67e3913 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-25 +date: 2024-06-26 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 54eadcd190803..c99b03ea42fa2 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-25 +date: 2024-06-26 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 7e10a60dc7f25..ecf67bf4ab03b 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-25 +date: 2024-06-26 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 16f3c1ddf56ac..f3d52fdc94511 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-25 +date: 2024-06-26 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 28d252c5f4d14..60dc776e611a4 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.devdocs.json b/api_docs/kbn_security_api_key_management.devdocs.json new file mode 100644 index 0000000000000..2c2f3d3c66c73 --- /dev/null +++ b/api_docs/kbn_security_api_key_management.devdocs.json @@ -0,0 +1,1259 @@ +{ + "id": "@kbn/security-api-key-management", + "client": { + "classes": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient", + "type": "Class", + "tags": [], + "label": "APIKeysAPIClient", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "http", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-browser", + "scope": "common", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-common.HttpSetup", + "text": "HttpSetup" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.queryApiKeys", + "type": "Function", + "tags": [], + "label": "queryApiKeys", + "description": [], + "signature": [ + "(params?: ", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.QueryApiKeyParams", + "text": "QueryApiKeyParams" + }, + " | undefined) => Promise<", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.QueryApiKeyResult", + "text": "QueryApiKeyResult" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.queryApiKeys.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.QueryApiKeyParams", + "text": "QueryApiKeyParams" + }, + " | undefined" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.invalidateApiKeys", + "type": "Function", + "tags": [], + "label": "invalidateApiKeys", + "description": [], + "signature": [ + "(apiKeys: ", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.ApiKeyToInvalidate", + "text": "ApiKeyToInvalidate" + }, + "[], isAdmin?: boolean) => Promise<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.InvalidateApiKeysResponse", + "text": "InvalidateApiKeysResponse" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.invalidateApiKeys.$1", + "type": "Array", + "tags": [], + "label": "apiKeys", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.ApiKeyToInvalidate", + "text": "ApiKeyToInvalidate" + }, + "[]" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.invalidateApiKeys.$2", + "type": "boolean", + "tags": [], + "label": "isAdmin", + "description": [], + "signature": [ + "boolean" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.createApiKey", + "type": "Function", + "tags": [], + "label": "createApiKey", + "description": [], + "signature": [ + "(apiKey: ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + }, + ") => Promise<", + "SecurityCreateApiKeyResponse", + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.createApiKey.$1", + "type": "CompoundType", + "tags": [], + "label": "apiKey", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.updateApiKey", + "type": "Function", + "tags": [], + "label": "updateApiKey", + "description": [], + "signature": [ + "(apiKey: ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + }, + ") => Promise<", + "SecurityUpdateApiKeyResponse", + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.APIKeysAPIClient.updateApiKey.$1", + "type": "CompoundType", + "tags": [], + "label": "apiKey", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyBadge", + "type": "Function", + "tags": [], + "label": "ApiKeyBadge", + "description": [], + "signature": [ + "({ type }: React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyBadgeProps", + "text": "ApiKeyBadgeProps" + }, + ">) => JSX.Element" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_badge.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyBadge.$1", + "type": "CompoundType", + "tags": [], + "label": "{ type }", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyBadgeProps", + "text": "ApiKeyBadgeProps" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_badge.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyCreatedCallout", + "type": "Function", + "tags": [], + "label": "ApiKeyCreatedCallout", + "description": [], + "signature": [ + "({ createdApiKey, }: React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyCreatedCalloutProps", + "text": "ApiKeyCreatedCalloutProps" + }, + ">) => JSX.Element" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyCreatedCallout.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n createdApiKey,\n}", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyCreatedCalloutProps", + "text": "ApiKeyCreatedCalloutProps" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFlyout", + "type": "Function", + "tags": [], + "label": "ApiKeyFlyout", + "description": [], + "signature": [ + "({ onSuccess, onCancel, defaultExpiration, defaultMetadata, defaultRoleDescriptors, apiKey, canManageCrossClusterApiKeys, readOnly, currentUser, isLoadingCurrentUser, }: React.PropsWithChildren<(", + "DisambiguateSet", + "<CreateApiKeyFlyoutProps, UpdateApiKeyFlyoutProps> & UpdateApiKeyFlyoutProps) | (", + "DisambiguateSet", + "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)>) => JSX.Element" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFlyout.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n onSuccess,\n onCancel,\n defaultExpiration,\n defaultMetadata,\n defaultRoleDescriptors,\n apiKey,\n canManageCrossClusterApiKeys = false,\n readOnly = false,\n currentUser,\n isLoadingCurrentUser,\n}", + "description": [], + "signature": [ + "React.PropsWithChildren<(", + "DisambiguateSet", + "<CreateApiKeyFlyoutProps, UpdateApiKeyFlyoutProps> & UpdateApiKeyFlyoutProps) | (", + "DisambiguateSet", + "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)>" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeySelectableTokenField", + "type": "Function", + "tags": [], + "label": "ApiKeySelectableTokenField", + "description": [], + "signature": [ + "({ createdApiKey, }: React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyCreatedCalloutProps", + "text": "ApiKeyCreatedCalloutProps" + }, + ">) => JSX.Element" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeySelectableTokenField.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n createdApiKey,\n}", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyCreatedCalloutProps", + "text": "ApiKeyCreatedCalloutProps" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyStatus", + "type": "Function", + "tags": [], + "label": "ApiKeyStatus", + "description": [], + "signature": [ + "({ expiration }: React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyStatusProps", + "text": "ApiKeyStatusProps" + }, + ">) => JSX.Element" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_status.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyStatus.$1", + "type": "CompoundType", + "tags": [], + "label": "{ expiration }", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyStatusProps", + "text": "ApiKeyStatusProps" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_status.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.mapCreateApiKeyValues", + "type": "Function", + "tags": [], + "label": "mapCreateApiKeyValues", + "description": [], + "signature": [ + "(values: ", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyFormValues", + "text": "ApiKeyFormValues" + }, + ") => ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.mapCreateApiKeyValues.$1", + "type": "Object", + "tags": [], + "label": "values", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyFormValues", + "text": "ApiKeyFormValues" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.mapUpdateApiKeyValues", + "type": "Function", + "tags": [], + "label": "mapUpdateApiKeyValues", + "description": [], + "signature": [ + "(type: \"managed\" | \"rest\" | \"cross_cluster\", id: string, values: ", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyFormValues", + "text": "ApiKeyFormValues" + }, + ") => ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.mapUpdateApiKeyValues.$1", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"managed\" | \"rest\" | \"cross_cluster\"" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.mapUpdateApiKeyValues.$2", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.mapUpdateApiKeyValues.$3", + "type": "Object", + "tags": [], + "label": "values", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.ApiKeyFormValues", + "text": "ApiKeyFormValues" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.TimeToolTip", + "type": "Function", + "tags": [], + "label": "TimeToolTip", + "description": [], + "signature": [ + "({ timestamp, children }: React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.TimeToolTipProps", + "text": "TimeToolTipProps" + }, + ">) => JSX.Element" + ], + "path": "x-pack/packages/security/api_key_management/src/components/time_tool_tip.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.TimeToolTip.$1", + "type": "CompoundType", + "tags": [], + "label": "{ timestamp, children }", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.TimeToolTipProps", + "text": "TimeToolTipProps" + }, + ">" + ], + "path": "x-pack/packages/security/api_key_management/src/components/time_tool_tip.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyBadgeProps", + "type": "Interface", + "tags": [], + "label": "ApiKeyBadgeProps", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_badge.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyBadgeProps.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"managed\" | \"rest\" | \"cross_cluster\"" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_badge.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyCreatedCalloutProps", + "type": "Interface", + "tags": [], + "label": "ApiKeyCreatedCalloutProps", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyCreatedCalloutProps.createdApiKey", + "type": "Object", + "tags": [], + "label": "createdApiKey", + "description": [], + "signature": [ + "SecurityCreateApiKeyResponse" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues", + "type": "Interface", + "tags": [], + "label": "ApiKeyFormValues", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.customExpiration", + "type": "boolean", + "tags": [], + "label": "customExpiration", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.customPrivileges", + "type": "boolean", + "tags": [], + "label": "customPrivileges", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.includeMetadata", + "type": "boolean", + "tags": [], + "label": "includeMetadata", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.access", + "type": "string", + "tags": [], + "label": "access", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.role_descriptors", + "type": "string", + "tags": [], + "label": "role_descriptors", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFormValues.metadata", + "type": "string", + "tags": [], + "label": "metadata", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.InvalidateApiKeysResponse", + "type": "Interface", + "tags": [], + "label": "InvalidateApiKeysResponse", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.InvalidateApiKeysResponse.itemsInvalidated", + "type": "Array", + "tags": [], + "label": "itemsInvalidated", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.ApiKeyToInvalidate", + "text": "ApiKeyToInvalidate" + }, + "[]" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.InvalidateApiKeysResponse.errors", + "type": "Array", + "tags": [], + "label": "errors", + "description": [], + "signature": [ + "any[]" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeyParams", + "type": "Interface", + "tags": [], + "label": "QueryApiKeyParams", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeyParams.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "QueryContainer" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeyParams.from", + "type": "number", + "tags": [], + "label": "from", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeyParams.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeyParams.sort", + "type": "Object", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.QueryApiKeySortOptions", + "text": "QueryApiKeySortOptions" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeyParams.filters", + "type": "Object", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-api-key-management", + "scope": "public", + "docId": "kibKbnSecurityApiKeyManagementPluginApi", + "section": "def-public.QueryFilters", + "text": "QueryFilters" + } + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeySortOptions", + "type": "Interface", + "tags": [], + "label": "QueryApiKeySortOptions", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeySortOptions.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "\"id\" | \"type\" | \"name\" | \"username\" | \"metadata\" | \"expired\" | \"creation\" | \"expiration\" | \"role_descriptors\" | \"realm\" | \"invalidated\" | \"limited_by\" | \"_sort\"" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryApiKeySortOptions.direction", + "type": "CompoundType", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + "\"asc\" | \"desc\"" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryFilters", + "type": "Interface", + "tags": [], + "label": "QueryFilters", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryFilters.usernames", + "type": "Array", + "tags": [], + "label": "usernames", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryFilters.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"managed\" | \"rest\" | \"cross_cluster\" | undefined" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.QueryFilters.expired", + "type": "CompoundType", + "tags": [], + "label": "expired", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.TimeToolTipProps", + "type": "Interface", + "tags": [], + "label": "TimeToolTipProps", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/time_tool_tip.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.TimeToolTipProps.timestamp", + "type": "number", + "tags": [], + "label": "timestamp", + "description": [], + "path": "x-pack/packages/security/api_key_management/src/components/time_tool_tip.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyFlyoutProps", + "type": "Type", + "tags": [], + "label": "ApiKeyFlyoutProps", + "description": [], + "signature": [ + "(", + "DisambiguateSet", + "<CreateApiKeyFlyoutProps, UpdateApiKeyFlyoutProps> & UpdateApiKeyFlyoutProps) | (", + "DisambiguateSet", + "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.ApiKeyStatusProps", + "type": "Type", + "tags": [], + "label": "ApiKeyStatusProps", + "description": [], + "signature": [ + "{ expiration?: number | undefined; }" + ], + "path": "x-pack/packages/security/api_key_management/src/components/api_key_status.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.CreateAPIKeyParams", + "type": "Type", + "tags": [], + "label": "CreateAPIKeyParams", + "description": [], + "signature": [ + "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record<string, Readonly<{} & {}>>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record<string, Readonly<{} & { kibana: Readonly<{ base?: string[] | undefined; feature?: Record<string, string[]> | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.CreateAPIKeyResult", + "type": "Type", + "tags": [], + "label": "CreateAPIKeyResult", + "description": [ + "\nResponse of Kibana Create API key endpoint." + ], + "signature": [ + "SecurityCreateApiKeyResponse" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.UpdateAPIKeyParams", + "type": "Type", + "tags": [], + "label": "UpdateAPIKeyParams", + "description": [ + "\nRequest body of Kibana Update API key endpoint." + ], + "signature": [ + "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; role_descriptors: Record<string, Readonly<{} & {}>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; type: \"cross_cluster\"; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; kibana_role_descriptors: Record<string, Readonly<{} & { kibana: Readonly<{ base?: string[] | undefined; feature?: Record<string, string[]> | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-api-key-management", + "id": "def-public.UpdateAPIKeyResult", + "type": "Type", + "tags": [], + "label": "UpdateAPIKeyResult", + "description": [ + "\nResponse of Kibana Update API key endpoint." + ], + "signature": [ + "SecurityUpdateApiKeyResponse" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx new file mode 100644 index 0000000000000..182ae1226f8a4 --- /dev/null +++ b/api_docs/kbn_security_api_key_management.mdx @@ -0,0 +1,39 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSecurityApiKeyManagementPluginApi +slug: /kibana-dev-docs/api/kbn-security-api-key-management +title: "@kbn/security-api-key-management" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/security-api-key-management plugin +date: 2024-06-26 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] +--- +import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; + + + +Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 68 | 0 | 65 | 0 | + +## Client + +### Functions +<DocDefinitionList data={kbnSecurityApiKeyManagementObj.client.functions}/> + +### Classes +<DocDefinitionList data={kbnSecurityApiKeyManagementObj.client.classes}/> + +### Interfaces +<DocDefinitionList data={kbnSecurityApiKeyManagementObj.client.interfaces}/> + +### Consts, variables and types +<DocDefinitionList data={kbnSecurityApiKeyManagementObj.client.misc}/> + diff --git a/api_docs/kbn_security_form_components.devdocs.json b/api_docs/kbn_security_form_components.devdocs.json new file mode 100644 index 0000000000000..e6456ca9c7abd --- /dev/null +++ b/api_docs/kbn_security_form_components.devdocs.json @@ -0,0 +1,727 @@ +{ + "id": "@kbn/security-form-components", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.createFieldValidator", + "type": "Function", + "tags": [], + "label": "createFieldValidator", + "description": [], + "signature": [ + "(options: ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.ValidateOptions", + "text": "ValidateOptions" + }, + ") => ", + "FieldValidator" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.createFieldValidator.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.ValidateOptions", + "text": "ValidateOptions" + } + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormChangesProvider", + "type": "Function", + "tags": [], + "label": "FormChangesProvider", + "description": [], + "signature": [ + "React.ProviderExoticComponent<React.ProviderProps<", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormChangesProps", + "text": "FormChangesProps" + }, + " | undefined>>" + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormChangesProvider.$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/security-form-components", + "id": "def-common.FormField", + "type": "Function", + "tags": [ + "throws" + ], + "label": "FormField", + "description": [ + "\nPolymorphic component that renders a form field with all state required for inline validation.\n" + ], + "signature": [ + "({\n as,\n validate,\n onBlur,\n ...rest\n}: ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormFieldProps", + "text": "FormFieldProps" + }, + "<T> & Omit<React.PropsWithoutRef<React.ComponentProps<T>>, keyof ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormFieldProps", + "text": "FormFieldProps" + }, + "<T>>) => JSX.Element" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormField.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n as,\n validate,\n onBlur,\n ...rest\n}", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormFieldProps", + "text": "FormFieldProps" + }, + "<T> & Omit<React.PropsWithoutRef<React.ComponentProps<T>>, keyof ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormFieldProps", + "text": "FormFieldProps" + }, + "<T>>" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormLabel", + "type": "Function", + "tags": [ + "throws", + "throws" + ], + "label": "FormLabel", + "description": [ + "\nComponent that visually indicates whether a field value has changed.\n" + ], + "signature": [ + "(props: React.PropsWithChildren<React.PropsWithChildren<", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormLabelProps", + "text": "FormLabelProps" + }, + ">>) => JSX.Element" + ], + "path": "x-pack/packages/security/form_components/src/form_label.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormLabel.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "React.PropsWithChildren<React.PropsWithChildren<", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormLabelProps", + "text": "FormLabelProps" + }, + ">>" + ], + "path": "x-pack/packages/security/form_components/src/form_label.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormRow", + "type": "Function", + "tags": [ + "throws", + "throws" + ], + "label": "FormRow", + "description": [ + "\nComponent that renders a form row with all error states for inline validation.\n" + ], + "signature": [ + "(props: React.PropsWithChildren<((", + "DisambiguateSet", + "<LabelProps, LegendProps> & { labelType?: \"legend\" | undefined; } & ", + "CommonProps", + " & { display?: \"center\" | \"row\" | \"rowCompressed\" | \"columnCompressed\" | \"centerCompressed\" | \"columnCompressedSwitch\" | undefined; hasEmptyLabelSpace?: boolean | undefined; fullWidth?: boolean | undefined; describedByIds?: string[] | undefined; hasChildLabel?: boolean | undefined; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; label?: React.ReactNode; labelAppend?: any; id?: string | undefined; isInvalid?: boolean | undefined; error?: React.ReactNode | React.ReactNode[]; helpText?: React.ReactNode | React.ReactNode[]; isDisabled?: boolean | undefined; } & Omit<React.HTMLAttributes<HTMLFieldSetElement>, \"disabled\">) | (", + "DisambiguateSet", + "<LegendProps, LabelProps> & { labelType?: \"label\" | undefined; } & ", + "CommonProps", + " & { display?: \"center\" | \"row\" | \"rowCompressed\" | \"columnCompressed\" | \"centerCompressed\" | \"columnCompressedSwitch\" | undefined; hasEmptyLabelSpace?: boolean | undefined; fullWidth?: boolean | undefined; describedByIds?: string[] | undefined; hasChildLabel?: boolean | undefined; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; label?: React.ReactNode; labelAppend?: any; id?: string | undefined; isInvalid?: boolean | undefined; error?: React.ReactNode | React.ReactNode[]; helpText?: React.ReactNode | React.ReactNode[]; isDisabled?: boolean | undefined; } & React.HTMLAttributes<HTMLDivElement>)) & ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormRowProps", + "text": "FormRowProps" + }, + ">) => JSX.Element" + ], + "path": "x-pack/packages/security/form_components/src/form_row.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormRow.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "React.PropsWithChildren<((", + "DisambiguateSet", + "<LabelProps, LegendProps> & { labelType?: \"legend\" | undefined; } & ", + "CommonProps", + " & { display?: \"center\" | \"row\" | \"rowCompressed\" | \"columnCompressed\" | \"centerCompressed\" | \"columnCompressedSwitch\" | undefined; hasEmptyLabelSpace?: boolean | undefined; fullWidth?: boolean | undefined; describedByIds?: string[] | undefined; hasChildLabel?: boolean | undefined; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; label?: React.ReactNode; labelAppend?: any; id?: string | undefined; isInvalid?: boolean | undefined; error?: React.ReactNode | React.ReactNode[]; helpText?: React.ReactNode | React.ReactNode[]; isDisabled?: boolean | undefined; } & Omit<React.HTMLAttributes<HTMLFieldSetElement>, \"disabled\">) | (", + "DisambiguateSet", + "<LegendProps, LabelProps> & { labelType?: \"label\" | undefined; } & ", + "CommonProps", + " & { display?: \"center\" | \"row\" | \"rowCompressed\" | \"columnCompressed\" | \"centerCompressed\" | \"columnCompressedSwitch\" | undefined; hasEmptyLabelSpace?: boolean | undefined; fullWidth?: boolean | undefined; describedByIds?: string[] | undefined; hasChildLabel?: boolean | undefined; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; label?: React.ReactNode; labelAppend?: any; id?: string | undefined; isInvalid?: boolean | undefined; error?: React.ReactNode | React.ReactNode[]; helpText?: React.ReactNode | React.ReactNode[]; isDisabled?: boolean | undefined; } & React.HTMLAttributes<HTMLDivElement>)) & ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormRowProps", + "text": "FormRowProps" + }, + ">" + ], + "path": "x-pack/packages/security/form_components/src/form_row.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.OptionalText", + "type": "Function", + "tags": [], + "label": "OptionalText", + "description": [], + "signature": [ + "() => JSX.Element" + ], + "path": "x-pack/packages/security/form_components/src/form_row.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.useFormChanges", + "type": "Function", + "tags": [], + "label": "useFormChanges", + "description": [ + "\nCustom React hook that allows tracking changes within a form.\n" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormChangesProps", + "text": "FormChangesProps" + } + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.useFormChangesContext", + "type": "Function", + "tags": [ + "throws" + ], + "label": "useFormChangesContext", + "description": [ + "\nCustom React hook that returns all @see FormChangesProps state from context.\n" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormChangesProps", + "text": "FormChangesProps" + } + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormChangesProps", + "type": "Interface", + "tags": [], + "label": "FormChangesProps", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormChangesProps.count", + "type": "number", + "tags": [], + "label": "count", + "description": [ + "\nNumber of fields rendered on the page that have changed." + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormChangesProps.report", + "type": "Function", + "tags": [], + "label": "report", + "description": [ + "\nCallback function used by a form field to indicate whether its current value is different to its initial value.\n" + ], + "signature": [ + "(isEqual: boolean) => ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.RevertFunction", + "text": "RevertFunction" + }, + " | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormChangesProps.report.$1", + "type": "boolean", + "tags": [], + "label": "isEqual", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormFieldProps", + "type": "Interface", + "tags": [], + "label": "FormFieldProps", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.FormFieldProps", + "text": "FormFieldProps" + }, + "<T>" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormFieldProps.as", + "type": "Uncategorized", + "tags": [], + "label": "as", + "description": [], + "signature": [ + "T | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormFieldProps.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormFieldProps.validate", + "type": "CompoundType", + "tags": [], + "label": "validate", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.ValidateOptions", + "text": "ValidateOptions" + }, + " | ", + "FieldValidator", + " | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormLabelProps", + "type": "Interface", + "tags": [], + "label": "FormLabelProps", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_label.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormLabelProps.for", + "type": "string", + "tags": [], + "label": "for", + "description": [ + "\nName of target form field." + ], + "path": "x-pack/packages/security/form_components/src/form_label.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormRowProps", + "type": "Interface", + "tags": [], + "label": "FormRowProps", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_row.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.FormRowProps.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nOptional name of form field.\n\nIf not provided the name will be inferred from its child element." + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_row.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions", + "type": "Interface", + "tags": [], + "label": "ValidateOptions", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions.required", + "type": "string", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions.pattern", + "type": "Object", + "tags": [], + "label": "pattern", + "description": [], + "signature": [ + "{ value: RegExp; message: string; } | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions.minLength", + "type": "Object", + "tags": [], + "label": "minLength", + "description": [], + "signature": [ + "{ value: number; message: string; } | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions.maxLength", + "type": "Object", + "tags": [], + "label": "maxLength", + "description": [], + "signature": [ + "{ value: number; message: string; } | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions.min", + "type": "Object", + "tags": [], + "label": "min", + "description": [], + "signature": [ + "{ value: number; message: string; } | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ValidateOptions.max", + "type": "Object", + "tags": [], + "label": "max", + "description": [], + "signature": [ + "{ value: number; message: string; } | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_field.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ReportFunction", + "type": "Type", + "tags": [], + "label": "ReportFunction", + "description": [], + "signature": [ + "(isEqual: boolean) => ", + { + "pluginId": "@kbn/security-form-components", + "scope": "common", + "docId": "kibKbnSecurityFormComponentsPluginApi", + "section": "def-common.RevertFunction", + "text": "RevertFunction" + }, + " | undefined" + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.ReportFunction.$1", + "type": "boolean", + "tags": [], + "label": "isEqual", + "description": [], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-form-components", + "id": "def-common.RevertFunction", + "type": "Type", + "tags": [], + "label": "RevertFunction", + "description": [], + "signature": [ + "() => void" + ], + "path": "x-pack/packages/security/form_components/src/form_changes.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [], + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx new file mode 100644 index 0000000000000..069c8ec98164f --- /dev/null +++ b/api_docs/kbn_security_form_components.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSecurityFormComponentsPluginApi +slug: /kibana-dev-docs/api/kbn-security-form-components +title: "@kbn/security-form-components" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/security-form-components plugin +date: 2024-06-26 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] +--- +import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; + + + +Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 35 | 0 | 25 | 0 | + +## Common + +### Functions +<DocDefinitionList data={kbnSecurityFormComponentsObj.common.functions}/> + +### Interfaces +<DocDefinitionList data={kbnSecurityFormComponentsObj.common.interfaces}/> + +### Consts, variables and types +<DocDefinitionList data={kbnSecurityFormComponentsObj.common.misc}/> + diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 98ebbb51f5c28..94c8ff264b9ee 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-25 +date: 2024-06-26 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.devdocs.json b/api_docs/kbn_security_plugin_types_common.devdocs.json index 804df8e1e3d13..4bb4d0397c70f 100644 --- a/api_docs/kbn_security_plugin_types_common.devdocs.json +++ b/api_docs/kbn_security_plugin_types_common.devdocs.json @@ -20,6 +20,119 @@ "classes": [], "functions": [], "interfaces": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyAggregations", + "type": "Interface", + "tags": [], + "label": "ApiKeyAggregations", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyAggregations.usernames", + "type": "Object", + "tags": [], + "label": "usernames", + "description": [], + "signature": [ + "AggregationsStringTermsAggregate", + " | undefined" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyAggregations.types", + "type": "Object", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "AggregationsStringTermsAggregate", + " | undefined" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyAggregations.expired", + "type": "Object", + "tags": [], + "label": "expired", + "description": [], + "signature": [ + "AggregationsFilterAggregateKeys", + " | undefined" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyAggregations.managed", + "type": "Object", + "tags": [], + "label": "managed", + "description": [], + "signature": [ + "{ buckets: { metadataBased: ", + "AggregationsFilterAggregateKeys", + "; namePrefixBased: ", + "AggregationsFilterAggregateKeys", + "; }; } | undefined" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyToInvalidate", + "type": "Interface", + "tags": [], + "label": "ApiKeyToInvalidate", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyToInvalidate.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyToInvalidate.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-common", "id": "def-common.AuthenticatedUser", @@ -203,6 +316,211 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.BaseApiKey", + "type": "Interface", + "tags": [], + "label": "BaseApiKey", + "description": [ + "\nFixing up `estypes.SecurityApiKey` type since some fields are marked as optional even though they are guaranteed to be returned.\n\nTODO: Remove this type when `@elastic/elasticsearch` has been updated." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.BaseApiKey", + "text": "BaseApiKey" + }, + " extends ", + "SecurityApiKey" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.BaseApiKey.username", + "type": "string", + "tags": [], + "label": "username", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.BaseApiKey.realm", + "type": "string", + "tags": [], + "label": "realm", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.BaseApiKey.creation", + "type": "number", + "tags": [], + "label": "creation", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.BaseApiKey.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [x: string]: any; }" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.BaseApiKey.role_descriptors", + "type": "Object", + "tags": [], + "label": "role_descriptors", + "description": [], + "signature": [ + "{ [x: string]: ", + "SecurityRoleDescriptor", + "; }" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CrossClusterApiKey", + "type": "Interface", + "tags": [], + "label": "CrossClusterApiKey", + "description": [ + "\nInterface representing a cross-cluster API key the way it is returned by Elasticsearch GET endpoint.\n\nTODO: Remove this type when `@elastic/elasticsearch` has been updated." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.CrossClusterApiKey", + "text": "CrossClusterApiKey" + }, + " extends ", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.BaseApiKey", + "text": "BaseApiKey" + } + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CrossClusterApiKey.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"cross_cluster\"" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CrossClusterApiKey.access", + "type": "Object", + "tags": [], + "label": "access", + "description": [ + "\nThe access to be granted to this API key. The access is composed of permissions for cross-cluster\nsearch and cross-cluster replication. At least one of them must be specified." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.CrossClusterApiKeyAccess", + "text": "CrossClusterApiKeyAccess" + } + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CrossClusterApiKeyAccess", + "type": "Interface", + "tags": [], + "label": "CrossClusterApiKeyAccess", + "description": [], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CrossClusterApiKeyAccess.search", + "type": "Array", + "tags": [], + "label": "search", + "description": [ + "\nA list of indices permission entries for cross-cluster search." + ], + "signature": [ + "CrossClusterApiKeySearch[] | undefined" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CrossClusterApiKeyAccess.replication", + "type": "Array", + "tags": [], + "label": "replication", + "description": [ + "\nA list of indices permission entries for cross-cluster replication." + ], + "signature": [ + "CrossClusterApiKeyReplication[] | undefined" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-common", "id": "def-common.FeaturesPrivileges", @@ -231,6 +549,100 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ManagedApiKey", + "type": "Interface", + "tags": [], + "label": "ManagedApiKey", + "description": [ + "\nInterface representing a REST API key that is managed by Kibana." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.ManagedApiKey", + "text": "ManagedApiKey" + }, + " extends ", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.BaseApiKey", + "text": "BaseApiKey" + } + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ManagedApiKey.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"managed\"" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.RestApiKey", + "type": "Interface", + "tags": [], + "label": "RestApiKey", + "description": [ + "\nInterface representing a REST API key the way it is returned by Elasticsearch GET endpoint.\n\nTODO: Remove this type when `@elastic/elasticsearch` has been updated." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.RestApiKey", + "text": "RestApiKey" + }, + " extends ", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.BaseApiKey", + "text": "BaseApiKey" + } + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.RestApiKey.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\"" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-common", "id": "def-common.Role", @@ -1406,6 +1818,87 @@ ], "enums": [], "misc": [ + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKey", + "type": "Type", + "tags": [], + "label": "ApiKey", + "description": [ + "\nInterface representing an API key the way it is returned by Elasticsearch GET endpoint." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.RestApiKey", + "text": "RestApiKey" + }, + " | ", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.CrossClusterApiKey", + "text": "CrossClusterApiKey" + } + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.ApiKeyRoleDescriptors", + "type": "Type", + "tags": [], + "label": "ApiKeyRoleDescriptors", + "description": [], + "signature": [ + "{ [x: string]: ", + "SecurityRoleDescriptor", + "; }" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.CategorizedApiKey", + "type": "Type", + "tags": [], + "label": "CategorizedApiKey", + "description": [ + "\nInterface representing an API key the way it is presented in the Kibana UI (with Kibana system\nAPI keys given its own dedicated `managed` type)." + ], + "signature": [ + "(", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.ApiKey", + "text": "ApiKey" + }, + " | ", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.ManagedApiKey", + "text": "ManagedApiKey" + }, + ") & { expired: boolean; }" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-common", "id": "def-common.LoginLayout", @@ -1423,6 +1916,23 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/security-plugin-types-common", + "id": "def-common.QueryApiKeyResult", + "type": "Type", + "tags": [], + "label": "QueryApiKeyResult", + "description": [ + "\nResponse of Kibana Query API keys endpoint." + ], + "signature": [ + "SuccessQueryApiKeyResult | ErrorQueryApiKeyResult" + ], + "path": "x-pack/packages/security/plugin_types_common/src/api_keys/api_key.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-common", "id": "def-common.UserProfileData", diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 8716850ec1ae5..f52bcd45549a1 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 88 | 0 | 40 | 0 | +| 116 | 0 | 58 | 0 | ## Common diff --git a/api_docs/kbn_security_plugin_types_public.devdocs.json b/api_docs/kbn_security_plugin_types_public.devdocs.json index 637e988957f0e..b2c795162fd9a 100644 --- a/api_docs/kbn_security_plugin_types_public.devdocs.json +++ b/api_docs/kbn_security_plugin_types_public.devdocs.json @@ -520,14 +520,6 @@ { "plugin": "security", "path": "x-pack/plugins/security/public/plugin.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts" } ] }, @@ -643,10 +635,6 @@ "plugin": "security", "path": "x-pack/plugins/security/public/plugin.tsx" }, - { - "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx" - }, { "plugin": "imageEmbeddable", "path": "src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx" diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 9e043c059ade2..023f5ccf04054 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-25 +date: 2024-06-26 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.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index 66a58ecffebd0..03c206b69bd4e 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -134,6 +134,95 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.getUpdateRestApiKeyWithKibanaPrivilegesSchema", + "type": "Function", + "tags": [], + "label": "getUpdateRestApiKeyWithKibanaPrivilegesSchema", + "description": [], + "signature": [ + "(getBasePrivilegeNames: () => { global: string[]; space: string[]; }) => ExtendedObjectType<{ type: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"rest\" | undefined>; name: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string>; expiration: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string | undefined>; role_descriptors: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Record<string, Readonly<{} & {}>>>; metadata: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Readonly<{} & {}> | undefined>; }, { role_descriptors: null; name: null; id: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string>; kibana_role_descriptors: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Record<string, Readonly<{} & { kibana: Readonly<{ base?: string[] | undefined; feature?: Record<string, string[]> | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>>; }>" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.getUpdateRestApiKeyWithKibanaPrivilegesSchema.$1", + "type": "Function", + "tags": [], + "label": "getBasePrivilegeNames", + "description": [], + "signature": [ + "() => { global: string[]; space: string[]; }" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ @@ -4366,6 +4455,85 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateAPIKeyParams", + "type": "Type", + "tags": [], + "label": "UpdateAPIKeyParams", + "description": [ + "\nRequest body of Kibana Update API key endpoint." + ], + "signature": [ + "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; role_descriptors: Record<string, Readonly<{} & {}>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; type: \"cross_cluster\"; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; kibana_role_descriptors: Record<string, Readonly<{} & { kibana: Readonly<{ base?: string[] | undefined; feature?: Record<string, string[]> | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateAPIKeyResult", + "type": "Type", + "tags": [], + "label": "UpdateAPIKeyResult", + "description": [ + "\nResponse of Kibana Update API key endpoint." + ], + "signature": [ + "SecurityUpdateApiKeyResponse" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams", + "type": "Type", + "tags": [], + "label": "UpdateCrossClusterAPIKeyParams", + "description": [], + "signature": [ + "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly id: string; readonly type: \"cross_cluster\"; readonly access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams", + "type": "Type", + "tags": [], + "label": "UpdateRestAPIKeyParams", + "description": [], + "signature": [ + "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly id: string; readonly role_descriptors: Record<string, Readonly<{} & {}>>; }" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams", + "type": "Type", + "tags": [], + "label": "UpdateRestAPIKeyWithKibanaPrivilegesParams", + "description": [], + "signature": [ + "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly id: string; readonly kibana_role_descriptors: Record<string, Readonly<{} & { kibana: Readonly<{ base?: string[] | undefined; feature?: Record<string, string[]> | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-server", "id": "def-server.UserProfileServiceStart", @@ -4610,6 +4778,178 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.updateCrossClusterApiKeySchema", + "type": "Object", + "tags": [], + "label": "updateCrossClusterApiKeySchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<ExtendedProps<ExtendedProps<{ type: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"rest\" | undefined>; name: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string>; expiration: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string | undefined>; role_descriptors: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Record<string, Readonly<{} & {}>>>; metadata: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Readonly<{} & {}> | undefined>; }, { type: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"cross_cluster\">; role_descriptors: null; access: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ search: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined>; replication: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Readonly<{} & { names: string[]; }>[] | undefined>; }>; }>, { name: null; id: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string>; }>>" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.updateRestApiKeySchema", + "type": "Object", + "tags": [], + "label": "updateRestApiKeySchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<ExtendedProps<{ type: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"rest\" | undefined>; name: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string>; expiration: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string | undefined>; role_descriptors: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Record<string, Readonly<{} & {}>>>; metadata: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<Readonly<{} & {}> | undefined>; }, { name: null; id: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<string>; }>>" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ] }, diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 4f40616338e17..d2033e6e7c0d0 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 207 | 0 | 114 | 0 | +| 216 | 0 | 121 | 0 | ## Server diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 11d01e2283f6e..41cb83896aaf1 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-25 +date: 2024-06-26 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 eb95c41e1a7cd..2de0e8ae55c3d 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-25 +date: 2024-06-26 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 5b421d98cb3ed..2e76c2aff92dc 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-25 +date: 2024-06-26 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 3b52d5f3d4c8a..65ef8db957321 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-25 +date: 2024-06-26 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 e50848a01023e..6de17c19ff30b 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-25 +date: 2024-06-26 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 0059ce92bdb49..afa75b2237c23 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-25 +date: 2024-06-26 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 b14d4fe5eabb1..db86cf7fdf951 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-25 +date: 2024-06-26 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 19ff4819ebad9..569d781cf33fc 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-25 +date: 2024-06-26 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 540aac983e4aa..9b4d160a9557c 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-25 +date: 2024-06-26 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 cc0a347e7787d..dd8b416cb9302 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-25 +date: 2024-06-26 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 ffb7a35800470..3832b2ee6431f 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-25 +date: 2024-06-26 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 47d54988e60ae..53f92776db7fd 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-25 +date: 2024-06-26 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 28c6010f5c90e..caa5305ea96dc 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-25 +date: 2024-06-26 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 b8d580394a2c6..2688f49d4073f 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-25 +date: 2024-06-26 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 ef9d50bfa1190..ef49bb77a112c 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-25 +date: 2024-06-26 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 984ecefb93db8..51ac7621c6973 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-25 +date: 2024-06-26 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 818af5e18bcdc..6ef501e51cbe3 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-25 +date: 2024-06-26 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 7c06fc862b4c7..da55f5194e003 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-25 +date: 2024-06-26 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 695e4d263ae59..dedb606412550 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-25 +date: 2024-06-26 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 c14772cae9b97..eed19f2fe3bf8 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-25 +date: 2024-06-26 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 dc8ffc2e93980..d02e537595714 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-25 +date: 2024-06-26 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 7c4a7456e0c97..1481089a65dc9 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-25 +date: 2024-06-26 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 aede21299ca77..aec55c90ab1e8 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-25 +date: 2024-06-26 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 afbb242cadba7..5354734905af9 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-25 +date: 2024-06-26 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 4cfd9c000aac5..5c74bfb9e7d5c 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-25 +date: 2024-06-26 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 fc656a8ab2dba..a7f14429a85a3 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-25 +date: 2024-06-26 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 0b0076552bb9f..e407d28bede69 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-25 +date: 2024-06-26 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 336ffbf1a690f..95da157646e69 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-25 +date: 2024-06-26 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 fa922ec7f2c27..80c996ea69f9d 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-25 +date: 2024-06-26 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 f13fb766566f2..3504df630e54f 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-25 +date: 2024-06-26 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 08d323e5c6eb7..e124911c42941 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-25 +date: 2024-06-26 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 868b6f92dfac9..d245a6763c95b 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-25 +date: 2024-06-26 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 d2146b12a0eac..eaf21527eb799 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-25 +date: 2024-06-26 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 e05573e50abf7..76d564629a2f7 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-25 +date: 2024-06-26 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 50f1b823c5f4c..420d60ae2155f 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-25 +date: 2024-06-26 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 fc56699729272..8ceb4841a3242 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-25 +date: 2024-06-26 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 d85ed952cb411..527e9298b20f2 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-25 +date: 2024-06-26 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 56df21146cb5a..7b8c2eb6cc3a7 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-25 +date: 2024-06-26 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 d2947f2c24e7f..de929e1f2a27c 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-25 +date: 2024-06-26 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 8d020b9261da4..1096ad098dcfb 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-25 +date: 2024-06-26 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 a6220a738a005..e6ec7f575da53 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-25 +date: 2024-06-26 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 7489d95e2d4bb..d124be8945998 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-25 +date: 2024-06-26 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 994d34728f333..23f129275aee7 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-25 +date: 2024-06-26 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 e83be9a576b4a..8b435cfeeb9a9 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-25 +date: 2024-06-26 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 8489241db8f5c..0baaf9fa20c56 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-25 +date: 2024-06-26 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 e700d15418e6e..b5f3e21df4ef6 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-25 +date: 2024-06-26 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 b4f29b76b5946..1f29f1423dfef 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-25 +date: 2024-06-26 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 6dccb6fee5def..584710e8a7c87 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-25 +date: 2024-06-26 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 dfb28fcb0511f..d3026f1ce6e46 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-25 +date: 2024-06-26 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 c0c7436c0bde6..fac362d336dec 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-25 +date: 2024-06-26 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 a7acd3a3b99d6..8faf41b2e7e37 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-25 +date: 2024-06-26 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 3971fb759e750..2986da6336b9c 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-25 +date: 2024-06-26 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 68200fa6aea97..8a3af9430f9f7 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-25 +date: 2024-06-26 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 0a4eefc59e001..93750f9e3781f 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-25 +date: 2024-06-26 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 ccbd8bbf43463..8cb9ce911a4d4 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-25 +date: 2024-06-26 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 fee653962b340..d6abe818bea3a 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-25 +date: 2024-06-26 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 e13fcb41c564e..feebd69ae5b07 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-25 +date: 2024-06-26 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 3d948c3ea6d50..ba18cc14147e6 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-25 +date: 2024-06-26 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 fe23d1c64a041..af38374e3e772 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-25 +date: 2024-06-26 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 4c5739f8198a4..af86463c2027a 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-25 +date: 2024-06-26 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 64751279933d6..52bb35a6f1125 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-25 +date: 2024-06-26 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 3f3d3d1602bc1..d66af5a3e0136 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-25 +date: 2024-06-26 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 3960fd97a0b0e..0d9a2780ff35c 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-25 +date: 2024-06-26 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 02d2b93184945..f7132a40fac54 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-25 +date: 2024-06-26 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 cf4fd714809e2..9b6740e9795d3 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-25 +date: 2024-06-26 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 e11e01e54cfb0..f846728b1e6df 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-25 +date: 2024-06-26 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 fd884b65cbcbe..908ff45486f59 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-25 +date: 2024-06-26 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 982ef4066b3b2..9c3e6b2f662b0 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-25 +date: 2024-06-26 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 6e952f481fa71..0d531e0592db5 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-25 +date: 2024-06-26 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 fa31b90c36e2b..0c889058d61b3 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-25 +date: 2024-06-26 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 23a8698ed1c3d..828ea766a3351 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-25 +date: 2024-06-26 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 50a5e29ee89b9..65adf8bd65546 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-25 +date: 2024-06-26 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 4632a759d1c0f..79e713a9c70a3 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-25 +date: 2024-06-26 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 7709a066a74d0..ac8f12feca04f 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-25 +date: 2024-06-26 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 b6267a4ffecde..b833ae5c0f0b2 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-25 +date: 2024-06-26 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 d1b39064da422..0067bb89d55df 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-25 +date: 2024-06-26 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 155433705978c..4e3619ae1b071 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-25 +date: 2024-06-26 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 5fa7d9c8d3092..e8b08b03ded62 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-25 +date: 2024-06-26 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 a5fbd30feb207..f257ff67eb8cd 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-25 +date: 2024-06-26 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 5884b187e5cbb..4fdf7ceddf692 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-25 +date: 2024-06-26 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 9edaf4d2af2c8..d32510ebfee71 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-25 +date: 2024-06-26 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 505143d3cd8a4..1c7d239dfdb24 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-25 +date: 2024-06-26 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 6bf29d329cf17..ce8055b764097 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-25 +date: 2024-06-26 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 3ea4774d0bd2a..3c2462c004bd9 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-25 +date: 2024-06-26 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 424c3b238a7e1..8398ddf20be1d 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-25 +date: 2024-06-26 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 a1a56acaa08dd..008137caa6e13 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-25 +date: 2024-06-26 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 133207d73e809..071842c337802 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-25 +date: 2024-06-26 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 db0038e278edf..d190fcfd263b9 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-25 +date: 2024-06-26 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 e609e7bd8532e..d794b08507a1c 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-25 +date: 2024-06-26 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 08a5368cb36f4..8ed6b1f0b1f9c 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-25 +date: 2024-06-26 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 14645013d4e93..949d2b5054c32 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-25 +date: 2024-06-26 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 c66e5afd4e514..83591ac81f067 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-25 +date: 2024-06-26 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 d7fa697e42195..4ab725a0f085a 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-25 +date: 2024-06-26 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 bc261faf6bcca..046859418c3d7 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index edebe944f9ab6..ad3e54d80b024 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 3746502d352ff..cc1285171c6be 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-25 +date: 2024-06-26 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 2333053251584..c3de2bd210c4c 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-25 +date: 2024-06-26 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 dbf4bc7787baa..902da4bd5b1d7 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-25 +date: 2024-06-26 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 cc6d3bac0b63c..0af811283ea18 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-25 +date: 2024-06-26 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 0d5c0c8ac7bf6..3aad081e416e5 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-25 +date: 2024-06-26 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 81aa7c19249b9..703f807fd88da 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-25 +date: 2024-06-26 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 ded1ecf90319c..d4a07162ebc11 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-25 +date: 2024-06-26 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 2ce1cc1af731e..c26d937f8e849 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-25 +date: 2024-06-26 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 747970143a51a..926a0cff992a2 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-25 +date: 2024-06-26 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 ff375219d35e8..03c12ce98a52c 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-25 +date: 2024-06-26 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 89b61748928ff..0b188a61c7f84 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-25 +date: 2024-06-26 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 49ede3b7aa002..0601f358649ca 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-25 +date: 2024-06-26 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 4f2fb608278fd..595ae94c2cfa9 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-25 +date: 2024-06-26 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 ba8f3623888c8..67946b4f21bc3 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-25 +date: 2024-06-26 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 aec896d5325bc..d6bbda3c04161 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-25 +date: 2024-06-26 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 363fed87120b9..6a48fd421d7c5 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-25 +date: 2024-06-26 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 238ad1bf95988..718e09f730703 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-25 +date: 2024-06-26 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 c757ae7e44b5b..675530d73f1b1 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-25 +date: 2024-06-26 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 457976299070a..ca8c9a86beb91 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-25 +date: 2024-06-26 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 80ee9c6497177..3c890f58aae59 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-25 +date: 2024-06-26 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 89ce057846c73..3ada2c6b3e309 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-25 +date: 2024-06-26 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 45b4c1392be72..c5fb38b618c6a 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-25 +date: 2024-06-26 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 45f45dad5ab44..547e16d96533e 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-25 +date: 2024-06-26 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 d3dd2dbedba75..00ecfce7e4ec7 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-25 +date: 2024-06-26 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 a57a144a194a2..2992d52fb1548 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-25 +date: 2024-06-26 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 cc1ca399f96e4..edf6720a36908 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-25 +date: 2024-06-26 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 1fc5ef2dc891f..11e9dc68f7edb 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-25 +date: 2024-06-26 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 2bb16023ac1b9..9ff15f0e1198f 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-25 +date: 2024-06-26 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 e34875769829f..5f0adc9bf8052 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-25 +date: 2024-06-26 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 a5a8b8016124f..214721933971b 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-25 +date: 2024-06-26 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 7a0bb24f28f2f..3ee2bf7e651a8 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-25 +date: 2024-06-26 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 5a3e285e64c7f..7a49d7bb4b78c 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-25 +date: 2024-06-26 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 48664d249cf29..f2144a08ad60c 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-25 +date: 2024-06-26 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 ff65f63d2451a..ff3c3703ac445 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-25 +date: 2024-06-26 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 aa2f8dd7d74b9..4bde97507c10b 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 47e68f63b1d39..7082446850312 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -1,177 +1,70 @@ { "id": "observability", "client": { - "classes": [ + "classes": [], + "functions": [ { "parentPluginId": "observability", - "id": "def-public.AutocompleteField", - "type": "Class", + "id": "def-public.AlertSummary", + "type": "Function", "tags": [], - "label": "AutocompleteField", + "label": "AlertSummary", "description": [], "signature": [ - { - "pluginId": "observability", - "scope": "public", - "docId": "kibObservabilityPluginApi", - "section": "def-public.AutocompleteField", - "text": "AutocompleteField" - }, - " extends React.Component<AutocompleteFieldProps, AutocompleteFieldState, any>" + "(props: ", + "AlertSummaryProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/index.tsx", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "observability", - "id": "def-public.AutocompleteField.state", + "id": "def-public.AlertSummary.$1", "type": "Object", "tags": [], - "label": "state", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.state.areSuggestionsVisible", - "type": "boolean", - "tags": [], - "label": "areSuggestionsVisible", - "description": [], - "signature": [ - "false" - ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.state.isFocused", - "type": "boolean", - "tags": [], - "label": "isFocused", - "description": [], - "signature": [ - "false" - ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.state.selectedIndex", - "type": "Uncategorized", - "tags": [], - "label": "selectedIndex", - "description": [], - "signature": [ - "null" - ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.render", - "type": "Function", - "tags": [], - "label": "render", - "description": [], - "signature": [ - "() => JSX.Element" - ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.componentDidMount", - "type": "Function", - "tags": [], - "label": "componentDidMount", - "description": [], - "signature": [ - "() => void" - ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.componentDidUpdate", - "type": "Function", - "tags": [], - "label": "componentDidUpdate", + "label": "props", "description": [], "signature": [ - "(prevProps: AutocompleteFieldProps) => void" + "AlertSummaryProps" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/index.tsx", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.AutocompleteField.componentDidUpdate.$1", - "type": "Object", - "tags": [], - "label": "prevProps", - "description": [], - "signature": [ - "AutocompleteFieldProps" - ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/autocomplete_field/autocomplete_field.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] + "isRequired": true } ], + "returnComment": [], "initialIsOpen": false - } - ], - "functions": [ + }, { "parentPluginId": "observability", - "id": "def-public.AlertSummary", + "id": "def-public.AutocompleteField", "type": "Function", "tags": [], - "label": "AlertSummary", + "label": "AutocompleteField", "description": [], "signature": [ - "({ alert, alertSummaryFields }: AlertSummaryProps) => JSX.Element" + "(props: ", + "AutocompleteFieldProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/alert_summary.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "observability", - "id": "def-public.AlertSummary.$1", + "id": "def-public.AutocompleteField.$1", "type": "Object", "tags": [], - "label": "{ alert, alertSummaryFields }", + "label": "props", "description": [], "signature": [ - "AlertSummaryProps" + "AutocompleteFieldProps" ], - "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/alert_summary.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -457,9 +350,11 @@ "label": "DatePicker", "description": [], "signature": [ - "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: DatePickerProps) => JSX.Element" + "(props: ", + "DatePickerProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability_solution/observability/public/pages/overview/components/date_picker/date_picker.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/pages/overview/components/date_picker/index.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -468,12 +363,12 @@ "id": "def-public.DatePicker.$1", "type": "Object", "tags": [], - "label": "{\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}", + "label": "props", "description": [], "signature": [ "DatePickerProps" ], - "path": "x-pack/plugins/observability_solution/observability/public/pages/overview/components/date_picker/date_picker.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/pages/overview/components/date_picker/index.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -791,49 +686,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.getElasticsearchQueryOrThrow", - "type": "Function", - "tags": [], - "label": "getElasticsearchQueryOrThrow", - "description": [], - "signature": [ - "(kuery: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }) => never[] | ", - "QueryDslQueryContainer", - " | { bool: ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.BoolQuery", - "text": "BoolQuery" - }, - "; }" - ], - "path": "x-pack/plugins/observability_solution/observability/common/utils/parse_kuery.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.getElasticsearchQueryOrThrow.$1", - "type": "CompoundType", - "tags": [], - "label": "kuery", - "description": [], - "signature": [ - "string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }" - ], - "path": "x-pack/plugins/observability_solution/observability/common/utils/parse_kuery.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.getGroupFilters", @@ -1079,9 +931,11 @@ "label": "RuleConditionChart", "description": [], "signature": [ - "({\n metricExpression,\n searchConfiguration,\n dataView,\n groupBy,\n error,\n annotations,\n timeRange,\n chartOptions: { seriesType, interval } = {},\n additionalFilters = [],\n}: RuleConditionChartProps) => JSX.Element" + "(props: ", + "RuleConditionChartProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/rule_condition_chart.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/index.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -1090,12 +944,12 @@ "id": "def-public.RuleConditionChart.$1", "type": "Object", "tags": [], - "label": "{\n metricExpression,\n searchConfiguration,\n dataView,\n groupBy,\n error,\n annotations,\n timeRange,\n chartOptions: { seriesType, interval } = {},\n additionalFilters = [],\n}", + "label": "props", "description": [], "signature": [ "RuleConditionChartProps" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/rule_condition_chart.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/index.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1112,9 +966,11 @@ "label": "RuleFlyoutKueryBar", "description": [], "signature": [ - "({\n derivedIndexPattern,\n onSubmit,\n onChange,\n value,\n placeholder,\n curryLoadSuggestions = defaultCurryLoadSuggestions,\n compressed,\n}: Props) => JSX.Element" + "(props: ", + "RuleFlyoutKueryBarProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/kuery_bar.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -1123,12 +979,12 @@ "id": "def-public.RuleFlyoutKueryBar.$1", "type": "Object", "tags": [], - "label": "{\n derivedIndexPattern,\n onSubmit,\n onChange,\n value,\n placeholder,\n curryLoadSuggestions = defaultCurryLoadSuggestions,\n compressed,\n}", + "label": "props", "description": [], "signature": [ - "Props" + "RuleFlyoutKueryBarProps" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/kuery_bar.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1172,29 +1028,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.useCreateRule", - "type": "Function", - "tags": [], - "label": "useCreateRule", - "description": [], - "signature": [ - "() => ", - "UseMutationResult", - "<", - "CreateRuleResponse", - "<Params>, Error, { rule: ", - "CreateRuleRequestBody", - "<Params>; }, unknown>" - ], - "path": "x-pack/plugins/observability_solution/observability/public/hooks/use_create_rule.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.useFetchDataViews", @@ -1234,23 +1067,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.useGetFilteredRuleTypes", - "type": "Function", - "tags": [], - "label": "useGetFilteredRuleTypes", - "description": [], - "signature": [ - "() => string[]" - ], - "path": "x-pack/plugins/observability_solution/observability/public/hooks/use_get_filtered_rule_types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.useSummaryTimeRange", @@ -1337,42 +1153,31 @@ "label": "WithKueryAutocompletion", "description": [], "signature": [ - "React.FunctionComponent<Omit<WithKueryAutocompletionLifecycleProps, \"kibana\">>" + "(props: ", + "WithKueryAutocompletionLifecycleProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/with_kuery_autocompletion.tsx", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, "trackAdoption": false, - "returnComment": [], "children": [ { "parentPluginId": "observability", "id": "def-public.WithKueryAutocompletion.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "WithKueryAutocompletionLifecycleProps" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.WithKueryAutocompletion.$2", - "type": "Any", - "tags": [], - "label": "context", - "description": [], - "signature": [ - "any" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "isRequired": true } ], + "returnComment": [], "initialIsOpen": false } ], diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 7e8630ed6495e..33cabc8ad3f72 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.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 | |-------------------|-----------|------------------------|-----------------| -| 705 | 2 | 696 | 16 | +| 693 | 2 | 686 | 22 | ## Client @@ -34,9 +34,6 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ ### Functions <DocDefinitionList data={observabilityObj.client.functions}/> -### Classes -<DocDefinitionList data={observabilityObj.client.classes}/> - ### Interfaces <DocDefinitionList data={observabilityObj.client.interfaces}/> diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index f599121b20b5c..8999c4197a467 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-25 +date: 2024-06-26 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 d39aa36e76bb4..016e6e95fb218 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-25 +date: 2024-06-26 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 09e6010905020..0f660661a9d38 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-25 +date: 2024-06-26 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 ae5a030638640..e20abf2365cbb 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-25 +date: 2024-06-26 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 bc199f3aead93..df6de3ddf4ea0 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-25 +date: 2024-06-26 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 44540c21bc620..8cee439886545 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-25 +date: 2024-06-26 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 66af140dfe2cb..99d5d1661fc2a 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-25 +date: 2024-06-26 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 60a74ea60e866..a0e5fc246d1d0 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-25 +date: 2024-06-26 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 6c5f77780edf4..5305a82346a4c 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a <br /> public API | Number of teams | |--------------|----------|------------------------| -| 808 | 692 | 42 | +| 810 | 694 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 49412 | 238 | 37680 | 1886 | +| 49561 | 238 | 37805 | 1888 | ## Plugin Directory @@ -31,7 +31,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibAdvancedSettingsPluginApi" text="advancedSettings"/> | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | | <DocLink id="kibAiAssistantManagementSelectionPluginApi" text="aiAssistantManagementSelection"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | | <DocLink id="kibAiopsPluginApi" text="aiops"/> | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 72 | 0 | 9 | 2 | -| <DocLink id="kibAlertingPluginApi" text="alerting"/> | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 868 | 1 | 836 | 54 | +| <DocLink id="kibAlertingPluginApi" text="alerting"/> | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 868 | 1 | 836 | 52 | | <DocLink id="kibApmPluginApi" text="apm"/> | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 123 | | <DocLink id="kibApmDataAccessPluginApi" text="apmDataAccess"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | <DocLink id="kibAssetManagerPluginApi" text="assetManager"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 11 | 0 | 11 | 3 | @@ -147,7 +147,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibNewsfeedPluginApi" text="newsfeed"/> | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | <DocLink id="kibNoDataPagePluginApi" text="noDataPage"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | <DocLink id="kibNotificationsPluginApi" text="notifications"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| <DocLink id="kibObservabilityPluginApi" text="observability"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 705 | 2 | 696 | 16 | +| <DocLink id="kibObservabilityPluginApi" text="observability"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 693 | 2 | 686 | 22 | | <DocLink id="kibObservabilityAIAssistantPluginApi" text="observabilityAIAssistant"/> | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 290 | 1 | 288 | 26 | | <DocLink id="kibObservabilityAIAssistantAppPluginApi" text="observabilityAIAssistantApp"/> | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 0 | | <DocLink id="kibObservabilityAiAssistantManagementPluginApi" text="observabilityAiAssistantManagement"/> | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | @@ -179,7 +179,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibSearchNotebooksPluginApi" text="searchNotebooks"/> | [@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 | | <DocLink id="kibSearchPlaygroundPluginApi" text="searchPlayground"/> | [@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 | -| <DocLink id="kibSecurityPluginApi" text="security"/> | [@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. | 414 | 0 | 205 | 3 | +| <DocLink id="kibSecurityPluginApi" text="security"/> | [@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. | 411 | 0 | 204 | 1 | | <DocLink id="kibSecuritySolutionPluginApi" text="securitySolution"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 191 | 0 | 121 | 37 | | <DocLink id="kibSecuritySolutionEssPluginApi" text="securitySolutionEss"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | <DocLink id="kibSecuritySolutionServerlessPluginApi" text="securitySolutionServerless"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | @@ -488,7 +488,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnEcsDataQualityDashboardPluginApi" text="@kbn/ecs-data-quality-dashboard"/> | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 13 | 0 | 5 | 0 | | <DocLink id="kibKbnElasticAgentUtilsPluginApi" text="@kbn/elastic-agent-utils"/> | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | | <DocLink id="kibKbnElasticAssistantPluginApi" text="@kbn/elastic-assistant"/> | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 165 | 0 | 138 | 9 | -| <DocLink id="kibKbnElasticAssistantCommonPluginApi" text="@kbn/elastic-assistant-common"/> | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 305 | 0 | 286 | 0 | +| <DocLink id="kibKbnElasticAssistantCommonPluginApi" text="@kbn/elastic-assistant-common"/> | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 329 | 0 | 307 | 0 | | <DocLink id="kibKbnEntitiesSchemaPluginApi" text="@kbn/entities-schema"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 20 | 0 | 20 | 0 | | <DocLink id="kibKbnEsPluginApi" text="@kbn/es"/> | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 37 | 7 | | <DocLink id="kibKbnEsArchiverPluginApi" text="@kbn/es-archiver"/> | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | @@ -637,10 +637,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnSearchIndexDocumentsPluginApi" text="@kbn/search-index-documents"/> | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 25 | 0 | 25 | 0 | | <DocLink id="kibKbnSearchResponseWarningsPluginApi" text="@kbn/search-response-warnings"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | <DocLink id="kibKbnSearchTypesPluginApi" text="@kbn/search-types"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 25 | 0 | +| <DocLink id="kibKbnSecurityApiKeyManagementPluginApi" text="@kbn/security-api-key-management"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 68 | 0 | 65 | 0 | +| <DocLink id="kibKbnSecurityFormComponentsPluginApi" text="@kbn/security-form-components"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 35 | 0 | 25 | 0 | | <DocLink id="kibKbnSecurityHardeningPluginApi" text="@kbn/security-hardening"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 7 | 0 | 7 | 0 | -| <DocLink id="kibKbnSecurityPluginTypesCommonPluginApi" text="@kbn/security-plugin-types-common"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 88 | 0 | 40 | 0 | +| <DocLink id="kibKbnSecurityPluginTypesCommonPluginApi" text="@kbn/security-plugin-types-common"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 116 | 0 | 58 | 0 | | <DocLink id="kibKbnSecurityPluginTypesPublicPluginApi" text="@kbn/security-plugin-types-public"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 51 | 0 | 25 | 0 | -| <DocLink id="kibKbnSecurityPluginTypesServerPluginApi" text="@kbn/security-plugin-types-server"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 207 | 0 | 114 | 0 | +| <DocLink id="kibKbnSecurityPluginTypesServerPluginApi" text="@kbn/security-plugin-types-server"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 216 | 0 | 121 | 0 | | <DocLink id="kibKbnSecuritySolutionFeaturesPluginApi" text="@kbn/security-solution-features"/> | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | | <DocLink id="kibKbnSecuritySolutionNavigationPluginApi" text="@kbn/security-solution-navigation"/> | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 54 | 0 | 49 | 0 | | <DocLink id="kibKbnSecuritySolutionSideNavPluginApi" text="@kbn/security-solution-side-nav"/> | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 30 | 0 | 24 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index b9e7d0c151572..3088517943524 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-25 +date: 2024-06-26 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 e197eddaa2983..cb7fb8337d696 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-25 +date: 2024-06-26 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 5e749e2faa87a..9ac528357a45e 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-25 +date: 2024-06-26 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 368fdf3b34e30..058c13c270255 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-25 +date: 2024-06-26 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 1fe7f5657310c..bb368f04afdd1 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-25 +date: 2024-06-26 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 b1474a2d53082..052095317d7e4 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-25 +date: 2024-06-26 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 e1204a8520125..6566456c6e407 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-25 +date: 2024-06-26 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 6d5d5304b05ec..c46010826a24c 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-25 +date: 2024-06-26 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 03211d7d7f21e..b84e84df42452 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-25 +date: 2024-06-26 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 d6c60152562b5..18d1a9cdbcfeb 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-25 +date: 2024-06-26 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 ccb6391122f19..b24d73b362c2b 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-25 +date: 2024-06-26 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 5981e5b9bc1fd..91235a1d0044c 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-25 +date: 2024-06-26 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 740773dd26207..25cf532cfc37e 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-25 +date: 2024-06-26 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 8e9fefc97a4c1..997e1bff5c758 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-25 +date: 2024-06-26 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 ace8f9057ef17..67868c678419e 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-25 +date: 2024-06-26 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 e050cdd04db30..eb0537533306b 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-25 +date: 2024-06-26 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 0345229ccd848..49d1d55211ff7 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-25 +date: 2024-06-26 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 b91fc2904e34a..c71e2fb7400ba 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 925a69bc38e80..578276dc434e1 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index b3eb93fda9b40..37c14e51525d8 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-06-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 6a4f5b8aa94af..95306ad478d0e 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-25 +date: 2024-06-26 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 dd449fe68a986..df2fc5bb91e20 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index 9896e29ee043a..8511554e9b273 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -1255,16 +1255,7 @@ "path": "x-pack/packages/security/plugin_types_public/src/plugin.ts", "deprecated": true, "trackAdoption": false, - "references": [ - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts" - } - ] + "references": [] }, { "parentPluginId": "security", @@ -6623,47 +6614,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "security", - "id": "def-common.RestApiKey", - "type": "Interface", - "tags": [], - "label": "RestApiKey", - "description": [ - "\nInterface representing a REST API key the way it is returned by Elasticsearch GET endpoint.\n\nTODO: Remove this type when `@elastic/elasticsearch` has been updated." - ], - "signature": [ - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.RestApiKey", - "text": "RestApiKey" - }, - " extends ", - "BaseApiKey" - ], - "path": "x-pack/plugins/security/common/model/api_key.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "security", - "id": "def-common.RestApiKey.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "\"rest\"" - ], - "path": "x-pack/plugins/security/common/model/api_key.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "security", "id": "def-common.Role", @@ -7980,31 +7930,6 @@ ], "enums": [], "misc": [ - { - "parentPluginId": "security", - "id": "def-common.ApiKey", - "type": "Type", - "tags": [], - "label": "ApiKey", - "description": [ - "\nInterface representing an API key the way it is returned by Elasticsearch GET endpoint." - ], - "signature": [ - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.RestApiKey", - "text": "RestApiKey" - }, - " | ", - "CrossClusterApiKey" - ], - "path": "x-pack/plugins/security/common/model/api_key.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "security", "id": "def-common.LoginLayout", diff --git a/api_docs/security.mdx b/api_docs/security.mdx index fde376dd1ce21..372667ec3823f 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 414 | 0 | 205 | 3 | +| 411 | 0 | 204 | 1 | ## Client diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 887684bdf4edc..b2201135f5ed4 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-25 +date: 2024-06-26 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 634b7a2fda3b3..8b71da2715c23 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-25 +date: 2024-06-26 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 b9a3f691b70f1..2a769f0669dd3 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-25 +date: 2024-06-26 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 872eedbfec118..c79c1e206d08e 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-25 +date: 2024-06-26 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 f8070afa28d9e..2b2524b152444 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-25 +date: 2024-06-26 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 a084d33659da1..269c75104ac33 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-25 +date: 2024-06-26 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 7cc8ff8cc077c..cb30d987cd745 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-25 +date: 2024-06-26 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 f59df61a3f6f7..b7aaab1fadce0 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-25 +date: 2024-06-26 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 cbe568db4c544..fd15d4bf79c76 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-25 +date: 2024-06-26 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 0dcc86139743a..5b43cf0a1a897 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-25 +date: 2024-06-26 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 76b5a1a3aaf53..94a30d9d19f54 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-25 +date: 2024-06-26 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 5ca2df3020adb..35f20eb4d194e 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-25 +date: 2024-06-26 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 72c81084f19fa..e1d92eca17256 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-25 +date: 2024-06-26 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 ed349d0cd8b6e..0741b5ed6bbaa 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-25 +date: 2024-06-26 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 9938a533875ab..abf3e0319ed0c 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-25 +date: 2024-06-26 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 1123feb2b28c6..d2367dca904c0 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-25 +date: 2024-06-26 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 653ee5652d926..444f5b25a7737 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-25 +date: 2024-06-26 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 2e284c4884d84..36bdb33aaae9d 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-25 +date: 2024-06-26 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 50b035e5aa10a..1ffe28521c2b2 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-25 +date: 2024-06-26 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 5cf667ea05cbb..1e7710286a01e 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-25 +date: 2024-06-26 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 93236e324fa3f..6c2c424cc639e 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-25 +date: 2024-06-26 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 1ddc4fcfb16ff..66022f4afcc65 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-25 +date: 2024-06-26 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 c1795abdcb2e4..aafca4662428b 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-25 +date: 2024-06-26 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 79cec7c3ee5c4..057cb5ee6e384 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-25 +date: 2024-06-26 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 4008aba47b7ce..8b394d1ca1412 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-25 +date: 2024-06-26 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 5a3f485e875a9..57fdca0443572 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-25 +date: 2024-06-26 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 54d92fc2aba81..946f8cd0c8173 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-25 +date: 2024-06-26 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 6990f96af5bd9..ecd69631eb8a2 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-25 +date: 2024-06-26 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 d1ed759c90b48..c5bca47ad5d0c 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-25 +date: 2024-06-26 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 2581ca3d986d7..437dccb7649a7 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-25 +date: 2024-06-26 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 e6cb90ae31a37..56953555e1660 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-25 +date: 2024-06-26 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 c7345789d14b3..304ad99301db7 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-25 +date: 2024-06-26 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 6eb4196ccf5a4..0699b0c2bb804 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-25 +date: 2024-06-26 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 3266c1af8d2db..1e8fc23a4ac33 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-25 +date: 2024-06-26 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 e06b9632fa6ce..5191df04916be 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-25 +date: 2024-06-26 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 95259dd6a3644..89bf2ba455cf4 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-25 +date: 2024-06-26 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 8662a6b3435d3..063094b54475d 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-25 +date: 2024-06-26 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 efe6e361f5a6e..f2f6e48bea358 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-25 +date: 2024-06-26 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 a652aa9e61a41..ed98c3f3917cd 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-25 +date: 2024-06-26 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 25e6e407040a2..1c8541f3b080a 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-25 +date: 2024-06-26 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 36dfa8e37ce74..b4f8361136794 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-25 +date: 2024-06-26 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 bf659a5d22c89..25aca6964fd65 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-25 +date: 2024-06-26 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 9594fd0ad5e0c..53fe17e61d26d 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-25 +date: 2024-06-26 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 cbf9728e310d1..e9c2635558bdf 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-25 +date: 2024-06-26 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 4468ce52c373eac076d3f25e71d7697fab467431 Mon Sep 17 00:00:00 2001 From: Mykola Harmash <mykola.harmash@gmail.com> Date: Wed, 26 Jun 2024 09:18:55 +0200 Subject: [PATCH 10/40] [Onboarding] Fix failing Cypress tests (#186898) ## Summary Fixes [failng Cypress tests](https://buildkite.com/elastic/kibana-pull-request/builds/217616#01904f09-ffdb-4ef4-8cc4-84ed91834b25) by adding a payload with required `agentId` to 'ea-status': 'complete' progress step. --- .../logs/custom_logs/install_elastic_agent.cy.ts | 16 ++++++++++++---- .../e2e/cypress/e2e/logs/system_logs.cy.ts | 16 ++++++++++++---- .../e2e/cypress/support/commands.ts | 12 +++++++++++- .../e2e/cypress/support/types.d.ts | 3 ++- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts index 7e0b829e67305..b4707350948f0 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts @@ -261,7 +261,9 @@ describe('[Logs onboarding] Custom logs - install elastic agent', () => { }); it('shows a success callout when elastic agent status is healthy', () => { - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); cy.getByTestSubj('obltOnboardingStepStatus-complete') .contains('Connected to the Elastic Agent') .should('exist'); @@ -299,7 +301,9 @@ describe('[Logs onboarding] Custom logs - install elastic agent', () => { cy.updateInstallationStepStatus(onboardingId, 'ea-download', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-extract', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-install', 'complete'); - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); }); it('shows loading callout when config is being downloaded to the host', () => { @@ -340,7 +344,9 @@ describe('[Logs onboarding] Custom logs - install elastic agent', () => { cy.updateInstallationStepStatus(onboardingId, 'ea-download', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-extract', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-install', 'complete'); - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); }); it('shows loading callout when config is being downloaded to the host', () => { @@ -424,7 +430,9 @@ describe('[Logs onboarding] Custom logs - install elastic agent', () => { cy.updateInstallationStepStatus(onboardingId, 'ea-download', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-extract', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-install', 'complete'); - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); cy.updateInstallationStepStatus(onboardingId, 'ea-config', 'complete'); }); diff --git a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts index 811d073855350..bd0af6f595b34 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts @@ -291,7 +291,9 @@ describe('[Logs onboarding] System logs', () => { }); it('shows a success callout when elastic agent status is healthy', () => { - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); cy.getByTestSubj('obltOnboardingStepStatus-complete') .contains('Connected to the Elastic Agent') .should('exist'); @@ -330,7 +332,9 @@ describe('[Logs onboarding] System logs', () => { cy.updateInstallationStepStatus(onboardingId, 'ea-download', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-extract', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-install', 'complete'); - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); }); it('shows loading callout when config is being downloaded to the host', () => { @@ -371,7 +375,9 @@ describe('[Logs onboarding] System logs', () => { cy.updateInstallationStepStatus(onboardingId, 'ea-download', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-extract', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-install', 'complete'); - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); }); it('shows loading callout when config is being downloaded to the host', () => { @@ -456,7 +462,9 @@ describe('[Logs onboarding] System logs', () => { cy.updateInstallationStepStatus(onboardingId, 'ea-download', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-extract', 'complete'); cy.updateInstallationStepStatus(onboardingId, 'ea-install', 'complete'); - cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete'); + cy.updateInstallationStepStatus(onboardingId, 'ea-status', 'complete', { + agentId: 'test-agent-id', + }); cy.updateInstallationStepStatus(onboardingId, 'ea-config', 'complete'); }); diff --git a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/commands.ts b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/commands.ts index ebf44ed802b39..4b63eaf207d72 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/commands.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/commands.ts @@ -24,6 +24,10 @@ export type InstallationStepStatus = | 'danger' | 'current'; +export interface ElasticAgentStepPayload { + agentId: string; +} + Cypress.Commands.add('loginAsViewerUser', () => { return cy.loginAs({ username: ObservabilityOnboardingUsername.viewerUser, @@ -151,7 +155,12 @@ Cypress.Commands.add('deleteIntegration', (integrationName: string) => { Cypress.Commands.add( 'updateInstallationStepStatus', - (onboardingId: string, step: InstallationStep, status: InstallationStepStatus) => { + ( + onboardingId: string, + step: InstallationStep, + status: InstallationStepStatus, + payload: ElasticAgentStepPayload | undefined + ) => { const kibanaUrl = Cypress.env('KIBANA_URL'); cy.log(onboardingId, step, status); @@ -166,6 +175,7 @@ Cypress.Commands.add( auth: { user: 'editor', pass: 'changeme' }, body: { status, + payload, }, }); } diff --git a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/types.d.ts b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/types.d.ts index dbc28bb442bb9..7bb3549a60e7c 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/types.d.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/e2e/cypress/support/types.d.ts @@ -22,7 +22,8 @@ declare namespace Cypress { updateInstallationStepStatus( onboardingId: string, step: InstallationStep, - status: InstallationStepStatus + status: InstallationStepStatus, + payload?: ElasticAgentStepPayload ): void; } } From eda351ec3665e9bd6b343cf46feb4ac7045d6145 Mon Sep 17 00:00:00 2001 From: Cristina Amico <criamico@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:19:46 +0200 Subject: [PATCH 11/40] [Fleet] Enable multiple agent policies feature only for Enterprise licences (#186871) ## Summary Enable multiple agent policies feature only for Enterprise licences. I created a central hook to reuse in the UI to avoid repeating the same call everywhere and replaced the calls to `enableReusableIntegrationPolicies` with this new hook. ### Testing - Enable a local enterprise licence ([steps](https://elasticco.atlassian.net/wiki/spaces/PM/pages/46802910/Internal+License+-+X-Pack+and+Endgame)) - Enable flag `enableReusableIntegrationPolicies` - The recent changes for multiple agent policies should be visible in the UI Repeat the steps with any lower licence, the UI changes shouldn't be visible ### Checklist - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../steps/step_select_agent_policy.test.tsx | 13 ++++++----- .../steps/step_select_agent_policy.tsx | 20 +++++++--------- .../edit_package_policy_page/index.test.tsx | 14 +++++++---- .../edit_package_policy_page/index.tsx | 7 +++--- .../detail/policies/package_policies.tsx | 6 ++--- .../package_policy_actions_menu.test.tsx | 17 ++++++++++---- .../package_policy_delete_provider.tsx | 7 +++--- x-pack/plugins/fleet/public/hooks/index.ts | 1 + .../hooks/use_multiple_agent_policies.ts | 23 +++++++++++++++++++ 9 files changed, 71 insertions(+), 37 deletions(-) create mode 100644 x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx index c560f3ef53a93..33ff461f7efd5 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx @@ -10,12 +10,10 @@ import { act } from '@testing-library/react'; import type { PackageInfo } from '../../../../../../../../common'; -import { ExperimentalFeaturesService } from '../../../../../../../services'; - import type { TestRenderer } from '../../../../../../../mock'; import { createFleetTestRendererMock } from '../../../../../../../mock'; -import { useGetAgentPolicies } from '../../../../../hooks'; +import { useGetAgentPolicies, useMultipleAgentPolicies } from '../../../../../hooks'; import { StepSelectAgentPolicy } from './step_select_agent_policy'; @@ -23,6 +21,7 @@ jest.mock('../../../../../hooks', () => { return { ...jest.requireActual('../../../../../hooks'), useGetAgentPolicies: jest.fn(), + useMultipleAgentPolicies: jest.fn(), useGetOutputs: jest.fn().mockReturnValue({ data: { items: [ @@ -61,6 +60,9 @@ jest.mock('../../../../../hooks', () => { const useGetAgentPoliciesMock = useGetAgentPolicies as jest.MockedFunction< typeof useGetAgentPolicies >; +const useMultipleAgentPoliciesMock = useMultipleAgentPolicies as jest.MockedFunction< + typeof useMultipleAgentPolicies +>; describe('step select agent policy', () => { let testRenderer: TestRenderer; @@ -80,6 +82,7 @@ describe('step select agent policy', () => { beforeEach(() => { testRenderer = createFleetTestRendererMock(); + useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: false }); updateAgentPoliciesMock.mockReset(); }); @@ -124,9 +127,7 @@ describe('step select agent policy', () => { describe('multiple agent policies', () => { beforeEach(() => { - jest - .spyOn(ExperimentalFeaturesService, 'get') - .mockReturnValue({ enableReusableIntegrationPolicies: true }); + useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: true }); useGetAgentPoliciesMock.mockReturnValue({ data: { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx index 0593c8274a22e..f28593d84ef9a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx @@ -24,11 +24,7 @@ import { import { Error } from '../../../../../components'; import type { AgentPolicy, Output, PackageInfo } from '../../../../../types'; -import { - isPackageLimited, - doesAgentPolicyAlreadyIncludePackage, - ExperimentalFeaturesService, -} from '../../../../../services'; +import { isPackageLimited, doesAgentPolicyAlreadyIncludePackage } from '../../../../../services'; import { useGetAgentPolicies, useGetOutputs, @@ -43,6 +39,8 @@ import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, } from '../../../../../../../../common/constants'; +import { useMultipleAgentPolicies } from '../../../../../hooks'; + import { AgentPolicyMultiSelect } from './components/agent_policy_multi_select'; const AgentPolicyFormRow = styled(EuiFormRow)` @@ -229,7 +227,7 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ const [selectedAgentPolicyError, setSelectedAgentPolicyError] = useState<Error>(); - const { enableReusableIntegrationPolicies } = ExperimentalFeaturesService.get(); + const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); const { isLoading, @@ -289,12 +287,10 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ isFirstLoad && selectedPolicyIds.length === 0 && existingAgentPolicies.length && - (enableReusableIntegrationPolicies - ? agentPolicyMultiOptions.length - : agentPolicyOptions.length) + (canUseMultipleAgentPolicies ? agentPolicyMultiOptions.length : agentPolicyOptions.length) ) { setIsFirstLoad(false); - if (enableReusableIntegrationPolicies) { + if (canUseMultipleAgentPolicies) { const enabledOptions = agentPolicyMultiOptions.filter((option) => !option.disabled); if (enabledOptions.length === 1) { setSelectedPolicyIds([enabledOptions[0].key!]); @@ -313,7 +309,7 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ }, [ agentPolicyOptions, agentPolicyMultiOptions, - enableReusableIntegrationPolicies, + canUseMultipleAgentPolicies, selectedAgentPolicyIds, selectedPolicyIds, existingAgentPolicies, @@ -424,7 +420,7 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ ) : null } > - {enableReusableIntegrationPolicies ? ( + {canUseMultipleAgentPolicies ? ( <AgentPolicyMultiSelect isLoading={isLoading || !packageInfo || isLoadingSelectedAgentPolicies} selectedPolicyIds={selectedPolicyIds} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx index f00ac0981cd03..7d50d3e494dbb 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx @@ -8,8 +8,6 @@ import React from 'react'; import { fireEvent, act, waitFor } from '@testing-library/react'; -import { ExperimentalFeaturesService } from '../../../../../services'; - import type { TestRenderer } from '../../../../../mock'; import { createFleetTestRendererMock } from '../../../../../mock'; @@ -24,6 +22,7 @@ import { sendCreateAgentPolicy, sendBulkGetAgentPolicies, useGetAgentPolicies, + useMultipleAgentPolicies, } from '../../../hooks'; import { useGetOnePackagePolicy } from '../../../../integrations/hooks'; @@ -39,6 +38,7 @@ jest.mock('../../../hooks', () => { sendGetOnePackagePolicy: jest.fn(), sendGetOneAgentPolicy: jest.fn(), sendUpgradePackagePolicyDryRun: jest.fn(), + useMultipleAgentPolicies: jest.fn(), sendGetPackageInfoByKey: jest.fn().mockImplementation((name, version) => Promise.resolve({ data: { @@ -201,6 +201,10 @@ const TestComponent = async () => { }; }; +const useMultipleAgentPoliciesMock = useMultipleAgentPolicies as jest.MockedFunction< + typeof useMultipleAgentPolicies +>; + describe('edit package policy page', () => { let testRenderer: TestRenderer; let renderResult: ReturnType<typeof testRenderer.render>; @@ -250,6 +254,7 @@ describe('edit package policy page', () => { isLoading: false, resendRequest: jest.fn(), }); + useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: false }); }); it('should disable submit button on invalid form with empty package var', async () => { @@ -486,9 +491,8 @@ describe('edit package policy page', () => { describe('modify agent policies', () => { beforeEach(() => { - jest - .spyOn(ExperimentalFeaturesService, 'get') - .mockReturnValue({ enableReusableIntegrationPolicies: true }); + useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: true }); + (sendGetAgentStatus as jest.MockedFunction<any>).mockResolvedValue({ data: { results: { total: 0 } }, }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index 73e1a9cf8c137..15928ab8bc133 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -50,13 +50,14 @@ import { import { AGENTLESS_POLICY_ID } from '../../../../../../common/constants'; import type { AgentPolicy, PackagePolicyEditExtensionComponentProps } from '../../../types'; -import { ExperimentalFeaturesService, pkgKeyFromPackageInfo } from '../../../services'; +import { pkgKeyFromPackageInfo } from '../../../services'; import { getInheritedNamespace, getRootPrivilegedDataStreams, isRootPrivilegesRequired, } from '../../../../../../common/services'; +import { useMultipleAgentPolicies } from '../../../hooks'; import { RootPrivilegesCallout } from '../create_package_policy_page/single_page_layout/root_callout'; @@ -103,7 +104,7 @@ export const EditPackagePolicyForm = memo<{ agents: { enabled: isFleetEnabled }, } = useConfig(); const { getHref } = useLink(); - const { enableReusableIntegrationPolicies } = ExperimentalFeaturesService.get(); + const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); const { // data @@ -520,7 +521,7 @@ export const EditPackagePolicyForm = memo<{ <EuiSpacer size="xxl" /> </> )} - {enableReusableIntegrationPolicies ? ( + {canUseMultipleAgentPolicies ? ( <StepsWithLessPadding steps={steps} /> ) : ( replaceConfigurePackage || configurePackage diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx index 6e1ce1cf8b2d4..d33958c5a68ec 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx @@ -21,7 +21,6 @@ import { i18n } from '@kbn/i18n'; import { FormattedRelative, FormattedMessage } from '@kbn/i18n-react'; import { policyHasFleetServer } from '../../../../../../../../common/services'; -import { ExperimentalFeaturesService } from '../../../../../services'; import { InstallStatus } from '../../../../../types'; import type { GetAgentPoliciesResponseItem, InMemoryPackagePolicy } from '../../../../../types'; @@ -44,6 +43,7 @@ import { import { PackagePolicyAgentsCell } from './components/package_policy_agents_cell'; import { usePackagePoliciesWithAgentPolicy } from './use_package_policies_with_agent_policy'; import { Persona } from './persona'; +import { useMultipleAgentPolicies } from '../../../../../hooks'; interface PackagePoliciesPanelProps { name: string; @@ -103,7 +103,7 @@ export const PackagePoliciesPage = ({ name, version }: PackagePoliciesPanelProps const getPackageInstallStatus = useGetPackageInstallStatus(); const packageInstallStatus = getPackageInstallStatus(name); const { pagination, pageSizeOptions, setPagination } = useUrlPagination(); - const { enableReusableIntegrationPolicies } = ExperimentalFeaturesService.get(); + const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); const { data, @@ -173,7 +173,7 @@ export const PackagePoliciesPage = ({ name, version }: PackagePoliciesPanelProps [setPagination] ); const canShowMultiplePoliciesCell = - enableReusableIntegrationPolicies && canReadIntegrationPolicies && canReadAgentPolicies; + canUseMultipleAgentPolicies && canReadIntegrationPolicies && canReadAgentPolicies; const columns: Array<EuiTableFieldDataColumnType<InMemoryPackagePolicyAndAgentPolicy>> = useMemo( () => [ { diff --git a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx index 96849c077f881..e099092b4b863 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx @@ -12,10 +12,21 @@ import { act } from '@testing-library/react'; import type { AgentPolicy, InMemoryPackagePolicy } from '../types'; import { createIntegrationsTestRendererMock } from '../mock'; -import { ExperimentalFeaturesService } from '../services'; +import { useMultipleAgentPolicies } from '../hooks'; import { PackagePolicyActionsMenu } from './package_policy_actions_menu'; +jest.mock('../hooks', () => { + return { + ...jest.requireActual('../hooks'), + useMultipleAgentPolicies: jest.fn(), + }; +}); + +const useMultipleAgentPoliciesMock = useMultipleAgentPolicies as jest.MockedFunction< + typeof useMultipleAgentPolicies +>; + function renderMenu({ agentPolicies, packagePolicy, @@ -87,9 +98,7 @@ function createMockPackagePolicy( } describe('PackagePolicyActionsMenu', () => { beforeAll(() => { - jest.spyOn(ExperimentalFeaturesService, 'get').mockReturnValue({ - enableReusableIntegrationPolicies: false, - } as any); + useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: false }); }); it('Should disable upgrade button if package does not have upgrade', async () => { diff --git a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx index c4bdd8a4671fd..35f2313f37e0a 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx @@ -10,11 +10,10 @@ import { EuiCallOut, EuiConfirmModal, EuiSpacer, EuiIconTip } from '@elastic/eui import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ExperimentalFeaturesService } from '../services'; import { useStartServices, sendDeletePackagePolicy, useConfig } from '../hooks'; import { AGENTS_PREFIX } from '../../common/constants'; import type { AgentPolicy } from '../types'; -import { sendGetAgents } from '../hooks'; +import { sendGetAgents, useMultipleAgentPolicies } from '../hooks'; interface Props { agentPolicies?: AgentPolicy[]; @@ -42,10 +41,10 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ const [agentsCount, setAgentsCount] = useState<number>(0); const [isLoading, setIsLoading] = useState<boolean>(false); const onSuccessCallback = useRef<OnSuccessCallback | null>(null); - const { enableReusableIntegrationPolicies } = ExperimentalFeaturesService.get(); + const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); const hasMultipleAgentPolicies = - enableReusableIntegrationPolicies && agentPolicies && agentPolicies.length > 1; + canUseMultipleAgentPolicies && agentPolicies && agentPolicies.length > 1; const fetchAgentsCount = useMemo( () => async () => { diff --git a/x-pack/plugins/fleet/public/hooks/index.ts b/x-pack/plugins/fleet/public/hooks/index.ts index e9450a975d3b5..f537698897a19 100644 --- a/x-pack/plugins/fleet/public/hooks/index.ts +++ b/x-pack/plugins/fleet/public/hooks/index.ts @@ -34,3 +34,4 @@ export * from './use_fleet_server_standalone'; export * from './use_locator'; export * from './use_agent_version'; export * from './use_fleet_server_agents'; +export * from './use_multiple_agent_policies'; diff --git a/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts b/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts new file mode 100644 index 0000000000000..2adf814e8ffba --- /dev/null +++ b/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.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. + */ + +import { ExperimentalFeaturesService } from '../services'; + +import { useLicense } from './use_license'; + +export const LICENCE_FOR_MULTIPLE_AGENT_POLICIES = 'enterprise'; + +export function useMultipleAgentPolicies() { + const licenseService = useLicense(); + const { enableReusableIntegrationPolicies } = ExperimentalFeaturesService.get(); + + const hasEnterpriseLicence = licenseService.hasAtLeast(LICENCE_FOR_MULTIPLE_AGENT_POLICIES); + + const canUseMultipleAgentPolicies = enableReusableIntegrationPolicies && hasEnterpriseLicence; + + return { canUseMultipleAgentPolicies }; +} From 1b17f661286a2a7f11df961f455d140bd609b1ea Mon Sep 17 00:00:00 2001 From: Maxim Kholod <maxim.kholod@elastic.co> Date: Wed, 26 Jun 2024 11:26:27 +0200 Subject: [PATCH 12/40] [Cloud Security] unskip"Findings Page - DataTable > Table Sort" FTR test suit (#186825) ## Summary Related to: - https://github.com/elastic/kibana/issues/152913 Unskipping the test, as the data grid has been refactored and it after running flaky test runner it looks like the flakiness is gone (finger crossed, in the failed cases the failures were unrelated, eg. agent lost). --- .../test/cloud_security_posture_functional/pages/findings.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings.ts b/x-pack/test/cloud_security_posture_functional/pages/findings.ts index 57b9f303a2046..76ea64f6e6195 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings.ts @@ -147,8 +147,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await findings.index.remove(); }); - // FLAKY: https://github.com/elastic/kibana/issues/152913 - describe.skip('Table Sort', () => { + describe('Table Sort', () => { type SortingMethod = (a: string, b: string) => number; type SortDirection = 'asc' | 'desc'; // Sort by lexical order will sort by the first character of the string (case-sensitive) From 4ec5ad566fd34ad7ae6e575019b31154a97536df Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani <marcoantonio.ghiani01@gmail.com> Date: Wed, 26 Jun 2024 11:50:54 +0200 Subject: [PATCH 13/40] [Monitoring] Set explicit access option for internal API (#186882) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Part of #186781 Explicit set the `access` options for the monitoring internal API: - access [internal] [POST] for path [/api/monitoring/v1/alert/{clusterUuid}/status]" - access [internal] [POST] for path [/api/monitoring/v1/alerts/enable]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/apm/{apmUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/apm/instances]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/apm]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/beats/beat/{beatUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/beats/beats]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/beats]" - access [internal] [GET] for path [/api/monitoring/v1/check_access]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/indices/{id}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/indices]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/nodes/{nodeUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/nodes]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/ml_jobs]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/ccr]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/elasticsearch/ccr/{index}/shard/{shardId}]" - access [internal] [GET] for path [/api/monitoring/v1/elasticsearch_settings/check/cluster]" - access [internal] [POST] for path [/api/monitoring/v1/elasticsearch_settings/check/internal_monitoring]" - access [internal] [GET] for path [/api/monitoring/v1/elasticsearch_settings/check/nodes]" - access [internal] [PUT] for path [/api/monitoring/v1/elasticsearch_settings/set/collection_enabled]" - access [internal] [PUT] for path [/api/monitoring/v1/elasticsearch_settings/set/collection_interval]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/enterprise_search]" - access [internal] [GET] for path [/api/monitoring/v1/_health]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash/pipeline_ids]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash/pipelines]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash/node/{logstashUuid}/pipelines]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash/node/{logstashUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash/nodes]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/logstash/pipeline/{pipelineId}/{pipelineHash?}]" - access [internal] [POST] for path [/api/monitoring/v1/setup/collection/cluster/{clusterUuid?}]" - access [internal] [POST] for path [/api/monitoring/v1/setup/collection/{clusterUuid}/disable_internal_collection]" - access [internal] [POST] for path [/api/monitoring/v1/setup/collection/node/{nodeUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/kibana/{kibanaUuid}]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/kibana/instances]" - access [internal] [POST] for path [/api/monitoring/v1/clusters/{clusterUuid}/kibana]" - access [internal] [GET] for path [/api/monitoring_collection/{type}] Co-authored-by: Marco Antonio Ghiani <marcoantonio.ghiani@elastic.co> --- .../plugins/monitoring/server/routes/api/v1/_health/index.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/alerts/enable.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/alerts/status.ts | 3 +++ x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/apm/instances.ts | 3 +++ x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts | 3 +++ .../monitoring/server/routes/api/v1/beats/beat_detail.ts | 3 +++ x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/beats/overview.ts | 3 +++ .../server/routes/api/v1/check_access/check_access.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/cluster/cluster.ts | 3 +++ .../monitoring/server/routes/api/v1/cluster/clusters.ts | 3 +++ .../monitoring/server/routes/api/v1/elasticsearch/ccr.ts | 3 +++ .../monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts | 3 +++ .../server/routes/api/v1/elasticsearch/index_detail.ts | 3 +++ .../monitoring/server/routes/api/v1/elasticsearch/indices.ts | 3 +++ .../monitoring/server/routes/api/v1/elasticsearch/ml_jobs.ts | 3 +++ .../server/routes/api/v1/elasticsearch/node_detail.ts | 3 +++ .../monitoring/server/routes/api/v1/elasticsearch/nodes.ts | 3 +++ .../monitoring/server/routes/api/v1/elasticsearch/overview.ts | 3 +++ .../routes/api/v1/elasticsearch_settings/check/cluster.ts | 3 +++ .../api/v1/elasticsearch_settings/check/internal_monitoring.ts | 3 +++ .../server/routes/api/v1/elasticsearch_settings/check/nodes.ts | 3 +++ .../api/v1/elasticsearch_settings/set/collection_enabled.ts | 3 +++ .../api/v1/elasticsearch_settings/set/collection_interval.ts | 3 +++ .../server/routes/api/v1/enterprise_search/overview.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/kibana/instance.ts | 3 +++ .../monitoring/server/routes/api/v1/kibana/instances.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/kibana/overview.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/logstash/node.ts | 3 +++ .../plugins/monitoring/server/routes/api/v1/logstash/nodes.ts | 3 +++ .../monitoring/server/routes/api/v1/logstash/overview.ts | 3 +++ .../monitoring/server/routes/api/v1/logstash/pipeline.ts | 3 +++ .../routes/api/v1/logstash/pipelines/cluster_pipeline_ids.ts | 3 +++ .../routes/api/v1/logstash/pipelines/cluster_pipelines.ts | 3 +++ .../server/routes/api/v1/logstash/pipelines/node_pipelines.ts | 3 +++ .../server/routes/api/v1/setup/cluster_setup_status.ts | 3 +++ .../api/v1/setup/disable_elasticsearch_internal_collection.ts | 3 +++ .../monitoring/server/routes/api/v1/setup/node_setup_status.ts | 3 +++ .../server/routes/api/v1/dynamic_route/get_metrics_by_type.ts | 1 + 40 files changed, 118 insertions(+) diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/_health/index.ts b/x-pack/plugins/monitoring/server/routes/api/v1/_health/index.ts index 8a04150a7bbde..5ed5b85168ee2 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/_health/index.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/_health/index.ts @@ -30,6 +30,9 @@ export function registerV1HealthRoute(server: MonitoringCore) { validate: { query: validateQuery, }, + options: { + access: 'internal', + }, async handler(req: LegacyRequest) { const logger = req.getLogger(); const timeRange = { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts index 326033e61f1c0..8b919fd1f86ea 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts @@ -19,6 +19,9 @@ export function enableAlertsRoute(server: MonitoringCore, npRoute: RouteDependen { path: '/api/monitoring/v1/alerts/enable', validate: false, + options: { + access: 'internal', + }, }, async (context, request, response) => { try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/status.ts b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/status.ts index a9efc14c8c458..64a0b7b92d85f 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/status.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/status.ts @@ -28,6 +28,9 @@ export function alertStatusRoute(npRoute: RouteDependencies) { }), }), }, + options: { + access: 'internal', + }, }, async (context, request, response) => { try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts index 92266c20596dc..8c8d7e0ad2c69 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts @@ -29,6 +29,9 @@ export function apmInstanceRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const apmUuid = req.params.apmUuid; const config = server.config; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts index 3dbe30c459ba6..bb8086867ed05 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts @@ -27,6 +27,9 @@ export function apmInstancesRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const ccs = req.payload.ccs; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts b/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts index 468f267d517bd..12f0fcda23cb6 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts @@ -28,6 +28,9 @@ export function apmOverviewRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.ts b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.ts index 1a6e1da429f93..30ef661feb0f4 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.ts @@ -29,6 +29,9 @@ export function beatsDetailRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; const beatUuid = req.params.beatUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.ts b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.ts index f78a4902734fa..b59cec2898617 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.ts @@ -27,6 +27,9 @@ export function beatsListingRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const ccs = req.payload.ccs; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.ts b/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.ts index 3fac0fea06db5..cbdc28ebf4f9b 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.ts @@ -29,6 +29,9 @@ export function beatsOverviewRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const ccs = req.payload.ccs; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts b/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts index d1688bfbb087a..baab09e81becd 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts @@ -21,6 +21,9 @@ export function checkAccessRoute(server: MonitoringCore) { method: 'get', path: '/api/monitoring/v1/check_access', validate: {}, + options: { + access: 'internal', + }, handler: async (req: LegacyRequest) => { const response: { has_access?: boolean } = {}; try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts index 864b2beec5b7b..97a6bb8407b12 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts @@ -30,6 +30,9 @@ export function clusterRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, handler: async (req) => { const options = { clusterUuid: req.params.clusterUuid, diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts index 1e5883360d09b..ab74302fa4e27 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts @@ -30,6 +30,9 @@ export function clustersRoute(server: MonitoringCore) { validate: { body: validateBody, }, + options: { + access: 'internal', + }, handler: async (req) => { // NOTE using try/catch because checkMonitoringAuth is expected to throw // an error when current logged-in user doesn't have permission to read diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts index efc3c439d7776..137175010cb22 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts @@ -271,6 +271,9 @@ export function ccrRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const ccs = req.payload.ccs; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts index cc37e52c0d9e8..3e215aaf67e35 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts @@ -95,6 +95,9 @@ export function ccrShardRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const index = req.params.index; const shardId = req.params.shardId; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.ts index 86a46dd8fae41..d420056d4ec0e 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.ts @@ -36,6 +36,9 @@ export function esIndexRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, handler: async (req) => { try { const config = server.config; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.ts index 00956410d8c4d..d453a89b7d9dc 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.ts @@ -32,6 +32,9 @@ export function esIndicesRoute(server: MonitoringCore) { query: validateQuery, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const { clusterUuid } = req.params; const { show_system_indices: showSystemIndices } = req.query; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.ts index f51ca41ee4e9f..25f72a93c0c98 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.ts @@ -29,6 +29,9 @@ export function mlJobRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.ts index 4c95edeb718e1..a07b55b9be635 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.ts @@ -41,6 +41,9 @@ export function esNodeRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const showSystemIndices = req.payload.showSystemIndices ?? false; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.ts index f291af318bf9b..30bc527eea598 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.ts @@ -32,6 +32,9 @@ export function esNodesRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const { pagination, diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.ts index 2d3b3600085d4..0b97f9ea63363 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.ts @@ -34,6 +34,9 @@ export function esOverviewRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/cluster.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/cluster.ts index df2fafa2a952c..1aa326d872654 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/cluster.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/cluster.ts @@ -18,6 +18,9 @@ export function clusterSettingsCheckRoute(server: MonitoringCore) { method: 'get', path: '/api/monitoring/v1/elasticsearch_settings/check/cluster', validate: {}, + options: { + access: 'internal', + }, async handler(req) { try { const response = await checkClusterSettings(req); // needs to be try/catch to handle privilege error 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 192d5b995e10c..65726a56d8473 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 @@ -83,6 +83,9 @@ export function internalMonitoringCheckRoute(server: MonitoringCore, npRoute: Ro validate: { body: validateBody, }, + options: { + access: 'internal', + }, }, async (context, request, response) => { try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/nodes.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/nodes.ts index 90c37c6f910c9..6edabba7e7646 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/nodes.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/nodes.ts @@ -18,6 +18,9 @@ export function nodesSettingsCheckRoute(server: MonitoringCore) { method: 'get', path: '/api/monitoring/v1/elasticsearch_settings/check/nodes', validate: {}, + options: { + access: 'internal', + }, async handler(req) { try { const response = await checkNodesSettings(req); // needs to be try/catch to handle privilege error diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_enabled.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_enabled.ts index 941818699ede2..c171a20917c1f 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_enabled.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_enabled.ts @@ -18,6 +18,9 @@ export function setCollectionEnabledRoute(server: MonitoringCore) { method: 'put', path: '/api/monitoring/v1/elasticsearch_settings/set/collection_enabled', validate: {}, + options: { + access: 'internal', + }, async handler(req) { try { const response = await setCollectionEnabled(req); diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_interval.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_interval.ts index eb4798efc36cc..8cb27c86fac0c 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_interval.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/set/collection_interval.ts @@ -18,6 +18,9 @@ export function setCollectionIntervalRoute(server: MonitoringCore) { method: 'put', path: '/api/monitoring/v1/elasticsearch_settings/set/collection_interval', validate: {}, + options: { + access: 'internal', + }, async handler(req) { try { const response = await setCollectionInterval(req); diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.ts b/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.ts index 6581b52655cee..2491e391c3947 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.ts @@ -28,6 +28,9 @@ export function entSearchOverviewRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts index d93b4ad829186..c265bbc9f4e27 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts @@ -29,6 +29,9 @@ export function kibanaInstanceRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req: LegacyRequest) { const clusterUuid = req.params.clusterUuid; const kibanaUuid = req.params.kibanaUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.ts b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.ts index ebd8c870c33d1..0d63a12eff74a 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.ts @@ -27,6 +27,9 @@ export function kibanaInstancesRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.ts b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.ts index 936dbd95c1727..f398a1bda59d7 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.ts @@ -29,6 +29,9 @@ export function kibanaOverviewRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.ts index 4c0088b4112e6..5c7bbc36b168c 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.ts @@ -34,6 +34,9 @@ export function logstashNodeRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.ts index 169165b0893fe..c4e32d86eec3a 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.ts @@ -26,6 +26,9 @@ export function logstashNodesRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.ts index 8937c1dc7a9ad..26d63693fd6dd 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.ts @@ -28,6 +28,9 @@ export function logstashOverviewRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.ts index ba4eb941f7ffe..99c0a054cc2e1 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.ts @@ -34,6 +34,9 @@ export function logstashPipelineRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.ts index fe4d2c2b64ed7..791b6a5b16aec 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.ts @@ -25,6 +25,9 @@ export function logstashClusterPipelineIdsRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const config = server.config; const clusterUuid = req.params.clusterUuid; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.ts index 07404c28894c4..452be9d2896c6 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.ts @@ -35,6 +35,9 @@ export function logstashClusterPipelinesRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const { pagination, diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.ts b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.ts index 8cf74c1d93cc7..19cd898267fad 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.ts @@ -34,6 +34,9 @@ export function logstashNodePipelinesRoute(server: MonitoringCore) { params: validateParams, body: validateBody, }, + options: { + access: 'internal', + }, async handler(req) { const { pagination, diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.ts b/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.ts index 7f8a03cf03c6b..4ebd330270bb4 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.ts @@ -35,6 +35,9 @@ export function clusterSetupStatusRoute(server: MonitoringCore) { query: validateQuery, body: validateBody, }, + options: { + access: 'internal', + }, handler: async (req) => { const clusterUuid = req.params.clusterUuid; const skipLiveData = req.query.skipLiveData; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/setup/disable_elasticsearch_internal_collection.ts b/x-pack/plugins/monitoring/server/routes/api/v1/setup/disable_elasticsearch_internal_collection.ts index cdecf346bae9d..59426eeaa99b4 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/setup/disable_elasticsearch_internal_collection.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/setup/disable_elasticsearch_internal_collection.ts @@ -19,6 +19,9 @@ export function disableElasticsearchInternalCollectionRoute(server: MonitoringCo validate: { params: createValidationFunction(postDisableInternalCollectionRequestParamsRT), }, + options: { + access: 'internal', + }, handler: async (req) => { // NOTE using try/catch because checkMonitoringAuth is expected to throw // an error when current logged-in user doesn't have permission to read diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.ts b/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.ts index 58d51fa3edcf2..7f91386020228 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.ts @@ -35,6 +35,9 @@ export function nodeSetupStatusRoute(server: MonitoringCore) { query: validateQuery, body: validateBody, }, + options: { + access: 'internal', + }, handler: async (req) => { const nodeUuid = req.params.nodeUuid; const skipLiveData = req.query.skipLiveData; diff --git a/x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.ts b/x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.ts index 4d18eeb6ec922..95e1770826d6f 100644 --- a/x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.ts +++ b/x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.ts @@ -37,6 +37,7 @@ export function registerDynamicRoute({ { path: `${MONITORING_COLLECTION_BASE_PATH}/{type}`, options: { + access: 'internal', authRequired: true, tags: ['api'], // ensures that unauthenticated calls receive a 401 rather than a 302 redirect to login page }, From ac9f6233eb6675c6d5db7cef80817a4698543653 Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Wed, 26 Jun 2024 12:05:10 +0200 Subject: [PATCH 14/40] remove category from the browser field (#186839) ## Summary Cleaning up the sourcerer model a bit, `category` does not seem to be used anywhere and it is one of the things that deviate from the FieldSpec. --- .../column_headers/helpers.test.tsx | 8 ----- .../data_table/mock/mock_source.ts | 35 ------------------ .../drag_drop_context_wrapper.test.tsx.snap | 36 ------------------- .../components/drag_and_drop/helpers.ts | 1 - .../components/event_details/columns.tsx | 16 ++++----- .../event_details/summary_view.test.tsx | 1 - .../table/field_value_cell.test.tsx | 4 --- .../table/prevalence_cell.test.tsx | 1 - .../table/summary_value_cell.test.tsx | 2 -- .../public/common/containers/source/mock.ts | 36 ------------------- .../document_details/right/tabs/table_tab.tsx | 15 ++------ .../public/sourcerer/containers/mocks.ts | 1 - .../__snapshots__/index.test.tsx.snap | 36 ------------------- .../body/column_headers/helpers.test.ts | 8 ----- .../use_timeline_columns.test.ts.snap | 17 --------- .../search_strategy/index_fields/index.ts | 11 +++--- .../timelines/public/mock/browser_fields.ts | 35 ------------------ 17 files changed, 15 insertions(+), 248 deletions(-) diff --git a/x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.test.tsx b/x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.test.tsx index dfb495201f6d1..b3687272274f7 100644 --- a/x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.test.tsx +++ b/x-pack/packages/security-solution/data_table/components/data_table/column_headers/helpers.test.tsx @@ -226,7 +226,6 @@ describe('helpers', () => { { actions, aggregatable: true, - category: 'base', columnHeaderType: 'not-filtered', defaultSortDirection, description: @@ -247,7 +246,6 @@ describe('helpers', () => { { actions, aggregatable: true, - category: 'source', columnHeaderType: 'not-filtered', defaultSortDirection, description: 'IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.', @@ -266,7 +264,6 @@ describe('helpers', () => { { actions, aggregatable: true, - category: 'destination', columnHeaderType: 'not-filtered', defaultSortDirection, description: @@ -296,7 +293,6 @@ describe('helpers', () => { { actions, aggregatable: true, - category: 'base', columnHeaderType: 'not-filtered', defaultSortDirection, description: @@ -355,7 +351,6 @@ describe('helpers', () => { const fieldName = 'test_field'; const testField = { aggregatable: true, - category: 'base', description: 'Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.', example: '2016-05-23T08:05:34.853Z', @@ -389,7 +384,6 @@ describe('helpers', () => { const fieldName = 'testFieldName'; const testField = { aggregatable: true, - category: fieldName, description: 'test field description', example: '2016-05-23T08:05:34.853Z', format: 'date', @@ -422,7 +416,6 @@ describe('helpers', () => { const fieldName = 'test.field.splittable'; const testField = { aggregatable: true, - category: 'test', description: 'test field description', example: '2016-05-23T08:05:34.853Z', format: 'date', @@ -455,7 +448,6 @@ describe('helpers', () => { describe('allowSorting', () => { const aggregatableField = { - category: 'cloud', description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.', example: '666777888999', diff --git a/x-pack/packages/security-solution/data_table/mock/mock_source.ts b/x-pack/packages/security-solution/data_table/mock/mock_source.ts index 82c2a34448153..588e302c9818b 100644 --- a/x-pack/packages/security-solution/data_table/mock/mock_source.ts +++ b/x-pack/packages/security-solution/data_table/mock/mock_source.ts @@ -25,7 +25,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'agent.ephemeral_id': { aggregatable: true, - category: 'agent', description: 'Ephemeral identifier of this agent (if one exists). This id normally changes across restarts, but `agent.id` does not.', example: '8a4f500f', @@ -38,7 +37,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.hostname': { aggregatable: true, - category: 'agent', description: null, example: null, format: '', @@ -50,7 +48,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.id': { aggregatable: true, - category: 'agent', description: 'Unique identifier of this agent (if one exists). Example: For Beats this would be beat.id.', example: '8a4f500d', @@ -63,7 +60,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.name': { aggregatable: true, - category: 'agent', description: 'Name of the agent. This is a name that can be given to an agent. This can be helpful if for example two Filebeat instances are running on the same host but a human readable separation is needed on which Filebeat instance data is coming from. If no name is given, the name is often left empty.', example: 'foo', @@ -80,7 +76,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'auditd.data.a0': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -92,7 +87,6 @@ export const mockBrowserFields: BrowserFields = { }, 'auditd.data.a1': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -104,7 +98,6 @@ export const mockBrowserFields: BrowserFields = { }, 'auditd.data.a2': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -120,7 +113,6 @@ export const mockBrowserFields: BrowserFields = { fields: { '@timestamp': { aggregatable: true, - category: 'base', description: 'Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.', example: '2016-05-23T08:05:34.853Z', @@ -133,7 +125,6 @@ export const mockBrowserFields: BrowserFields = { readFromDocValues: true, }, _id: { - category: 'base', description: 'Each document has an _id that uniquely identifies it', example: 'Y-6TfmcB0WOhS6qyMv3s', name: '_id', @@ -144,7 +135,6 @@ export const mockBrowserFields: BrowserFields = { indexes: ['auditbeat', 'filebeat', 'packetbeat'], }, message: { - category: 'base', description: 'For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.', example: 'Hello World', @@ -162,7 +152,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'client.address': { aggregatable: true, - category: 'client', description: 'Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.', example: null, @@ -175,7 +164,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.bytes': { aggregatable: true, - category: 'client', description: 'Bytes sent from the client to the server.', example: '184', format: '', @@ -187,7 +175,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.domain': { aggregatable: true, - category: 'client', description: 'Client domain.', example: null, format: '', @@ -199,7 +186,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.geo.country_iso_code': { aggregatable: true, - category: 'client', description: 'Country ISO code.', example: 'CA', format: '', @@ -215,7 +201,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'cloud.account.id': { aggregatable: true, - category: 'cloud', description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.', example: '666777888999', @@ -228,7 +213,6 @@ export const mockBrowserFields: BrowserFields = { }, 'cloud.availability_zone': { aggregatable: true, - category: 'cloud', description: 'Availability zone in which this host is running.', example: 'us-east-1c', format: '', @@ -244,7 +228,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'container.id': { aggregatable: true, - category: 'container', description: 'Unique container id.', example: null, format: '', @@ -256,7 +239,6 @@ export const mockBrowserFields: BrowserFields = { }, 'container.image.name': { aggregatable: true, - category: 'container', description: 'Name of the image the container was built on.', example: null, format: '', @@ -268,7 +250,6 @@ export const mockBrowserFields: BrowserFields = { }, 'container.image.tag': { aggregatable: true, - category: 'container', description: 'Container image tag.', example: null, format: '', @@ -284,7 +265,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'destination.address': { aggregatable: true, - category: 'destination', description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.', example: null, @@ -297,7 +277,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.bytes': { aggregatable: true, - category: 'destination', description: 'Bytes sent from the destination to the source.', example: '184', format: '', @@ -309,7 +288,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.domain': { aggregatable: true, - category: 'destination', description: 'Destination domain.', example: null, format: '', @@ -321,7 +299,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.ip': { aggregatable: true, - category: 'destination', description: 'IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.', example: '', @@ -334,7 +311,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.port': { aggregatable: true, - category: 'destination', description: 'Port of the destination.', example: '', format: '', @@ -349,7 +325,6 @@ export const mockBrowserFields: BrowserFields = { event: { fields: { 'event.end': { - category: 'event', description: 'event.end contains the date when the event ended or when the activity was last observed.', example: null, @@ -362,7 +337,6 @@ export const mockBrowserFields: BrowserFields = { aggregatable: true, }, 'event.action': { - category: 'event', description: 'The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.', example: 'user-password-change', @@ -375,7 +349,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.category': { - category: 'event', description: 'This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. `event.category` represents the "big buckets" of ECS categories. For example, filtering on `event.category:process` yields all events relating to process activity. This field is closely related to `event.type`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.', example: 'authentication', @@ -388,7 +361,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.severity': { - category: 'event', description: "The numeric severity of the event according to your event source. What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source. The Syslog severity belongs in `log.syslog.severity.code`. `event.severity` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the `log.syslog.severity.code` to `event.severity`.", example: 7, @@ -405,7 +377,6 @@ export const mockBrowserFields: BrowserFields = { host: { fields: { 'host.name': { - category: 'host', description: 'Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.', name: 'host.name', @@ -422,7 +393,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'source.ip': { aggregatable: true, - category: 'source', description: 'IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.', example: '', format: '', @@ -434,7 +404,6 @@ export const mockBrowserFields: BrowserFields = { }, 'source.port': { aggregatable: true, - category: 'source', description: 'Port of the source.', example: '', format: '', @@ -449,7 +418,6 @@ export const mockBrowserFields: BrowserFields = { user: { fields: { 'user.name': { - category: 'user', description: 'Short name or login of the user.', example: 'albert', name: 'user.name', @@ -466,7 +434,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'nestedField.firstAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', @@ -482,7 +449,6 @@ export const mockBrowserFields: BrowserFields = { }, 'nestedField.secondAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', @@ -498,7 +464,6 @@ export const mockBrowserFields: BrowserFields = { }, 'nestedField.thirdAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap index 3a964febf4c85..b313ad4b41998 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap @@ -8,7 +8,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "agent.ephemeral_id": Object { "aggregatable": true, - "category": "agent", "description": "Ephemeral identifier of this agent (if one exists). This id normally changes across restarts, but \`agent.id\` does not.", "esTypes": Array [ "keyword", @@ -26,7 +25,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "agent.hostname": Object { "aggregatable": true, - "category": "agent", "description": null, "esTypes": Array [ "keyword", @@ -44,7 +42,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "agent.id": Object { "aggregatable": true, - "category": "agent", "description": "Unique identifier of this agent (if one exists). Example: For Beats this would be beat.id.", "esTypes": Array [ "keyword", @@ -62,7 +59,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "agent.name": Object { "aggregatable": true, - "category": "agent", "description": "Name of the agent. This is a name that can be given to an agent. This can be helpful if for example two Filebeat instances are running on the same host but a human readable separation is needed on which Filebeat instance data is coming from. If no name is given, the name is often left empty.", "esTypes": Array [ "keyword", @@ -84,7 +80,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "auditd.data.a0": Object { "aggregatable": true, - "category": "auditd", "description": null, "esTypes": Array [ "keyword", @@ -100,7 +95,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "auditd.data.a1": Object { "aggregatable": true, - "category": "auditd", "description": null, "esTypes": Array [ "keyword", @@ -116,7 +110,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "auditd.data.a2": Object { "aggregatable": true, - "category": "auditd", "description": null, "esTypes": Array [ "keyword", @@ -136,7 +129,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "@timestamp": Object { "aggregatable": true, - "category": "base", "description": "Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.", "esTypes": Array [ "date", @@ -155,7 +147,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "_id": Object { "aggregatable": false, - "category": "base", "description": "Each document has an _id that uniquely identifies it", "esTypes": Array [], "example": "Y-6TfmcB0WOhS6qyMv3s", @@ -170,7 +161,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "message": Object { "aggregatable": false, - "category": "base", "description": "For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.", "esTypes": Array [ "text", @@ -192,7 +182,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "client.address": Object { "aggregatable": true, - "category": "client", "description": "Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the \`.address\` field. Then it should be duplicated to \`.ip\` or \`.domain\`, depending on which one it is.", "esTypes": Array [ "keyword", @@ -210,7 +199,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "client.bytes": Object { "aggregatable": true, - "category": "client", "description": "Bytes sent from the client to the server.", "esTypes": Array [ "long", @@ -228,7 +216,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "client.domain": Object { "aggregatable": true, - "category": "client", "description": "Client domain.", "esTypes": Array [ "keyword", @@ -246,7 +233,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "client.geo.country_iso_code": Object { "aggregatable": true, - "category": "client", "description": "Country ISO code.", "esTypes": Array [ "keyword", @@ -268,7 +254,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "cloud.account.id": Object { "aggregatable": true, - "category": "cloud", "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.", "esTypes": Array [ "keyword", @@ -286,7 +271,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "cloud.availability_zone": Object { "aggregatable": true, - "category": "cloud", "description": "Availability zone in which this host is running.", "esTypes": Array [ "keyword", @@ -308,7 +292,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "container.id": Object { "aggregatable": true, - "category": "container", "description": "Unique container id.", "esTypes": Array [ "keyword", @@ -326,7 +309,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "container.image.name": Object { "aggregatable": true, - "category": "container", "description": "Name of the image the container was built on.", "esTypes": Array [ "keyword", @@ -344,7 +326,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "container.image.tag": Object { "aggregatable": true, - "category": "container", "description": "Container image tag.", "esTypes": Array [ "keyword", @@ -366,7 +347,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "destination.address": Object { "aggregatable": true, - "category": "destination", "description": "Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the \`.address\` field. Then it should be duplicated to \`.ip\` or \`.domain\`, depending on which one it is.", "esTypes": Array [ "keyword", @@ -384,7 +364,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "destination.bytes": Object { "aggregatable": true, - "category": "destination", "description": "Bytes sent from the destination to the source.", "esTypes": Array [ "long", @@ -402,7 +381,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "destination.domain": Object { "aggregatable": true, - "category": "destination", "description": "Destination domain.", "esTypes": Array [ "keyword", @@ -420,7 +398,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "destination.ip": Object { "aggregatable": true, - "category": "destination", "description": "IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ "ip", @@ -438,7 +415,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "destination.port": Object { "aggregatable": true, - "category": "destination", "description": "Port of the destination.", "esTypes": Array [ "long", @@ -460,7 +436,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "event.action": Object { "aggregatable": true, - "category": "event", "description": "The action captured by the event. This describes the information in the event. It is more specific than \`event.category\`. Examples are \`group-add\`, \`process-started\`, \`file-created\`. The value is normally defined by the implementer.", "esTypes": Array [ "keyword", @@ -484,7 +459,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "event.category": Object { "aggregatable": true, - "category": "event", "description": "This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. \`event.category\` represents the \\"big buckets\\" of ECS categories. For example, filtering on \`event.category:process\` yields all events relating to process activity. This field is closely related to \`event.type\`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.", "esTypes": Array [ "keyword", @@ -508,7 +482,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "event.end": Object { "aggregatable": true, - "category": "event", "description": "event.end contains the date when the event ended or when the activity was last observed.", "esTypes": Array [ "date", @@ -532,7 +505,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "event.kind": Object { "aggregatable": true, - "category": "event", "description": "This defined the type of event eg. alerts", "esTypes": Array [ "keyword", @@ -556,7 +528,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "event.severity": Object { "aggregatable": true, - "category": "event", "description": "The numeric severity of the event according to your event source. What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source. The Syslog severity belongs in \`log.syslog.severity.code\`. \`event.severity\` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the \`log.syslog.severity.code\` to \`event.severity\`.", "esTypes": Array [ "long", @@ -584,7 +555,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "host.name": Object { "aggregatable": true, - "category": "host", "description": "Name of the host. It can contain what \`hostname\` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.", "esTypes": Array [ "keyword", @@ -611,7 +581,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "nestedField.firstAttributes": Object { "aggregatable": false, - "category": "nestedField", "description": "", "example": "", "format": "", @@ -631,7 +600,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "nestedField.secondAttributes": Object { "aggregatable": false, - "category": "nestedField", "description": "", "example": "", "format": "", @@ -651,7 +619,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "nestedField.thirdAttributes": Object { "aggregatable": false, - "category": "nestedField", "description": "", "example": "", "format": "", @@ -690,7 +657,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "source.ip": Object { "aggregatable": true, - "category": "source", "description": "IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ "ip", @@ -708,7 +674,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = }, "source.port": Object { "aggregatable": true, - "category": "source", "description": "Port of the source.", "esTypes": Array [ "long", @@ -730,7 +695,6 @@ exports[`DragDropContextWrapper rendering it renders against the snapshot 1`] = "fields": Object { "user.name": Object { "aggregatable": true, - "category": "user", "description": "Short name or login of the user.", "esTypes": Array [ "keyword", diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts index ae0a417e5e32a..fc08b8eb81a9a 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts @@ -231,7 +231,6 @@ export const addFieldToColumns = ({ dispatch( scopedActions.upsertColumn({ column: { - category: column.category, columnHeaderType: 'not-filtered', description: isString(column.description) ? column.description : undefined, example: isString(column.example) ? column.example : undefined, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx index 26d98016c169c..5ec5cf8ce892c 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx @@ -6,10 +6,10 @@ */ import { EuiPanel, EuiText } from '@elastic/eui'; -import { get } from 'lodash'; import memoizeOne from 'memoize-one'; import React from 'react'; import styled from 'styled-components'; +import { getCategory } from '@kbn/triggers-actions-ui-plugin/public'; import { SecurityCellActions, CellActionsMode, SecurityCellActionsTrigger } from '../cell_actions'; import type { BrowserFields } from '../../containers/source'; import * as i18n from './translations'; @@ -35,9 +35,12 @@ const HoverActionsContainer = styled(EuiPanel)` HoverActionsContainer.displayName = 'HoverActionsContainer'; export const getFieldFromBrowserField = memoizeOne( - (keys: string[], browserFields: BrowserFields): BrowserField | undefined => - get(browserFields, keys), - (newArgs, lastArgs) => newArgs[0].join() === lastArgs[0].join() + (field: string, browserFields: BrowserFields): BrowserField | undefined => { + const category = getCategory(field); + + return browserFields[category]?.fields?.[field] as BrowserField; + }, + (newArgs, lastArgs) => newArgs[0] === lastArgs[0] ); export const getColumns: ColumnsProvider = ({ @@ -106,10 +109,7 @@ export const getColumns: ColumnsProvider = ({ sortable: true, truncateText: false, render: (values, data) => { - const fieldFromBrowserField = getFieldFromBrowserField( - [data.category as string, 'fields', data.field], - browserFields - ); + const fieldFromBrowserField = getFieldFromBrowserField(data.field, browserFields); return ( <FieldValueCell contextId={contextId} diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx index e465bfb37407e..8030aad826b5f 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx @@ -21,7 +21,6 @@ const eventId = 'TUWyf3wBFCFU0qRJTauW'; const hostIpValues = ['127.0.0.1', '::1', '10.1.2.3', '2001:0DB8:AC10:FE01::']; const hostIpFieldFromBrowserField: BrowserField = { aggregatable: true, - category: 'host', description: 'Host ip addresses.', example: '127.0.0.1', fields: {}, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx index 6c78e4ba4fa4c..d7eefe10fb320 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx @@ -20,7 +20,6 @@ const eventId = 'TUWyf3wBFCFU0qRJTauW'; const hostIpData: EventFieldsData = { aggregatable: true, ariaRowindex: 35, - category: 'host', description: 'Host ip addresses.', example: '127.0.0.1', field: 'host.ip', @@ -89,7 +88,6 @@ describe('FieldValueCell', () => { const messageData: EventFieldsData = { aggregatable: false, ariaRowindex: 50, - category: 'base', description: 'For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.', example: 'Hello World', @@ -109,7 +107,6 @@ describe('FieldValueCell', () => { const messageFieldFromBrowserField: BrowserField = { aggregatable: false, - category: 'base', description: 'For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.', example: 'Hello World', @@ -150,7 +147,6 @@ describe('FieldValueCell', () => { describe('when `BrowserField` metadata IS available', () => { const hostIpFieldFromBrowserField: BrowserField = { aggregatable: true, - category: 'host', description: 'Host ip addresses.', example: '127.0.0.1', fields: {}, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.test.tsx index 3afe62980628d..0ed62c23bd436 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.test.tsx @@ -27,7 +27,6 @@ const eventId = 'TUWyf3wBFCFU0qRJTauW'; const hostIpValues = ['127.0.0.1', '::1', '10.1.2.3', '2001:0DB8:AC10:FE01::']; const hostIpFieldFromBrowserField: BrowserField = { aggregatable: true, - category: 'host', description: 'Host ip addresses.', example: '127.0.0.1', fields: {}, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/summary_value_cell.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/summary_value_cell.test.tsx index ace35265885f8..d0349079b8c8e 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/summary_value_cell.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/summary_value_cell.test.tsx @@ -24,7 +24,6 @@ const eventId = 'TUWyf3wBFCFU0qRJTauW'; const hostIpValues = ['127.0.0.1', '::1', '10.1.2.3', '2001:0DB8:AC10:FE01::']; const hostIpFieldFromBrowserField: BrowserField = { aggregatable: true, - category: 'host', description: 'Host ip addresses.', example: '127.0.0.1', fields: {}, @@ -63,7 +62,6 @@ const enrichedAgentStatusData: AlertSummaryRow['description'] = { aggregatable: false, description: '', example: '', - category: '', fields: {}, indexes: [], name: AGENT_STATUS_FIELD_NAME, diff --git a/x-pack/plugins/security_solution/public/common/containers/source/mock.ts b/x-pack/plugins/security_solution/public/common/containers/source/mock.ts index c3cd086ea056f..6bbb2cb26d0ab 100644 --- a/x-pack/plugins/security_solution/public/common/containers/source/mock.ts +++ b/x-pack/plugins/security_solution/public/common/containers/source/mock.ts @@ -53,7 +53,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'agent.ephemeral_id': { aggregatable: true, - category: 'agent', description: 'Ephemeral identifier of this agent (if one exists). This id normally changes across restarts, but `agent.id` does not.', example: '8a4f500f', @@ -66,7 +65,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.hostname': { aggregatable: true, - category: 'agent', description: null, example: null, format: '', @@ -78,7 +76,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.id': { aggregatable: true, - category: 'agent', description: 'Unique identifier of this agent (if one exists). Example: For Beats this would be beat.id.', example: '8a4f500d', @@ -91,7 +88,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.name': { aggregatable: true, - category: 'agent', description: 'Name of the agent. This is a name that can be given to an agent. This can be helpful if for example two Filebeat instances are running on the same host but a human readable separation is needed on which Filebeat instance data is coming from. If no name is given, the name is often left empty.', example: 'foo', @@ -108,7 +104,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'auditd.data.a0': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -120,7 +115,6 @@ export const mockBrowserFields: BrowserFields = { }, 'auditd.data.a1': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -132,7 +126,6 @@ export const mockBrowserFields: BrowserFields = { }, 'auditd.data.a2': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -148,7 +141,6 @@ export const mockBrowserFields: BrowserFields = { fields: { '@timestamp': { aggregatable: true, - category: 'base', description: 'Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.', example: '2016-05-23T08:05:34.853Z', @@ -161,7 +153,6 @@ export const mockBrowserFields: BrowserFields = { readFromDocValues: true, }, _id: { - category: 'base', description: 'Each document has an _id that uniquely identifies it', example: 'Y-6TfmcB0WOhS6qyMv3s', name: '_id', @@ -172,7 +163,6 @@ export const mockBrowserFields: BrowserFields = { indexes: ['auditbeat', 'filebeat', 'packetbeat'], }, message: { - category: 'base', description: 'For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.', example: 'Hello World', @@ -190,7 +180,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'client.address': { aggregatable: true, - category: 'client', description: 'Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.', example: null, @@ -203,7 +192,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.bytes': { aggregatable: true, - category: 'client', description: 'Bytes sent from the client to the server.', example: '184', format: '', @@ -215,7 +203,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.domain': { aggregatable: true, - category: 'client', description: 'Client domain.', example: null, format: '', @@ -227,7 +214,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.geo.country_iso_code': { aggregatable: true, - category: 'client', description: 'Country ISO code.', example: 'CA', format: '', @@ -243,7 +229,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'cloud.account.id': { aggregatable: true, - category: 'cloud', description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.', example: '666777888999', @@ -256,7 +241,6 @@ export const mockBrowserFields: BrowserFields = { }, 'cloud.availability_zone': { aggregatable: true, - category: 'cloud', description: 'Availability zone in which this host is running.', example: 'us-east-1c', format: '', @@ -272,7 +256,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'container.id': { aggregatable: true, - category: 'container', description: 'Unique container id.', example: null, format: '', @@ -284,7 +267,6 @@ export const mockBrowserFields: BrowserFields = { }, 'container.image.name': { aggregatable: true, - category: 'container', description: 'Name of the image the container was built on.', example: null, format: '', @@ -296,7 +278,6 @@ export const mockBrowserFields: BrowserFields = { }, 'container.image.tag': { aggregatable: true, - category: 'container', description: 'Container image tag.', example: null, format: '', @@ -312,7 +293,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'destination.address': { aggregatable: true, - category: 'destination', description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.', example: null, @@ -325,7 +305,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.bytes': { aggregatable: true, - category: 'destination', description: 'Bytes sent from the destination to the source.', example: '184', format: '', @@ -337,7 +316,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.domain': { aggregatable: true, - category: 'destination', description: 'Destination domain.', example: null, format: '', @@ -349,7 +327,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.ip': { aggregatable: true, - category: 'destination', description: 'IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.', example: '', @@ -362,7 +339,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.port': { aggregatable: true, - category: 'destination', description: 'Port of the destination.', example: '', format: '', @@ -377,7 +353,6 @@ export const mockBrowserFields: BrowserFields = { event: { fields: { 'event.end': { - category: 'event', description: 'event.end contains the date when the event ended or when the activity was last observed.', example: null, @@ -390,7 +365,6 @@ export const mockBrowserFields: BrowserFields = { aggregatable: true, }, 'event.action': { - category: 'event', description: 'The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.', example: 'user-password-change', @@ -403,7 +377,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.category': { - category: 'event', description: 'This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. `event.category` represents the "big buckets" of ECS categories. For example, filtering on `event.category:process` yields all events relating to process activity. This field is closely related to `event.type`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.', example: 'authentication', @@ -416,7 +389,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.severity': { - category: 'event', description: "The numeric severity of the event according to your event source. What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source. The Syslog severity belongs in `log.syslog.severity.code`. `event.severity` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the `log.syslog.severity.code` to `event.severity`.", example: 7, @@ -429,7 +401,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.kind': { - category: 'event', description: 'This defined the type of event eg. alerts', example: 'signal', name: 'event.kind', @@ -445,7 +416,6 @@ export const mockBrowserFields: BrowserFields = { host: { fields: { 'host.name': { - category: 'host', description: 'Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.', name: 'host.name', @@ -462,7 +432,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'source.ip': { aggregatable: true, - category: 'source', description: 'IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.', example: '', format: '', @@ -474,7 +443,6 @@ export const mockBrowserFields: BrowserFields = { }, 'source.port': { aggregatable: true, - category: 'source', description: 'Port of the source.', example: '', format: '', @@ -489,7 +457,6 @@ export const mockBrowserFields: BrowserFields = { user: { fields: { 'user.name': { - category: 'user', description: 'Short name or login of the user.', example: 'albert', name: 'user.name', @@ -506,7 +473,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'nestedField.firstAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', @@ -522,7 +488,6 @@ export const mockBrowserFields: BrowserFields = { }, 'nestedField.secondAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', @@ -538,7 +503,6 @@ export const mockBrowserFields: BrowserFields = { }, 'nestedField.thirdAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx index 72a6310f46f31..138714693a796 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx @@ -7,11 +7,9 @@ import React, { memo } from 'react'; import { EuiText } from '@elastic/eui'; -import { get } from 'lodash'; -import memoizeOne from 'memoize-one'; +import { getFieldFromBrowserField } from '../../../../common/components/event_details/columns'; import type { EventFieldsData } from '../../../../common/components/event_details/types'; import { FieldValueCell } from '../../../../common/components/event_details/table/field_value_cell'; -import type { BrowserField, BrowserFields } from '../../../../../common/search_strategy'; import { FieldNameCell } from '../../../../common/components/event_details/table/field_name_cell'; import { CellActions } from '../components/cell_actions'; import * as i18n from '../../../../common/components/event_details/translations'; @@ -20,12 +18,6 @@ import type { ColumnsProvider } from '../../../../common/components/event_detail import { EventFieldsBrowser } from '../../../../common/components/event_details/event_fields_browser'; import { TimelineTabs } from '../../../../../common/types'; -export const getFieldFromBrowserField = memoizeOne( - (keys: string[], browserFields: BrowserFields): BrowserField | undefined => - get(browserFields, keys), - (newArgs, lastArgs) => newArgs[0].join() === lastArgs[0].join() -); - export const getColumns: ColumnsProvider = ({ browserFields, eventId, @@ -57,10 +49,7 @@ export const getColumns: ColumnsProvider = ({ ), width: '70%', render: (values, data) => { - const fieldFromBrowserField = getFieldFromBrowserField( - [data.category as string, 'fields', data.field], - browserFields - ); + const fieldFromBrowserField = getFieldFromBrowserField(data.field, browserFields); return ( <CellActions field={data.field} value={values} isObjectArray={data.isObjectArray}> <FieldValueCell diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts b/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts index 08e992c76aac6..2bce14ddcadf0 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts @@ -28,7 +28,6 @@ export const mockSourcererScope: SelectedDataView = { fields: { _id: { aggregatable: false, - category: '_id', description: 'Each document has an _id that uniquely identifies it', esTypes: undefined, example: 'Y-6TfmcB0WOhS6qyMv3s', diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap index dc31ad380635b..d197cc88f46e0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap @@ -9,7 +9,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "agent.ephemeral_id": Object { "aggregatable": true, - "category": "agent", "description": "Ephemeral identifier of this agent (if one exists). This id normally changes across restarts, but \`agent.id\` does not.", "esTypes": Array [ "keyword", @@ -27,7 +26,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "agent.hostname": Object { "aggregatable": true, - "category": "agent", "description": null, "esTypes": Array [ "keyword", @@ -45,7 +43,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "agent.id": Object { "aggregatable": true, - "category": "agent", "description": "Unique identifier of this agent (if one exists). Example: For Beats this would be beat.id.", "esTypes": Array [ "keyword", @@ -63,7 +60,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "agent.name": Object { "aggregatable": true, - "category": "agent", "description": "Name of the agent. This is a name that can be given to an agent. This can be helpful if for example two Filebeat instances are running on the same host but a human readable separation is needed on which Filebeat instance data is coming from. If no name is given, the name is often left empty.", "esTypes": Array [ "keyword", @@ -85,7 +81,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "auditd.data.a0": Object { "aggregatable": true, - "category": "auditd", "description": null, "esTypes": Array [ "keyword", @@ -101,7 +96,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "auditd.data.a1": Object { "aggregatable": true, - "category": "auditd", "description": null, "esTypes": Array [ "keyword", @@ -117,7 +111,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "auditd.data.a2": Object { "aggregatable": true, - "category": "auditd", "description": null, "esTypes": Array [ "keyword", @@ -137,7 +130,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "@timestamp": Object { "aggregatable": true, - "category": "base", "description": "Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.", "esTypes": Array [ "date", @@ -156,7 +148,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "_id": Object { "aggregatable": false, - "category": "base", "description": "Each document has an _id that uniquely identifies it", "esTypes": Array [], "example": "Y-6TfmcB0WOhS6qyMv3s", @@ -171,7 +162,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "message": Object { "aggregatable": false, - "category": "base", "description": "For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.", "esTypes": Array [ "text", @@ -193,7 +183,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "client.address": Object { "aggregatable": true, - "category": "client", "description": "Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the \`.address\` field. Then it should be duplicated to \`.ip\` or \`.domain\`, depending on which one it is.", "esTypes": Array [ "keyword", @@ -211,7 +200,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "client.bytes": Object { "aggregatable": true, - "category": "client", "description": "Bytes sent from the client to the server.", "esTypes": Array [ "long", @@ -229,7 +217,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "client.domain": Object { "aggregatable": true, - "category": "client", "description": "Client domain.", "esTypes": Array [ "keyword", @@ -247,7 +234,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "client.geo.country_iso_code": Object { "aggregatable": true, - "category": "client", "description": "Country ISO code.", "esTypes": Array [ "keyword", @@ -269,7 +255,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "cloud.account.id": Object { "aggregatable": true, - "category": "cloud", "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.", "esTypes": Array [ "keyword", @@ -287,7 +272,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "cloud.availability_zone": Object { "aggregatable": true, - "category": "cloud", "description": "Availability zone in which this host is running.", "esTypes": Array [ "keyword", @@ -309,7 +293,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "container.id": Object { "aggregatable": true, - "category": "container", "description": "Unique container id.", "esTypes": Array [ "keyword", @@ -327,7 +310,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "container.image.name": Object { "aggregatable": true, - "category": "container", "description": "Name of the image the container was built on.", "esTypes": Array [ "keyword", @@ -345,7 +327,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "container.image.tag": Object { "aggregatable": true, - "category": "container", "description": "Container image tag.", "esTypes": Array [ "keyword", @@ -367,7 +348,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "destination.address": Object { "aggregatable": true, - "category": "destination", "description": "Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the \`.address\` field. Then it should be duplicated to \`.ip\` or \`.domain\`, depending on which one it is.", "esTypes": Array [ "keyword", @@ -385,7 +365,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "destination.bytes": Object { "aggregatable": true, - "category": "destination", "description": "Bytes sent from the destination to the source.", "esTypes": Array [ "long", @@ -403,7 +382,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "destination.domain": Object { "aggregatable": true, - "category": "destination", "description": "Destination domain.", "esTypes": Array [ "keyword", @@ -421,7 +399,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "destination.ip": Object { "aggregatable": true, - "category": "destination", "description": "IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ "ip", @@ -439,7 +416,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "destination.port": Object { "aggregatable": true, - "category": "destination", "description": "Port of the destination.", "esTypes": Array [ "long", @@ -461,7 +437,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "event.action": Object { "aggregatable": true, - "category": "event", "description": "The action captured by the event. This describes the information in the event. It is more specific than \`event.category\`. Examples are \`group-add\`, \`process-started\`, \`file-created\`. The value is normally defined by the implementer.", "esTypes": Array [ "keyword", @@ -485,7 +460,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "event.category": Object { "aggregatable": true, - "category": "event", "description": "This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. \`event.category\` represents the \\"big buckets\\" of ECS categories. For example, filtering on \`event.category:process\` yields all events relating to process activity. This field is closely related to \`event.type\`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.", "esTypes": Array [ "keyword", @@ -509,7 +483,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "event.end": Object { "aggregatable": true, - "category": "event", "description": "event.end contains the date when the event ended or when the activity was last observed.", "esTypes": Array [ "date", @@ -533,7 +506,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "event.kind": Object { "aggregatable": true, - "category": "event", "description": "This defined the type of event eg. alerts", "esTypes": Array [ "keyword", @@ -557,7 +529,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "event.severity": Object { "aggregatable": true, - "category": "event", "description": "The numeric severity of the event according to your event source. What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source. The Syslog severity belongs in \`log.syslog.severity.code\`. \`event.severity\` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the \`log.syslog.severity.code\` to \`event.severity\`.", "esTypes": Array [ "long", @@ -585,7 +556,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "host.name": Object { "aggregatable": true, - "category": "host", "description": "Name of the host. It can contain what \`hostname\` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.", "esTypes": Array [ "keyword", @@ -612,7 +582,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "nestedField.firstAttributes": Object { "aggregatable": false, - "category": "nestedField", "description": "", "example": "", "format": "", @@ -632,7 +601,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "nestedField.secondAttributes": Object { "aggregatable": false, - "category": "nestedField", "description": "", "example": "", "format": "", @@ -652,7 +620,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "nestedField.thirdAttributes": Object { "aggregatable": false, - "category": "nestedField", "description": "", "example": "", "format": "", @@ -691,7 +658,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "source.ip": Object { "aggregatable": true, - "category": "source", "description": "IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ "ip", @@ -709,7 +675,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` }, "source.port": Object { "aggregatable": true, - "category": "source", "description": "Port of the source.", "esTypes": Array [ "long", @@ -731,7 +696,6 @@ exports[`ColumnHeaders rendering renders correctly against snapshot 1`] = ` "fields": Object { "user.name": Object { "aggregatable": true, - "category": "user", "description": "Short name or login of the user.", "esTypes": Array [ "keyword", diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.test.ts index 519c8d21ab70e..5f56dfbf0bf06 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.test.ts @@ -105,7 +105,6 @@ describe('helpers', () => { const expectedData = [ { aggregatable: true, - category: 'base', columnHeaderType: 'not-filtered', description: 'Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.', @@ -122,7 +121,6 @@ describe('helpers', () => { }, { aggregatable: true, - category: 'source', columnHeaderType: 'not-filtered', description: 'IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.', example: '', @@ -137,7 +135,6 @@ describe('helpers', () => { }, { aggregatable: true, - category: 'destination', columnHeaderType: 'not-filtered', description: 'IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.', @@ -170,7 +167,6 @@ describe('helpers', () => { expect(getColumnHeaders(headers, mockBrowserFields)).toEqual([ { aggregatable: false, - category: 'base', columnHeaderType: 'not-filtered', description: 'Each document has an _id that uniquely identifies it', esTypes: [], @@ -199,7 +195,6 @@ describe('helpers', () => { fields: { test_field_1: { aggregatable: true, - category: 'test_field_1', esTypes: ['keyword'], format: 'string', indexes: [ @@ -226,7 +221,6 @@ describe('helpers', () => { expect(getColumnHeaders(headers, oneLevelDeep)).toEqual([ { aggregatable: true, - category: 'test_field_1', columnHeaderType: 'not-filtered', esTypes: ['keyword'], format: 'string', @@ -266,7 +260,6 @@ describe('helpers', () => { fields: { 'foo.bar': { aggregatable: true, - category: 'foo', esTypes: ['keyword'], format: 'string', indexes: [ @@ -293,7 +286,6 @@ describe('helpers', () => { expect(getColumnHeaders(headers, twoLevelsDeep)).toEqual([ { aggregatable: true, - category: 'foo', columnHeaderType: 'not-filtered', esTypes: ['keyword'], format: 'string', diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/__snapshots__/use_timeline_columns.test.ts.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/__snapshots__/use_timeline_columns.test.ts.snap index afcc519bfe10e..8e42f726a7e15 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/__snapshots__/use_timeline_columns.test.ts.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/__snapshots__/use_timeline_columns.test.ts.snap @@ -4,7 +4,6 @@ exports[`useTimelineColumns augmentedColumnHeaders should return the default col Array [ Object { "aggregatable": true, - "category": "base", "columnHeaderType": "not-filtered", "description": "Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.", "esTypes": Array [ @@ -26,7 +25,6 @@ Array [ }, Object { "aggregatable": false, - "category": "base", "columnHeaderType": "not-filtered", "description": "For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.", "esTypes": Array [ @@ -47,7 +45,6 @@ Array [ }, Object { "aggregatable": true, - "category": "event", "columnHeaderType": "not-filtered", "description": "This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. \`event.category\` represents the \\"big buckets\\" of ECS categories. For example, filtering on \`event.category:process\` yields all events relating to process activity. This field is closely related to \`event.type\`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.", "esTypes": Array [ @@ -74,7 +71,6 @@ Array [ }, Object { "aggregatable": true, - "category": "event", "columnHeaderType": "not-filtered", "description": "The action captured by the event. This describes the information in the event. It is more specific than \`event.category\`. Examples are \`group-add\`, \`process-started\`, \`file-created\`. The value is normally defined by the implementer.", "esTypes": Array [ @@ -101,7 +97,6 @@ Array [ }, Object { "aggregatable": true, - "category": "host", "columnHeaderType": "not-filtered", "description": "Name of the host. It can contain what \`hostname\` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.", "esTypes": Array [ @@ -127,7 +122,6 @@ Array [ }, Object { "aggregatable": true, - "category": "source", "columnHeaderType": "not-filtered", "description": "IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ @@ -148,7 +142,6 @@ Array [ }, Object { "aggregatable": true, - "category": "destination", "columnHeaderType": "not-filtered", "description": "IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ @@ -169,7 +162,6 @@ Array [ }, Object { "aggregatable": true, - "category": "user", "columnHeaderType": "not-filtered", "description": "Short name or login of the user.", "esTypes": Array [ @@ -195,7 +187,6 @@ exports[`useTimelineColumns augmentedColumnHeaders should return the default uni Array [ Object { "aggregatable": true, - "category": "base", "columnHeaderType": "not-filtered", "description": "Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.", "esTypes": Array [ @@ -217,7 +208,6 @@ Array [ }, Object { "aggregatable": false, - "category": "base", "columnHeaderType": "not-filtered", "description": "For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.", "esTypes": Array [ @@ -238,7 +228,6 @@ Array [ }, Object { "aggregatable": true, - "category": "event", "columnHeaderType": "not-filtered", "description": "This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. \`event.category\` represents the \\"big buckets\\" of ECS categories. For example, filtering on \`event.category:process\` yields all events relating to process activity. This field is closely related to \`event.type\`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.", "esTypes": Array [ @@ -264,7 +253,6 @@ Array [ }, Object { "aggregatable": true, - "category": "event", "columnHeaderType": "not-filtered", "description": "The action captured by the event. This describes the information in the event. It is more specific than \`event.category\`. Examples are \`group-add\`, \`process-started\`, \`file-created\`. The value is normally defined by the implementer.", "esTypes": Array [ @@ -290,7 +278,6 @@ Array [ }, Object { "aggregatable": true, - "category": "host", "columnHeaderType": "not-filtered", "description": "Name of the host. It can contain what \`hostname\` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.", "esTypes": Array [ @@ -315,7 +302,6 @@ Array [ }, Object { "aggregatable": true, - "category": "source", "columnHeaderType": "not-filtered", "description": "IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ @@ -335,7 +321,6 @@ Array [ }, Object { "aggregatable": true, - "category": "destination", "columnHeaderType": "not-filtered", "description": "IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ @@ -355,7 +340,6 @@ Array [ }, Object { "aggregatable": true, - "category": "user", "columnHeaderType": "not-filtered", "description": "Short name or login of the user.", "esTypes": Array [ @@ -380,7 +364,6 @@ exports[`useTimelineColumns augmentedColumnHeaders should return the provided co Array [ Object { "aggregatable": true, - "category": "source", "columnHeaderType": "not-filtered", "description": "IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.", "esTypes": Array [ diff --git a/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts b/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts index 32b5ec4e4162e..efc66d0a7dbca 100644 --- a/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts +++ b/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts @@ -76,17 +76,16 @@ export interface IndexFieldsStrategyResponse extends IEsSearchResponse { */ export interface BrowserField { aggregatable: boolean; - category: string; - description: string | null; - example: string | number | null; - fields: Record<string, Partial<BrowserField>>; + description: string | null; // FIXME: replace with customDescription or EcsFlat + example: string | number | null; // FIXME: not there, could be pulled from the ecs + fields: Record<string, Partial<BrowserField>>; // FIXME: missing in FieldSpec format: string; - indexes: string[]; + indexes: string[]; // FIXME: missing in FieldSpec name: string; searchable: boolean; type: string; esTypes?: string[]; - subType?: IFieldSubType; + subType?: IFieldSubType; // not sure readFromDocValues: boolean; runtimeField?: RuntimeField; } diff --git a/x-pack/plugins/timelines/public/mock/browser_fields.ts b/x-pack/plugins/timelines/public/mock/browser_fields.ts index d852c0002e83b..a65dda5c0aa49 100644 --- a/x-pack/plugins/timelines/public/mock/browser_fields.ts +++ b/x-pack/plugins/timelines/public/mock/browser_fields.ts @@ -372,7 +372,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'agent.ephemeral_id': { aggregatable: true, - category: 'agent', description: 'Ephemeral identifier of this agent (if one exists). This id normally changes across restarts, but `agent.id` does not.', example: '8a4f500f', @@ -384,7 +383,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.hostname': { aggregatable: true, - category: 'agent', description: null, example: null, format: '', @@ -395,7 +393,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.id': { aggregatable: true, - category: 'agent', description: 'Unique identifier of this agent (if one exists). Example: For Beats this would be beat.id.', example: '8a4f500d', @@ -407,7 +404,6 @@ export const mockBrowserFields: BrowserFields = { }, 'agent.name': { aggregatable: true, - category: 'agent', description: 'Name of the agent. This is a name that can be given to an agent. This can be helpful if for example two Filebeat instances are running on the same host but a human readable separation is needed on which Filebeat instance data is coming from. If no name is given, the name is often left empty.', example: 'foo', @@ -423,7 +419,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'auditd.data.a0': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -434,7 +429,6 @@ export const mockBrowserFields: BrowserFields = { }, 'auditd.data.a1': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -445,7 +439,6 @@ export const mockBrowserFields: BrowserFields = { }, 'auditd.data.a2': { aggregatable: true, - category: 'auditd', description: null, example: null, format: '', @@ -460,7 +453,6 @@ export const mockBrowserFields: BrowserFields = { fields: { '@timestamp': { aggregatable: true, - category: 'base', description: 'Date/time when the event originated. For log events this is the date/time when the event was generated, and not when it was read. Required field for all events.', example: '2016-05-23T08:05:34.853Z', @@ -471,7 +463,6 @@ export const mockBrowserFields: BrowserFields = { type: 'date', }, _id: { - category: 'base', description: 'Each document has an _id that uniquely identifies it', example: 'Y-6TfmcB0WOhS6qyMv3s', name: '_id', @@ -481,7 +472,6 @@ export const mockBrowserFields: BrowserFields = { indexes: ['auditbeat', 'filebeat', 'packetbeat'], }, message: { - category: 'base', description: 'For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message.', example: 'Hello World', @@ -498,7 +488,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'client.address': { aggregatable: true, - category: 'client', description: 'Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.', example: null, @@ -510,7 +499,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.bytes': { aggregatable: true, - category: 'client', description: 'Bytes sent from the client to the server.', example: '184', format: '', @@ -521,7 +509,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.domain': { aggregatable: true, - category: 'client', description: 'Client domain.', example: null, format: '', @@ -532,7 +519,6 @@ export const mockBrowserFields: BrowserFields = { }, 'client.geo.country_iso_code': { aggregatable: true, - category: 'client', description: 'Country ISO code.', example: 'CA', format: '', @@ -547,7 +533,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'cloud.account.id': { aggregatable: true, - category: 'cloud', description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.', example: '666777888999', @@ -559,7 +544,6 @@ export const mockBrowserFields: BrowserFields = { }, 'cloud.availability_zone': { aggregatable: true, - category: 'cloud', description: 'Availability zone in which this host is running.', example: 'us-east-1c', format: '', @@ -574,7 +558,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'container.id': { aggregatable: true, - category: 'container', description: 'Unique container id.', example: null, format: '', @@ -585,7 +568,6 @@ export const mockBrowserFields: BrowserFields = { }, 'container.image.name': { aggregatable: true, - category: 'container', description: 'Name of the image the container was built on.', example: null, format: '', @@ -596,7 +578,6 @@ export const mockBrowserFields: BrowserFields = { }, 'container.image.tag': { aggregatable: true, - category: 'container', description: 'Container image tag.', example: null, format: '', @@ -611,7 +592,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'destination.address': { aggregatable: true, - category: 'destination', description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.', example: null, @@ -623,7 +603,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.bytes': { aggregatable: true, - category: 'destination', description: 'Bytes sent from the destination to the source.', example: '184', format: '', @@ -634,7 +613,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.domain': { aggregatable: true, - category: 'destination', description: 'Destination domain.', example: null, format: '', @@ -645,7 +623,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.ip': { aggregatable: true, - category: 'destination', description: 'IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses.', example: '', @@ -657,7 +634,6 @@ export const mockBrowserFields: BrowserFields = { }, 'destination.port': { aggregatable: true, - category: 'destination', description: 'Port of the destination.', example: '', format: '', @@ -671,7 +647,6 @@ export const mockBrowserFields: BrowserFields = { event: { fields: { 'event.end': { - category: 'event', description: 'event.end contains the date when the event ended or when the activity was last observed.', example: null, @@ -683,7 +658,6 @@ export const mockBrowserFields: BrowserFields = { aggregatable: true, }, 'event.action': { - category: 'event', description: 'The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.', example: 'user-password-change', @@ -695,7 +669,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.category': { - category: 'event', description: 'This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. `event.category` represents the "big buckets" of ECS categories. For example, filtering on `event.category:process` yields all events relating to process activity. This field is closely related to `event.type`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories.', example: 'authentication', @@ -707,7 +680,6 @@ export const mockBrowserFields: BrowserFields = { indexes: DEFAULT_INDEX_PATTERN, }, 'event.severity': { - category: 'event', description: "The numeric severity of the event according to your event source. What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source. The Syslog severity belongs in `log.syslog.severity.code`. `event.severity` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the `log.syslog.severity.code` to `event.severity`.", example: 7, @@ -723,7 +695,6 @@ export const mockBrowserFields: BrowserFields = { host: { fields: { 'host.name': { - category: 'host', description: 'Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.', name: 'host.name', @@ -739,7 +710,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'source.ip': { aggregatable: true, - category: 'source', description: 'IP address of the source. Can be one or multiple IPv4 or IPv6 addresses.', example: '', format: '', @@ -750,7 +720,6 @@ export const mockBrowserFields: BrowserFields = { }, 'source.port': { aggregatable: true, - category: 'source', description: 'Port of the source.', example: '', format: '', @@ -764,7 +733,6 @@ export const mockBrowserFields: BrowserFields = { user: { fields: { 'user.name': { - category: 'user', description: 'Short name or login of the user.', example: 'albert', name: 'user.name', @@ -780,7 +748,6 @@ export const mockBrowserFields: BrowserFields = { fields: { 'nestedField.firstAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', @@ -796,7 +763,6 @@ export const mockBrowserFields: BrowserFields = { }, 'nestedField.secondAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', @@ -812,7 +778,6 @@ export const mockBrowserFields: BrowserFields = { }, 'nestedField.thirdAttributes': { aggregatable: false, - category: 'nestedField', description: '', example: '', format: '', From 805c770f0170aaef2ffc5f7d4d91c38e3608af76 Mon Sep 17 00:00:00 2001 From: Pablo Machado <pablo.nevesmachado@elastic.co> Date: Wed, 26 Jun 2024 12:10:03 +0200 Subject: [PATCH 15/40] Move/Delete risk score calculation APIs (#186881) ## Summary All internal APIs should be located under the `/internal/` subpath. Entity Analytics team still has 2 internal APIs under `/api/` subpath. This PR addressed the problem by: * Create `/internal/risk_score/calculation/entity` API route * Before we can delete `/api/risk_scores/calculation/entity` we need to create `/internal/risk_score/calculation/entity` and keep both available. We can delete the deprecated API in a later release. * Delete `/api/risk_scores/calculation` API. It was unused and internal. I believe we can safely delete it. --- .../risk_engine/calculation_route.gen.ts | 43 +- .../risk_engine/calculation_route.schema.yaml | 67 +--- .../entity_calculation_route.schema.yaml | 23 ++ .../entity_analytics/risk_score/constants.ts | 10 +- .../risk_score/routes/calculation.test.ts | 143 ------- .../risk_score/routes/calculation.ts | 116 ------ .../risk_score/routes/entity_calculation.ts | 286 ++++++++------ .../routes/register_risk_score_routes.ts | 8 +- .../trial_license_complete_tier/index.ts | 1 - .../risk_score_calculation.ts | 374 ------------------ 10 files changed, 196 insertions(+), 875 deletions(-) delete mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts delete mode 100644 x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.gen.ts index dfec5ee92c360..2abe745e97f4a 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.gen.ts @@ -10,52 +10,13 @@ * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. * * info: - * title: Risk Scoring API + * title: RiskScoresCalculation types * version: 1 */ import { z } from 'zod'; -import { - AfterKeys, - DataViewId, - Filter, - PageSize, - IdentifierType, - DateRange, - RiskScoreWeights, - EntityRiskScoreRecord, -} from '../common/common.gen'; - -export type RiskScoresCalculationRequest = z.infer<typeof RiskScoresCalculationRequest>; -export const RiskScoresCalculationRequest = z.object({ - /** - * Used to calculate a specific "page" of risk scores. If unspecified, the first "page" of scores is returned. See also the `after_keys` key in a risk scores response. - */ - after_keys: AfterKeys.optional(), - /** - * The identifier of the Kibana data view to be used when generating risk scores. If a data view is not found, the provided ID will be used as the query's index pattern instead. - */ - data_view_id: DataViewId, - /** - * If set to `true`, the internal ES requests/responses will be logged in Kibana. - */ - debug: z.boolean().optional(), - /** - * An elasticsearch DSL filter object. Used to filter the data being scored, which implicitly filters the risk scores calculated. - */ - filter: Filter.optional(), - page_size: PageSize.optional(), - /** - * Used to restrict the type of risk scores calculated. - */ - identifier_type: IdentifierType, - /** - * Defines the time period over which scores will be evaluated. If unspecified, a range of `[now, now-30d]` will be used. - */ - range: DateRange, - weights: RiskScoreWeights.optional(), -}); +import { AfterKeys, EntityRiskScoreRecord } from '../common/common.gen'; export type RiskScoresCalculationResponse = z.infer<typeof RiskScoresCalculationResponse>; export const RiskScoresCalculationResponse = z.object({ diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.schema.yaml index 5a290ce7930af..857971ddbf555 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/calculation_route.schema.yaml @@ -1,75 +1,12 @@ openapi: 3.0.0 info: + title: RiskScoresCalculation types version: '1' - title: Risk Scoring API - description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. - -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' - -paths: - /api/risk_scores/calculation: - post: - x-labels: [ess, serverless] - x-internal: true - summary: Trigger calculation of Risk Scores - description: Calculates and persists a segment of Risk Scores, returning details about the calculation. - requestBody: - description: Details about the Risk Scores being calculated - content: - application/json: - schema: - $ref: '#/components/schemas/RiskScoresCalculationRequest' - required: true - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/RiskScoresCalculationResponse' - '400': - description: Invalid request +paths: {} components: schemas: - RiskScoresCalculationRequest: - type: object - required: - - data_view_id - - identifier_type - - range - properties: - after_keys: - description: Used to calculate a specific "page" of risk scores. If unspecified, the first "page" of scores is returned. See also the `after_keys` key in a risk scores response. - $ref: '../common/common.schema.yaml#/components/schemas/AfterKeys' - data_view_id: - $ref: '../common/common.schema.yaml#/components/schemas/DataViewId' - description: The identifier of the Kibana data view to be used when generating risk scores. If a data view is not found, the provided ID will be used as the query's index pattern instead. - debug: - description: If set to `true`, the internal ES requests/responses will be logged in Kibana. - type: boolean - filter: - $ref: '../common/common.schema.yaml#/components/schemas/Filter' - description: An elasticsearch DSL filter object. Used to filter the data being scored, which implicitly filters the risk scores calculated. - page_size: - $ref: '../common/common.schema.yaml#/components/schemas/PageSize' - identifier_type: - description: Used to restrict the type of risk scores calculated. - allOf: - - $ref: '../common/common.schema.yaml#/components/schemas/IdentifierType' - range: - $ref: '../common/common.schema.yaml#/components/schemas/DateRange' - description: Defines the time period over which scores will be evaluated. If unspecified, a range of `[now, now-30d]` will be used. - weights: - $ref: '../common/common.schema.yaml#/components/schemas/RiskScoreWeights' - RiskScoresCalculationResponse: type: object required: diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml index 328c67184e0f9..bb94305254885 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml @@ -14,10 +14,33 @@ servers: default: '5601' paths: + # TODO delete on a future serverless release /api/risk_scores/calculation/entity: post: x-labels: [ess, serverless] x-internal: true + summary: Deprecated Trigger calculation of Risk Scores for an entity. Moved to /internal/risk_score/calculation/entity + description: Calculates and persists Risk Scores for an entity, returning the calculated risk score. + requestBody: + description: The entity type and identifier + content: + application/json: + schema: + $ref: '#/components/schemas/RiskScoresEntityCalculationRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskScoresEntityCalculationResponse' + '400': + description: Invalid request + + /internal/risk_score/calculation/entity: + post: + x-labels: [ess, serverless] summary: Trigger calculation of Risk Scores for an entity description: Calculates and persists Risk Scores for an entity, returning the calculated risk score. requestBody: diff --git a/x-pack/plugins/security_solution/common/entity_analytics/risk_score/constants.ts b/x-pack/plugins/security_solution/common/entity_analytics/risk_score/constants.ts index 808a68871e96d..ff31aa502fd25 100644 --- a/x-pack/plugins/security_solution/common/entity_analytics/risk_score/constants.ts +++ b/x-pack/plugins/security_solution/common/entity_analytics/risk_score/constants.ts @@ -5,14 +5,6 @@ * 2.0. */ -/** - * Public Risk Score routes - */ -export const RISK_ENGINE_PUBLIC_PREFIX = '/api/risk_scores' as const; -export const RISK_SCORE_CALCULATION_URL = `${RISK_ENGINE_PUBLIC_PREFIX}/calculation` as const; -export const RISK_SCORE_ENTITY_CALCULATION_URL = - `${RISK_ENGINE_PUBLIC_PREFIX}/calculation/entity` as const; - /** * Internal Risk Score routes */ @@ -36,3 +28,5 @@ export const RISK_SCORE_CREATE_STORED_SCRIPT = export const RISK_SCORE_DELETE_STORED_SCRIPT = `${INTERNAL_RISK_SCORE_URL}/stored_scripts/delete` as const; export const RISK_SCORE_PREVIEW_URL = `${INTERNAL_RISK_SCORE_URL}/preview` as const; +export const RISK_SCORE_ENTITY_CALCULATION_URL = + `${INTERNAL_RISK_SCORE_URL}/calculation/entity` as const; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.test.ts deleted file mode 100644 index 9ef1cc8bc2106..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.test.ts +++ /dev/null @@ -1,143 +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 { riskScoreCalculationRoute } from './calculation'; - -import { loggerMock } from '@kbn/logging-mocks'; -import { RISK_SCORE_CALCULATION_URL } from '../../../../../common/constants'; -import { - serverMock, - requestContextMock, - requestMock, -} from '../../../detection_engine/routes/__mocks__'; -import { riskScoreServiceFactory } from '../risk_score_service'; -import { riskScoreServiceMock } from '../risk_score_service.mock'; -import { getRiskInputsIndex } from '../get_risk_inputs_index'; -import { calculateAndPersistRiskScoresMock } from '../calculate_and_persist_risk_scores.mock'; - -jest.mock('../get_risk_inputs_index'); -jest.mock('../risk_score_service'); - -describe('risk score calculation route', () => { - let server: ReturnType<typeof serverMock.create>; - let { clients, context } = requestContextMock.createTools(); - let logger: ReturnType<typeof loggerMock.create>; - let mockRiskScoreService: ReturnType<typeof riskScoreServiceMock.create>; - - beforeEach(() => { - jest.resetAllMocks(); - - server = serverMock.create(); - logger = loggerMock.create(); - ({ clients, context } = requestContextMock.createTools()); - mockRiskScoreService = riskScoreServiceMock.create(); - - (getRiskInputsIndex as jest.Mock).mockResolvedValue({ - index: 'default-dataview-index', - runtimeMappings: {}, - }); - clients.appClient.getAlertsIndex.mockReturnValue('default-alerts-index'); - (riskScoreServiceFactory as jest.Mock).mockReturnValue(mockRiskScoreService); - - riskScoreCalculationRoute(server.router, logger); - }); - - const buildRequest = (overrides: object = {}) => { - const defaults = { - data_view_id: 'default-dataview-id', - range: { start: 'now-30d', end: 'now' }, - identifier_type: 'host', - }; - - return requestMock.create({ - method: 'post', - path: RISK_SCORE_CALCULATION_URL, - body: { ...defaults, ...overrides }, - }); - }; - - it('should return 200 when risk score calculation is successful', async () => { - mockRiskScoreService.calculateAndPersistScores.mockResolvedValue( - calculateAndPersistRiskScoresMock.buildResponse() - ); - const request = buildRequest(); - - const response = await server.inject(request, requestContextMock.convertContext(context)); - - expect(response.status).toEqual(200); - }); - - describe('parameters', () => { - it('accepts a parameter for the dataview', async () => { - const request = buildRequest({ data_view_id: 'custom-dataview-id' }); - - const response = await server.inject(request, requestContextMock.convertContext(context)); - - expect(response.status).toEqual(200); - expect(getRiskInputsIndex).toHaveBeenCalledWith( - expect.objectContaining({ dataViewId: 'custom-dataview-id' }) - ); - }); - - it('accepts a parameter for the range', async () => { - const request = buildRequest({ range: { start: 'now-30d', end: 'now-20d' } }); - const response = await server.inject(request, requestContextMock.convertContext(context)); - - expect(response.status).toEqual(200); - expect(mockRiskScoreService.calculateAndPersistScores).toHaveBeenCalledWith( - expect.objectContaining({ range: { start: 'now-30d', end: 'now-20d' } }) - ); - }); - }); - - describe('validation', () => { - describe('required parameters', () => { - it('requires a parameter for the dataview', async () => { - const request = buildRequest({ data_view_id: undefined }); - const result = await server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith('data_view_id: Required'); - }); - - it('requires a parameter for the date range', async () => { - const request = buildRequest({ range: undefined }); - const result = await server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith('range: Required'); - }); - - it('requires a parameter for the identifier type', async () => { - const request = buildRequest({ identifier_type: undefined }); - const result = await server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith('identifier_type: Required'); - }); - }); - - it('uses an unknown dataview as index pattern', async () => { - const request = buildRequest({ data_view_id: 'unknown-dataview' }); - (getRiskInputsIndex as jest.Mock).mockResolvedValue({ - index: 'unknown-dataview', - runtimeMappings: {}, - }); - - const response = await server.inject(request, requestContextMock.convertContext(context)); - - expect(response.status).toEqual(200); - expect(mockRiskScoreService.calculateAndPersistScores).toHaveBeenCalledWith( - expect.objectContaining({ index: 'unknown-dataview', runtimeMappings: {} }) - ); - }); - - it('rejects an invalid date range', async () => { - const request = buildRequest({ range: 'bad range' }); - const result = await server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith('range: Expected object, received string'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts deleted file mode 100644 index 1602e724db227..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/calculation.ts +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { Logger } from '@kbn/core/server'; -import { buildSiemResponse } from '@kbn/lists-plugin/server/routes/utils'; -import { transformError } from '@kbn/securitysolution-es-utils'; -import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; -import { RiskScoresCalculationRequest } from '../../../../../common/api/entity_analytics/risk_engine/calculation_route.gen'; -import { - APP_ID, - DEFAULT_RISK_SCORE_PAGE_SIZE, - RISK_SCORE_CALCULATION_URL, -} from '../../../../../common/constants'; -import { getRiskInputsIndex } from '../get_risk_inputs_index'; -import type { EntityAnalyticsRoutesDeps } from '../../types'; -import { RiskScoreAuditActions } from '../audit'; -import { AUDIT_CATEGORY, AUDIT_OUTCOME, AUDIT_TYPE } from '../../audit'; -import { buildRiskScoreServiceForRequest } from './helpers'; - -export const riskScoreCalculationRoute = ( - router: EntityAnalyticsRoutesDeps['router'], - logger: Logger -) => { - router.versioned - .post({ - path: RISK_SCORE_CALCULATION_URL, - access: 'internal', - options: { - tags: ['access:securitySolution', `access:${APP_ID}-entity-analytics`], - }, - }) - .addVersion( - { - version: '1', - validate: { request: { body: buildRouteValidationWithZod(RiskScoresCalculationRequest) } }, - }, - async (context, request, response) => { - const securityContext = await context.securitySolution; - - securityContext.getAuditLogger()?.log({ - message: 'User triggered custom manual scoring', - event: { - action: RiskScoreAuditActions.RISK_ENGINE_MANUAL_SCORING, - category: AUDIT_CATEGORY.DATABASE, - type: AUDIT_TYPE.CHANGE, - outcome: AUDIT_OUTCOME.UNKNOWN, - }, - }); - - const siemResponse = buildSiemResponse(response); - const coreContext = await context.core; - const soClient = coreContext.savedObjects.client; - const securityConfig = await securityContext.getConfig(); - - const riskScoreService = buildRiskScoreServiceForRequest( - securityContext, - coreContext, - logger - ); - - const { - after_keys: userAfterKeys, - data_view_id: dataViewId, - debug, - page_size: userPageSize, - identifier_type: identifierType, - filter, - range, - weights, - } = request.body; - - try { - const { index, runtimeMappings } = await getRiskInputsIndex({ - dataViewId, - logger, - soClient, - }); - - const afterKeys = userAfterKeys ?? {}; - const pageSize = userPageSize ?? DEFAULT_RISK_SCORE_PAGE_SIZE; - const entityAnalyticsConfig = await riskScoreService.getConfigurationWithDefaults( - securityConfig.entityAnalytics - ); - - const alertSampleSizePerShard = entityAnalyticsConfig?.alertSampleSizePerShard; - - const result = await riskScoreService.calculateAndPersistScores({ - afterKeys, - debug, - pageSize, - identifierType, - index, - filter, - range, - runtimeMappings, - weights, - alertSampleSizePerShard, - }); - - return response.ok({ body: result }); - } catch (e) { - const error = transformError(e); - - return siemResponse.error({ - statusCode: error.statusCode, - body: { message: error.message, full_error: JSON.stringify(e) }, - bypassErrorFormat: true, - }); - } - } - ); -}; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts index eeb773b41a180..c521d11d19704 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts @@ -6,10 +6,16 @@ */ import { isEmpty } from 'lodash/fp'; -import type { Logger } from '@kbn/core/server'; +import type { + IKibanaResponse, + KibanaRequest, + KibanaResponseFactory, + Logger, +} from '@kbn/core/server'; import { buildSiemResponse } from '@kbn/lists-plugin/server/routes/utils'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; +import type { SecuritySolutionRequestHandlerContext } from '../../../../types'; import type { RiskScoresCalculationResponse } from '../../../../../common/api/entity_analytics/risk_engine/calculation_route.gen'; import type { AfterKeys } from '../../../../../common/api/entity_analytics/common'; import { RiskScoresEntityCalculationRequest } from '../../../../../common/api/entity_analytics/risk_engine/entity_calculation_route.gen'; @@ -23,6 +29,160 @@ import { buildRiskScoreServiceForRequest } from './helpers'; import { getFieldForIdentifier } from '../helpers'; import { withRiskEnginePrivilegeCheck } from '../../risk_engine/risk_engine_privileges'; +type Handler = ( + context: SecuritySolutionRequestHandlerContext, + request: KibanaRequest<unknown, unknown, RiskScoresEntityCalculationRequest>, + response: KibanaResponseFactory +) => Promise<IKibanaResponse>; + +const handler: (logger: Logger) => Handler = (logger) => async (context, request, response) => { + const securityContext = await context.securitySolution; + + securityContext.getAuditLogger()?.log({ + message: 'User triggered custom manual scoring', + event: { + action: RiskScoreAuditActions.RISK_ENGINE_ENTITY_MANUAL_SCORING, + category: AUDIT_CATEGORY.DATABASE, + type: AUDIT_TYPE.CHANGE, + outcome: AUDIT_OUTCOME.UNKNOWN, + }, + }); + + const coreContext = await context.core; + const securityConfig = await securityContext.getConfig(); + const siemResponse = buildSiemResponse(response); + const soClient = coreContext.savedObjects.client; + + const riskScoreService = buildRiskScoreServiceForRequest(securityContext, coreContext, logger); + + const { identifier_type: identifierType, identifier, refresh } = request.body; + + try { + const entityAnalyticsConfig = await riskScoreService.getConfigurationWithDefaults( + securityConfig.entityAnalytics + ); + + if (entityAnalyticsConfig == null) { + return siemResponse.error({ + statusCode: 400, + body: 'No Risk engine configuration found', + }); + } + + const { + dataViewId, + enabled, + range: configuredRange, + pageSize, + alertSampleSizePerShard, + filter: userFilter, + } = entityAnalyticsConfig; + + if (!enabled) { + return siemResponse.error({ + statusCode: 400, + body: 'Risk engine is disabled', + }); + } + + const { index, runtimeMappings } = await getRiskInputsIndex({ + dataViewId, + logger, + soClient, + }); + + const range = convertRangeToISO(configuredRange); + + const afterKeys: AfterKeys = {}; + + const identifierFilter = { + term: { [getFieldForIdentifier(identifierType)]: identifier }, + }; + + const filter = isEmpty(userFilter) ? [identifierFilter] : [userFilter, identifierFilter]; + + const result: RiskScoresCalculationResponse = await riskScoreService.calculateAndPersistScores({ + pageSize, + identifierType, + index, + filter: { + bool: { + filter, + }, + }, + range, + runtimeMappings, + weights: [], + alertSampleSizePerShard, + afterKeys, + returnScores: true, + refresh, + }); + + if (result.errors.length) { + return siemResponse.error({ + statusCode: 500, + body: { + message: 'Error calculating the risk score for an entity.', + full_error: JSON.stringify(result.errors), + }, + bypassErrorFormat: true, + }); + } + + if (result.scores_written > 0) { + await riskScoreService.scheduleLatestTransformNow(); + } + + const score = result.scores_written === 1 ? result.scores?.[identifierType]?.[0] : undefined; + + return response.ok({ + body: { + success: true, + score, + }, + }); + } catch (e) { + const error = transformError(e); + + return siemResponse.error({ + statusCode: error.statusCode, + body: { message: error.message, full_error: JSON.stringify(e) }, + bypassErrorFormat: true, + }); + } +}; + +/** + * @deprecated + * It will be deleted on a future Serverless release. + */ +export const deprecatedRiskScoreEntityCalculationRoute = ( + router: EntityAnalyticsRoutesDeps['router'], + getStartServices: EntityAnalyticsRoutesDeps['getStartServices'], + logger: Logger +) => { + router.versioned + .post({ + path: '/api/risk_scores/calculation/entity', + access: 'internal', + options: { + tags: ['access:securitySolution', `access:${APP_ID}-entity-analytics`], + }, + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: buildRouteValidationWithZod(RiskScoresEntityCalculationRequest), + }, + }, + }, + withRiskEnginePrivilegeCheck(getStartServices, handler(logger)) + ); +}; + export const riskScoreEntityCalculationRoute = ( router: EntityAnalyticsRoutesDeps['router'], getStartServices: EntityAnalyticsRoutesDeps['getStartServices'], @@ -45,128 +205,6 @@ export const riskScoreEntityCalculationRoute = ( }, }, }, - withRiskEnginePrivilegeCheck(getStartServices, async (context, request, response) => { - const securityContext = await context.securitySolution; - - securityContext.getAuditLogger()?.log({ - message: 'User triggered custom manual scoring', - event: { - action: RiskScoreAuditActions.RISK_ENGINE_ENTITY_MANUAL_SCORING, - category: AUDIT_CATEGORY.DATABASE, - type: AUDIT_TYPE.CHANGE, - outcome: AUDIT_OUTCOME.UNKNOWN, - }, - }); - - const coreContext = await context.core; - const securityConfig = await securityContext.getConfig(); - const siemResponse = buildSiemResponse(response); - const soClient = coreContext.savedObjects.client; - - const riskScoreService = buildRiskScoreServiceForRequest( - securityContext, - coreContext, - logger - ); - - const { identifier_type: identifierType, identifier, refresh } = request.body; - - try { - const entityAnalyticsConfig = await riskScoreService.getConfigurationWithDefaults( - securityConfig.entityAnalytics - ); - - if (entityAnalyticsConfig == null) { - return siemResponse.error({ - statusCode: 400, - body: 'No Risk engine configuration found', - }); - } - - const { - dataViewId, - enabled, - range: configuredRange, - pageSize, - alertSampleSizePerShard, - filter: userFilter, - } = entityAnalyticsConfig; - - if (!enabled) { - return siemResponse.error({ - statusCode: 400, - body: 'Risk engine is disabled', - }); - } - - const { index, runtimeMappings } = await getRiskInputsIndex({ - dataViewId, - logger, - soClient, - }); - - const range = convertRangeToISO(configuredRange); - - const afterKeys: AfterKeys = {}; - - const identifierFilter = { - term: { [getFieldForIdentifier(identifierType)]: identifier }, - }; - - const filter = isEmpty(userFilter) ? [identifierFilter] : [userFilter, identifierFilter]; - - const result: RiskScoresCalculationResponse = - await riskScoreService.calculateAndPersistScores({ - pageSize, - identifierType, - index, - filter: { - bool: { - filter, - }, - }, - range, - runtimeMappings, - weights: [], - alertSampleSizePerShard, - afterKeys, - returnScores: true, - refresh, - }); - - if (result.errors.length) { - return siemResponse.error({ - statusCode: 500, - body: { - message: 'Error calculating the risk score for an entity.', - full_error: JSON.stringify(result.errors), - }, - bypassErrorFormat: true, - }); - } - - if (result.scores_written > 0) { - await riskScoreService.scheduleLatestTransformNow(); - } - - const score = - result.scores_written === 1 ? result.scores?.[identifierType]?.[0] : undefined; - - return response.ok({ - body: { - success: true, - score, - }, - }); - } catch (e) { - const error = transformError(e); - - return siemResponse.error({ - statusCode: error.statusCode, - body: { message: error.message, full_error: JSON.stringify(e) }, - bypassErrorFormat: true, - }); - } - }) + withRiskEnginePrivilegeCheck(getStartServices, handler(logger)) ); }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/register_risk_score_routes.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/register_risk_score_routes.ts index 015b12c5d8ee1..1b32ce0bf52b0 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/register_risk_score_routes.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/register_risk_score_routes.ts @@ -5,9 +5,11 @@ * 2.0. */ import { riskScorePreviewRoute } from './preview'; -import { riskScoreCalculationRoute } from './calculation'; import type { EntityAnalyticsRoutesDeps } from '../../types'; -import { riskScoreEntityCalculationRoute } from './entity_calculation'; +import { + deprecatedRiskScoreEntityCalculationRoute, + riskScoreEntityCalculationRoute, +} from './entity_calculation'; export const registerRiskScoreRoutes = ({ router, @@ -15,6 +17,6 @@ export const registerRiskScoreRoutes = ({ logger, }: EntityAnalyticsRoutesDeps) => { riskScorePreviewRoute(router, logger); - riskScoreCalculationRoute(router, logger); riskScoreEntityCalculationRoute(router, getStartServices, logger); + deprecatedRiskScoreEntityCalculationRoute(router, getStartServices, logger); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/index.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/index.ts index e2af055597f99..4ccce93c790f9 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/index.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Entity Analytics - Risk Engine', function () { loadTestFile(require.resolve('./init_and_status_apis')); - loadTestFile(require.resolve('./risk_score_calculation')); loadTestFile(require.resolve('./risk_score_preview')); loadTestFile(require.resolve('./risk_scoring_task/task_execution')); loadTestFile(require.resolve('./risk_scoring_task/task_execution_nondefault_spaces')); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts deleted file mode 100644 index 29451ef9dacbe..0000000000000 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts +++ /dev/null @@ -1,374 +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 { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; - -import { RISK_SCORE_CALCULATION_URL } from '@kbn/security-solution-plugin/common/constants'; -import { v4 as uuidv4 } from 'uuid'; -import { EntityRiskScoreRecord } from '@kbn/security-solution-plugin/common/api/entity_analytics/common'; -import { dataGeneratorFactory } from '../../../detections_response/utils'; -import { deleteAllAlerts, deleteAllRules } from '../../../../../common/utils/security_solution'; -import { - buildDocument, - createAndSyncRuleAndAlertsFactory, - deleteAllRiskScores, - readRiskScores, - normalizeScores, - waitForRiskScoresToBePresent, - assetCriticalityRouteHelpersFactory, - cleanAssetCriticality, - waitForAssetCriticalityToBePresent, - getLatestRiskScoreIndexMapping, - riskEngineRouteHelpersFactory, - cleanRiskEngine, - enableAssetCriticalityAdvancedSetting, -} from '../../utils'; -import { FtrProviderContext } from '../../../../ftr_provider_context'; - -export default ({ getService }: FtrProviderContext): void => { - const supertest = getService('supertest'); - - const esArchiver = getService('esArchiver'); - const es = getService('es'); - const log = getService('log'); - const kibanaServer = getService('kibanaServer'); - - const riskEngineRoutes = riskEngineRouteHelpersFactory(supertest); - - const createAndSyncRuleAndAlerts = createAndSyncRuleAndAlertsFactory({ supertest, log }); - - const calculateRiskScores = async ({ - body, - }: { - body: object; - }): Promise<{ scores: EntityRiskScoreRecord[] }> => { - const { body: result } = await supertest - .post(RISK_SCORE_CALCULATION_URL) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') - .send(body) - .expect(200); - return result; - }; - - const calculateRiskScoreAfterRuleCreationAndExecution = async ( - documentId: string, - { - alerts = 1, - riskScore = 21, - maxSignals = 100, - }: { alerts?: number; riskScore?: number; maxSignals?: number } = {} - ) => { - await createAndSyncRuleAndAlerts({ query: `id: ${documentId}`, alerts, riskScore, maxSignals }); - - return await calculateRiskScores({ - body: { - data_view_id: '.alerts-security.alerts-default', - range: { start: 'now-30d', end: 'now' }, - identifier_type: 'host', - }, - }); - }; - - describe('@ess @serverless Risk Scoring Calculation API', () => { - before(async () => { - enableAssetCriticalityAdvancedSetting(kibanaServer, log); - }); - - context('with auditbeat data', () => { - const { indexListOfDocuments } = dataGeneratorFactory({ - es, - index: 'ecs_compliant', - log, - }); - - before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/security_solution/ecs_compliant'); - }); - - after(async () => { - await esArchiver.unload( - 'x-pack/test/functional/es_archives/security_solution/ecs_compliant' - ); - }); - - beforeEach(async () => { - await deleteAllAlerts(supertest, log, es); - await deleteAllRules(supertest, log); - - await cleanRiskEngine({ kibanaServer, es, log }); - await riskEngineRoutes.init(); - }); - - afterEach(async () => { - await deleteAllRiskScores(log, es); - await deleteAllAlerts(supertest, log, es); - await deleteAllRules(supertest, log); - - await cleanRiskEngine({ kibanaServer, es, log }); - }); - - it('calculates and persists risk score', async () => { - const documentId = uuidv4(); - await indexListOfDocuments([buildDocument({ host: { name: 'host-1' } }, documentId)]); - - const results = await calculateRiskScoreAfterRuleCreationAndExecution(documentId); - expect(results).to.eql({ - after_keys: { - host: { - 'host.name': 'host-1', - }, - }, - errors: [], - scores_written: 1, - }); - - await waitForRiskScoresToBePresent({ es, log }); - const scores = await readRiskScores(es); - - expect(scores.length).to.eql(1); - const [score] = normalizeScores(scores); - - expect(score).to.eql({ - calculated_level: 'Unknown', - calculated_score: 21, - calculated_score_norm: 8.10060175898781, - category_1_score: 8.10060175898781, - category_1_count: 1, - id_field: 'host.name', - id_value: 'host-1', - }); - }); - - it('upgrades latest risk score index dynamic setting before persisting risk scores', async () => { - const documentId = uuidv4(); - await indexListOfDocuments([buildDocument({ host: { name: 'host-1' } }, documentId)]); - - await calculateRiskScoreAfterRuleCreationAndExecution(documentId); - - const unmodifiedIndexMapping = await getLatestRiskScoreIndexMapping(es); - // by default, the dynamic mapping is set to false. - expect(unmodifiedIndexMapping?.dynamic).to.eql('false'); - - // set the 'dynamic' configuration to an undesirable value - await es.indices.putMapping({ - index: 'risk-score.risk-score-latest-default', - dynamic: 'strict', - }); - - expect((await getLatestRiskScoreIndexMapping(es))?.dynamic).to.eql('strict'); - - // before re-running risk score persistence, the dynamic configuration should be reset to the desired value - await calculateRiskScoreAfterRuleCreationAndExecution(documentId); - - const finalIndexMapping = await getLatestRiskScoreIndexMapping(es); - - expect(finalIndexMapping?.dynamic).to.eql('false'); - - // after all processing is complete, the mapping should be exactly the same as before - expect(unmodifiedIndexMapping).to.eql(finalIndexMapping); - }); - - describe('paging through calculations', () => { - let documentId: string; - beforeEach(async () => { - documentId = uuidv4(); - const baseEvent = buildDocument({ host: { name: 'host-1' } }, documentId); - await indexListOfDocuments( - Array(10) - .fill(baseEvent) - .map((_baseEvent, index) => ({ - ..._baseEvent, - 'host.name': `host-${index}`, - })) - ); - - await createAndSyncRuleAndAlerts({ - query: `id: ${documentId}`, - alerts: 10, - riskScore: 40, - }); - }); - - it('calculates and persists a single page of risk scores', async () => { - const results = await calculateRiskScores({ - body: { - data_view_id: '.alerts-security.alerts-default', - identifier_type: 'host', - range: { start: 'now-30d', end: 'now' }, - }, - }); - expect(results).to.eql({ - after_keys: { - host: { - 'host.name': 'host-9', - }, - }, - errors: [], - scores_written: 10, - }); - - await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 }); - const scores = await readRiskScores(es); - - expect(scores.length).to.eql(10); - }); - - it('calculates and persists multiple pages of risk scores', async () => { - const results = await calculateRiskScores({ - body: { - data_view_id: '.alerts-security.alerts-default', - identifier_type: 'host', - range: { start: 'now-30d', end: 'now' }, - page_size: 5, - }, - }); - expect(results).to.eql({ - after_keys: { - host: { - 'host.name': 'host-4', - }, - }, - errors: [], - scores_written: 5, - }); - - const secondResults = await calculateRiskScores({ - body: { - after_keys: { - host: { - 'host.name': 'host-4', - }, - }, - data_view_id: '.alerts-security.alerts-default', - identifier_type: 'host', - range: { start: 'now-30d', end: 'now' }, - page_size: 5, - }, - }); - - expect(secondResults).to.eql({ - after_keys: { - host: { - 'host.name': 'host-9', - }, - }, - errors: [], - scores_written: 5, - }); - - await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 }); - const scores = await readRiskScores(es); - - expect(scores.length).to.eql(10); - }); - - it('returns an appropriate response if there are no inputs left to score/persist', async () => { - const results = await calculateRiskScores({ - body: { - data_view_id: '.alerts-security.alerts-default', - identifier_type: 'host', - range: { start: 'now-30d', end: 'now' }, - page_size: 10, - }, - }); - expect(results).to.eql({ - after_keys: { - host: { - 'host.name': 'host-9', - }, - }, - errors: [], - scores_written: 10, - }); - - const noopCalculationResults = await calculateRiskScores({ - body: { - after_keys: { - host: { - 'host.name': 'host-9', - }, - }, - debug: true, - data_view_id: '.alerts-security.alerts-default', - identifier_type: 'host', - range: { start: 'now-30d', end: 'now' }, - page_size: 5, - }, - }); - - expect(noopCalculationResults).to.eql({ - after_keys: {}, - errors: [], - scores_written: 0, - }); - - await waitForRiskScoresToBePresent({ es, log, scoreCount: 10 }); - const scores = await readRiskScores(es); - - expect(scores.length).to.eql(10); - }); - }); - - describe('@skipInServerless with asset criticality data', () => { - const assetCriticalityRoutes = assetCriticalityRouteHelpersFactory(supertest); - - beforeEach(async () => { - await assetCriticalityRoutes.upsert({ - id_field: 'host.name', - id_value: 'host-1', - criticality_level: 'high_impact', - }); - }); - - afterEach(async () => { - await cleanAssetCriticality({ log, es }); - }); - - it('calculates and persists risk scores with additional criticality metadata and modifiers', async () => { - const documentId = uuidv4(); - await indexListOfDocuments([buildDocument({ host: { name: 'host-1' } }, documentId)]); - await waitForAssetCriticalityToBePresent({ es, log }); - - const results = await calculateRiskScoreAfterRuleCreationAndExecution(documentId); - expect(results).to.eql({ - after_keys: { host: { 'host.name': 'host-1' } }, - errors: [], - scores_written: 1, - }); - - await waitForRiskScoresToBePresent({ es, log }); - const scores = await readRiskScores(es); - expect(scores.length).to.eql(1); - - const [score] = normalizeScores(scores); - expect(score).to.eql({ - criticality_level: 'high_impact', - criticality_modifier: 1.5, - calculated_level: 'Unknown', - calculated_score: 21, - calculated_score_norm: 11.677912063468526, - category_1_score: 8.10060175898781, - category_1_count: 1, - id_field: 'host.name', - id_value: 'host-1', - }); - const [rawScore] = scores; - - expect( - rawScore.host?.risk.category_1_score! + rawScore.host?.risk.category_2_score! - ).to.be.within( - score.calculated_score_norm! - 0.000000000000001, - score.calculated_score_norm! + 0.000000000000001 - ); - }); - }); - }); - }); -}; From 34f76adc75be6a88fe6f2b9598e82a37e02363ec Mon Sep 17 00:00:00 2001 From: Georgii Gorbachev <georgii.gorbachev@elastic.co> Date: Wed, 26 Jun 2024 13:44:49 +0200 Subject: [PATCH 16/40] [Security Solution] Fix `prebuiltRulesCustomizationEnabled` feature flag (#186964) **Resolves: https://github.com/elastic/kibana/issues/180130** **Follow-up to:** https://github.com/elastic/kibana/pull/186823 ## Summary - Adds more information to the feature flag's JSDoc comment according to the template we use for feature flags. - Changes the ticket's link to a public one. --- .../common/experimental_features.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 0612a7515ea7d..4f7fc6c442eb1 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -233,6 +233,17 @@ export const allowedExperimentalValues = Object.freeze({ */ perFieldPrebuiltRulesDiffingEnabled: true, + /** + * Enables an ability to customize Elastic prebuilt rules. + * + * Ticket: https://github.com/elastic/kibana/issues/174168 + * Owners: https://github.com/orgs/elastic/teams/security-detection-rule-management + * Added: on Jun 24, 2024 in https://github.com/elastic/kibana/pull/186823 + * Turned: TBD + * Expires: TBD + */ + prebuiltRulesCustomizationEnabled: false, + /** * Makes Elastic Defend integration's Malware On-Write Scan option available to edit. */ @@ -267,14 +278,6 @@ export const allowedExperimentalValues = Object.freeze({ * Adds a new option to filter descendants of a process for Management / Event Filters */ filterProcessDescendantsForEventFiltersEnabled: false, - - /** - * Enables an ability to customize Elastic prebuilt rules. - * - * Ticket: https://github.com/elastic/security-team/issues/1974 - * Owners: https://github.com/orgs/elastic/teams/security-detection-rule-management - */ - prebuiltRulesCustomizationEnabled: false, }); type ExperimentalConfigKeys = Array<keyof ExperimentalFeatures>; From a493e4075b7267d34715607492197fc49c77b081 Mon Sep 17 00:00:00 2001 From: Kevin Lacabane <kevin.lacabane@elastic.co> Date: Wed, 26 Jun 2024 14:25:32 +0200 Subject: [PATCH 17/40] [eem] rename asset_manager to entity_manager (#186617) ## Summary Renames the experimental asset_manager plugin (never documented/officially released) into entity_manager. I've used `node scripts/lint_ts_projects --fix` and `node scripts/lint_packages.js --fix` to help with the procedure and also renamed manually the asset_manager references left. The change also removes the deprecated asset_manager code, including the `assetManager.alphaEnabled` plugin configuration. This means entityManager plugin will be enabled by default. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/ftr_configs.yml | 1 - .github/CODEOWNERS | 2 +- api_docs/asset_manager.devdocs.json | 193 ---------- api_docs/asset_manager.mdx | 44 --- api_docs/deprecations_by_api.mdx | 4 +- api_docs/deprecations_by_plugin.mdx | 18 +- api_docs/kbn_core_http_server.devdocs.json | 66 +--- ..._security_plugin_types_server.devdocs.json | 22 +- api_docs/plugin_directory.mdx | 1 - api_docs/security.devdocs.json | 22 +- docs/developer/plugin-list.asciidoc | 8 +- package.json | 2 +- .../current_fields.json | 16 + .../current_mappings.json | 46 +++ packages/kbn-optimizer/limits.yml | 2 +- .../check_registered_types.test.ts | 2 + .../group3/type_registrations.test.ts | 2 + .../group5/dot_kibana_split.test.ts | 2 + .../test_suites/core_plugins/rendering.ts | 1 - tsconfig.base.json | 4 +- .../asset_manager/README.md | 13 - .../asset_manager/common/config.ts | 48 --- .../asset_manager/common/constants_routes.ts | 21 -- .../asset_manager/common/types_api.ts | 315 ---------------- .../asset_manager/common/types_client.ts | 24 -- .../public/lib/public_assets_client.test.ts | 130 ------- .../public/lib/public_assets_client.ts | 94 ----- .../asset_manager/server/constants.ts | 8 - .../asset_manager/server/index.ts | 24 -- .../containers/get_containers.test.ts | 357 ------------------ .../accessors/containers/get_containers.ts | 91 ----- .../lib/accessors/hosts/get_hosts.test.ts | 357 ------------------ .../server/lib/accessors/hosts/get_hosts.ts | 91 ----- .../lib/accessors/pods/get_pods.test.ts | 341 ----------------- .../server/lib/accessors/pods/get_pods.ts | 96 ----- .../lib/accessors/services/get_services.ts | 108 ------ .../server/lib/asset_client.test.ts | 167 -------- .../asset_manager/server/lib/asset_client.ts | 56 --- .../server/lib/asset_client_types.ts | 28 -- .../server/lib/collectors/containers.ts | 101 ----- .../server/lib/collectors/hosts.ts | 119 ------ .../server/lib/collectors/index.ts | 38 -- .../server/lib/collectors/pods.ts | 101 ----- .../server/lib/collectors/services.ts | 147 -------- .../server/lib/manage_index_templates.ts | 119 ------ .../server/lib/parse_ean.test.ts | 33 -- .../asset_manager/server/lib/parse_ean.ts | 18 - .../asset_manager/server/lib/sample_assets.ts | 218 ----------- .../asset_manager/server/lib/write_assets.ts | 37 -- .../server/routes/assets/containers.ts | 73 ---- .../server/routes/assets/hosts.ts | 70 ---- .../server/routes/assets/index.ts | 70 ---- .../server/routes/assets/pods.ts | 70 ---- .../server/routes/assets/services.ts | 74 ---- .../server/routes/sample_assets.ts | 143 ------- .../asset_manager/server/routes/utils.ts | 46 --- .../server/templates/assets_template.ts | 44 --- .../asset_manager/server/test_utils.ts | 46 --- .../entity_manager/README.md | 3 + .../entity_manager/common/config.ts | 30 ++ .../common/constants_entities.ts | 0 .../common/debug_log.ts | 0 .../common/errors.ts | 0 .../entity_manager/common/types_api.ts | 25 ++ .../docs/entity_definitions.md | 0 .../jest.config.js | 6 +- .../kibana.jsonc | 10 +- .../public/index.ts | 10 +- .../public/lib/entity_client.ts | 0 .../public/plugin.ts | 26 +- .../public/types.ts | 18 +- .../entity_manager/server/index.ts | 18 + .../server/lib/auth/api_key/api_key.ts | 8 +- .../server/lib/auth/api_key/saved_object.ts | 6 +- .../server/lib/auth/index.ts | 0 .../server/lib/auth/privileges.ts | 0 .../server/lib/entities/built_in/constants.ts | 0 .../server/lib/entities/built_in/index.ts | 0 .../server/lib/entities/built_in/services.ts | 0 .../create_and_install_ingest_pipeline.ts | 0 .../entities/create_and_install_transform.ts | 0 .../lib/entities/delete_entity_definition.ts | 0 .../server/lib/entities/delete_index.ts | 0 .../lib/entities/delete_ingest_pipeline.ts | 0 .../errors/entity_id_conflict_error.ts | 0 .../lib/entities/errors/entity_not_found.ts | 0 .../errors/entity_security_exception.ts | 0 .../errors/invalid_transform_error.ts | 0 .../lib/entities/find_entity_definition.ts | 0 .../helpers/fixtures/entity_definition.ts | 0 .../entities/helpers/generate_index_name.ts | 0 .../get_elasticsearch_query_or_throw.ts | 0 .../server/lib/entities/helpers/retry.ts | 0 .../generate_history_processors.test.ts.snap | 0 .../generate_latest_processors.test.ts.snap | 0 .../generate_history_ingest_pipeline_id.ts | 0 .../generate_history_processors.test.ts | 0 .../generate_history_processors.ts | 0 .../generate_latest_ingest_pipeline_id.ts | 0 .../generate_latest_processors.test.ts | 0 .../generate_latest_processors.ts | 0 .../install_entity_definition.test.ts | 0 .../lib/entities/install_entity_definition.ts | 0 .../lib/entities/read_entity_definition.ts | 0 .../lib/entities/save_entity_definition.ts | 0 .../server/lib/entities/start_transform.ts | 0 .../lib/entities/stop_and_delete_transform.ts | 0 .../generate_history_transform.test.ts.snap | 0 .../generate_latest_transform.test.ts.snap | 0 .../generate_history_transform.test.ts | 0 .../transform/generate_history_transform.ts | 0 .../generate_history_transform_id.ts | 0 .../generate_latest_transform.test.ts | 0 .../transform/generate_latest_transform.ts | 0 .../transform/generate_latest_transform_id.ts | 0 .../generate_metadata_aggregations.ts | 0 .../transform/generate_metric_aggregations.ts | 0 .../entities/uninstall_entity_definition.ts | 0 .../server/lib/errors.ts | 0 .../server/lib/manage_index_templates.ts | 52 +++ .../server/lib/utils.ts | 0 .../lib/validators/validate_date_range.ts | 0 .../server/lib/validators/validation_error.ts | 0 .../server/plugin.ts | 69 +--- .../server/routes/enablement/check.ts | 0 .../server/routes/enablement/disable.ts | 0 .../server/routes/enablement/enable.ts | 0 .../server/routes/entities/create.ts | 0 .../server/routes/entities/delete.ts | 0 .../server/routes/entities/get.ts | 0 .../server/routes/entities/reset.ts | 0 .../server/routes/index.ts | 12 - .../server/routes/ping.ts | 6 +- .../server/routes/types.ts | 6 +- .../server/saved_objects/entity_definition.ts | 0 .../saved_objects/entity_discovery_api_key.ts | 0 .../server/saved_objects/index.ts | 0 .../server/templates/components/base.ts | 0 .../server/templates/components/entity.ts | 0 .../server/templates/components/event.ts | 0 .../server/templates/entities_template.ts | 0 .../server/types.ts | 21 +- .../tsconfig.json | 5 - .../asset_manager/config_when_disabled.ts | 17 - .../apis/asset_manager/tests/basics.ts | 29 -- .../apis/asset_manager/tests/constants.ts | 8 - .../apis/asset_manager/tests/helpers.ts | 104 ----- .../apis/asset_manager/tests/index.ts | 14 - .../apis/asset_manager/tests/sample_assets.ts | 162 -------- .../apis/asset_manager/tests/when_disabled.ts | 27 -- x-pack/test/tsconfig.json | 1 - yarn.lock | 8 +- 152 files changed, 302 insertions(+), 4793 deletions(-) delete mode 100644 api_docs/asset_manager.devdocs.json delete mode 100644 api_docs/asset_manager.mdx delete mode 100644 x-pack/plugins/observability_solution/asset_manager/README.md delete mode 100644 x-pack/plugins/observability_solution/asset_manager/common/config.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/common/constants_routes.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/common/types_api.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/common/types_client.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.test.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/constants.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/index.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.test.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.test.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.test.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/services/get_services.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.test.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client_types.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/containers.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/hosts.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/index.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/pods.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/services.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/manage_index_templates.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.test.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/sample_assets.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/lib/write_assets.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/assets/containers.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/assets/hosts.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/assets/index.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/assets/pods.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/assets/services.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/routes/utils.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/templates/assets_template.ts delete mode 100644 x-pack/plugins/observability_solution/asset_manager/server/test_utils.ts create mode 100644 x-pack/plugins/observability_solution/entity_manager/README.md create mode 100644 x-pack/plugins/observability_solution/entity_manager/common/config.ts rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/common/constants_entities.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/common/debug_log.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/common/errors.ts (100%) create mode 100644 x-pack/plugins/observability_solution/entity_manager/common/types_api.ts rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/docs/entity_definitions.md (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/jest.config.js (68%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/kibana.jsonc (59%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/public/index.ts (61%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/public/lib/entity_client.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/public/plugin.ts (51%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/public/types.ts (59%) create mode 100644 x-pack/plugins/observability_solution/entity_manager/server/index.ts rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/auth/api_key/api_key.ts (92%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/auth/api_key/saved_object.ts (87%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/auth/index.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/auth/privileges.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/built_in/constants.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/built_in/index.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/built_in/services.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/create_and_install_ingest_pipeline.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/create_and_install_transform.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/delete_entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/delete_index.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/delete_ingest_pipeline.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/errors/entity_id_conflict_error.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/errors/entity_not_found.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/errors/entity_security_exception.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/errors/invalid_transform_error.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/find_entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/helpers/fixtures/entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/helpers/generate_index_name.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/helpers/get_elasticsearch_query_or_throw.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/helpers/retry.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/generate_history_processors.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/ingest_pipeline/generate_latest_processors.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/install_entity_definition.test.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/install_entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/read_entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/save_entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/start_transform.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/stop_and_delete_transform.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_history_transform.test.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_history_transform.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_history_transform_id.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_latest_transform.test.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_latest_transform.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_latest_transform_id.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_metadata_aggregations.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/transform/generate_metric_aggregations.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/entities/uninstall_entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/errors.ts (100%) create mode 100644 x-pack/plugins/observability_solution/entity_manager/server/lib/manage_index_templates.ts rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/utils.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/validators/validate_date_range.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/lib/validators/validation_error.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/plugin.ts (58%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/enablement/check.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/enablement/disable.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/enablement/enable.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/entities/create.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/entities/delete.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/entities/get.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/entities/reset.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/index.ts (72%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/ping.ts (79%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/routes/types.ts (77%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/saved_objects/entity_definition.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/saved_objects/entity_discovery_api_key.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/saved_objects/index.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/templates/components/base.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/templates/components/entity.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/templates/components/event.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/templates/entities_template.ts (100%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/server/types.ts (61%) rename x-pack/plugins/observability_solution/{asset_manager => entity_manager}/tsconfig.json (81%) delete mode 100644 x-pack/test/api_integration/apis/asset_manager/config_when_disabled.ts delete mode 100644 x-pack/test/api_integration/apis/asset_manager/tests/basics.ts delete mode 100644 x-pack/test/api_integration/apis/asset_manager/tests/constants.ts delete mode 100644 x-pack/test/api_integration/apis/asset_manager/tests/helpers.ts delete mode 100644 x-pack/test/api_integration/apis/asset_manager/tests/index.ts delete mode 100644 x-pack/test/api_integration/apis/asset_manager/tests/sample_assets.ts delete mode 100644 x-pack/test/api_integration/apis/asset_manager/tests/when_disabled.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 65001ead9fc28..f3ad03a4e7598 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -193,7 +193,6 @@ enabled: - x-pack/test/api_integration/config_security_basic.ts - x-pack/test/api_integration/config_security_trial.ts - x-pack/test/api_integration/apis/aiops/config.ts - - x-pack/test/api_integration/apis/asset_manager/config_when_disabled.ts - x-pack/test/api_integration/apis/cases/config.ts - x-pack/test/api_integration/apis/content_management/config.ts - x-pack/test/api_integration/apis/cloud_security_posture/config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e877178d0a996..2dd7f2a8c6aee 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -47,7 +47,6 @@ packages/kbn-apm-synthtrace-client @elastic/obs-ux-infra_services-team @elastic/ packages/kbn-apm-utils @elastic/obs-ux-infra_services-team test/plugin_functional/plugins/app_link_test @elastic/kibana-core x-pack/test/usage_collection/plugins/application_usage_test @elastic/kibana-core -x-pack/plugins/observability_solution/asset_manager @elastic/obs-knowledge-team x-pack/plugins/observability_solution/assets_data_access @elastic/obs-knowledge-team x-pack/test/security_api_integration/plugins/audit_log @elastic/kibana-security packages/kbn-axe-config @elastic/kibana-qa @@ -391,6 +390,7 @@ x-pack/examples/embedded_lens_example @elastic/kibana-visualizations x-pack/plugins/encrypted_saved_objects @elastic/kibana-security x-pack/plugins/enterprise_search @elastic/search-kibana x-pack/packages/kbn-entities-schema @elastic/obs-knowledge-team +x-pack/plugins/observability_solution/entity_manager @elastic/obs-knowledge-team examples/error_boundary @elastic/appex-sharedux packages/kbn-es @elastic/kibana-operations packages/kbn-es-archiver @elastic/kibana-operations @elastic/appex-qa diff --git a/api_docs/asset_manager.devdocs.json b/api_docs/asset_manager.devdocs.json deleted file mode 100644 index cb0687b7f9922..0000000000000 --- a/api_docs/asset_manager.devdocs.json +++ /dev/null @@ -1,193 +0,0 @@ -{ - "id": "assetManager", - "client": { - "classes": [], - "functions": [], - "interfaces": [ - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerPublicPluginSetup", - "type": "Interface", - "tags": [], - "label": "AssetManagerPublicPluginSetup", - "description": [], - "path": "x-pack/plugins/observability_solution/asset_manager/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerPublicPluginSetup.publicAssetsClient", - "type": "Object", - "tags": [], - "label": "publicAssetsClient", - "description": [], - "signature": [ - "IPublicAssetsClient" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/public/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerPublicPluginSetup.entityClient", - "type": "Object", - "tags": [], - "label": "entityClient", - "description": [], - "signature": [ - "IEntityClient" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerPublicPluginStart", - "type": "Interface", - "tags": [], - "label": "AssetManagerPublicPluginStart", - "description": [], - "path": "x-pack/plugins/observability_solution/asset_manager/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerPublicPluginStart.publicAssetsClient", - "type": "Object", - "tags": [], - "label": "publicAssetsClient", - "description": [], - "signature": [ - "IPublicAssetsClient" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/public/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerPublicPluginStart.entityClient", - "type": "Object", - "tags": [], - "label": "entityClient", - "description": [], - "signature": [ - "IEntityClient" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], - "enums": [], - "misc": [ - { - "parentPluginId": "assetManager", - "id": "def-public.AssetManagerAppId", - "type": "Type", - "tags": [], - "label": "AssetManagerAppId", - "description": [], - "signature": [ - "\"assetManager\"" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/public/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], - "objects": [] - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [ - { - "parentPluginId": "assetManager", - "id": "def-server.AssetManagerConfig", - "type": "Type", - "tags": [], - "label": "AssetManagerConfig", - "description": [], - "signature": [ - "{ readonly alphaEnabled?: boolean | undefined; readonly sourceIndices: Readonly<{} & { logs: string; }>; }" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/common/config.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "assetManager", - "id": "def-server.WriteSamplesPostBody", - "type": "Type", - "tags": [], - "label": "WriteSamplesPostBody", - "description": [], - "signature": [ - "{ baseDateTime?: string | number | undefined; excludeEans?: string[] | undefined; refresh?: boolean | \"wait_for\" | undefined; } | null" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], - "objects": [], - "setup": { - "parentPluginId": "assetManager", - "id": "def-server.AssetManagerServerPluginSetup", - "type": "Type", - "tags": [], - "label": "AssetManagerServerPluginSetup", - "description": [], - "signature": [ - "{ assetClient: ", - "AssetClient", - "; } | undefined" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/server/plugin.ts", - "deprecated": false, - "trackAdoption": false, - "lifecycle": "setup", - "initialIsOpen": true - }, - "start": { - "parentPluginId": "assetManager", - "id": "def-server.AssetManagerServerPluginStart", - "type": "Type", - "tags": [], - "label": "AssetManagerServerPluginStart", - "description": [], - "signature": [ - "{} | undefined" - ], - "path": "x-pack/plugins/observability_solution/asset_manager/server/plugin.ts", - "deprecated": false, - "trackAdoption": false, - "lifecycle": "start", - "initialIsOpen": true - } - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - } -} \ No newline at end of file diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx deleted file mode 100644 index c0b8edc34d032..0000000000000 --- a/api_docs/asset_manager.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -#### -#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. -#### Reach out in #docs-engineering for more info. -#### -id: kibAssetManagerPluginApi -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-26 -tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] ---- -import assetManagerObj from './asset_manager.devdocs.json'; - -Asset manager plugin for entity assets (inventory, topology, etc) - -Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) for questions regarding this plugin. - -**Code health stats** - -| Public API count | Any count | Items lacking comments | Missing exports | -|-------------------|-----------|------------------------|-----------------| -| 11 | 0 | 11 | 3 | - -## Client - -### Interfaces -<DocDefinitionList data={assetManagerObj.client.interfaces}/> - -### Consts, variables and types -<DocDefinitionList data={assetManagerObj.client.misc}/> - -## Server - -### Setup -<DocDefinitionList data={[assetManagerObj.server.setup]}/> - -### Start -<DocDefinitionList data={[assetManagerObj.server.start]}/> - -### Consts, variables and types -<DocDefinitionList data={assetManagerObj.server.misc}/> - diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 165846fd25365..1e6b4c59e72c0 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -39,7 +39,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibDataPluginApi" section="def-common.EqlSearchStrategyRequest.options" text="options"/> | securitySolution | - | | <DocLink id="kibFleetPluginApi" section="def-public.NewPackagePolicy.policy_id" text="policy_id"/> | cloudDefend, osquery, securitySolution, synthetics | - | | <DocLink id="kibFleetPluginApi" section="def-common.NewPackagePolicy.policy_id" text="policy_id"/> | cloudDefend, osquery, securitySolution, synthetics | - | -| <DocLink id="kibSecurityPluginApi" section="def-server.SecurityPluginStart.authc" text="authc"/> | actions, alerting, files, cases, observabilityAIAssistant, fleet, cloudDefend, cloudSecurityPosture, elasticAssistant, enterpriseSearch, lists, osquery, securitySolution, reporting, serverlessSearch, transform, upgradeAssistant, apm, assetManager, observabilityOnboarding, synthetics, security | - | +| <DocLink id="kibSecurityPluginApi" section="def-server.SecurityPluginStart.authc" text="authc"/> | actions, alerting, files, cases, observabilityAIAssistant, fleet, cloudDefend, cloudSecurityPosture, elasticAssistant, enterpriseSearch, lists, osquery, securitySolution, reporting, serverlessSearch, transform, upgradeAssistant, apm, entityManager, observabilityOnboarding, synthetics, security | - | | <DocLink id="kibSecurityPluginApi" section="def-server.SecurityPluginStart.userProfiles" text="userProfiles"/> | cases, securitySolution, security | - | | <DocLink id="kibTimelinesPluginApi" section="def-common.DeprecatedCellValueElementProps" text="DeprecatedCellValueElementProps"/> | @kbn/securitysolution-data-table, securitySolution | - | | <DocLink id="kibTimelinesPluginApi" section="def-common.DeprecatedRowRenderer" text="DeprecatedRowRenderer"/> | @kbn/securitysolution-data-table, securitySolution | - | @@ -240,4 +240,4 @@ Safe to remove. | <DocLink id="kibKbnCoreSavedObjectsApiBrowserPluginApi" section="def-common.SavedObjectsBulkDeleteResponseItem" text="SavedObjectsBulkDeleteResponseItem"/> | @kbn/core-saved-objects-api-browser | | <DocLink id="kibKbnStorybookPluginApi" section="def-common.StorybookConfig.config" text="config"/> | @kbn/storybook | | <DocLink id="kibKbnUiThemePluginApi" section="def-common.tag" text="tag"/> | @kbn/ui-theme | -| <DocLink id="kibKbnUiThemePluginApi" section="def-common.version" text="version"/> | @kbn/ui-theme | \ No newline at end of file +| <DocLink id="kibKbnUiThemePluginApi" section="def-common.version" text="version"/> | @kbn/ui-theme | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 6a9c021aa0aad..44a9db75af299 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -511,14 +511,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## assetManager - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| <DocLink id="kibSecurityPluginApi" section="def-server.SecurityPluginStart.authc" text="authc"/> | [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [enable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts#:~:text=authc), [disable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [enable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts#:~:text=authc), [disable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts#:~:text=authc) | - | - - - ## canvas | Deprecated API | Reference location(s) | Remove By | @@ -785,6 +777,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## entityManager + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| <DocLink id="kibSecurityPluginApi" section="def-server.SecurityPluginStart.authc" text="authc"/> | [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [enable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/enable.ts#:~:text=authc), [disable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/disable.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts#:~:text=authc), [enable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/enable.ts#:~:text=authc), [disable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/disable.ts#:~:text=authc) | - | + + + ## eventAnnotation | Deprecated API | Reference location(s) | Remove By | @@ -1643,4 +1643,4 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| <DocLink id="kibLicensingPluginApi" section="def-public.LicensingPluginSetup.license$" text="license$"/> | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | 8.8.0 | \ No newline at end of file +| <DocLink id="kibLicensingPluginApi" section="def-public.LicensingPluginSetup.license$" text="license$"/> | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | 8.8.0 | diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index b2fdab00057fd..e401d35fa8d11 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -4730,42 +4730,6 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/ping.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/assets/index.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/assets/hosts.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/assets/services.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/assets/containers.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/assets/pods.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/entities/get.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/check.ts" - }, { "plugin": "profiling", "path": "x-pack/plugins/observability_solution/profiling/server/routes/apm.ts" @@ -7248,18 +7212,6 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts" - }, { "plugin": "profiling", "path": "x-pack/plugins/observability_solution/profiling/server/routes/setup/route.ts" @@ -8758,10 +8710,6 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -9682,18 +9630,6 @@ "plugin": "grokdebugger", "path": "x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts" }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts" - }, - { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/server/server.ts" @@ -19735,4 +19671,4 @@ } ] } -} \ No newline at end of file +} diff --git a/api_docs/kbn_security_plugin_types_server.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index 03c206b69bd4e..507aecc0f5716 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -3469,24 +3469,24 @@ "path": "x-pack/plugins/observability_solution/apm/server/routes/fleet/is_superuser.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/enable.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/disable.ts" }, { "plugin": "observabilityOnboarding", @@ -4961,4 +4961,4 @@ "misc": [], "objects": [] } -} \ No newline at end of file +} diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 5305a82346a4c..9dba90629b847 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -34,7 +34,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibAlertingPluginApi" text="alerting"/> | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 868 | 1 | 836 | 52 | | <DocLink id="kibApmPluginApi" text="apm"/> | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 123 | | <DocLink id="kibApmDataAccessPluginApi" text="apmDataAccess"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | -| <DocLink id="kibAssetManagerPluginApi" text="assetManager"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 11 | 0 | 11 | 3 | | <DocLink id="kibAssetsDataAccessPluginApi" text="assetsDataAccess"/> | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | <DocLink id="kibBannersPluginApi" text="banners"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | | <DocLink id="kibBfetchPluginApi" text="bfetch"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 83 | 1 | 73 | 2 | diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index 8511554e9b273..322ace8e21c72 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -5675,24 +5675,24 @@ "path": "x-pack/plugins/observability_solution/apm/server/routes/fleet/is_superuser.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/enable.ts" }, { - "plugin": "assetManager", - "path": "x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts" + "plugin": "entityManager", + "path": "x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/disable.ts" }, { "plugin": "observabilityOnboarding", @@ -8021,4 +8021,4 @@ ], "objects": [] } -} \ No newline at end of file +} diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index fc15206bd284d..e4f161ac8f4e5 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -470,10 +470,6 @@ The plugin exposes the static DefaultEditorController class to consume. |WARNING: Missing README. -|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/asset_manager/README.md[assetManager] -|This plugin provides access to observed asset data, such as information about hosts, pods, containers, services, and more. - - |{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/assets_data_access[assetsDataAccess] |WARNING: Missing README. @@ -573,6 +569,10 @@ security and spaces filtering. |This plugin provides Kibana user interfaces for managing the Enterprise Search solution and its products, App Search and Workplace Search. +|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/entity_manager/README.md[entityManager] +|This plugin provides access to observed asset data, such as information about hosts, pods, containers, services, and more. + + |{kib-repo}blob/{branch}/x-pack/plugins/event_log/README.md[eventLog] |The event log plugin provides a persistent history of alerting and action activities. diff --git a/package.json b/package.json index b9feecd10aa71..d96f38fa52b39 100644 --- a/package.json +++ b/package.json @@ -176,7 +176,6 @@ "@kbn/apm-utils": "link:packages/kbn-apm-utils", "@kbn/app-link-test-plugin": "link:test/plugin_functional/plugins/app_link_test", "@kbn/application-usage-test-plugin": "link:x-pack/test/usage_collection/plugins/application_usage_test", - "@kbn/assetManager-plugin": "link:x-pack/plugins/observability_solution/asset_manager", "@kbn/assets-data-access-plugin": "link:x-pack/plugins/observability_solution/assets_data_access", "@kbn/audit-log-plugin": "link:x-pack/test/security_api_integration/plugins/audit_log", "@kbn/banners-plugin": "link:x-pack/plugins/banners", @@ -446,6 +445,7 @@ "@kbn/encrypted-saved-objects-plugin": "link:x-pack/plugins/encrypted_saved_objects", "@kbn/enterprise-search-plugin": "link:x-pack/plugins/enterprise_search", "@kbn/entities-schema": "link:x-pack/packages/kbn-entities-schema", + "@kbn/entityManager-plugin": "link:x-pack/plugins/observability_solution/entity_manager", "@kbn/error-boundary-example-plugin": "link:examples/error_boundary", "@kbn/es-errors": "link:packages/kbn-es-errors", "@kbn/es-query": "link:packages/kbn-es-query", diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 8bce3d4d5e536..b0277b79eca6b 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -290,6 +290,22 @@ "schemaVersion" ], "enterprise_search_telemetry": [], + "entity-definition": [ + "description", + "filter", + "id", + "identityFields", + "indexPatterns", + "managed", + "metadata", + "metrics", + "name", + "staticFields", + "type" + ], + "entity-discovery-api-key": [ + "apiKey" + ], "epm-packages": [ "es_index_patterns", "experimental_data_stream_features", diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index a498714b970f2..e0b84e572e0f9 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -993,6 +993,52 @@ "dynamic": false, "properties": {} }, + "entity-definition": { + "dynamic": false, + "properties": { + "description": { + "type": "text" + }, + "filter": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "identityFields": { + "type": "object" + }, + "indexPatterns": { + "type": "keyword" + }, + "managed": { + "type": "boolean" + }, + "metadata": { + "type": "object" + }, + "metrics": { + "type": "object" + }, + "name": { + "type": "text" + }, + "staticFields": { + "type": "object" + }, + "type": { + "type": "keyword" + } + } + }, + "entity-discovery-api-key": { + "dynamic": false, + "properties": { + "apiKey": { + "type": "binary" + } + } + }, "epm-packages": { "properties": { "es_index_patterns": { diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index c012f2f05879c..07edd80d6387f 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -5,7 +5,6 @@ pageLoadAssetSize: aiops: 10000 alerting: 106936 apm: 64385 - assetManager: 25000 banners: 17946 bfetch: 22837 canvas: 29355 @@ -42,6 +41,7 @@ pageLoadAssetSize: embeddable: 87309 embeddableEnhanced: 22107 enterpriseSearch: 66810 + entityManager: 17175 esqlDataGrid: 24582 esUiShared: 326654 eventAnnotation: 30000 diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 2337bbfaaa89e..d318b96435469 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -88,6 +88,8 @@ describe('checking migration metadata changes on all registered SO types', () => "endpoint:unified-user-artifact-manifest": "71c7fcb52c658b21ea2800a6b6a76972ae1c776e", "endpoint:user-artifact-manifest": "1c3533161811a58772e30cdc77bac4631da3ef2b", "enterprise_search_telemetry": "9ac912e1417fc8681e0cd383775382117c9e3d3d", + "entity-definition": "33fe0194bd896f0bfe479d55f6de20f8ba1d7713", + "entity-discovery-api-key": "c267a65c69171d1804362155c1378365f5acef88", "epm-packages": "f8ee125b57df31fd035dc04ad81aef475fd2f5bd", "epm-packages-assets": "7a3e58efd9a14191d0d1a00b8aaed30a145fd0b1", "event-annotation-group": "715ba867d8c68f3c9438052210ea1c30a9362582", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index f6a9bfd089008..a137b905f07a7 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -51,6 +51,8 @@ const previouslyRegisteredTypes = [ 'endpoint:user-artifact-manifest', 'endpoint:unified-user-artifact-manifest', 'enterprise_search_telemetry', + 'entity-definition', + 'entity-discovery-api-key', 'epm-packages', 'epm-packages-assets', 'event_loop_delays_daily', diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts index 8f765010e37a8..c4c56442c23f8 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts @@ -208,6 +208,8 @@ describe('split .kibana index into multiple system indices', () => { "endpoint:unified-user-artifact-manifest", "endpoint:user-artifact-manifest", "enterprise_search_telemetry", + "entity-definition", + "entity-discovery-api-key", "epm-packages", "epm-packages-assets", "event-annotation-group", diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 380f3e965947f..b9bb6183b22b0 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -220,7 +220,6 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.apm.featureFlags.storageExplorerAvailable (any)', 'xpack.apm.featureFlags.profilingIntegrationAvailable (boolean)', 'xpack.apm.serverless.enabled (any)', // It's a boolean (any because schema.conditional) - 'xpack.assetManager.alphaEnabled (boolean)', 'xpack.observability_onboarding.serverless.enabled (any)', // It's a boolean (any because schema.conditional) 'xpack.cases.files.allowedMimeTypes (array)', 'xpack.cases.files.maxSize (number)', diff --git a/tsconfig.base.json b/tsconfig.base.json index f83c16643458c..689df41bae17a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -88,8 +88,6 @@ "@kbn/app-link-test-plugin/*": ["test/plugin_functional/plugins/app_link_test/*"], "@kbn/application-usage-test-plugin": ["x-pack/test/usage_collection/plugins/application_usage_test"], "@kbn/application-usage-test-plugin/*": ["x-pack/test/usage_collection/plugins/application_usage_test/*"], - "@kbn/assetManager-plugin": ["x-pack/plugins/observability_solution/asset_manager"], - "@kbn/assetManager-plugin/*": ["x-pack/plugins/observability_solution/asset_manager/*"], "@kbn/assets-data-access-plugin": ["x-pack/plugins/observability_solution/assets_data_access"], "@kbn/assets-data-access-plugin/*": ["x-pack/plugins/observability_solution/assets_data_access/*"], "@kbn/audit-log-plugin": ["x-pack/test/security_api_integration/plugins/audit_log"], @@ -776,6 +774,8 @@ "@kbn/enterprise-search-plugin/*": ["x-pack/plugins/enterprise_search/*"], "@kbn/entities-schema": ["x-pack/packages/kbn-entities-schema"], "@kbn/entities-schema/*": ["x-pack/packages/kbn-entities-schema/*"], + "@kbn/entityManager-plugin": ["x-pack/plugins/observability_solution/entity_manager"], + "@kbn/entityManager-plugin/*": ["x-pack/plugins/observability_solution/entity_manager/*"], "@kbn/error-boundary-example-plugin": ["examples/error_boundary"], "@kbn/error-boundary-example-plugin/*": ["examples/error_boundary/*"], "@kbn/es": ["packages/kbn-es"], diff --git a/x-pack/plugins/observability_solution/asset_manager/README.md b/x-pack/plugins/observability_solution/asset_manager/README.md deleted file mode 100644 index d73bfbb53b087..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Asset Manager Plugin - -This plugin provides access to observed asset data, such as information about hosts, pods, containers, services, and more. - -## Documentation - -### User Docs - -For those interested in making use of the APIs provided by this plugin, see [our API docs](./docs/api.md). - -### Developer Docs - -For those working on this plugin directly and developing it, please see [our development docs](./docs/development.md). diff --git a/x-pack/plugins/observability_solution/asset_manager/common/config.ts b/x-pack/plugins/observability_solution/asset_manager/common/config.ts deleted file mode 100644 index 22d1c2ace4578..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/common/config.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { schema, TypeOf } from '@kbn/config-schema'; - -export const INDEX_DEFAULTS = { - logs: 'filebeat-*,logs-*', -}; - -export const configSchema = schema.object({ - alphaEnabled: schema.maybe(schema.boolean()), - // Designate where various types of data live. - // NOTE: this should be handled in a centralized way for observability, so - // that when a user configures these differently from the known defaults, - // that value is propagated everywhere. For now, we duplicate the value here. - sourceIndices: schema.object( - { - logs: schema.string({ defaultValue: INDEX_DEFAULTS.logs }), - }, - { defaultValue: INDEX_DEFAULTS } - ), -}); - -export type AssetManagerConfig = TypeOf<typeof configSchema>; - -/** - * The following map is passed to the server plugin setup under the - * exposeToBrowser: option, and controls which of the above config - * keys are allow-listed to be available in the browser config. - * - * NOTE: anything exposed here will be visible in the UI dev tools, - * and therefore MUST NOT be anything that is sensitive information! - */ -export const exposeToBrowserConfig = { - alphaEnabled: true, -} as const; - -type ValidKeys = keyof { - [K in keyof typeof exposeToBrowserConfig as typeof exposeToBrowserConfig[K] extends true - ? K - : never]: true; -}; - -export type AssetManagerPublicConfig = Pick<AssetManagerConfig, ValidKeys>; diff --git a/x-pack/plugins/observability_solution/asset_manager/common/constants_routes.ts b/x-pack/plugins/observability_solution/asset_manager/common/constants_routes.ts deleted file mode 100644 index 6bbde84cc668b..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/common/constants_routes.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export const ASSET_MANAGER_API_BASE = '/api/asset-manager'; - -function base(path: string) { - return `${ASSET_MANAGER_API_BASE}${path}`; -} - -export const GET_ASSETS = base('/assets'); -export const GET_RELATED_ASSETS = base('/assets/related'); -export const GET_ASSETS_DIFF = base('/assets/diff'); - -export const GET_HOSTS = base('/assets/hosts'); -export const GET_SERVICES = base('/assets/services'); -export const GET_CONTAINERS = base('/assets/containers'); -export const GET_PODS = base('/assets/pods'); diff --git a/x-pack/plugins/observability_solution/asset_manager/common/types_api.ts b/x-pack/plugins/observability_solution/asset_manager/common/types_api.ts deleted file mode 100644 index 108e4b254343f..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/common/types_api.ts +++ /dev/null @@ -1,315 +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 * as rt from 'io-ts'; -import { - dateRt, - inRangeFromStringRt, - datemathStringRt, - createLiteralValueFromUndefinedRT, -} from '@kbn/io-ts-utils'; - -export const assetTypeRT = rt.keyof({ - 'k8s.pod': null, - 'k8s.cluster': null, - 'k8s.node': null, -}); - -export type AssetType = rt.TypeOf<typeof assetTypeRT>; - -export const assetKindRT = rt.keyof({ - cluster: null, - host: null, - pod: null, - container: null, - service: null, -}); - -export type AssetKind = rt.TypeOf<typeof assetKindRT>; - -export const assetStatusRT = rt.keyof({ - CREATING: null, - ACTIVE: null, - DELETING: null, - FAILED: null, - UPDATING: null, - PENDING: null, - UNKNOWN: null, -}); - -export type AssetStatus = rt.TypeOf<typeof assetStatusRT>; - -// https://github.com/gcanti/io-ts/blob/master/index.md#union-of-string-literals -export const cloudProviderNameRT = rt.keyof({ - aws: null, - gcp: null, - azure: null, - other: null, - unknown: null, - none: null, -}); - -export type CloudProviderName = rt.TypeOf<typeof cloudProviderNameRT>; - -const withTimestampRT = rt.type({ - '@timestamp': rt.string, -}); - -export type WithTimestamp = rt.TypeOf<typeof withTimestampRT>; - -export const ECSDocumentRT = rt.intersection([ - withTimestampRT, - rt.partial({ - 'kubernetes.namespace': rt.string, - 'kubernetes.pod.name': rt.string, - 'kubernetes.pod.uid': rt.string, - 'kubernetes.pod.start_time': rt.string, - 'kubernetes.node.name': rt.string, - 'kubernetes.node.start_time': rt.string, - 'orchestrator.api_version': rt.string, - 'orchestrator.namespace': rt.string, - 'orchestrator.organization': rt.string, - 'orchestrator.type': rt.string, - 'orchestrator.cluster.id': rt.string, - 'orchestrator.cluster.name': rt.string, - 'orchestrator.cluster.url': rt.string, - 'orchestrator.cluster.version': rt.string, - 'cloud.provider': cloudProviderNameRT, - 'cloud.instance.id': rt.string, - 'cloud.region': rt.string, - 'cloud.service.name': rt.string, - 'service.environment': rt.string, - }), -]); - -export type ECSDocument = rt.TypeOf<typeof ECSDocumentRT>; - -export const assetRT = rt.intersection([ - ECSDocumentRT, - rt.type({ - 'asset.ean': rt.string, - 'asset.id': rt.string, - 'asset.kind': assetKindRT, - }), - // mixed required and optional require separate hashes combined via intersection - // https://github.com/gcanti/io-ts/blob/master/index.md#mixing-required-and-optional-props - rt.partial({ - 'asset.collection_version': rt.string, - 'asset.name': rt.string, - 'asset.type': assetTypeRT, - 'asset.status': assetStatusRT, - 'asset.parents': rt.union([rt.string, rt.array(rt.string)]), - 'asset.children': rt.union([rt.string, rt.array(rt.string)]), - 'asset.references': rt.union([rt.string, rt.array(rt.string)]), - 'asset.namespace': rt.string, - }), -]); - -export type Asset = rt.TypeOf<typeof assetRT>; - -export type AssetWithoutTimestamp = Omit<Asset, '@timestamp'>; - -export interface K8sPod extends WithTimestamp { - id: string; - name?: string; - ean: string; - node?: string; - cloud?: { - provider?: CloudProviderName; - region?: string; - }; -} - -export interface K8sNodeMetricBucket { - timestamp: number; - date?: string; - averageMemoryAvailable: number | null; - averageMemoryUsage: number | null; - maxMemoryUsage: number | null; - averageCpuCoreNs: number | null; - maxCpuCoreNs: number | null; -} - -export interface K8sNodeLog { - timestamp: number; - message: string; -} - -export interface K8sNode extends WithTimestamp { - id: string; - name?: string; - ean: string; - pods?: K8sPod[]; - cluster?: K8sCluster; - cloud?: { - provider?: CloudProviderName; - region?: string; - }; - metrics?: K8sNodeMetricBucket[]; - logs?: K8sNodeLog[]; -} - -export interface K8sCluster extends WithTimestamp { - name?: string; - nodes?: K8sNode[]; - ean: string; - status?: AssetStatus; - version?: string; - cloud?: { - provider?: CloudProviderName; - region?: string; - }; -} - -export const assetFiltersSingleKindRT = rt.exact( - rt.partial({ - type: rt.union([assetTypeRT, rt.array(assetTypeRT)]), - ean: rt.union([rt.string, rt.array(rt.string)]), - id: rt.string, - parentEan: rt.string, - ['cloud.provider']: rt.string, - ['cloud.region']: rt.string, - ['orchestrator.cluster.name']: rt.string, - }) -); - -export type SingleKindAssetFilters = rt.TypeOf<typeof assetFiltersSingleKindRT>; - -const supportedKindRT = rt.union([rt.literal('host'), rt.literal('service')]); -export const assetFiltersRT = rt.intersection([ - assetFiltersSingleKindRT, - rt.partial({ kind: rt.union([supportedKindRT, rt.array(supportedKindRT)]) }), -]); - -export type AssetFilters = rt.TypeOf<typeof assetFiltersRT>; - -export const relationRT = rt.union([ - rt.literal('ancestors'), - rt.literal('descendants'), - rt.literal('references'), -]); - -export type Relation = rt.TypeOf<typeof relationRT>; -export type RelationField = keyof Pick< - Asset, - 'asset.children' | 'asset.parents' | 'asset.references' ->; - -export const sizeRT = rt.union([ - inRangeFromStringRt(1, 100), - createLiteralValueFromUndefinedRT(10), -]); -export const assetDateRT = rt.union([dateRt, datemathStringRt]); - -/** - * Hosts - */ -export const getHostAssetsQueryOptionsRT = rt.intersection([ - rt.strict({ from: assetDateRT }), - rt.partial({ - to: assetDateRT, - size: sizeRT, - stringFilters: rt.string, - filters: assetFiltersSingleKindRT, - }), -]); -export type GetHostAssetsQueryOptions = rt.TypeOf<typeof getHostAssetsQueryOptionsRT>; -export const getHostAssetsResponseRT = rt.type({ - hosts: rt.array(assetRT), -}); -export type GetHostAssetsResponse = rt.TypeOf<typeof getHostAssetsResponseRT>; - -/** - * Containers - */ -export const getContainerAssetsQueryOptionsRT = rt.intersection([ - rt.strict({ from: assetDateRT }), - rt.partial({ - to: assetDateRT, - size: sizeRT, - stringFilters: rt.string, - filters: assetFiltersSingleKindRT, - }), -]); -export type GetContainerAssetsQueryOptions = rt.TypeOf<typeof getContainerAssetsQueryOptionsRT>; -export const getContainerAssetsResponseRT = rt.type({ - containers: rt.array(assetRT), -}); -export type GetContainerAssetsResponse = rt.TypeOf<typeof getContainerAssetsResponseRT>; - -/** - * Services - */ -export const getServiceAssetsQueryOptionsRT = rt.intersection([ - rt.strict({ from: assetDateRT }), - rt.partial({ - from: assetDateRT, - to: assetDateRT, - size: sizeRT, - stringFilters: rt.string, - filters: assetFiltersSingleKindRT, - }), -]); - -export type GetServiceAssetsQueryOptions = rt.TypeOf<typeof getServiceAssetsQueryOptionsRT>; -export const getServiceAssetsResponseRT = rt.type({ - services: rt.array(assetRT), -}); -export type GetServiceAssetsResponse = rt.TypeOf<typeof getServiceAssetsResponseRT>; - -/** - * Pods - */ -export const getPodAssetsQueryOptionsRT = rt.intersection([ - rt.strict({ from: assetDateRT }), - rt.partial({ - to: assetDateRT, - size: sizeRT, - stringFilters: rt.string, - filters: assetFiltersSingleKindRT, - }), -]); -export type GetPodAssetsQueryOptions = rt.TypeOf<typeof getPodAssetsQueryOptionsRT>; -export const getPodAssetsResponseRT = rt.type({ - pods: rt.array(assetRT), -}); -export type GetPodAssetsResponse = rt.TypeOf<typeof getPodAssetsResponseRT>; - -/** - * Assets - */ -export const getAssetsQueryOptionsRT = rt.intersection([ - rt.strict({ from: assetDateRT }), - rt.partial({ - to: assetDateRT, - size: sizeRT, - stringFilters: rt.string, - filters: assetFiltersRT, - }), -]); -export type GetAssetsQueryOptions = rt.TypeOf<typeof getAssetsQueryOptionsRT>; -export const getAssetsResponseRT = rt.type({ - assets: rt.array(assetRT), -}); -export type GetAssetsResponse = rt.TypeOf<typeof getAssetsResponseRT>; - -/** - * Managed entities enablement - */ -export const managedEntityEnabledResponseRT = rt.type({ - enabled: rt.boolean, - reason: rt.string, -}); -export type ManagedEntityEnabledResponse = rt.TypeOf<typeof managedEntityEnabledResponseRT>; - -export const managedEntityResponseBase = rt.type({ - success: rt.boolean, - reason: rt.string, - message: rt.string, -}); -export type EnableManagedEntityResponse = rt.TypeOf<typeof managedEntityResponseBase>; -export type DisableManagedEntityResponse = rt.TypeOf<typeof managedEntityResponseBase>; diff --git a/x-pack/plugins/observability_solution/asset_manager/common/types_client.ts b/x-pack/plugins/observability_solution/asset_manager/common/types_client.ts deleted file mode 100644 index e779a8a15ae31..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/common/types_client.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { AssetFilters, SingleKindAssetFilters } from './types_api'; - -export interface SharedAssetsOptionsPublic<F = AssetFilters> { - from: string; - to?: string; - filters?: F; - stringFilters?: string; -} - -// Methods that return only a single "kind" of asset should not accept -// a filter of "kind" to filter by asset kinds - -export type GetHostsOptionsPublic = SharedAssetsOptionsPublic<SingleKindAssetFilters>; -export type GetContainersOptionsPublic = SharedAssetsOptionsPublic<SingleKindAssetFilters>; -export type GetPodsOptionsPublic = SharedAssetsOptionsPublic<SingleKindAssetFilters>; -export type GetServicesOptionsPublic = SharedAssetsOptionsPublic<SingleKindAssetFilters>; -export type GetAssetsOptionsPublic = SharedAssetsOptionsPublic<AssetFilters>; diff --git a/x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.test.ts b/x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.test.ts deleted file mode 100644 index 649bcfcb83dc3..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.test.ts +++ /dev/null @@ -1,130 +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 { HttpSetupMock } from '@kbn/core-http-browser-mocks'; -import { coreMock } from '@kbn/core/public/mocks'; -import { PublicAssetsClient } from './public_assets_client'; -import * as routePaths from '../../common/constants_routes'; - -describe('Public assets client', () => { - let http: HttpSetupMock = coreMock.createSetup().http; - - beforeEach(() => { - http = coreMock.createSetup().http; - }); - - describe('class instantiation', () => { - it('should successfully instantiate', () => { - new PublicAssetsClient(http); - }); - }); - - describe('getHosts', () => { - it('should call the REST API', async () => { - const client = new PublicAssetsClient(http); - await client.getHosts({ from: 'x', to: 'y' }); - expect(http.get).toBeCalledTimes(1); - }); - - it('should include specified "from" and "to" parameters in http.get query', async () => { - const client = new PublicAssetsClient(http); - await client.getHosts({ from: 'x', to: 'y' }); - expect(http.get).toBeCalledWith(routePaths.GET_HOSTS, { - query: { from: 'x', to: 'y' }, - }); - }); - - it('should include provided filters, but in string form', async () => { - const client = new PublicAssetsClient(http); - const filters = { id: '*id-1*' }; - await client.getHosts({ from: 'x', filters }); - expect(http.get).toBeCalledWith(routePaths.GET_HOSTS, { - query: { - from: 'x', - stringFilters: JSON.stringify(filters), - }, - }); - }); - - it('should return the direct results of http.get', async () => { - const client = new PublicAssetsClient(http); - http.get.mockResolvedValueOnce('my hosts'); - const result = await client.getHosts({ from: 'x', to: 'y' }); - expect(result).toBe('my hosts'); - }); - }); - - describe('getContainers', () => { - it('should call the REST API', async () => { - const client = new PublicAssetsClient(http); - await client.getContainers({ from: 'x', to: 'y' }); - expect(http.get).toBeCalledTimes(1); - }); - - it('should include specified "from" and "to" parameters in http.get query', async () => { - const client = new PublicAssetsClient(http); - await client.getContainers({ from: 'x', to: 'y' }); - expect(http.get).toBeCalledWith(routePaths.GET_CONTAINERS, { - query: { from: 'x', to: 'y' }, - }); - }); - - it('should include provided filters, but in string form', async () => { - const client = new PublicAssetsClient(http); - const filters = { id: '*id-1*' }; - await client.getContainers({ from: 'x', filters }); - expect(http.get).toBeCalledWith(routePaths.GET_CONTAINERS, { - query: { - from: 'x', - stringFilters: JSON.stringify(filters), - }, - }); - }); - - it('should return the direct results of http.get', async () => { - const client = new PublicAssetsClient(http); - http.get.mockResolvedValueOnce('my hosts'); - const result = await client.getContainers({ from: 'x', to: 'y' }); - expect(result).toBe('my hosts'); - }); - }); - - describe('getServices', () => { - it('should call the REST API', async () => { - const client = new PublicAssetsClient(http); - await client.getServices({ from: 'x', to: 'y' }); - expect(http.get).toBeCalledTimes(1); - }); - - it('should include specified "from" and "to" parameters in http.get query', async () => { - const client = new PublicAssetsClient(http); - await client.getServices({ from: 'x', to: 'y' }); - expect(http.get).toBeCalledWith(routePaths.GET_SERVICES, { - query: { from: 'x', to: 'y' }, - }); - }); - - it('should include provided filters, but in string form', async () => { - const client = new PublicAssetsClient(http); - const filters = { id: '*id-1*', parentEan: 'container:123' }; - await client.getServices({ from: 'x', filters }); - expect(http.get).toBeCalledWith(routePaths.GET_SERVICES, { - query: { - from: 'x', - stringFilters: JSON.stringify(filters), - }, - }); - }); - - it('should return the direct results of http.get', async () => { - const client = new PublicAssetsClient(http); - http.get.mockResolvedValueOnce('my services'); - const result = await client.getServices({ from: 'x', to: 'y' }); - expect(result).toBe('my services'); - }); - }); -}); diff --git a/x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.ts b/x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.ts deleted file mode 100644 index 130e723da34a6..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/public/lib/public_assets_client.ts +++ /dev/null @@ -1,94 +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 { HttpStart } from '@kbn/core/public'; -import { - GetContainersOptionsPublic, - GetHostsOptionsPublic, - GetServicesOptionsPublic, - GetPodsOptionsPublic, - GetAssetsOptionsPublic, -} from '../../common/types_client'; -import { - GetContainerAssetsResponse, - GetHostAssetsResponse, - GetServiceAssetsResponse, - GetPodAssetsResponse, - GetAssetsResponse, -} from '../../common/types_api'; -import { - GET_CONTAINERS, - GET_HOSTS, - GET_SERVICES, - GET_PODS, - GET_ASSETS, -} from '../../common/constants_routes'; -import { IPublicAssetsClient } from '../types'; - -export class PublicAssetsClient implements IPublicAssetsClient { - constructor(private readonly http: HttpStart) {} - - async getHosts(options: GetHostsOptionsPublic) { - const { filters, ...otherOptions } = options; - const results = await this.http.get<GetHostAssetsResponse>(GET_HOSTS, { - query: { - stringFilters: JSON.stringify(filters), - ...otherOptions, - }, - }); - - return results; - } - - async getContainers(options: GetContainersOptionsPublic) { - const { filters, ...otherOptions } = options; - const results = await this.http.get<GetContainerAssetsResponse>(GET_CONTAINERS, { - query: { - stringFilters: JSON.stringify(filters), - ...otherOptions, - }, - }); - - return results; - } - - async getServices(options: GetServicesOptionsPublic) { - const { filters, ...otherOptions } = options; - const results = await this.http.get<GetServiceAssetsResponse>(GET_SERVICES, { - query: { - stringFilters: JSON.stringify(filters), - ...otherOptions, - }, - }); - - return results; - } - - async getPods(options: GetPodsOptionsPublic) { - const { filters, ...otherOptions } = options; - const results = await this.http.get<GetPodAssetsResponse>(GET_PODS, { - query: { - stringFilters: JSON.stringify(filters), - ...otherOptions, - }, - }); - - return results; - } - - async getAssets(options: GetAssetsOptionsPublic) { - const { filters, ...otherOptions } = options; - const results = await this.http.get<GetAssetsResponse>(GET_ASSETS, { - query: { - stringFilters: JSON.stringify(filters), - ...otherOptions, - }, - }); - - return results; - } -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/constants.ts b/x-pack/plugins/observability_solution/asset_manager/server/constants.ts deleted file mode 100644 index 4630365e47875..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/constants.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 const ASSETS_INDEX_PREFIX = 'assets'; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/index.ts b/x-pack/plugins/observability_solution/asset_manager/server/index.ts deleted file mode 100644 index 86e5e855a74c9..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { PluginInitializerContext } from '@kbn/core-plugins-server'; -import { AssetManagerConfig } from '../common/config'; -import { AssetManagerServerPluginSetup, AssetManagerServerPluginStart, config } from './plugin'; -import type { WriteSamplesPostBody } from './routes/sample_assets'; - -export type { - AssetManagerConfig, - WriteSamplesPostBody, - AssetManagerServerPluginSetup, - AssetManagerServerPluginStart, -}; -export { config }; - -export const plugin = async (context: PluginInitializerContext<AssetManagerConfig>) => { - const { AssetManagerServerPlugin } = await import('./plugin'); - return new AssetManagerServerPlugin(context); -}; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.test.ts deleted file mode 100644 index 8a7aad907a368..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.test.ts +++ /dev/null @@ -1,357 +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 { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; -import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { GetApmIndicesMethod } from '../../asset_client_types'; -import { getContainers } from './get_containers'; -import { - createGetApmIndicesMock, - expectToThrowValidationErrorWithStatusCode, -} from '../../../test_utils'; -import { MetricsDataClient, MetricsDataClientMock } from '@kbn/metrics-data-access-plugin/server'; -import { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; - -function createBaseOptions({ - getApmIndicesMock, - metricsDataClientMock, -}: { - getApmIndicesMock: GetApmIndicesMethod; - metricsDataClientMock: MetricsDataClient; -}) { - return { - sourceIndices: { - logs: 'my-logs*', - }, - getApmIndices: getApmIndicesMock, - metricsClient: metricsDataClientMock, - }; -} - -describe('getContainers', () => { - let getApmIndicesMock = createGetApmIndicesMock(); - let metricsDataClientMock = MetricsDataClientMock.create(); - let baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); - let esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - let soClientMock = savedObjectsClientMock.create(); - - function resetMocks() { - getApmIndicesMock = createGetApmIndicesMock(); - metricsDataClientMock = MetricsDataClientMock.create(); - baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); - esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - soClientMock = savedObjectsClientMock.create(); - } - - beforeEach(() => { - resetMocks(); - - // ES returns no results, just enough structure to not blow up - esClientMock.search.mockResolvedValueOnce({ - took: 1, - timed_out: false, - _shards: { - failed: 0, - successful: 1, - total: 1, - }, - hits: { - hits: [], - }, - }); - }); - - it('should query Elasticsearch correctly', async () => { - await getContainers({ - ...baseOptions, - from: 'now-5d', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }); - - expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledTimes(1); - expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledWith({ - savedObjectsClient: soClientMock, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.filter).toEqual([ - { - range: { - '@timestamp': { - gte: 'now-5d', - lte: 'now-3d', - }, - }, - }, - ]); - - expect(bool?.must).toEqual([ - { - exists: { - field: 'container.id', - }, - }, - ]); - - expect(bool?.should).toEqual([ - { exists: { field: 'kubernetes.container.id' } }, - { exists: { field: 'kubernetes.pod.uid' } }, - { exists: { field: 'kubernetes.node.name' } }, - { exists: { field: 'host.hostname' } }, - ]); - }); - - it('should correctly include an EAN filter as a container ID term query', async () => { - const mockContainerId = '123abc'; - - await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `container:${mockContainerId}`, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'container.id', - }, - }, - { - term: { - 'container.id': mockContainerId, - }, - }, - ]) - ); - }); - - it('should not query ES and return empty if filtering on non-container EAN', async () => { - const mockId = 'some-id-123'; - - const result = await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `pod:${mockId}`, - }, - }); - - expect(esClientMock.search).toHaveBeenCalledTimes(0); - expect(result).toEqual({ containers: [] }); - }); - - it('should throw an error when an invalid EAN is provided', async () => { - try { - await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `invalid`, - }, - }); - } catch (error) { - const hasMessage = 'message' in error; - expect(hasMessage).toEqual(true); - expect(error.message).toEqual('invalid is not a valid EAN'); - } - - try { - await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `invalid:toomany:colons`, - }, - }); - } catch (error) { - const hasMessage = 'message' in error; - expect(hasMessage).toEqual(true); - expect(error.message).toEqual('invalid:toomany:colons is not a valid EAN'); - } - }); - - it('should include a wildcard ID filter when an ID filter is provided with asterisks included', async () => { - const mockIdPattern = '*partial-id*'; - - await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - id: mockIdPattern, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'container.id', - }, - }, - { - wildcard: { - 'container.id': mockIdPattern, - }, - }, - ]) - ); - }); - - it('should include a term ID filter when an ID filter is provided without asterisks included', async () => { - const mockId = 'full-id'; - - await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - id: mockId, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'container.id', - }, - }, - { - term: { - 'container.id': mockId, - }, - }, - ]) - ); - }); - - it('should include a term filter for cloud filters', async () => { - const mockCloudProvider = 'gcp'; - const mockCloudRegion = 'us-central-1'; - - await getContainers({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - 'cloud.provider': mockCloudProvider, - 'cloud.region': mockCloudRegion, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'container.id', - }, - }, - { - term: { - 'cloud.provider': mockCloudProvider, - }, - }, - { - term: { - 'cloud.region': mockCloudRegion, - }, - }, - ]) - ); - }); - - it('should reject with 400 for invalid "from" date', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getContainers({ - ...baseOptions, - from: 'now-1zz', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 for invalid "to" date', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getContainers({ - ...baseOptions, - from: 'now-5d', - to: 'now-3fe', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is a date that is after "to"', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getContainers({ - ...baseOptions, - from: 'now', - to: 'now-5d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is in the future', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getContainers({ - ...baseOptions, - from: 'now+1d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); -}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.ts deleted file mode 100644 index c3c11bc375a84..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/containers/get_containers.ts +++ /dev/null @@ -1,91 +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 { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { Asset } from '../../../../common/types_api'; -import { GetContainersOptionsPublic } from '../../../../common/types_client'; -import { - AssetClientDependencies, - AssetClientOptionsWithInjectedValues, -} from '../../asset_client_types'; -import { parseEan } from '../../parse_ean'; -import { collectContainers } from '../../collectors'; -import { validateStringDateRange } from '../../validators/validate_date_range'; - -export type GetContainersOptions = GetContainersOptionsPublic & AssetClientDependencies; -export type GetContainersOptionsInjected = - AssetClientOptionsWithInjectedValues<GetContainersOptions>; - -export async function getContainers( - options: GetContainersOptionsInjected -): Promise<{ containers: Asset[] }> { - validateStringDateRange(options.from, options.to); - - const metricsIndices = await options.metricsClient.getMetricIndices({ - savedObjectsClient: options.savedObjectsClient, - }); - - const filters: QueryDslQueryContainer[] = []; - - if (options.filters?.ean) { - const ean = Array.isArray(options.filters.ean) ? options.filters.ean[0] : options.filters.ean; - const { kind, id } = parseEan(ean); - - // if EAN filter isn't targeting a container asset, we don't need to do this query - if (kind !== 'container') { - return { - containers: [], - }; - } - - filters.push({ - term: { - 'container.id': id, - }, - }); - } - - if (options.filters?.id) { - const fn = options.filters.id.includes('*') ? 'wildcard' : 'term'; - filters.push({ - [fn]: { - 'container.id': options.filters.id, - }, - }); - } - - if (options.filters?.['cloud.provider']) { - filters.push({ - term: { - 'cloud.provider': options.filters['cloud.provider'], - }, - }); - } - - if (options.filters?.['cloud.region']) { - filters.push({ - term: { - 'cloud.region': options.filters['cloud.region'], - }, - }); - } - - const { assets } = await collectContainers({ - client: options.elasticsearchClient, - from: options.from, - to: options.to || 'now', - filters, - sourceIndices: { - metrics: metricsIndices, - logs: options.sourceIndices.logs, - }, - }); - - return { - containers: assets, - }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.test.ts deleted file mode 100644 index 1f7d1e7007bb5..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.test.ts +++ /dev/null @@ -1,357 +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 { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; -import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { GetApmIndicesMethod } from '../../asset_client_types'; -import { getHosts } from './get_hosts'; -import { - createGetApmIndicesMock, - expectToThrowValidationErrorWithStatusCode, -} from '../../../test_utils'; -import { MetricsDataClient, MetricsDataClientMock } from '@kbn/metrics-data-access-plugin/server'; -import { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; - -function createBaseOptions({ - getApmIndicesMock, - metricsDataClientMock, -}: { - getApmIndicesMock: GetApmIndicesMethod; - metricsDataClientMock: MetricsDataClient; -}) { - return { - sourceIndices: { - logs: 'my-logs*', - }, - getApmIndices: getApmIndicesMock, - metricsClient: metricsDataClientMock, - }; -} - -describe('getHosts', () => { - let getApmIndicesMock = createGetApmIndicesMock(); - let metricsDataClientMock = MetricsDataClientMock.create(); - let baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); - let esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - let soClientMock = savedObjectsClientMock.create(); - - function resetMocks() { - getApmIndicesMock = createGetApmIndicesMock(); - metricsDataClientMock = MetricsDataClientMock.create(); - baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); - esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - soClientMock = savedObjectsClientMock.create(); - } - - beforeEach(() => { - resetMocks(); - - // ES returns no results, just enough structure to not blow up - esClientMock.search.mockResolvedValueOnce({ - took: 1, - timed_out: false, - _shards: { - failed: 0, - successful: 1, - total: 1, - }, - hits: { - hits: [], - }, - }); - }); - - it('should query Elasticsearch correctly', async () => { - await getHosts({ - ...baseOptions, - from: 'now-5d', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }); - - expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledTimes(1); - expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledWith({ - savedObjectsClient: soClientMock, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.filter).toEqual([ - { - range: { - '@timestamp': { - gte: 'now-5d', - lte: 'now-3d', - }, - }, - }, - ]); - - expect(bool?.must).toEqual([ - { - exists: { - field: 'host.hostname', - }, - }, - ]); - - expect(bool?.should).toEqual([ - { exists: { field: 'kubernetes.node.name' } }, - { exists: { field: 'kubernetes.pod.uid' } }, - { exists: { field: 'container.id' } }, - { exists: { field: 'cloud.provider' } }, - ]); - }); - - it('should correctly include an EAN filter as a hostname term query', async () => { - const mockHostName = 'some-hostname-123'; - - await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `host:${mockHostName}`, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'host.hostname', - }, - }, - { - terms: { - 'host.hostname': [mockHostName], - }, - }, - ]) - ); - }); - - it('should not query ES and return empty if filtering on non-host EAN', async () => { - const mockId = 'some-id-123'; - - const result = await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `container:${mockId}`, - }, - }); - - expect(esClientMock.search).toHaveBeenCalledTimes(0); - expect(result).toEqual({ hosts: [] }); - }); - - it('should throw an error when an invalid EAN is provided', async () => { - try { - await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `invalid`, - }, - }); - } catch (error) { - const hasMessage = 'message' in error; - expect(hasMessage).toEqual(true); - expect(error.message).toEqual('invalid is not a valid EAN'); - } - - try { - await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `invalid:toomany:colons`, - }, - }); - } catch (error) { - const hasMessage = 'message' in error; - expect(hasMessage).toEqual(true); - expect(error.message).toEqual('invalid:toomany:colons is not a valid EAN'); - } - }); - - it('should include a wildcard ID filter when an ID filter is provided with asterisks included', async () => { - const mockIdPattern = '*partial-id*'; - - await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - id: mockIdPattern, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'host.hostname', - }, - }, - { - wildcard: { - 'host.hostname': mockIdPattern, - }, - }, - ]) - ); - }); - - it('should include a term ID filter when an ID filter is provided without asterisks included', async () => { - const mockId = 'full-id'; - - await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - id: mockId, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'host.hostname', - }, - }, - { - term: { - 'host.hostname': mockId, - }, - }, - ]) - ); - }); - - it('should include a term filter for cloud filters', async () => { - const mockCloudProvider = 'gcp'; - const mockCloudRegion = 'us-central-1'; - - await getHosts({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - 'cloud.provider': mockCloudProvider, - 'cloud.region': mockCloudRegion, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'host.hostname', - }, - }, - { - term: { - 'cloud.provider': mockCloudProvider, - }, - }, - { - term: { - 'cloud.region': mockCloudRegion, - }, - }, - ]) - ); - }); - - it('should reject with 400 for invalid "from" date', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getHosts({ - ...baseOptions, - from: 'now-1zz', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 for invalid "to" date', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getHosts({ - ...baseOptions, - from: 'now-5d', - to: 'now-3fe', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is a date that is after "to"', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getHosts({ - ...baseOptions, - from: 'now', - to: 'now-5d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is in the future', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getHosts({ - ...baseOptions, - from: 'now+1d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); -}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.ts deleted file mode 100644 index 8252c57da3b0f..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/hosts/get_hosts.ts +++ /dev/null @@ -1,91 +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 { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { Asset } from '../../../../common/types_api'; -import { collectHosts } from '../../collectors/hosts'; -import { GetHostsOptionsPublic } from '../../../../common/types_client'; -import { - AssetClientDependencies, - AssetClientOptionsWithInjectedValues, -} from '../../asset_client_types'; -import { parseEan } from '../../parse_ean'; -import { validateStringDateRange } from '../../validators/validate_date_range'; - -export type GetHostsOptions = GetHostsOptionsPublic & AssetClientDependencies; -export type GetHostsOptionsInjected = AssetClientOptionsWithInjectedValues<GetHostsOptions>; - -export async function getHosts(options: GetHostsOptionsInjected): Promise<{ hosts: Asset[] }> { - validateStringDateRange(options.from, options.to); - - const metricsIndices = await options.metricsClient.getMetricIndices({ - savedObjectsClient: options.savedObjectsClient, - }); - - const filters: QueryDslQueryContainer[] = []; - - if (options.filters?.ean) { - const eans = Array.isArray(options.filters.ean) ? options.filters.ean : [options.filters.ean]; - const hostnames = eans - .map(parseEan) - .filter(({ kind }) => kind === 'host') - .map(({ id }) => id); - - // if EAN filter isn't targeting a host asset, we don't need to do this query - if (hostnames.length === 0) { - return { - hosts: [], - }; - } - - filters.push({ - terms: { - 'host.hostname': hostnames, - }, - }); - } - - if (options.filters?.id) { - const fn = options.filters.id.includes('*') ? 'wildcard' : 'term'; - filters.push({ - [fn]: { - 'host.hostname': options.filters.id, - }, - }); - } - - if (options.filters?.['cloud.provider']) { - filters.push({ - term: { - 'cloud.provider': options.filters['cloud.provider'], - }, - }); - } - - if (options.filters?.['cloud.region']) { - filters.push({ - term: { - 'cloud.region': options.filters['cloud.region'], - }, - }); - } - - const { assets } = await collectHosts({ - client: options.elasticsearchClient, - from: options.from, - to: options.to || 'now', - filters, - sourceIndices: { - metrics: metricsIndices, - logs: options.sourceIndices.logs, - }, - }); - - return { - hosts: assets, - }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.test.ts deleted file mode 100644 index 94d367963588c..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.test.ts +++ /dev/null @@ -1,341 +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 { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; -import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { GetApmIndicesMethod } from '../../asset_client_types'; -import { getPods } from './get_pods'; -import { - createGetApmIndicesMock, - expectToThrowValidationErrorWithStatusCode, -} from '../../../test_utils'; -import { MetricsDataClient, MetricsDataClientMock } from '@kbn/metrics-data-access-plugin/server'; -import { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; - -function createBaseOptions({ - getApmIndicesMock, - metricsDataClientMock, -}: { - getApmIndicesMock: GetApmIndicesMethod; - metricsDataClientMock: MetricsDataClient; -}) { - return { - sourceIndices: { - logs: 'my-logs*', - }, - getApmIndices: getApmIndicesMock, - metricsClient: metricsDataClientMock, - }; -} - -describe('getPods', () => { - let getApmIndicesMock = createGetApmIndicesMock(); - let metricsDataClientMock = MetricsDataClientMock.create(); - let baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); - let esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - let soClientMock = savedObjectsClientMock.create(); - - function resetMocks() { - getApmIndicesMock = createGetApmIndicesMock(); - metricsDataClientMock = MetricsDataClientMock.create(); - baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); - esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - soClientMock = savedObjectsClientMock.create(); - } - - beforeEach(() => { - resetMocks(); - - // ES returns no results, just enough structure to not blow up - esClientMock.search.mockResolvedValueOnce({ - took: 1, - timed_out: false, - _shards: { - failed: 0, - successful: 1, - total: 1, - }, - hits: { - hits: [], - }, - }); - }); - - it('should query Elasticsearch correctly', async () => { - await getPods({ - ...baseOptions, - from: 'now-5d', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }); - - expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledTimes(1); - expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledWith({ - savedObjectsClient: soClientMock, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.filter).toEqual([ - { - range: { - '@timestamp': { - gte: 'now-5d', - lte: 'now-3d', - }, - }, - }, - ]); - - expect(bool?.must).toEqual([ - { - exists: { - field: 'kubernetes.pod.uid', - }, - }, - { - exists: { - field: 'kubernetes.node.name', - }, - }, - ]); - }); - - it('should correctly include an EAN filter as a pod ID term query', async () => { - const mockPodId = '123abc'; - - await getPods({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `pod:${mockPodId}`, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'kubernetes.pod.uid', - }, - }, - { - exists: { - field: 'kubernetes.node.name', - }, - }, - { - term: { - 'kubernetes.pod.uid': mockPodId, - }, - }, - ]) - ); - }); - - it('should not query ES and return empty if filtering on non-pod EAN', async () => { - const mockId = 'some-id-123'; - - const result = await getPods({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - ean: `container:${mockId}`, - }, - }); - - expect(esClientMock.search).toHaveBeenCalledTimes(0); - expect(result).toEqual({ pods: [] }); - }); - - it('should include a wildcard ID filter when an ID filter is provided with asterisks included', async () => { - const mockIdPattern = '*partial-id*'; - - await getPods({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - id: mockIdPattern, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'kubernetes.pod.uid', - }, - }, - { - exists: { - field: 'kubernetes.node.name', - }, - }, - { - wildcard: { - 'kubernetes.pod.uid': mockIdPattern, - }, - }, - ]) - ); - }); - - it('should include a term ID filter when an ID filter is provided without asterisks included', async () => { - const mockId = 'full-id'; - - await getPods({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - id: mockId, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'kubernetes.pod.uid', - }, - }, - { - exists: { - field: 'kubernetes.node.name', - }, - }, - { - term: { - 'kubernetes.pod.uid': mockId, - }, - }, - ]) - ); - }); - - it('should include a term filter for cloud filters', async () => { - const mockCloudProvider = 'gcp'; - const mockCloudRegion = 'us-central-1'; - - await getPods({ - ...baseOptions, - from: 'now-1h', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - filters: { - 'cloud.provider': mockCloudProvider, - 'cloud.region': mockCloudRegion, - }, - }); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.must).toEqual( - expect.arrayContaining([ - { - exists: { - field: 'kubernetes.pod.uid', - }, - }, - { - exists: { - field: 'kubernetes.node.name', - }, - }, - { - term: { - 'cloud.provider': mockCloudProvider, - }, - }, - { - term: { - 'cloud.region': mockCloudRegion, - }, - }, - ]) - ); - }); - - it('should reject with 400 for invalid "from" date', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getPods({ - ...baseOptions, - from: 'now-1zz', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 for invalid "to" date', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getPods({ - ...baseOptions, - from: 'now-5d', - to: 'now-3fe', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is a date that is after "to"', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getPods({ - ...baseOptions, - from: 'now', - to: 'now-5d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is in the future', () => { - return expectToThrowValidationErrorWithStatusCode( - () => - getPods({ - ...baseOptions, - from: 'now+1d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); -}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.ts deleted file mode 100644 index db2bc11ae2315..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/pods/get_pods.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { Asset } from '../../../../common/types_api'; -import { GetPodsOptionsPublic } from '../../../../common/types_client'; -import { - AssetClientDependencies, - AssetClientOptionsWithInjectedValues, -} from '../../asset_client_types'; -import { parseEan } from '../../parse_ean'; -import { collectPods } from '../../collectors/pods'; -import { validateStringDateRange } from '../../validators/validate_date_range'; - -export type GetPodsOptions = GetPodsOptionsPublic & AssetClientDependencies; -export type GetPodsOptionsInjected = AssetClientOptionsWithInjectedValues<GetPodsOptions>; - -export async function getPods(options: GetPodsOptionsInjected): Promise<{ pods: Asset[] }> { - validateStringDateRange(options.from, options.to); - - const metricsIndices = await options.metricsClient.getMetricIndices({ - savedObjectsClient: options.savedObjectsClient, - }); - - const filters: QueryDslQueryContainer[] = []; - - if (options.filters?.ean) { - const ean = Array.isArray(options.filters.ean) ? options.filters.ean[0] : options.filters.ean; - const { kind, id } = parseEan(ean); - - // if EAN filter isn't targeting a pod asset, we don't need to do this query - if (kind !== 'pod') { - return { - pods: [], - }; - } - - filters.push({ - term: { - 'kubernetes.pod.uid': id, - }, - }); - } - - if (options.filters?.id) { - const fn = options.filters.id.includes('*') ? 'wildcard' : 'term'; - filters.push({ - [fn]: { - 'kubernetes.pod.uid': options.filters.id, - }, - }); - } - - if (options.filters?.['orchestrator.cluster.name']) { - filters.push({ - term: { - 'orchestrator.cluster.name': options.filters['orchestrator.cluster.name'], - }, - }); - } - - if (options.filters?.['cloud.provider']) { - filters.push({ - term: { - 'cloud.provider': options.filters['cloud.provider'], - }, - }); - } - - if (options.filters?.['cloud.region']) { - filters.push({ - term: { - 'cloud.region': options.filters['cloud.region'], - }, - }); - } - - const { assets } = await collectPods({ - client: options.elasticsearchClient, - from: options.from, - to: options.to || 'now', - filters, - sourceIndices: { - metrics: metricsIndices, - logs: options.sourceIndices.logs, - }, - }); - - return { - pods: assets, - }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/services/get_services.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/services/get_services.ts deleted file mode 100644 index b5a68028efcdb..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/accessors/services/get_services.ts +++ /dev/null @@ -1,108 +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 { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { Asset } from '../../../../common/types_api'; -import { collectServices } from '../../collectors/services'; -import { parseEan } from '../../parse_ean'; -import { GetServicesOptionsPublic } from '../../../../common/types_client'; -import { - AssetClientDependencies, - AssetClientOptionsWithInjectedValues, -} from '../../asset_client_types'; -import { validateStringDateRange } from '../../validators/validate_date_range'; - -export type GetServicesOptions = GetServicesOptionsPublic & AssetClientDependencies; -export type GetServicesOptionsInjected = AssetClientOptionsWithInjectedValues<GetServicesOptions>; - -export async function getServices( - options: GetServicesOptionsInjected -): Promise<{ services: Asset[] }> { - validateStringDateRange(options.from, options.to); - - const filters: QueryDslQueryContainer[] = []; - - if (options.filters?.ean) { - const eans = Array.isArray(options.filters.ean) ? options.filters.ean : [options.filters.ean]; - const services = eans - .map(parseEan) - .filter(({ kind }) => kind === 'service') - .map(({ id }) => id); - - if (services.length === 0) { - return { - services: [], - }; - } - - filters.push({ - terms: { - 'service.name': services, - }, - }); - } - - if (options.filters?.parentEan) { - const { kind, id } = parseEan(options.filters?.parentEan); - - if (kind === 'host') { - filters.push({ - bool: { - should: [{ term: { 'host.name': id } }, { term: { 'host.hostname': id } }], - minimum_should_match: 1, - }, - }); - } - - if (kind === 'container') { - filters.push({ - bool: { - should: [{ term: { 'container.id': id } }], - minimum_should_match: 1, - }, - }); - } - } - - if (options.filters?.id) { - const fn = options.filters.id.includes('*') ? 'wildcard' : 'term'; - filters.push({ - [fn]: { - 'service.name': options.filters.id, - }, - }); - } - - if (options.filters?.['cloud.provider']) { - filters.push({ - term: { - 'cloud.provider': options.filters['cloud.provider'], - }, - }); - } - - if (options.filters?.['cloud.region']) { - filters.push({ - term: { - 'cloud.region': options.filters['cloud.region'], - }, - }); - } - - const apmIndices = await options.getApmIndices(options.savedObjectsClient); - const { assets } = await collectServices({ - client: options.elasticsearchClient, - from: options.from, - to: options.to || 'now', - sourceIndices: { - apm: apmIndices, - }, - filters, - }); - - return { services: assets }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.test.ts deleted file mode 100644 index 9ed5fb536251c..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.test.ts +++ /dev/null @@ -1,167 +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 { - ElasticsearchClientMock, - elasticsearchClientMock, -} from '@kbn/core-elasticsearch-client-server-mocks'; -import { AssetClient } from './asset_client'; -import { MetricsDataClient, MetricsDataClientMock } from '@kbn/metrics-data-access-plugin/server'; -import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; -import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import { AssetsValidationError } from './validators/validation_error'; -import { GetApmIndicesMethod } from './asset_client_types'; -import { createGetApmIndicesMock, expectToThrowValidationErrorWithStatusCode } from '../test_utils'; - -function createAssetClient( - metricsDataClient: MetricsDataClient, - getApmIndicesMock: jest.Mocked<GetApmIndicesMethod> -) { - return new AssetClient({ - sourceIndices: { - logs: 'my-logs*', - }, - getApmIndices: getApmIndicesMock, - metricsClient: metricsDataClient, - }); -} - -describe('Server assets client', () => { - let metricsDataClientMock: MetricsDataClient = MetricsDataClientMock.create(); - let getApmIndicesMock: jest.Mocked<GetApmIndicesMethod> = createGetApmIndicesMock(); - let esClientMock: ElasticsearchClientMock = - elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - let soClientMock: jest.Mocked<SavedObjectsClientContract>; - - beforeEach(() => { - // Reset mocks - esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; - soClientMock = savedObjectsClientMock.create(); - metricsDataClientMock = MetricsDataClientMock.create(); - getApmIndicesMock = createGetApmIndicesMock(); - - // ES returns no results, just enough structure to not blow up - esClientMock.search.mockResolvedValueOnce({ - took: 1, - timed_out: false, - _shards: { - failed: 0, - successful: 1, - total: 1, - }, - hits: { - hits: [], - }, - }); - }); - - describe('class instantiation', () => { - it('should successfully instantiate', () => { - createAssetClient(metricsDataClientMock, getApmIndicesMock); - }); - }); - - // TODO: Move this block to the get_services accessor folder - describe('getServices', () => { - it('should query Elasticsearch correctly', async () => { - const client = createAssetClient(metricsDataClientMock, getApmIndicesMock); - - await client.getServices({ - from: 'now-5d', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }); - - expect(getApmIndicesMock).toHaveBeenCalledTimes(1); - expect(getApmIndicesMock).toHaveBeenCalledWith(soClientMock); - - const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; - const { bool } = dsl?.query || {}; - expect(bool).toBeDefined(); - - expect(bool?.filter).toEqual([ - { - range: { - '@timestamp': { - gte: 'now-5d', - lte: 'now-3d', - }, - }, - }, - ]); - - expect(bool?.must).toEqual([ - { - exists: { - field: 'service.name', - }, - }, - ]); - - expect(bool?.should).toBeUndefined(); - }); - - it('should reject with 400 for invalid "from" date', () => { - const client = createAssetClient(metricsDataClientMock, getApmIndicesMock); - - return expect(() => - client.getServices({ - from: 'now-1zz', - to: 'now-3d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }) - ).rejects.toThrow(AssetsValidationError); - }); - - it('should reject with 400 for invalid "to" date', () => { - const client = createAssetClient(metricsDataClientMock, getApmIndicesMock); - - return expectToThrowValidationErrorWithStatusCode( - () => - client.getServices({ - from: 'now-5d', - to: 'now-3fe', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is a date that is after "to"', () => { - const client = createAssetClient(metricsDataClientMock, getApmIndicesMock); - - return expectToThrowValidationErrorWithStatusCode( - () => - client.getServices({ - from: 'now', - to: 'now-5d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - - it('should reject with 400 when "from" is in the future', () => { - const client = createAssetClient(metricsDataClientMock, getApmIndicesMock); - - return expectToThrowValidationErrorWithStatusCode( - () => - client.getServices({ - from: 'now+1d', - elasticsearchClient: esClientMock, - savedObjectsClient: soClientMock, - }), - { statusCode: 400 } - ); - }); - }); -}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.ts deleted file mode 100644 index 9de64a9e6c000..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client.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 { orderBy } from 'lodash'; -import { Asset } from '../../common/types_api'; -import { GetAssetsOptionsPublic } from '../../common/types_client'; -import { getContainers, GetContainersOptions } from './accessors/containers/get_containers'; -import { getHosts, GetHostsOptions } from './accessors/hosts/get_hosts'; -import { getServices, GetServicesOptions } from './accessors/services/get_services'; -import { getPods, GetPodsOptions } from './accessors/pods/get_pods'; -import { AssetClientBaseOptions, AssetClientOptionsWithInjectedValues } from './asset_client_types'; -import { AssetClientDependencies } from './asset_client_types'; - -type GetAssetsOptions = GetAssetsOptionsPublic & AssetClientDependencies; - -export class AssetClient { - constructor(private baseOptions: AssetClientBaseOptions) {} - - injectOptions<T extends object = {}>(options: T): AssetClientOptionsWithInjectedValues<T> { - return { - ...options, - ...this.baseOptions, - }; - } - - async getHosts(options: GetHostsOptions): Promise<{ hosts: Asset[] }> { - const withInjected = this.injectOptions(options); - return await getHosts(withInjected); - } - - async getServices(options: GetServicesOptions): Promise<{ services: Asset[] }> { - const withInjected = this.injectOptions(options); - return await getServices(withInjected); - } - - async getContainers(options: GetContainersOptions): Promise<{ containers: Asset[] }> { - const withInjected = this.injectOptions(options); - return await getContainers(withInjected); - } - - async getPods(options: GetPodsOptions): Promise<{ pods: Asset[] }> { - const withInjected = this.injectOptions(options); - return await getPods(withInjected); - } - - async getAssets(options: GetAssetsOptions): Promise<{ assets: Asset[] }> { - const withInjected = this.injectOptions(options); - const { hosts } = await getHosts(withInjected); - const { services } = await getServices(withInjected); - return { assets: orderBy(hosts.concat(services), ['@timestamp'], ['desc']) }; - } -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client_types.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client_types.ts deleted file mode 100644 index a15886ce3a00a..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/asset_client_types.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { APMDataAccessConfig } from '@kbn/apm-data-access-plugin/server'; -import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import { MetricsDataClient } from '@kbn/metrics-data-access-plugin/server'; -import { AssetManagerConfig } from '../../common/config'; - -export type GetApmIndicesMethod = ( - soClient: SavedObjectsClientContract -) => Promise<APMDataAccessConfig['indices']>; -export interface AssetClientDependencies { - elasticsearchClient: ElasticsearchClient; - savedObjectsClient: SavedObjectsClientContract; -} - -export interface AssetClientBaseOptions { - sourceIndices: AssetManagerConfig['sourceIndices']; - getApmIndices: GetApmIndicesMethod; - metricsClient: MetricsDataClient; -} - -export type AssetClientOptionsWithInjectedValues<T extends object> = T & AssetClientBaseOptions; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/containers.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/containers.ts deleted file mode 100644 index 2012e05912487..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/containers.ts +++ /dev/null @@ -1,101 +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 { estypes } from '@elastic/elasticsearch'; -import { Asset } from '../../../common/types_api'; -import { CollectorOptions, QUERY_MAX_SIZE } from '.'; -import { extractFieldValue } from '../utils'; - -export async function collectContainers({ - client, - from, - to, - sourceIndices, - filters = [], - afterKey, -}: CollectorOptions) { - if (!sourceIndices?.metrics || !sourceIndices?.logs) { - throw new Error('missing required metrics/logs indices'); - } - - const musts = [...filters, { exists: { field: 'container.id' } }]; - - const { metrics, logs } = sourceIndices; - const dsl: estypes.SearchRequest = { - index: [metrics, logs], - size: QUERY_MAX_SIZE, - collapse: { - field: 'container.id', - }, - sort: [{ 'container.id': 'asc' }], - _source: false, - fields: [ - '@timestamp', - 'kubernetes.*', - 'cloud.provider', - 'orchestrator.cluster.name', - 'host.name', - 'host.hostname', - ], - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: from, - lte: to, - }, - }, - }, - ], - must: musts, - should: [ - { exists: { field: 'kubernetes.container.id' } }, - { exists: { field: 'kubernetes.pod.uid' } }, - { exists: { field: 'kubernetes.node.name' } }, - { exists: { field: 'host.hostname' } }, - ], - }, - }, - }; - - if (afterKey) { - dsl.search_after = afterKey; - } - - const esResponse = await client.search(dsl); - - const assets = esResponse.hits.hits.reduce<Asset[]>((acc: Asset[], hit: any) => { - const { fields = {} } = hit; - const containerId = extractFieldValue(fields['container.id']); - const podUid = extractFieldValue(fields['kubernetes.pod.uid']); - const nodeName = extractFieldValue(fields['kubernetes.node.name']); - - const parentEan = podUid ? `pod:${podUid}` : `host:${fields['host.hostname']}`; - - const container: Asset = { - '@timestamp': extractFieldValue(fields['@timestamp']), - 'asset.kind': 'container', - 'asset.id': containerId, - 'asset.ean': `container:${containerId}`, - 'asset.parents': [parentEan], - }; - - if (nodeName) { - container['asset.references'] = [`host:${nodeName}`]; - } - - acc.push(container); - - return acc; - }, []); - - const hitsLen = esResponse.hits.hits.length; - const next = hitsLen === QUERY_MAX_SIZE ? esResponse.hits.hits[hitsLen - 1].sort : undefined; - return { assets, afterKey: next }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/hosts.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/hosts.ts deleted file mode 100644 index b624373010f10..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/hosts.ts +++ /dev/null @@ -1,119 +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 { estypes } from '@elastic/elasticsearch'; -import { Asset } from '../../../common/types_api'; -import { CollectorOptions, QUERY_MAX_SIZE } from '.'; -import { extractFieldValue } from '../utils'; - -export async function collectHosts({ - client, - from, - to, - sourceIndices, - afterKey, - filters = [], -}: CollectorOptions) { - if (!sourceIndices?.metrics || !sourceIndices?.logs) { - throw new Error('missing required metrics/logs indices'); - } - - const { metrics, logs } = sourceIndices; - - const musts = [...filters, { exists: { field: 'host.hostname' } }]; - const dsl: estypes.SearchRequest = { - index: [metrics, logs], - size: QUERY_MAX_SIZE, - collapse: { field: 'host.hostname' }, - sort: [{ 'host.hostname': 'asc' }], - _source: false, - fields: [ - '@timestamp', - 'cloud.*', - 'container.*', - 'host.hostname', - 'kubernetes.*', - 'orchestrator.cluster.name', - ], - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: from, - lte: to, - }, - }, - }, - ], - must: musts, - should: [ - { exists: { field: 'kubernetes.node.name' } }, - { exists: { field: 'kubernetes.pod.uid' } }, - { exists: { field: 'container.id' } }, - { exists: { field: 'cloud.provider' } }, - ], - }, - }, - }; - - if (afterKey) { - dsl.search_after = afterKey; - } - - const esResponse = await client.search(dsl); - - const assets = esResponse.hits.hits.reduce<Asset[]>((acc: Asset[], hit: any) => { - const { fields = {} } = hit; - const hostName = extractFieldValue(fields['host.hostname']); - const k8sNode = extractFieldValue(fields['kubernetes.node.name']); - const k8sPod = extractFieldValue(fields['kubernetes.pod.uid']); - - const hostEan = `host:${k8sNode || hostName}`; - - const host: Asset = { - '@timestamp': extractFieldValue(fields['@timestamp']), - 'asset.kind': 'host', - 'asset.id': k8sNode || hostName, - 'asset.name': k8sNode || hostName, - 'asset.ean': hostEan, - }; - - if (fields['cloud.provider']) { - host['cloud.provider'] = extractFieldValue(fields['cloud.provider']); - } - - if (fields['cloud.instance.id']) { - host['cloud.instance.id'] = extractFieldValue(fields['cloud.instance.id']); - } - - if (fields['cloud.service.name']) { - host['cloud.service.name'] = extractFieldValue(fields['cloud.service.name']); - } - - if (fields['cloud.region']) { - host['cloud.region'] = extractFieldValue(fields['cloud.region']); - } - - if (fields['orchestrator.cluster.name']) { - host['orchestrator.cluster.name'] = extractFieldValue(fields['orchestrator.cluster.name']); - } - - if (k8sPod) { - host['asset.children'] = [`pod:${k8sPod}`]; - } - - acc.push(host); - - return acc; - }, []); - - const hitsLen = esResponse.hits.hits.length; - const next = hitsLen === QUERY_MAX_SIZE ? esResponse.hits.hits[hitsLen - 1].sort : undefined; - return { assets, afterKey: next }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/index.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/index.ts deleted file mode 100644 index f1d79e749cd97..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/index.ts +++ /dev/null @@ -1,38 +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 { estypes } from '@elastic/elasticsearch'; -import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; -import { ElasticsearchClient } from '@kbn/core/server'; -import { Asset } from '../../../common/types_api'; - -export const QUERY_MAX_SIZE = 10000; - -export type Collector = (opts: CollectorOptions) => Promise<CollectorResult>; - -export interface CollectorOptions { - client: ElasticsearchClient; - from: string; - to: string; - sourceIndices?: { - apm?: APMIndices; - metrics?: string; - logs?: string; - }; - afterKey?: estypes.SortResults; - filters?: estypes.QueryDslQueryContainer[]; -} - -export interface CollectorResult { - assets: Asset[]; - afterKey?: estypes.SortResults; -} - -export { collectContainers } from './containers'; -export { collectHosts } from './hosts'; -export { collectPods } from './pods'; -export { collectServices } from './services'; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/pods.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/pods.ts deleted file mode 100644 index e78fa106452ca..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/pods.ts +++ /dev/null @@ -1,101 +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 { estypes } from '@elastic/elasticsearch'; -import { Asset } from '../../../common/types_api'; -import { CollectorOptions, QUERY_MAX_SIZE } from '.'; -import { extractFieldValue } from '../utils'; - -export async function collectPods({ - client, - from, - to, - sourceIndices, - filters = [], - afterKey, -}: CollectorOptions) { - if (!sourceIndices?.metrics || !sourceIndices?.logs) { - throw new Error('missing required metrics/logs indices'); - } - - const musts = [ - ...filters, - { exists: { field: 'kubernetes.pod.uid' } }, - { exists: { field: 'kubernetes.node.name' } }, - ]; - - const { metrics, logs } = sourceIndices; - const dsl: estypes.SearchRequest = { - index: [metrics, logs], - size: QUERY_MAX_SIZE, - collapse: { - field: 'kubernetes.pod.uid', - }, - sort: [{ 'kubernetes.pod.uid': 'asc' }], - _source: false, - fields: [ - '@timestamp', - 'kubernetes.*', - 'cloud.provider', - 'orchestrator.cluster.name', - 'host.name', - 'host.hostname', - ], - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: from, - lte: to, - }, - }, - }, - ], - must: musts, - }, - }, - }; - - if (afterKey) { - dsl.search_after = afterKey; - } - - const esResponse = await client.search(dsl); - - const assets = esResponse.hits.hits.reduce<Asset[]>((acc: Asset[], hit: any) => { - const { fields = {} } = hit; - const podUid = extractFieldValue(fields['kubernetes.pod.uid']); - const nodeName = extractFieldValue(fields['kubernetes.node.name']); - const clusterName = extractFieldValue(fields['orchestrator.cluster.name']); - - const pod: Asset = { - '@timestamp': extractFieldValue(fields['@timestamp']), - 'asset.kind': 'pod', - 'asset.id': podUid, - 'asset.ean': `pod:${podUid}`, - 'asset.parents': [`host:${nodeName}`], - }; - - if (fields['cloud.provider']) { - pod['cloud.provider'] = extractFieldValue(fields['cloud.provider']); - } - - if (clusterName) { - pod['orchestrator.cluster.name'] = clusterName; - } - - acc.push(pod); - - return acc; - }, []); - - const hitsLen = esResponse.hits.hits.length; - const next = hitsLen === QUERY_MAX_SIZE ? esResponse.hits.hits[hitsLen - 1].sort : undefined; - return { assets, afterKey: next }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/services.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/services.ts deleted file mode 100644 index 4c49f75d13594..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/collectors/services.ts +++ /dev/null @@ -1,147 +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 { estypes } from '@elastic/elasticsearch'; -import { debug } from '../../../common/debug_log'; -import { Asset } from '../../../common/types_api'; -import { CollectorOptions, QUERY_MAX_SIZE } from '.'; - -export async function collectServices({ - client, - from, - to, - sourceIndices, - afterKey, - filters = [], -}: CollectorOptions) { - if (!sourceIndices?.apm) { - throw new Error('missing required apm indices'); - } - - const { transaction, error, metric } = sourceIndices.apm; - const musts: estypes.QueryDslQueryContainer[] = [ - ...filters, - { - exists: { - field: 'service.name', - }, - }, - ]; - - const dsl: estypes.SearchRequest = { - index: [transaction, error, metric], - size: 0, - _source: false, - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: from, - lte: to, - }, - }, - }, - ], - must: musts, - }, - }, - aggs: { - services: { - composite: { - size: QUERY_MAX_SIZE, - sources: [ - { - serviceName: { - terms: { - field: 'service.name', - }, - }, - }, - { - serviceEnvironment: { - terms: { - field: 'service.environment', - missing_bucket: true, - }, - }, - }, - ], - }, - aggs: { - last_seen: { - max: { field: '@timestamp' }, - }, - container_and_hosts: { - multi_terms: { - terms: [ - { - field: 'host.hostname', - }, - { - field: 'container.id', - }, - ], - }, - }, - }, - }, - }, - }; - - if (afterKey) { - dsl.aggs!.services!.composite!.after = afterKey; - } - - debug(dsl); - - const esResponse = await client.search(dsl); - - const { after_key: nextKey, buckets = [] } = (esResponse.aggregations?.services || {}) as any; - const assets = buckets.reduce((acc: Asset[], bucket: any) => { - const { - key: { serviceName, serviceEnvironment }, - container_and_hosts: containerHosts, - last_seen: lastSeen, - } = bucket; - - if (!serviceName) { - return acc; - } - - const service: Asset = { - '@timestamp': lastSeen.value_as_string, - 'asset.kind': 'service', - 'asset.id': serviceName, - 'asset.ean': `service:${serviceName}`, - 'asset.references': [], - 'asset.parents': [], - }; - - if (serviceEnvironment) { - service['service.environment'] = serviceEnvironment; - } - - containerHosts.buckets?.forEach((containerBucket: any) => { - const [hostname, containerId] = containerBucket.key; - if (hostname) { - (service['asset.references'] as string[]).push(`host:${hostname}`); - } - - if (containerId) { - (service['asset.parents'] as string[]).push(`container:${containerId}`); - } - }); - - acc.push(service); - - return acc; - }, []); - - return { assets, afterKey: buckets.length === QUERY_MAX_SIZE ? nextKey : undefined }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/manage_index_templates.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/manage_index_templates.ts deleted file mode 100644 index b364e63ff9a1f..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/manage_index_templates.ts +++ /dev/null @@ -1,119 +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 { - ClusterPutComponentTemplateRequest, - IndicesGetIndexTemplateResponse, - IndicesPutIndexTemplateRequest, -} from '@elastic/elasticsearch/lib/api/types'; -import { ElasticsearchClient, Logger } from '@kbn/core/server'; -import { ASSETS_INDEX_PREFIX } from '../constants'; - -function templateExists( - template: IndicesPutIndexTemplateRequest, - existing: IndicesGetIndexTemplateResponse | null -) { - if (existing === null) { - return false; - } - - if (existing.index_templates.length === 0) { - return false; - } - - const checkPatterns = Array.isArray(template.index_patterns) - ? template.index_patterns - : [template.index_patterns]; - - return existing.index_templates.some((t) => { - const { priority: existingPriority = 0 } = t.index_template; - const { priority: incomingPriority = 0 } = template; - if (existingPriority !== incomingPriority) { - return false; - } - - const existingPatterns = Array.isArray(t.index_template.index_patterns) - ? t.index_template.index_patterns - : [t.index_template.index_patterns]; - - if (checkPatterns.every((p) => p && existingPatterns.includes(p))) { - return true; - } - - return false; - }); -} - -interface TemplateManagementOptions { - esClient: ElasticsearchClient; - template: IndicesPutIndexTemplateRequest; - logger: Logger; -} - -interface ComponentManagementOptions { - esClient: ElasticsearchClient; - component: ClusterPutComponentTemplateRequest; - logger: Logger; -} - -export async function maybeCreateTemplate({ - esClient, - template, - logger, -}: TemplateManagementOptions) { - const pattern = ASSETS_INDEX_PREFIX + '*'; - template.index_patterns = [pattern]; - let existing: IndicesGetIndexTemplateResponse | null = null; - try { - existing = await esClient.indices.getIndexTemplate({ name: template.name }); - } catch (error: any) { - if (error?.name !== 'ResponseError' || error?.statusCode !== 404) { - logger.warn(`Asset manager index template lookup failed: ${error.message}`); - } - } - try { - if (!templateExists(template, existing)) { - await esClient.indices.putIndexTemplate(template); - } - } catch (error: any) { - logger.error(`Asset manager index template creation failed: ${error.message}`); - return; - } - - logger.info( - `Asset manager index template is up to date (use debug logging to see what was installed)` - ); - logger.debug(`Asset manager index template: ${JSON.stringify(template)}`); -} - -export async function upsertTemplate({ esClient, template, logger }: TemplateManagementOptions) { - try { - await esClient.indices.putIndexTemplate(template); - } catch (error: any) { - logger.error(`Error updating asset manager index template: ${error.message}`); - return; - } - - logger.info( - `Asset manager index template is up to date (use debug logging to see what was installed)` - ); - logger.debug(`Asset manager index template: ${JSON.stringify(template)}`); -} - -export async function upsertComponent({ esClient, component, logger }: ComponentManagementOptions) { - try { - await esClient.cluster.putComponentTemplate(component); - } catch (error: any) { - logger.error(`Error updating asset manager component template: ${error.message}`); - return; - } - - logger.info( - `Asset manager component template is up to date (use debug logging to see what was installed)` - ); - logger.debug(`Asset manager component template: ${JSON.stringify(component)}`); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.test.ts deleted file mode 100644 index b7dc5e592dabd..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.test.ts +++ /dev/null @@ -1,33 +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 { parseEan } from './parse_ean'; - -describe('parseEan function', () => { - it('should parse a valid EAN and return the kind and id as separate values', () => { - const ean = 'host:some-id-123'; - const { kind, id } = parseEan(ean); - expect(kind).toBe('host'); - expect(id).toBe('some-id-123'); - }); - - it('should throw an error when the provided EAN does not have enough segments', () => { - expect(() => parseEan('invalid-ean')).toThrowError('not a valid EAN'); - expect(() => parseEan('invalid-ean:')).toThrowError('not a valid EAN'); - expect(() => parseEan(':invalid-ean')).toThrowError('not a valid EAN'); - }); - - it('should throw an error when the provided EAN has too many segments', () => { - const ean = 'host:invalid:segments'; - expect(() => parseEan(ean)).toThrowError('not a valid EAN'); - }); - - it('should throw an error when the provided EAN includes an unsupported "kind" value', () => { - const ean = 'unsupported_kind:some-id-123'; - expect(() => parseEan(ean)).toThrowError('not a valid EAN'); - }); -}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.ts deleted file mode 100644 index 6be17f40de005..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/parse_ean.ts +++ /dev/null @@ -1,18 +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 { assetKindRT } from '../../common/types_api'; - -export function parseEan(ean: string) { - const [kind, id, ...rest] = ean.split(':'); - - if (!assetKindRT.is(kind) || !kind || !id || rest.length > 0) { - throw new Error(`${ean} is not a valid EAN`); - } - - return { kind, id }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/sample_assets.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/sample_assets.ts deleted file mode 100644 index 2e9fbc2bcd5be..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/sample_assets.ts +++ /dev/null @@ -1,218 +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 { Asset, AssetWithoutTimestamp } from '../../common/types_api'; - -// Provide a list of asset EAN values to remove, to simulate disappearing or -// appearing assets over time. -export function getSampleAssetDocs({ - baseDateTime = new Date(), - excludeEans = [], -}: { - baseDateTime?: Date; - excludeEans?: string[]; -}): Asset[] { - const timestamp = baseDateTime.toISOString(); - return sampleAssets - .filter((asset) => !excludeEans.includes(asset['asset.ean'])) - .map((asset) => { - return { - '@timestamp': timestamp, - ...asset, - }; - }); -} - -const sampleK8sClusters: AssetWithoutTimestamp[] = [ - { - 'asset.type': 'k8s.cluster', - 'asset.kind': 'cluster', - 'asset.id': 'cluster-001', - 'asset.name': 'Cluster 001 (AWS EKS)', - 'asset.ean': 'cluster:cluster-001', - 'orchestrator.type': 'kubernetes', - 'orchestrator.cluster.name': 'Cluster 001 (AWS EKS)', - 'orchestrator.cluster.id': 'cluster-001', - 'cloud.provider': 'aws', - 'cloud.region': 'us-east-1', - 'cloud.service.name': 'eks', - }, - { - 'asset.type': 'k8s.cluster', - 'asset.kind': 'cluster', - 'asset.id': 'cluster-002', - 'asset.name': 'Cluster 002 (Azure AKS)', - 'asset.ean': 'cluster:cluster-002', - 'orchestrator.type': 'kubernetes', - 'orchestrator.cluster.name': 'Cluster 002 (Azure AKS)', - 'orchestrator.cluster.id': 'cluster-002', - 'cloud.provider': 'azure', - 'cloud.region': 'eu-west', - 'cloud.service.name': 'aks', - }, -]; - -const sampleK8sNodes: AssetWithoutTimestamp[] = [ - { - 'asset.type': 'k8s.node', - 'asset.kind': 'host', - 'asset.id': 'node-101', - 'asset.name': 'k8s-node-101-aws', - 'asset.ean': 'host:node-101', - 'asset.parents': ['cluster:cluster-001'], - 'orchestrator.type': 'kubernetes', - 'orchestrator.cluster.name': 'Cluster 001 (AWS EKS)', - 'orchestrator.cluster.id': 'cluster-001', - 'cloud.provider': 'aws', - 'cloud.region': 'us-east-1', - 'cloud.service.name': 'eks', - }, - { - 'asset.type': 'k8s.node', - 'asset.kind': 'host', - 'asset.id': 'node-102', - 'asset.name': 'k8s-node-102-aws', - 'asset.ean': 'host:node-102', - 'asset.parents': ['cluster:cluster-001'], - 'orchestrator.type': 'kubernetes', - 'orchestrator.cluster.name': 'Cluster 001 (AWS EKS)', - 'orchestrator.cluster.id': 'cluster-001', - 'cloud.provider': 'aws', - 'cloud.region': 'us-east-1', - 'cloud.service.name': 'eks', - }, - { - 'asset.type': 'k8s.node', - 'asset.kind': 'host', - 'asset.id': 'node-103', - 'asset.name': 'k8s-node-103-aws', - 'asset.ean': 'host:node-103', - 'asset.parents': ['cluster:cluster-001'], - 'orchestrator.type': 'kubernetes', - 'orchestrator.cluster.name': 'Cluster 001 (AWS EKS)', - 'orchestrator.cluster.id': 'cluster-001', - 'cloud.provider': 'aws', - 'cloud.region': 'us-east-1', - 'cloud.service.name': 'eks', - }, -]; - -const sampleK8sPods: AssetWithoutTimestamp[] = [ - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200xrg1', - 'asset.name': 'k8s-pod-200xrg1-aws', - 'asset.ean': 'pod:pod-200xrg1', - 'asset.parents': ['host:node-101'], - 'asset.references': ['cluster:cluster-001'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200dfp2', - 'asset.name': 'k8s-pod-200dfp2-aws', - 'asset.ean': 'pod:pod-200dfp2', - 'asset.parents': ['host:node-101'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200wwc3', - 'asset.name': 'k8s-pod-200wwc3-aws', - 'asset.ean': 'pod:pod-200wwc3', - 'asset.parents': ['host:node-101'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200naq4', - 'asset.name': 'k8s-pod-200naq4-aws', - 'asset.ean': 'pod:pod-200naq4', - 'asset.parents': ['host:node-102'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200ohr5', - 'asset.name': 'k8s-pod-200ohr5-aws', - 'asset.ean': 'pod:pod-200ohr5', - 'asset.parents': ['host:node-102'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200yyx6', - 'asset.name': 'k8s-pod-200yyx6-aws', - 'asset.ean': 'pod:pod-200yyx6', - 'asset.parents': ['host:node-103'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200psd7', - 'asset.name': 'k8s-pod-200psd7-aws', - 'asset.ean': 'pod:pod-200psd7', - 'asset.parents': ['host:node-103'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200wmc8', - 'asset.name': 'k8s-pod-200wmc8-aws', - 'asset.ean': 'pod:pod-200wmc8', - 'asset.parents': ['host:node-103'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-200ugg9', - 'asset.name': 'k8s-pod-200ugg9-aws', - 'asset.ean': 'pod:pod-200ugg9', - 'asset.parents': ['host:node-103'], - }, -]; - -const sampleCircularReferences: AssetWithoutTimestamp[] = [ - { - 'asset.type': 'k8s.node', - 'asset.kind': 'host', - 'asset.id': 'node-203', - 'asset.name': 'k8s-node-203-aws', - 'asset.ean': 'host:node-203', - 'orchestrator.type': 'kubernetes', - 'orchestrator.cluster.name': 'Cluster 001 (AWS EKS)', - 'orchestrator.cluster.id': 'cluster-001', - 'cloud.provider': 'aws', - 'cloud.region': 'us-east-1', - 'cloud.service.name': 'eks', - 'asset.references': ['pod:pod-203ugg9', 'pod:pod-203ugg5'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-203ugg5', - 'asset.name': 'k8s-pod-203ugg5-aws', - 'asset.ean': 'pod:pod-203ugg5', - 'asset.references': ['host:node-203'], - }, - { - 'asset.type': 'k8s.pod', - 'asset.kind': 'pod', - 'asset.id': 'pod-203ugg9', - 'asset.name': 'k8s-pod-203ugg9-aws', - 'asset.ean': 'pod:pod-203ugg9', - 'asset.references': ['host:node-203'], - }, -]; - -export const sampleAssets: AssetWithoutTimestamp[] = [ - ...sampleK8sClusters, - ...sampleK8sNodes, - ...sampleK8sPods, - ...sampleCircularReferences, -]; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/write_assets.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/write_assets.ts deleted file mode 100644 index 72b79bc366b6d..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/write_assets.ts +++ /dev/null @@ -1,37 +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 { BulkRequest } from '@elastic/elasticsearch/lib/api/types'; -import { debug } from '../../common/debug_log'; -import { Asset } from '../../common/types_api'; -import { ASSETS_INDEX_PREFIX } from '../constants'; -import { ElasticsearchAccessorOptions } from '../types'; - -interface WriteAssetsOptions extends ElasticsearchAccessorOptions { - assetDocs: Asset[]; - namespace?: string; - refresh?: boolean | 'wait_for'; -} - -export async function writeAssets({ - elasticsearchClient, - assetDocs, - namespace = 'default', - refresh = false, -}: WriteAssetsOptions) { - const dsl: BulkRequest<Asset> = { - refresh, - operations: assetDocs.flatMap((asset) => [ - { create: { _index: `${ASSETS_INDEX_PREFIX}-${asset['asset.type']}-${namespace}` } }, - asset, - ]), - }; - - debug('Performing Write Asset Query', '\n\n', JSON.stringify(dsl, null, 2)); - - return await elasticsearchClient.bulk<{}>(dsl); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/containers.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/containers.ts deleted file mode 100644 index f96fd79c05812..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/containers.ts +++ /dev/null @@ -1,73 +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 { createRouteValidationFunction } from '@kbn/io-ts-utils'; -import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import { - GetContainerAssetsQueryOptions, - getContainerAssetsQueryOptionsRT, -} from '../../../common/types_api'; -import { debug } from '../../../common/debug_log'; -import { SetupRouteOptions } from '../types'; -import * as routePaths from '../../../common/constants_routes'; -import { getClientsFromContext, validateStringAssetFilters } from '../utils'; -import { AssetsValidationError } from '../../lib/validators/validation_error'; - -export function containersRoutes<T extends RequestHandlerContext>({ - router, - server, -}: SetupRouteOptions<T>) { - const validate = createRouteValidationFunction(getContainerAssetsQueryOptionsRT); - router.get<unknown, GetContainerAssetsQueryOptions, unknown>( - { - path: routePaths.GET_CONTAINERS, - validate: { - query: (q, res) => { - const [invalidResponse, validatedFilters] = validateStringAssetFilters(q, res); - if (invalidResponse) { - return invalidResponse; - } - if (validatedFilters) { - q.filters = validatedFilters; - } - return validate(q, res); - }, - }, - }, - async (context, req, res) => { - const { from = 'now-24h', to = 'now', filters } = req.query || {}; - const { elasticsearchClient, savedObjectsClient } = await getClientsFromContext(context); - - try { - const response = await server.assetClient.getContainers({ - from, - to, - filters, // safe due to route validation, are there better ways to do this? - elasticsearchClient, - savedObjectsClient, - }); - - return res.ok({ body: response }); - } catch (error: unknown) { - debug('Error while looking up CONTAINER asset records', error); - - if (error instanceof AssetsValidationError) { - return res.customError({ - statusCode: error.statusCode, - body: { - message: `Error while looking up container asset records - ${error.message}`, - }, - }); - } - return res.customError({ - statusCode: 500, - body: { message: 'Error while looking up container asset records - ' + `${error}` }, - }); - } - } - ); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/hosts.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/hosts.ts deleted file mode 100644 index 74f0724f43587..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/hosts.ts +++ /dev/null @@ -1,70 +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 { createRouteValidationFunction } from '@kbn/io-ts-utils'; -import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import { GetHostAssetsQueryOptions, getHostAssetsQueryOptionsRT } from '../../../common/types_api'; -import { debug } from '../../../common/debug_log'; -import { SetupRouteOptions } from '../types'; -import * as routePaths from '../../../common/constants_routes'; -import { getClientsFromContext, validateStringAssetFilters } from '../utils'; -import { AssetsValidationError } from '../../lib/validators/validation_error'; - -export function hostsRoutes<T extends RequestHandlerContext>({ - router, - server, -}: SetupRouteOptions<T>) { - const validate = createRouteValidationFunction(getHostAssetsQueryOptionsRT); - router.get<unknown, GetHostAssetsQueryOptions, unknown>( - { - path: routePaths.GET_HOSTS, - validate: { - query: (q, res) => { - const [invalidResponse, validatedFilters] = validateStringAssetFilters(q, res); - if (invalidResponse) { - return invalidResponse; - } - if (validatedFilters) { - q.filters = validatedFilters; - } - return validate(q, res); - }, - }, - }, - async (context, req, res) => { - const { from = 'now-24h', to = 'now', filters } = req.query || {}; - const { elasticsearchClient, savedObjectsClient } = await getClientsFromContext(context); - - try { - const response = await server.assetClient.getHosts({ - from, - to, - filters, // safe due to route validation, are there better ways to do this? - elasticsearchClient, - savedObjectsClient, - }); - - return res.ok({ body: response }); - } catch (error: unknown) { - debug('Error while looking up HOST asset records', error); - - if (error instanceof AssetsValidationError) { - return res.customError({ - statusCode: error.statusCode, - body: { - message: `Error while looking up host asset records - ${error.message}`, - }, - }); - } - return res.customError({ - statusCode: 500, - body: { message: 'Error while looking up host asset records - ' + `${error}` }, - }); - } - } - ); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/index.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/index.ts deleted file mode 100644 index b82aa4c15e10f..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/index.ts +++ /dev/null @@ -1,70 +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 { createRouteValidationFunction } from '@kbn/io-ts-utils'; -import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import { GetAssetsQueryOptions, getAssetsQueryOptionsRT } from '../../../common/types_api'; -import { debug } from '../../../common/debug_log'; -import { SetupRouteOptions } from '../types'; -import * as routePaths from '../../../common/constants_routes'; -import { getClientsFromContext, validateStringAssetFilters } from '../utils'; -import { AssetsValidationError } from '../../lib/validators/validation_error'; - -export function assetsRoutes<T extends RequestHandlerContext>({ - router, - server, -}: SetupRouteOptions<T>) { - const validate = createRouteValidationFunction(getAssetsQueryOptionsRT); - router.get<unknown, GetAssetsQueryOptions, unknown>( - { - path: routePaths.GET_ASSETS, - validate: { - query: (q, res) => { - const [invalidResponse, validatedFilters] = validateStringAssetFilters(q, res); - if (invalidResponse) { - return invalidResponse; - } - if (validatedFilters) { - q.filters = validatedFilters; - } - return validate(q, res); - }, - }, - }, - async (context, req, res) => { - const { from = 'now-24h', to = 'now', filters } = req.query || {}; - const { elasticsearchClient, savedObjectsClient } = await getClientsFromContext(context); - - try { - const response = await server.assetClient.getAssets({ - from, - to, - filters, - elasticsearchClient, - savedObjectsClient, - }); - - return res.ok({ body: response }); - } catch (error: unknown) { - debug('Error while looking up asset records', error); - - if (error instanceof AssetsValidationError) { - return res.customError({ - statusCode: error.statusCode, - body: { - message: `Error while looking up asset records - ${error.message}`, - }, - }); - } - return res.customError({ - statusCode: 500, - body: { message: 'Error while looking up asset records - ' + `${error}` }, - }); - } - } - ); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/pods.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/pods.ts deleted file mode 100644 index b5ff387641763..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/pods.ts +++ /dev/null @@ -1,70 +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 { createRouteValidationFunction } from '@kbn/io-ts-utils'; -import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import { GetPodAssetsQueryOptions, getPodAssetsQueryOptionsRT } from '../../../common/types_api'; -import { debug } from '../../../common/debug_log'; -import { SetupRouteOptions } from '../types'; -import * as routePaths from '../../../common/constants_routes'; -import { getClientsFromContext, validateStringAssetFilters } from '../utils'; -import { AssetsValidationError } from '../../lib/validators/validation_error'; - -export function podsRoutes<T extends RequestHandlerContext>({ - router, - server, -}: SetupRouteOptions<T>) { - const validate = createRouteValidationFunction(getPodAssetsQueryOptionsRT); - router.get<unknown, GetPodAssetsQueryOptions, unknown>( - { - path: routePaths.GET_PODS, - validate: { - query: (q, res) => { - const [invalidResponse, validatedFilters] = validateStringAssetFilters(q, res); - if (invalidResponse) { - return invalidResponse; - } - if (validatedFilters) { - q.filters = validatedFilters; - } - return validate(q, res); - }, - }, - }, - async (context, req, res) => { - const { from = 'now-24h', to = 'now', filters } = req.query || {}; - const { elasticsearchClient, savedObjectsClient } = await getClientsFromContext(context); - - try { - const response = await server.assetClient.getPods({ - from, - to, - filters, - elasticsearchClient, - savedObjectsClient, - }); - - return res.ok({ body: response }); - } catch (error: unknown) { - debug('Error while looking up POD asset records', error); - - if (error instanceof AssetsValidationError) { - return res.customError({ - statusCode: error.statusCode, - body: { - message: `Error while looking up pod asset records - ${error.message}`, - }, - }); - } - return res.customError({ - statusCode: 500, - body: { message: 'Error while looking up pod asset records - ' + `${error}` }, - }); - } - } - ); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/services.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/services.ts deleted file mode 100644 index 667a9568cda1d..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/assets/services.ts +++ /dev/null @@ -1,74 +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 { createRouteValidationFunction } from '@kbn/io-ts-utils'; -import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import { - GetServiceAssetsQueryOptions, - getServiceAssetsQueryOptionsRT, -} from '../../../common/types_api'; -import { debug } from '../../../common/debug_log'; -import { SetupRouteOptions } from '../types'; -import * as routePaths from '../../../common/constants_routes'; -import { getClientsFromContext, validateStringAssetFilters } from '../utils'; -import { AssetsValidationError } from '../../lib/validators/validation_error'; - -export function servicesRoutes<T extends RequestHandlerContext>({ - router, - server, -}: SetupRouteOptions<T>) { - const validate = createRouteValidationFunction(getServiceAssetsQueryOptionsRT); - // GET /assets/services - router.get<unknown, GetServiceAssetsQueryOptions, unknown>( - { - path: routePaths.GET_SERVICES, - validate: { - query: (q, res) => { - const [invalidResponse, validatedFilters] = validateStringAssetFilters(q, res); - if (invalidResponse) { - return invalidResponse; - } - if (validatedFilters) { - q.filters = validatedFilters; - } - return validate(q, res); - }, - }, - }, - async (context, req, res) => { - const { from = 'now-24h', to = 'now', filters } = req.query || {}; - const { elasticsearchClient, savedObjectsClient } = await getClientsFromContext(context); - try { - const response = await server.assetClient.getServices({ - from, - to, - filters, - elasticsearchClient, - savedObjectsClient, - }); - - return res.ok({ body: response }); - } catch (error: unknown) { - debug('Error while looking up SERVICE asset records', error); - - if (error instanceof AssetsValidationError) { - return res.customError({ - statusCode: error.statusCode, - body: { - message: `Error while looking up service asset records - ${error.message}`, - }, - }); - } - - return res.customError({ - statusCode: 500, - body: { message: 'Error while looking up service asset records - ' + `${error}` }, - }); - } - } - ); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts deleted file mode 100644 index 447051bbb2730..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/sample_assets.ts +++ /dev/null @@ -1,143 +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 { schema } from '@kbn/config-schema'; -import { RequestHandlerContext } from '@kbn/core/server'; -import { ASSET_MANAGER_API_BASE } from '../../common/constants_routes'; -import { getSampleAssetDocs, sampleAssets } from '../lib/sample_assets'; -import { writeAssets } from '../lib/write_assets'; -import { SetupRouteOptions } from './types'; -import { getClientsFromContext } from './utils'; - -export type WriteSamplesPostBody = { - baseDateTime?: string | number; - excludeEans?: string[]; - refresh?: boolean | 'wait_for'; -} | null; - -export function sampleAssetsRoutes<T extends RequestHandlerContext>({ - router, -}: SetupRouteOptions<T>) { - const SAMPLE_ASSETS_API_PATH = `${ASSET_MANAGER_API_BASE}/assets/sample`; - - // GET sample assets - router.get<unknown, unknown, unknown>( - { - path: SAMPLE_ASSETS_API_PATH, - validate: {}, - }, - async (context, req, res) => { - return res.ok({ body: { results: sampleAssets } }); - } - ); - - // POST sample assets - router.post<unknown, unknown, WriteSamplesPostBody>( - { - path: SAMPLE_ASSETS_API_PATH, - validate: { - body: schema.nullable( - schema.object({ - baseDateTime: schema.maybe( - schema.oneOf<string, number>([schema.string(), schema.number()]) - ), - excludeEans: schema.maybe(schema.arrayOf(schema.string())), - refresh: schema.maybe(schema.oneOf([schema.boolean(), schema.literal('wait_for')])), - }) - ), - }, - }, - async (context, req, res) => { - const { baseDateTime, excludeEans, refresh } = req.body || {}; - const parsed = baseDateTime === undefined ? undefined : new Date(baseDateTime); - if (parsed?.toString() === 'Invalid Date') { - return res.customError({ - statusCode: 400, - body: { - message: `${baseDateTime} is not a valid date time value`, - }, - }); - } - const { elasticsearchClient } = await getClientsFromContext(context); - const assetDocs = getSampleAssetDocs({ baseDateTime: parsed, excludeEans }); - - try { - const response = await writeAssets({ - elasticsearchClient, - assetDocs, - namespace: 'sample_data', - refresh, - }); - - if (response.errors) { - return res.customError({ - statusCode: 500, - body: { - message: JSON.stringify(response.errors), - }, - }); - } - - return res.ok({ body: response }); - } catch (error: any) { - return res.customError({ - statusCode: 500, - body: { - message: error.message || 'unknown error occurred while creating sample assets', - }, - }); - } - } - ); - - // DELETE all sample assets - router.delete( - { - path: SAMPLE_ASSETS_API_PATH, - validate: {}, - }, - async (context, req, res) => { - const { elasticsearchClient } = await getClientsFromContext(context); - - const sampleDataStreams = await elasticsearchClient.indices.getDataStream({ - name: 'assets-*-sample_data', - expand_wildcards: 'all', - }); - - const deletedDataStreams: string[] = []; - let errorWhileDeleting: string | null = null; - const dataStreamsToDelete = sampleDataStreams.data_streams.map((ds) => ds.name); - - for (let i = 0; i < dataStreamsToDelete.length; i++) { - const dsName = dataStreamsToDelete[i]; - try { - await elasticsearchClient.indices.deleteDataStream({ name: dsName }); - deletedDataStreams.push(dsName); - } catch (error: any) { - errorWhileDeleting = - typeof error.message === 'string' - ? error.message - : `Unknown error occurred while deleting sample data streams, at data stream name: ${dsName}`; - break; - } - } - - if (!errorWhileDeleting && deletedDataStreams.length === dataStreamsToDelete.length) { - return res.ok({ body: { deleted: deletedDataStreams } }); - } else { - return res.custom({ - statusCode: 500, - body: { - message: ['Not all found data streams were deleted', errorWhileDeleting].join(' - '), - deleted: deletedDataStreams, - matching: dataStreamsToDelete, - }, - }); - } - } - ); -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/utils.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/utils.ts deleted file mode 100644 index 3eb2a855e4854..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/utils.ts +++ /dev/null @@ -1,46 +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 { - RequestHandlerContext, - RouteValidationError, - RouteValidationResultFactory, -} from '@kbn/core/server'; -import { AssetFilters, assetFiltersSingleKindRT } from '../../common/types_api'; - -export async function getClientsFromContext<T extends RequestHandlerContext>(context: T) { - const coreContext = await context.core; - - return { - coreContext, - elasticsearchClient: coreContext.elasticsearch.client.asCurrentUser, - savedObjectsClient: coreContext.savedObjects.client, - }; -} - -type ValidateStringAssetFiltersReturn = - | [{ error: RouteValidationError }] - | [null, AssetFilters | undefined]; - -export function validateStringAssetFilters( - q: any, - res: RouteValidationResultFactory -): ValidateStringAssetFiltersReturn { - if (typeof q.stringFilters === 'string') { - try { - const parsedFilters = JSON.parse(q.stringFilters); - if (assetFiltersSingleKindRT.is(parsedFilters)) { - return [null, parsedFilters]; - } else { - return [res.badRequest(new Error(`Invalid asset filters - ${q.filters}`))]; - } - } catch (err: any) { - return [res.badRequest(err)]; - } - } - return [null, undefined]; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/assets_template.ts b/x-pack/plugins/observability_solution/asset_manager/server/templates/assets_template.ts deleted file mode 100644 index b99ecc4559187..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/templates/assets_template.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IndicesPutIndexTemplateRequest } from '@elastic/elasticsearch/lib/api/types'; -import { ASSETS_INDEX_PREFIX } from '../constants'; - -export const assetsIndexTemplateConfig: IndicesPutIndexTemplateRequest = { - name: 'assets', - priority: 100, - data_stream: {}, - index_patterns: [`${ASSETS_INDEX_PREFIX}*`], - template: { - settings: {}, - mappings: { - dynamic_templates: [ - { - strings_as_keywords: { - mapping: { - ignore_above: 1024, - type: 'keyword', - }, - match_mapping_type: 'string', - }, - }, - ], - properties: { - '@timestamp': { - type: 'date', - }, - asset: { - type: 'object', - // subobjects appears to not exist in the types, but is a valid ES mapping option - // see: https://www.elastic.co/guide/en/elasticsearch/reference/master/subobjects.html - // @ts-ignore - subobjects: false, - }, - }, - }, - }, -}; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/test_utils.ts b/x-pack/plugins/observability_solution/asset_manager/server/test_utils.ts deleted file mode 100644 index 8e07f201b1599..0000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/test_utils.ts +++ /dev/null @@ -1,46 +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. - */ - -// Helper function allows test to verify error was thrown, -// verify error is of the right class type, and error has - -import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import { GetApmIndicesMethod } from './lib/asset_client_types'; -import { AssetsValidationError } from './lib/validators/validation_error'; - -// the expected metadata such as statusCode on it -export function expectToThrowValidationErrorWithStatusCode( - testFn: () => Promise<any>, - expectedError: Partial<AssetsValidationError> = {} -) { - return expect(async () => { - try { - return await testFn(); - } catch (error: any) { - if (error instanceof AssetsValidationError) { - if (expectedError.statusCode) { - expect(error.statusCode).toEqual(expectedError.statusCode); - } - if (expectedError.message) { - expect(error.message).toEqual(expect.stringContaining(expectedError.message)); - } - } - throw error; - } - }).rejects.toThrow(AssetsValidationError); -} - -export function createGetApmIndicesMock(): jest.Mocked<GetApmIndicesMethod> { - return jest.fn(async (client: SavedObjectsClientContract) => ({ - transaction: 'apm-mock-transaction-indices', - span: 'apm-mock-span-indices', - error: 'apm-mock-error-indices', - metric: 'apm-mock-metric-indices', - onboarding: 'apm-mock-onboarding-indices', - sourcemap: 'apm-mock-sourcemap-indices', - })); -} diff --git a/x-pack/plugins/observability_solution/entity_manager/README.md b/x-pack/plugins/observability_solution/entity_manager/README.md new file mode 100644 index 0000000000000..325bea1b583e8 --- /dev/null +++ b/x-pack/plugins/observability_solution/entity_manager/README.md @@ -0,0 +1,3 @@ +# Entity Manager Plugin + +This plugin provides access to observed asset data, such as information about hosts, pods, containers, services, and more. \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/entity_manager/common/config.ts b/x-pack/plugins/observability_solution/entity_manager/common/config.ts new file mode 100644 index 0000000000000..5c1edfa618626 --- /dev/null +++ b/x-pack/plugins/observability_solution/entity_manager/common/config.ts @@ -0,0 +1,30 @@ +/* + * 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 { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({}); + +export type EntityManagerConfig = TypeOf<typeof configSchema>; + +/** + * The following map is passed to the server plugin setup under the + * exposeToBrowser: option, and controls which of the above config + * keys are allow-listed to be available in the browser config. + * + * NOTE: anything exposed here will be visible in the UI dev tools, + * and therefore MUST NOT be anything that is sensitive information! + */ +export const exposeToBrowserConfig = {} as const; + +type ValidKeys = keyof { + [K in keyof typeof exposeToBrowserConfig as typeof exposeToBrowserConfig[K] extends true + ? K + : never]: true; +}; + +export type EntityManagerPublicConfig = Pick<EntityManagerConfig, ValidKeys>; diff --git a/x-pack/plugins/observability_solution/asset_manager/common/constants_entities.ts b/x-pack/plugins/observability_solution/entity_manager/common/constants_entities.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/common/constants_entities.ts rename to x-pack/plugins/observability_solution/entity_manager/common/constants_entities.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/common/debug_log.ts b/x-pack/plugins/observability_solution/entity_manager/common/debug_log.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/common/debug_log.ts rename to x-pack/plugins/observability_solution/entity_manager/common/debug_log.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/common/errors.ts b/x-pack/plugins/observability_solution/entity_manager/common/errors.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/common/errors.ts rename to x-pack/plugins/observability_solution/entity_manager/common/errors.ts diff --git a/x-pack/plugins/observability_solution/entity_manager/common/types_api.ts b/x-pack/plugins/observability_solution/entity_manager/common/types_api.ts new file mode 100644 index 0000000000000..90540ab06a243 --- /dev/null +++ b/x-pack/plugins/observability_solution/entity_manager/common/types_api.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as rt from 'io-ts'; + +/** + * Managed entities enablement + */ +export const managedEntityEnabledResponseRT = rt.type({ + enabled: rt.boolean, + reason: rt.string, +}); +export type ManagedEntityEnabledResponse = rt.TypeOf<typeof managedEntityEnabledResponseRT>; + +export const managedEntityResponseBase = rt.type({ + success: rt.boolean, + reason: rt.string, + message: rt.string, +}); +export type EnableManagedEntityResponse = rt.TypeOf<typeof managedEntityResponseBase>; +export type DisableManagedEntityResponse = rt.TypeOf<typeof managedEntityResponseBase>; diff --git a/x-pack/plugins/observability_solution/asset_manager/docs/entity_definitions.md b/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/docs/entity_definitions.md rename to x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md diff --git a/x-pack/plugins/observability_solution/asset_manager/jest.config.js b/x-pack/plugins/observability_solution/entity_manager/jest.config.js similarity index 68% rename from x-pack/plugins/observability_solution/asset_manager/jest.config.js rename to x-pack/plugins/observability_solution/entity_manager/jest.config.js index 3f091dd5109b3..29fb7c37260fb 100644 --- a/x-pack/plugins/observability_solution/asset_manager/jest.config.js +++ b/x-pack/plugins/observability_solution/entity_manager/jest.config.js @@ -8,11 +8,11 @@ module.exports = { preset: '@kbn/test', rootDir: '../../../..', - roots: ['<rootDir>/x-pack/plugins/observability_solution/asset_manager'], + roots: ['<rootDir>/x-pack/plugins/observability_solution/entity_manager'], coverageDirectory: - '<rootDir>/target/kibana-coverage/jest/x-pack/plugins/observability_solution/asset_manager', + '<rootDir>/target/kibana-coverage/jest/x-pack/plugins/observability_solution/entity_manager', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '<rootDir>/x-pack/plugins/observability_solution/asset_manager/{common,public,server}/**/*.{js,ts,tsx}', + '<rootDir>/x-pack/plugins/observability_solution/entity_manager/{common,public,server}/**/*.{js,ts,tsx}', ], }; diff --git a/x-pack/plugins/observability_solution/asset_manager/kibana.jsonc b/x-pack/plugins/observability_solution/entity_manager/kibana.jsonc similarity index 59% rename from x-pack/plugins/observability_solution/asset_manager/kibana.jsonc rename to x-pack/plugins/observability_solution/entity_manager/kibana.jsonc index d4c7703deb6eb..b13c51630469e 100644 --- a/x-pack/plugins/observability_solution/asset_manager/kibana.jsonc +++ b/x-pack/plugins/observability_solution/entity_manager/kibana.jsonc @@ -1,20 +1,18 @@ { "type": "plugin", - "id": "@kbn/assetManager-plugin", + "id": "@kbn/entityManager-plugin", "owner": "@elastic/obs-knowledge-team", - "description": "Asset manager plugin for entity assets (inventory, topology, etc)", + "description": "Entity manager plugin for entity assets (inventory, topology, etc)", "plugin": { - "id": "assetManager", + "id": "entityManager", "configPath": [ "xpack", - "assetManager" + "entityManager" ], "optionalPlugins": [ "spaces" ], "requiredPlugins": [ - "apmDataAccess", - "metricsDataAccess", "security", "encryptedSavedObjects", ], diff --git a/x-pack/plugins/observability_solution/asset_manager/public/index.ts b/x-pack/plugins/observability_solution/entity_manager/public/index.ts similarity index 61% rename from x-pack/plugins/observability_solution/asset_manager/public/index.ts rename to x-pack/plugins/observability_solution/entity_manager/public/index.ts index 7837c00909430..e17edb959595d 100644 --- a/x-pack/plugins/observability_solution/asset_manager/public/index.ts +++ b/x-pack/plugins/observability_solution/entity_manager/public/index.ts @@ -7,14 +7,14 @@ import { PluginInitializer, PluginInitializerContext } from '@kbn/core/public'; import { Plugin } from './plugin'; -import { AssetManagerPublicPluginSetup, AssetManagerPublicPluginStart } from './types'; +import { EntityManagerPublicPluginSetup, EntityManagerPublicPluginStart } from './types'; export const plugin: PluginInitializer< - AssetManagerPublicPluginSetup | undefined, - AssetManagerPublicPluginStart | undefined + EntityManagerPublicPluginSetup | undefined, + EntityManagerPublicPluginStart | undefined > = (context: PluginInitializerContext) => { return new Plugin(context); }; -export type { AssetManagerPublicPluginSetup, AssetManagerPublicPluginStart }; -export type AssetManagerAppId = 'assetManager'; +export type { EntityManagerPublicPluginSetup, EntityManagerPublicPluginStart }; +export type EntityManagerAppId = 'entityManager'; diff --git a/x-pack/plugins/observability_solution/asset_manager/public/lib/entity_client.ts b/x-pack/plugins/observability_solution/entity_manager/public/lib/entity_client.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/public/lib/entity_client.ts rename to x-pack/plugins/observability_solution/entity_manager/public/lib/entity_client.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/public/plugin.ts b/x-pack/plugins/observability_solution/entity_manager/public/plugin.ts similarity index 51% rename from x-pack/plugins/observability_solution/asset_manager/public/plugin.ts rename to x-pack/plugins/observability_solution/entity_manager/public/plugin.ts index 8c3dd9115c1ef..0de83b4252b62 100644 --- a/x-pack/plugins/observability_solution/asset_manager/public/plugin.ts +++ b/x-pack/plugins/observability_solution/entity_manager/public/plugin.ts @@ -8,13 +8,12 @@ import { CoreSetup, CoreStart, PluginInitializerContext } from '@kbn/core/public'; import { Logger } from '@kbn/logging'; -import { AssetManagerPluginClass } from './types'; -import { PublicAssetsClient } from './lib/public_assets_client'; -import type { AssetManagerPublicConfig } from '../common/config'; +import { EntityManagerPluginClass } from './types'; +import type { EntityManagerPublicConfig } from '../common/config'; import { EntityClient } from './lib/entity_client'; -export class Plugin implements AssetManagerPluginClass { - public config: AssetManagerPublicConfig; +export class Plugin implements EntityManagerPluginClass { + public config: EntityManagerPublicConfig; public logger: Logger; constructor(context: PluginInitializerContext<{}>) { @@ -23,32 +22,15 @@ export class Plugin implements AssetManagerPluginClass { } setup(core: CoreSetup) { - // Check for config value and bail out if not "alpha-enabled" - if (!this.config.alphaEnabled) { - this.logger.debug('Public is NOT enabled'); - return; - } - - this.logger.debug('Public is enabled'); - - const publicAssetsClient = new PublicAssetsClient(core.http); const entityClient = new EntityClient(core.http); return { - publicAssetsClient, entityClient, }; } start(core: CoreStart) { - // Check for config value and bail out if not "alpha-enabled" - if (!this.config.alphaEnabled) { - return; - } - - const publicAssetsClient = new PublicAssetsClient(core.http); const entityClient = new EntityClient(core.http); return { - publicAssetsClient, entityClient, }; } diff --git a/x-pack/plugins/observability_solution/asset_manager/public/types.ts b/x-pack/plugins/observability_solution/entity_manager/public/types.ts similarity index 59% rename from x-pack/plugins/observability_solution/asset_manager/public/types.ts rename to x-pack/plugins/observability_solution/entity_manager/public/types.ts index 8a89793e361d9..5c7ab11058d4d 100644 --- a/x-pack/plugins/observability_solution/asset_manager/public/types.ts +++ b/x-pack/plugins/observability_solution/entity_manager/public/types.ts @@ -5,33 +5,25 @@ * 2.0. */ import type { Plugin as PluginClass } from '@kbn/core/public'; -import { GetHostsOptionsPublic } from '../common/types_client'; import { DisableManagedEntityResponse, EnableManagedEntityResponse, - GetHostAssetsResponse, ManagedEntityEnabledResponse, } from '../common/types_api'; -export interface AssetManagerPublicPluginSetup { - publicAssetsClient: IPublicAssetsClient; +export interface EntityManagerPublicPluginSetup { entityClient: IEntityClient; } -export interface AssetManagerPublicPluginStart { - publicAssetsClient: IPublicAssetsClient; +export interface EntityManagerPublicPluginStart { entityClient: IEntityClient; } -export type AssetManagerPluginClass = PluginClass< - AssetManagerPublicPluginSetup | undefined, - AssetManagerPublicPluginStart | undefined +export type EntityManagerPluginClass = PluginClass< + EntityManagerPublicPluginSetup | undefined, + EntityManagerPublicPluginStart | undefined >; -export interface IPublicAssetsClient { - getHosts: (options: GetHostsOptionsPublic) => Promise<GetHostAssetsResponse>; -} - export interface IEntityClient { isManagedEntityDiscoveryEnabled: () => Promise<ManagedEntityEnabledResponse>; enableManagedEntityDiscovery: () => Promise<EnableManagedEntityResponse>; diff --git a/x-pack/plugins/observability_solution/entity_manager/server/index.ts b/x-pack/plugins/observability_solution/entity_manager/server/index.ts new file mode 100644 index 0000000000000..172b22b588f58 --- /dev/null +++ b/x-pack/plugins/observability_solution/entity_manager/server/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext } from '@kbn/core-plugins-server'; +import { EntityManagerConfig } from '../common/config'; +import { EntityManagerServerPluginSetup, EntityManagerServerPluginStart, config } from './plugin'; + +export type { EntityManagerConfig, EntityManagerServerPluginSetup, EntityManagerServerPluginStart }; +export { config }; + +export const plugin = async (context: PluginInitializerContext<EntityManagerConfig>) => { + const { EntityManagerServerPlugin } = await import('./plugin'); + return new EntityManagerServerPlugin(context); +}; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts similarity index 92% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts index ecd73b643176e..5d48ff6e36f0d 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/api_key.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/api_key.ts @@ -7,7 +7,7 @@ import { KibanaRequest } from '@kbn/core-http-server'; import { getFakeKibanaRequest } from '@kbn/security-plugin/server/authentication/api_keys/fake_kibana_request'; -import { AssetManagerServerSetup } from '../../../types'; +import { EntityManagerServerSetup } from '../../../types'; import { canRunEntityDiscovery, requiredRunTimePrivileges } from '../privileges'; export interface EntityDiscoveryAPIKey { @@ -17,13 +17,13 @@ export interface EntityDiscoveryAPIKey { } export const checkIfAPIKeysAreEnabled = async ( - server: AssetManagerServerSetup + server: EntityManagerServerSetup ): Promise<boolean> => { return await server.security.authc.apiKeys.areAPIKeysEnabled(); }; export const checkIfEntityDiscoveryAPIKeyIsValid = async ( - server: AssetManagerServerSetup, + server: EntityManagerServerSetup, apiKey: EntityDiscoveryAPIKey ): Promise<boolean> => { server.logger.debug('validating API key against authentication service'); @@ -49,7 +49,7 @@ export const checkIfEntityDiscoveryAPIKeyIsValid = async ( }; export const generateEntityDiscoveryAPIKey = async ( - server: AssetManagerServerSetup, + server: EntityManagerServerSetup, req: KibanaRequest ): Promise<EntityDiscoveryAPIKey | undefined> => { const apiKey = await server.security.authc.apiKeys.grantAsInternalUser(req, { diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/saved_object.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/saved_object.ts similarity index 87% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/saved_object.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/saved_object.ts index 481efc60721a6..5bd5004f1b9bc 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/api_key/saved_object.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/api_key/saved_object.ts @@ -7,18 +7,18 @@ import { SavedObjectsErrorHelpers, SavedObjectsClientContract } from '@kbn/core/server'; import { EntityDiscoveryApiKeyType } from '../../../saved_objects'; -import { AssetManagerServerSetup } from '../../../types'; +import { EntityManagerServerSetup } from '../../../types'; import { EntityDiscoveryAPIKey } from './api_key'; const ENTITY_DISCOVERY_API_KEY_SO_ID = '19540C97-E35C-485B-8566-FB86EC8455E4'; -const getEncryptedSOClient = (server: AssetManagerServerSetup) => { +const getEncryptedSOClient = (server: EntityManagerServerSetup) => { return server.encryptedSavedObjects.getClient({ includedHiddenTypes: [EntityDiscoveryApiKeyType.name], }); }; -export const readEntityDiscoveryAPIKey = async (server: AssetManagerServerSetup) => { +export const readEntityDiscoveryAPIKey = async (server: EntityManagerServerSetup) => { try { const soClient = getEncryptedSOClient(server); const obj = await soClient.getDecryptedAsInternalUser<EntityDiscoveryAPIKey>( diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/index.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/auth/index.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/auth/index.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/auth/privileges.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/privileges.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/auth/privileges.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/auth/privileges.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/built_in/constants.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/constants.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/built_in/constants.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/constants.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/built_in/index.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/built_in/index.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/index.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/built_in/services.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/built_in/services.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/create_and_install_ingest_pipeline.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/create_and_install_ingest_pipeline.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_transform.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/create_and_install_transform.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_transform.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/create_and_install_transform.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/delete_entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/delete_entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/delete_index.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/delete_index.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_ingest_pipeline.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/delete_ingest_pipeline.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_ingest_pipeline.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/delete_ingest_pipeline.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_id_conflict_error.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/entity_id_conflict_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_id_conflict_error.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/entity_id_conflict_error.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_not_found.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/entity_not_found.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_not_found.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/entity_not_found.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/entity_security_exception.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/entity_security_exception.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/invalid_transform_error.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/invalid_transform_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/invalid_transform_error.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/errors/invalid_transform_error.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/find_entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/find_entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/find_entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/find_entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/fixtures/entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/fixtures/entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/fixtures/entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/fixtures/entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/generate_index_name.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/generate_index_name.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/generate_index_name.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/generate_index_name.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/get_elasticsearch_query_or_throw.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/get_elasticsearch_query_or_throw.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/get_elasticsearch_query_or_throw.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/get_elasticsearch_query_or_throw.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/retry.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/retry.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/retry.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/retry.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/install_entity_definition.test.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/install_entity_definition.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/install_entity_definition.test.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/install_entity_definition.test.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/install_entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/install_entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/install_entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/install_entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/read_entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/read_entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/read_entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/read_entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/save_entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/save_entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/save_entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/save_entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/start_transform.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/start_transform.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/start_transform.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/start_transform.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/stop_and_delete_transform.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/stop_and_delete_transform.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/stop_and_delete_transform.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/stop_and_delete_transform.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.test.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_history_transform.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.test.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_history_transform.test.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_history_transform.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_history_transform.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform_id.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_history_transform_id.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform_id.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_history_transform_id.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.test.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_latest_transform.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.test.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_latest_transform.test.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_latest_transform.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_latest_transform.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform_id.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_latest_transform_id.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform_id.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_latest_transform_id.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metadata_aggregations.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_metadata_aggregations.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metadata_aggregations.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_metadata_aggregations.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metric_aggregations.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_metric_aggregations.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metric_aggregations.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/transform/generate_metric_aggregations.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/uninstall_entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/uninstall_entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/uninstall_entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/entities/uninstall_entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/errors.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/errors.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/errors.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/errors.ts diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/manage_index_templates.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/manage_index_templates.ts new file mode 100644 index 0000000000000..f3591d82e0d25 --- /dev/null +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/manage_index_templates.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ClusterPutComponentTemplateRequest, + IndicesPutIndexTemplateRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import { ElasticsearchClient, Logger } from '@kbn/core/server'; + +interface TemplateManagementOptions { + esClient: ElasticsearchClient; + template: IndicesPutIndexTemplateRequest; + logger: Logger; +} + +interface ComponentManagementOptions { + esClient: ElasticsearchClient; + component: ClusterPutComponentTemplateRequest; + logger: Logger; +} + +export async function upsertTemplate({ esClient, template, logger }: TemplateManagementOptions) { + try { + await esClient.indices.putIndexTemplate(template); + } catch (error: any) { + logger.error(`Error updating entity manager index template: ${error.message}`); + return; + } + + logger.info( + `Entity manager index template is up to date (use debug logging to see what was installed)` + ); + logger.debug(`Entity manager index template: ${JSON.stringify(template)}`); +} + +export async function upsertComponent({ esClient, component, logger }: ComponentManagementOptions) { + try { + await esClient.cluster.putComponentTemplate(component); + } catch (error: any) { + logger.error(`Error updating entity manager component template: ${error.message}`); + return; + } + + logger.info( + `Entity manager component template is up to date (use debug logging to see what was installed)` + ); + logger.debug(`Entity manager component template: ${JSON.stringify(component)}`); +} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/utils.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/utils.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/utils.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/utils.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/validators/validate_date_range.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/validators/validate_date_range.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/validators/validate_date_range.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/validators/validate_date_range.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/validators/validation_error.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/validators/validation_error.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/validators/validation_error.ts rename to x-pack/plugins/observability_solution/entity_manager/server/lib/validators/validation_error.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/plugin.ts b/x-pack/plugins/observability_solution/entity_manager/server/plugin.ts similarity index 58% rename from x-pack/plugins/observability_solution/asset_manager/server/plugin.ts rename to x-pack/plugins/observability_solution/entity_manager/server/plugin.ts index 46cfa228fde1a..e71f5b36bb468 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/plugin.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/plugin.ts @@ -16,55 +16,45 @@ import { } from '@kbn/core/server'; import { upsertComponent, upsertTemplate } from './lib/manage_index_templates'; import { setupRoutes } from './routes'; -import { assetsIndexTemplateConfig } from './templates/assets_template'; -import { AssetClient } from './lib/asset_client'; import { - AssetManagerPluginSetupDependencies, - AssetManagerPluginStartDependencies, - AssetManagerServerSetup, + EntityManagerPluginSetupDependencies, + EntityManagerPluginStartDependencies, + EntityManagerServerSetup, } from './types'; -import { AssetManagerConfig, configSchema, exposeToBrowserConfig } from '../common/config'; +import { EntityManagerConfig, configSchema, exposeToBrowserConfig } from '../common/config'; import { entitiesBaseComponentTemplateConfig } from './templates/components/base'; import { entitiesEventComponentTemplateConfig } from './templates/components/event'; import { entitiesIndexTemplateConfig } from './templates/entities_template'; import { entityDefinition, EntityDiscoveryApiKeyType } from './saved_objects'; import { entitiesEntityComponentTemplateConfig } from './templates/components/entity'; -export type AssetManagerServerPluginSetup = ReturnType<AssetManagerServerPlugin['setup']>; -export type AssetManagerServerPluginStart = ReturnType<AssetManagerServerPlugin['start']>; +export type EntityManagerServerPluginSetup = ReturnType<EntityManagerServerPlugin['setup']>; +export type EntityManagerServerPluginStart = ReturnType<EntityManagerServerPlugin['start']>; -export const config: PluginConfigDescriptor<AssetManagerConfig> = { +export const config: PluginConfigDescriptor<EntityManagerConfig> = { schema: configSchema, exposeToBrowser: exposeToBrowserConfig, }; -export class AssetManagerServerPlugin +export class EntityManagerServerPlugin implements Plugin< - AssetManagerServerPluginSetup, - AssetManagerServerPluginStart, - AssetManagerPluginSetupDependencies, - AssetManagerPluginStartDependencies + EntityManagerServerPluginSetup, + EntityManagerServerPluginStart, + EntityManagerPluginSetupDependencies, + EntityManagerPluginStartDependencies > { - public config: AssetManagerConfig; + public config: EntityManagerConfig; public logger: Logger; - public server?: AssetManagerServerSetup; + public server?: EntityManagerServerSetup; - constructor(context: PluginInitializerContext<AssetManagerConfig>) { + constructor(context: PluginInitializerContext<EntityManagerConfig>) { this.config = context.config.get(); this.logger = context.logger.get(); } - public setup(core: CoreSetup, plugins: AssetManagerPluginSetupDependencies) { - // Check for config value and bail out if not "alpha-enabled" - if (!this.config.alphaEnabled) { - this.logger.info('Server is NOT enabled'); - return; - } - - this.logger.info('Server is enabled'); - + public setup(core: CoreSetup, plugins: EntityManagerPluginSetupDependencies) { core.savedObjects.registerType(entityDefinition); core.savedObjects.registerType(EntityDiscoveryApiKeyType); plugins.encryptedSavedObjects.registerType({ @@ -73,38 +63,24 @@ export class AssetManagerServerPlugin attributesToIncludeInAAD: new Set(['id', 'name']), }); - const assetClient = new AssetClient({ - sourceIndices: this.config.sourceIndices, - getApmIndices: plugins.apmDataAccess.getApmIndices, - metricsClient: plugins.metricsDataAccess.client, - }); - const router = core.http.createRouter(); this.server = { config: this.config, logger: this.logger, - } as AssetManagerServerSetup; + } as EntityManagerServerSetup; setupRoutes<RequestHandlerContext>({ router, - assetClient, logger: this.logger, spaces: plugins.spaces, server: this.server, }); - return { - assetClient, - }; + return {}; } - public start(core: CoreStart, plugins: AssetManagerPluginStartDependencies) { - // Check for config value and bail out if not "alpha-enabled" - if (!this.config.alphaEnabled) { - return; - } - + public start(core: CoreStart, plugins: EntityManagerPluginStartDependencies) { if (this.server) { this.server.core = core; this.server.isServerless = core.elasticsearch.getCapabilities().serverless; @@ -113,13 +89,8 @@ export class AssetManagerServerPlugin } const esClient = core.elasticsearch.client.asInternalUser; - upsertTemplate({ - esClient, - template: assetsIndexTemplateConfig, - logger: this.logger, - }).catch(() => {}); // it shouldn't reject, but just in case - // Install entities compoent templates and index template + // Install entities component templates and index template Promise.all([ upsertComponent({ esClient, diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/check.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/check.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/check.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/check.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/disable.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/disable.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/disable.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/enable.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/enablement/enable.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/enablement/enable.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/entities/create.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/entities/create.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/entities/delete.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/entities/delete.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/get.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/entities/get.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/entities/get.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/entities/get.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/entities/reset.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/entities/reset.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/index.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/index.ts similarity index 72% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/index.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/index.ts index 67e6df7dff41b..1ee71ebd197df 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/index.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/routes/index.ts @@ -8,12 +8,6 @@ import { RequestHandlerContext } from '@kbn/core/server'; import { SetupRouteOptions } from './types'; import { pingRoute } from './ping'; -import { sampleAssetsRoutes } from './sample_assets'; -import { assetsRoutes } from './assets'; -import { hostsRoutes } from './assets/hosts'; -import { servicesRoutes } from './assets/services'; -import { containersRoutes } from './assets/containers'; -import { podsRoutes } from './assets/pods'; import { createEntityDefinitionRoute } from './entities/create'; import { deleteEntityDefinitionRoute } from './entities/delete'; import { resetEntityDefinitionRoute } from './entities/reset'; @@ -24,12 +18,6 @@ import { disableEntityDiscoveryRoute } from './enablement/disable'; export function setupRoutes<T extends RequestHandlerContext>(dependencies: SetupRouteOptions<T>) { pingRoute<T>(dependencies); - sampleAssetsRoutes<T>(dependencies); - assetsRoutes<T>(dependencies); - hostsRoutes<T>(dependencies); - servicesRoutes<T>(dependencies); - containersRoutes<T>(dependencies); - podsRoutes<T>(dependencies); createEntityDefinitionRoute<T>(dependencies); deleteEntityDefinitionRoute<T>(dependencies); resetEntityDefinitionRoute<T>(dependencies); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/ping.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/ping.ts similarity index 79% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/ping.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/ping.ts index 3d7a20b5fd476..c5f6f65a49a52 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/ping.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/routes/ping.ts @@ -6,18 +6,18 @@ */ import { RequestHandlerContextBase } from '@kbn/core-http-server'; -import { ASSET_MANAGER_API_BASE } from '../../common/constants_routes'; +import { ENTITY_API_PREFIX } from '../../common/constants_entities'; import { SetupRouteOptions } from './types'; export function pingRoute<T extends RequestHandlerContextBase>({ router }: SetupRouteOptions<T>) { router.get( { - path: `${ASSET_MANAGER_API_BASE}/ping`, + path: `${ENTITY_API_PREFIX}/ping`, validate: false, }, async (_context, _req, res) => { return res.ok({ - body: { message: 'Asset Manager OK' }, + body: { message: 'Entity Manager OK' }, headers: { 'content-type': 'application/json' }, }); } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/types.ts b/x-pack/plugins/observability_solution/entity_manager/server/routes/types.ts similarity index 77% rename from x-pack/plugins/observability_solution/asset_manager/server/routes/types.ts rename to x-pack/plugins/observability_solution/entity_manager/server/routes/types.ts index 72cb202de2af3..e5c11777a57de 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/types.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/routes/types.ts @@ -8,13 +8,11 @@ import { IRouter, RequestHandlerContextBase } from '@kbn/core-http-server'; import { Logger } from '@kbn/core/server'; import { SpacesPluginSetup } from '@kbn/spaces-plugin/server'; -import { AssetClient } from '../lib/asset_client'; -import { AssetManagerServerSetup } from '../types'; +import { EntityManagerServerSetup } from '../types'; export interface SetupRouteOptions<T extends RequestHandlerContextBase> { router: IRouter<T>; - server: AssetManagerServerSetup; - assetClient: AssetClient; + server: EntityManagerServerSetup; logger: Logger; spaces?: SpacesPluginSetup; } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_definition.ts b/x-pack/plugins/observability_solution/entity_manager/server/saved_objects/entity_definition.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_definition.ts rename to x-pack/plugins/observability_solution/entity_manager/server/saved_objects/entity_definition.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_discovery_api_key.ts b/x-pack/plugins/observability_solution/entity_manager/server/saved_objects/entity_discovery_api_key.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_discovery_api_key.ts rename to x-pack/plugins/observability_solution/entity_manager/server/saved_objects/entity_discovery_api_key.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/index.ts b/x-pack/plugins/observability_solution/entity_manager/server/saved_objects/index.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/saved_objects/index.ts rename to x-pack/plugins/observability_solution/entity_manager/server/saved_objects/index.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/base.ts b/x-pack/plugins/observability_solution/entity_manager/server/templates/components/base.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/templates/components/base.ts rename to x-pack/plugins/observability_solution/entity_manager/server/templates/components/base.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts b/x-pack/plugins/observability_solution/entity_manager/server/templates/components/entity.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts rename to x-pack/plugins/observability_solution/entity_manager/server/templates/components/entity.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/event.ts b/x-pack/plugins/observability_solution/entity_manager/server/templates/components/event.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/templates/components/event.ts rename to x-pack/plugins/observability_solution/entity_manager/server/templates/components/event.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/entities_template.ts b/x-pack/plugins/observability_solution/entity_manager/server/templates/entities_template.ts similarity index 100% rename from x-pack/plugins/observability_solution/asset_manager/server/templates/entities_template.ts rename to x-pack/plugins/observability_solution/entity_manager/server/templates/entities_template.ts diff --git a/x-pack/plugins/observability_solution/asset_manager/server/types.ts b/x-pack/plugins/observability_solution/entity_manager/server/types.ts similarity index 61% rename from x-pack/plugins/observability_solution/asset_manager/server/types.ts rename to x-pack/plugins/observability_solution/entity_manager/server/types.ts index 9df0485f31291..505f44eccf3ff 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/types.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/types.ts @@ -6,25 +6,18 @@ */ import { CoreStart, ElasticsearchClient, Logger } from '@kbn/core/server'; -import { - ApmDataAccessPluginSetup, - ApmDataAccessPluginStart, -} from '@kbn/apm-data-access-plugin/server'; -import { MetricsDataPluginSetup } from '@kbn/metrics-data-access-plugin/server'; import { SecurityPluginStart } from '@kbn/security-plugin/server'; import { EncryptedSavedObjectsPluginSetup, EncryptedSavedObjectsPluginStart, } from '@kbn/encrypted-saved-objects-plugin/server'; import { SpacesPluginSetup } from '@kbn/spaces-plugin/server'; -import { AssetClient } from './lib/asset_client'; -import { AssetManagerConfig } from '../common/config'; +import { EntityManagerConfig } from '../common/config'; -export interface AssetManagerServerSetup { +export interface EntityManagerServerSetup { core: CoreStart; - config: AssetManagerConfig; + config: EntityManagerConfig; logger: Logger; - assetClient: AssetClient; security: SecurityPluginStart; encryptedSavedObjects: EncryptedSavedObjectsPluginStart; isServerless: boolean; @@ -34,14 +27,12 @@ export interface ElasticsearchAccessorOptions { elasticsearchClient: ElasticsearchClient; } -export interface AssetManagerPluginSetupDependencies { - apmDataAccess: ApmDataAccessPluginSetup; - metricsDataAccess: MetricsDataPluginSetup; +export interface EntityManagerPluginSetupDependencies { encryptedSavedObjects: EncryptedSavedObjectsPluginSetup; spaces?: SpacesPluginSetup; } -export interface AssetManagerPluginStartDependencies { - apmDataAccess: ApmDataAccessPluginStart; + +export interface EntityManagerPluginStartDependencies { security: SecurityPluginStart; encryptedSavedObjects: EncryptedSavedObjectsPluginStart; } diff --git a/x-pack/plugins/observability_solution/asset_manager/tsconfig.json b/x-pack/plugins/observability_solution/entity_manager/tsconfig.json similarity index 81% rename from x-pack/plugins/observability_solution/asset_manager/tsconfig.json rename to x-pack/plugins/observability_solution/entity_manager/tsconfig.json index c153938f4b33e..176494e26e600 100644 --- a/x-pack/plugins/observability_solution/asset_manager/tsconfig.json +++ b/x-pack/plugins/observability_solution/entity_manager/tsconfig.json @@ -17,13 +17,8 @@ "@kbn/config-schema", "@kbn/core-http-server", "@kbn/core-elasticsearch-client-server-mocks", - "@kbn/io-ts-utils", - "@kbn/core-http-request-handler-context-server", "@kbn/datemath", - "@kbn/apm-data-access-plugin", - "@kbn/core-http-browser-mocks", "@kbn/logging", - "@kbn/metrics-data-access-plugin", "@kbn/core-elasticsearch-server", "@kbn/core-saved-objects-api-server", "@kbn/core-saved-objects-api-server-mocks", diff --git a/x-pack/test/api_integration/apis/asset_manager/config_when_disabled.ts b/x-pack/test/api_integration/apis/asset_manager/config_when_disabled.ts deleted file mode 100644 index af9d3d0d206a4..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/config_when_disabled.ts +++ /dev/null @@ -1,17 +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 { FtrConfigProviderContext } from '@kbn/test'; - -export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const baseIntegrationTestsConfig = await readConfigFile(require.resolve('../../config.ts')); - - return { - ...baseIntegrationTestsConfig.getAll(), - testFiles: [require.resolve('./tests/when_disabled.ts')], - }; -} diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/basics.ts b/x-pack/test/api_integration/apis/asset_manager/tests/basics.ts deleted file mode 100644 index d0d44b88f68c1..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/tests/basics.ts +++ /dev/null @@ -1,29 +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 { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - const esSupertest = getService('esSupertest'); - - describe('during basic startup', () => { - describe('ping endpoint', () => { - it('returns a successful response', async () => { - const response = await supertest.get('/api/asset-manager/ping').expect(200); - expect(response.body).to.eql({ message: 'Asset Manager OK' }); - }); - }); - - describe('assets index templates', () => { - it('should always be installed', async () => { - await esSupertest.get('/_index_template/assets').expect(200); - }); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/constants.ts b/x-pack/test/api_integration/apis/asset_manager/tests/constants.ts deleted file mode 100644 index e71ee4fa7f49a..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/tests/constants.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 const ASSETS_ENDPOINT = '/api/asset-manager/assets'; diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/helpers.ts b/x-pack/test/api_integration/apis/asset_manager/tests/helpers.ts deleted file mode 100644 index 94ab2f5b99ffe..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/tests/helpers.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { AssetWithoutTimestamp } from '@kbn/assetManager-plugin/common/types_api'; -import type { WriteSamplesPostBody } from '@kbn/assetManager-plugin/server'; -import { apm, infra, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { Agent as SuperTestAgent } from 'supertest'; - -const SAMPLE_ASSETS_ENDPOINT = '/api/asset-manager/assets/sample'; - -export type KibanaSupertest = SuperTestAgent; - -// NOTE: In almost every case in tests, you want { refresh: true } -// in the options of this function, so it is defaulted to that value. -// Otherwise, it's likely whatever action you are testing after you -// create the sample asset docs will fail to find them. -// This refresh key passes through to the underlying ES -// query via the refresh option, see: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-refresh.html -export async function createSampleAssets( - supertest: KibanaSupertest, - options: WriteSamplesPostBody = {} -) { - if (options === null) { - options = {}; - } - if (!('refresh' in options)) { - options.refresh = true; - } - return supertest.post(SAMPLE_ASSETS_ENDPOINT).set('kbn-xsrf', 'xxx').send(options).expect(200); -} - -export async function deleteSampleAssets(supertest: KibanaSupertest) { - return await supertest.delete(SAMPLE_ASSETS_ENDPOINT).set('kbn-xsrf', 'xxx').expect(200); -} - -export async function viewSampleAssetDocs(supertest: KibanaSupertest) { - const response = await supertest.get(SAMPLE_ASSETS_ENDPOINT).expect(200); - expect(response).to.have.property('body'); - expect(response.body).to.have.property('results'); - return response.body.results as AssetWithoutTimestamp[]; -} - -export function generateServicesData({ - from, - to, - count = 1, -}: { - from: string; - to: string; - count: number; -}) { - const range = timerange(from, to); - - const services = Array(count) - .fill(0) - .map((_, idx) => - apm - .service({ - name: `service-${idx}`, - environment: 'production', - agentName: 'nodejs', - }) - .instance(`my-host-${idx}`) - ); - - return range - .interval('1m') - .rate(1) - .generator((timestamp, index) => - services.map((service) => - service - .transaction({ transactionName: 'GET /foo' }) - .timestamp(timestamp) - .duration(500) - .success() - ) - ); -} - -export function generateHostsData({ - from, - to, - count = 1, -}: { - from: string; - to: string; - count: number; -}) { - const range = timerange(from, to); - - const hosts = Array(count) - .fill(0) - .map((_, idx) => infra.host(`my-host-${idx}`)); - - return range - .interval('1m') - .rate(1) - .generator((timestamp, index) => hosts.map((host) => host.cpu().timestamp(timestamp))); -} diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/index.ts b/x-pack/test/api_integration/apis/asset_manager/tests/index.ts deleted file mode 100644 index e32e37c8ac020..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/tests/index.ts +++ /dev/null @@ -1,14 +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 { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('Asset Manager API Endpoints', () => { - loadTestFile(require.resolve('./basics')); - loadTestFile(require.resolve('./sample_assets')); - }); -} diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/sample_assets.ts b/x-pack/test/api_integration/apis/asset_manager/tests/sample_assets.ts deleted file mode 100644 index a9e7ebab188e8..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/tests/sample_assets.ts +++ /dev/null @@ -1,162 +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 { Asset } from '@kbn/assetManager-plugin/common/types_api'; -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../ftr_provider_context'; -import { createSampleAssets, deleteSampleAssets, viewSampleAssetDocs } from './helpers'; - -export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - const esSupertest = getService('esSupertest'); - - async function countSampleDocs() { - const sampleAssetDocs = await viewSampleAssetDocs(supertest); - return sampleAssetDocs.length; - } - - // This function performs the direct ES search using esSupertest, - // so we don't use the assets API to test the assets API - interface SearchESForAssetsOptions { - size?: number; - from?: string; - to?: string; - } - async function searchESForSampleAssets({ - size = 0, - from = 'now-24h', - to = 'now', - }: SearchESForAssetsOptions = {}) { - const queryPostBody = { - size, - query: { - range: { - '@timestamp': { - gte: from, - lte: to, - }, - }, - }, - }; - - return await esSupertest.post('/assets-*-sample_data/_search').send(queryPostBody).expect(200); - } - - describe('Sample Assets API', () => { - // Clear out the asset indices before each test - beforeEach(async () => { - await deleteSampleAssets(supertest); - }); - - // Clear out the asset indices one last time after the last test - after(async () => { - await deleteSampleAssets(supertest); - }); - - it('should return the sample asset documents', async () => { - const sampleAssetDocs = await viewSampleAssetDocs(supertest); - expect(sampleAssetDocs.length).to.be.greaterThan(0); - }); - - it('should find no sample assets in ES at first', async () => { - const initialResponse = await searchESForSampleAssets(); - expect(initialResponse.body.hits?.total?.value).to.equal(0); - }); - - it('should successfully create sample assets', async () => { - const nSampleDocs = await countSampleDocs(); - - const postResponse = await createSampleAssets(supertest, { refresh: true }); - expect(postResponse.status).to.equal(200); - expect(postResponse.body?.items?.length).to.equal(nSampleDocs); - - // using 'within the past 5 minutes' to approximate whatever the 'now' time was plus query and test lag - const searchResponse = await searchESForSampleAssets({ from: 'now-5m' }); - - expect(searchResponse.body.hits?.total?.value).to.equal(nSampleDocs); - }); - - it('should delete all sample data', async () => { - const nSampleDocs = await countSampleDocs(); - await createSampleAssets(supertest, { refresh: true }); - - const responseBeforeDelete = await searchESForSampleAssets(); - expect(responseBeforeDelete.body.hits?.total?.value).to.equal(nSampleDocs); - - await deleteSampleAssets(supertest); - - const responseAfterDelete = await searchESForSampleAssets(); - expect(responseAfterDelete.body.hits?.total?.value).to.equal(0); - }); - - it('should create sample data with a timestamp in the past', async () => { - const nSampleDocs = await countSampleDocs(); - - // Create sample documents dated three days prior to now - const now = new Date(); - const threeDaysAgo = new Date(now.getTime() - 1000 * 60 * 60 * 24 * 3); - const response = await createSampleAssets(supertest, { - refresh: true, - baseDateTime: threeDaysAgo.toISOString(), - }); - - // Expect that all of the sample docs have been indexed - expect(response.body?.items?.length).to.equal(nSampleDocs); - - // Searching only within the past day, we don't expect to find any of the asset documents - const oneDayAgoResponse = await searchESForSampleAssets({ size: 1, from: 'now-1d' }); - expect(oneDayAgoResponse.body.hits?.total?.value).to.equal(0); - - // Searching within the past 5 days, we should find all of the asset documents - const fiveDaysAgoResponse = await searchESForSampleAssets({ from: 'now-5d' }); - expect(fiveDaysAgoResponse.body.hits?.total?.value).to.equal(nSampleDocs); - }); - - it('should create sample data but exclude some documents via provided Elastic Asset Name values', async () => { - const sampleAssetDocs = await viewSampleAssetDocs(supertest); - const nSampleDocs = sampleAssetDocs.length; - - // We will remove the first and the last sample document, just for a test. - // Note: This test will continue to work without any hard-coded EAN values, and - // regardless of how those EAN values may change or expand. - const first = sampleAssetDocs.shift(); - const last = sampleAssetDocs.pop(); - const included = sampleAssetDocs.map((doc) => doc['asset.ean']); - - if (!first || !last) { - throw new Error('Sample asset documents were incorrectly returned'); - } - - const excluded = [first['asset.ean'], last['asset.ean']]; - const createResponse = await createSampleAssets(supertest, { - refresh: true, - excludeEans: excluded, - }); - - // We expect the created response should reference all sample docs, minus the 2 we excluded - expect(createResponse.body.items.length).to.equal(nSampleDocs - 2); - - // In Elasticsearch, we should also find 2 less asset documents than the total sample docs - const searchResponse = await searchESForSampleAssets({ size: nSampleDocs }); - expect(searchResponse.body.hits?.total?.value).to.equal(nSampleDocs - 2); - - // Lastly, we should confirm that the EAN values found in the sample docs are all - // included in the asset documents returned from ES, minus the two we excluded - const returnedAssetEans = searchResponse.body.hits.hits.map( - (doc: { _source: Asset }) => doc._source['asset.ean'] - ); - - included.forEach((ean) => { - expect(returnedAssetEans).to.contain(ean); - }); - - excluded.forEach((ean) => { - expect(returnedAssetEans).to.not.contain(ean); - }); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/when_disabled.ts b/x-pack/test/api_integration/apis/asset_manager/tests/when_disabled.ts deleted file mode 100644 index d8b556a959f8d..0000000000000 --- a/x-pack/test/api_integration/apis/asset_manager/tests/when_disabled.ts +++ /dev/null @@ -1,27 +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 { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - const esSupertest = getService('esSupertest'); - - describe('Asset Manager API Endpoints - when NOT enabled', () => { - describe('basic ping endpoint', () => { - it('returns a 404 response', async () => { - await supertest.get('/api/asset-manager/ping').expect(404); - }); - }); - - describe('assets index templates', () => { - it('should not be installed', async () => { - await esSupertest.get('/_index_template/assets').expect(404); - }); - }); - }); -} diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index d7727ec005328..13e3d0634cd40 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -120,7 +120,6 @@ "@kbn/discover-plugin", "@kbn/files-plugin", "@kbn/shared-ux-file-types", - "@kbn/assetManager-plugin", "@kbn/guided-onboarding-plugin", "@kbn/field-formats-plugin", "@kbn/ml-anomaly-utils", diff --git a/yarn.lock b/yarn.lock index b6e30b001733e..ce3018938a8f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3389,10 +3389,6 @@ version "0.0.0" uid "" -"@kbn/assetManager-plugin@link:x-pack/plugins/observability_solution/asset_manager": - version "0.0.0" - uid "" - "@kbn/assets-data-access-plugin@link:x-pack/plugins/observability_solution/assets_data_access": version "0.0.0" uid "" @@ -4765,6 +4761,10 @@ version "0.0.0" uid "" +"@kbn/entityManager-plugin@link:x-pack/plugins/observability_solution/entity_manager": + version "0.0.0" + uid "" + "@kbn/error-boundary-example-plugin@link:examples/error_boundary": version "0.0.0" uid "" From acde0277d40940143591ad469d92e219a1b152e0 Mon Sep 17 00:00:00 2001 From: SylvainJuge <763082+SylvainJuge@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:36:57 +0200 Subject: [PATCH 18/40] Create portable dashboard for otel JVM metrics (#182107) Create a dedicated "portable dashboard" for OTel Java. --------- Co-authored-by: Alexander Wert <AlexanderWert@users.noreply.github.com> --- .../kbn-apm-synthtrace-client/src/types/agent_names.ts | 2 ++ .../static_dashboard/dashboards/dashboard_catalog.ts | 9 +++++++++ .../static_dashboard/dashboards/opentelemetry_java.json | 1 + 3 files changed, 12 insertions(+) create mode 100644 x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/opentelemetry_java.json diff --git a/packages/kbn-apm-synthtrace-client/src/types/agent_names.ts b/packages/kbn-apm-synthtrace-client/src/types/agent_names.ts index c57b15e3dace0..3d3b0156cfd9d 100644 --- a/packages/kbn-apm-synthtrace-client/src/types/agent_names.ts +++ b/packages/kbn-apm-synthtrace-client/src/types/agent_names.ts @@ -26,6 +26,8 @@ type OpenTelemetryAgentName = | 'opentelemetry/erlang' | 'opentelemetry/go' | 'opentelemetry/java' + | 'opentelemetry/java/opentelemetry-java-instrumentation' + | 'opentelemetry/java/elastic' | 'opentelemetry/nodejs' | 'opentelemetry/php' | 'opentelemetry/python' diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/dashboard_catalog.ts b/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/dashboard_catalog.ts index 7293c045093f1..2d3ea5fded80b 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/dashboard_catalog.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/dashboard_catalog.ts @@ -9,6 +9,9 @@ export const AGENT_NAME_DASHBOARD_FILE_MAPPING: Record<string, string> = { nodejs: 'nodejs', 'opentelemetry/nodejs': 'opentelemetry_nodejs', java: 'java', + 'opentelemetry/java': 'opentelemetry_java', + 'opentelemetry/java/opentelemetry-java-instrumentation': 'opentelemetry_java', + 'opentelemetry/java/elastic': 'opentelemetry_java', }; /** @@ -35,6 +38,12 @@ export async function loadDashboardFile(filename: string): Promise<any> { './java.json' ); } + case 'opentelemetry_java': { + return import( + /* webpackChunkName: "lazyJavaDashboard" */ + './opentelemetry_java.json' + ); + } default: { break; } diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/opentelemetry_java.json b/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/opentelemetry_java.json new file mode 100644 index 0000000000000..727caf4636a67 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/app/metrics/static_dashboard/dashboards/opentelemetry_java.json @@ -0,0 +1 @@ +{"attributes":{"controlGroupInput":{"chainingSystem":"HIERARCHICAL","controlStyle":"oneLine","ignoreParentSettingsJSON":"{\"ignoreFilters\":false,\"ignoreQuery\":false,\"ignoreTimerange\":false,\"ignoreValidations\":false}","panelsJSON":"{\"1b6a901c-d055-485f-b404-9a86fd52985d\":{\"type\":\"optionsListControl\",\"order\":0,\"grow\":true,\"width\":\"medium\",\"explicitInput\":{\"id\":\"1b6a901c-d055-485f-b404-9a86fd52985d\",\"fieldName\":\"service.node.name\",\"title\":\"Node name\",\"grow\":true,\"width\":\"medium\",\"enhancements\":{},\"selectedOptions\":[]}}}","showApplySelections":false},"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"agent.name : \\\"opentelemetry/java/opentelemetry-java-instrumentation\\\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":10,\"i\":\"7b6cce32-fe3c-47a3-8784-6646ee4d5b24\"},\"panelIndex\":\"7b6cce32-fe3c-47a3-8784-6646ee4d5b24\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsDatatable\",\"type\":\"lens\",\"references\":[{\"type\":\"index-pattern\",\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-ffdfcd10-9cab-4806-813b-5c1c5053584e\"}],\"state\":{\"visualization\":{\"columns\":[{\"columnId\":\"03bdc1b7-9f72-4d24-89ae-72014a51a251\",\"isTransposed\":false,\"oneClickFilter\":false},{\"columnId\":\"bc1e385f-8a20-4227-980c-ee1f462e9c5b\",\"isTransposed\":false},{\"columnId\":\"fc9f178f-1bf3-4ec9-b709-2cf563038d8b\",\"isTransposed\":false},{\"columnId\":\"fd3d4405-64dd-4bdd-b5a6-79a89e9d7730\",\"isTransposed\":false},{\"columnId\":\"8bf5c093-6115-4f73-a279-1dd576647e20\",\"isTransposed\":false},{\"columnId\":\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7d\",\"isTransposed\":false,\"colorMode\":\"text\",\"palette\":{\"name\":\"custom\",\"type\":\"palette\",\"params\":{\"steps\":5,\"stops\":[{\"color\":\"#209280\",\"stop\":0.6},{\"color\":\"#54b399\",\"stop\":0.7},{\"color\":\"#d6bf57\",\"stop\":0.8},{\"color\":\"#e7664c\",\"stop\":0.9},{\"color\":\"#cc5642\",\"stop\":1.9}],\"name\":\"custom\",\"colorStops\":[{\"color\":\"#209280\",\"stop\":0},{\"color\":\"#54b399\",\"stop\":0.6},{\"color\":\"#d6bf57\",\"stop\":0.7},{\"color\":\"#e7664c\",\"stop\":0.8},{\"color\":\"#cc5642\",\"stop\":0.9}],\"continuity\":\"above\",\"reverse\":false,\"rangeMin\":0,\"rangeMax\":null,\"rangeType\":\"number\"}},\"isMetric\":true},{\"columnId\":\"68989fb9-3c56-406d-bb30-3d3a56a19d1b\",\"isTransposed\":false,\"isMetric\":true,\"colorMode\":\"text\",\"palette\":{\"name\":\"custom\",\"type\":\"palette\",\"params\":{\"steps\":5,\"stops\":[{\"color\":\"#209280\",\"stop\":0.5},{\"color\":\"#54b399\",\"stop\":0.7},{\"color\":\"#d6bf57\",\"stop\":0.8},{\"color\":\"#e7664c\",\"stop\":0.9},{\"color\":\"#cc5642\",\"stop\":1.9}],\"name\":\"custom\",\"colorStops\":[{\"color\":\"#209280\",\"stop\":0},{\"color\":\"#54b399\",\"stop\":0.5},{\"color\":\"#d6bf57\",\"stop\":0.7},{\"color\":\"#e7664c\",\"stop\":0.8},{\"color\":\"#cc5642\",\"stop\":0.9}],\"continuity\":\"above\",\"reverse\":false,\"rangeMin\":0,\"rangeMax\":null,\"rangeType\":\"number\"}}}],\"layerId\":\"ffdfcd10-9cab-4806-813b-5c1c5053584e\",\"layerType\":\"data\"},\"query\":{\"query\":\"(not agent.name :\\\"java\\\" ) and (jvm.cpu.recent_utilization :* or jvm.memory.used:* or jvm.thread.count :*)\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"ffdfcd10-9cab-4806-813b-5c1c5053584e\":{\"columns\":{\"03bdc1b7-9f72-4d24-89ae-72014a51a251\":{\"label\":\"JVM (Top 10)\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"service.node.name\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"bc1e385f-8a20-4227-980c-ee1f462e9c5b\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"},\"include\":[],\"exclude\":[],\"includeIsRegex\":false,\"excludeIsRegex\":false},\"customLabel\":true},\"bc1e385f-8a20-4227-980c-ee1f462e9c5b\":{\"label\":\"Heap memory avg\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":1}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type : \\\"heap\\\" \",\"language\":\"kuery\"}},\"fc9f178f-1bf3-4ec9-b709-2cf563038d8b\":{\"label\":\"Non-heap memory avg\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":1}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"non_heap\\\" \",\"language\":\"kuery\"}},\"fd3d4405-64dd-4bdd-b5a6-79a89e9d7730\":{\"label\":\"Thread count max\",\"dataType\":\"number\",\"operationType\":\"max\",\"sourceField\":\"jvm.thread.count\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"number\",\"params\":{\"decimals\":0}}},\"customLabel\":true},\"8bf5c093-6115-4f73-a279-1dd576647e20\":{\"label\":\"Host name\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"host.hostname\",\"isBucketed\":true,\"params\":{\"size\":1,\"orderBy\":{\"type\":\"column\",\"columnId\":\"bc1e385f-8a20-4227-980c-ee1f462e9c5b\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"},\"include\":[],\"exclude\":[],\"includeIsRegex\":false,\"excludeIsRegex\":false},\"customLabel\":true},\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX0\":{\"label\":\"Part of Heap usage avg [%]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"},\"params\":{\"emptyAsNull\":false},\"customLabel\":true},\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX1\":{\"label\":\"Part of Heap usage avg [%]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.limit\",\"isBucketed\":false,\"scale\":\"ratio\",\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"},\"params\":{\"emptyAsNull\":false},\"customLabel\":true},\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX2\":{\"label\":\"Part of Heap usage avg [%]\",\"dataType\":\"number\",\"operationType\":\"math\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"tinymathAst\":{\"type\":\"function\",\"name\":\"divide\",\"args\":[\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX0\",\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX1\"],\"location\":{\"min\":0,\"max\":50},\"text\":\"average(jvm.memory.used)/average(jvm.memory.limit)\"}},\"references\":[\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX0\",\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX1\"],\"customLabel\":true},\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7d\":{\"label\":\"Heap usage avg [%]\",\"dataType\":\"number\",\"operationType\":\"formula\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"formula\":\"average(jvm.memory.used)/average(jvm.memory.limit)\",\"isFormulaBroken\":false,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":1}}},\"references\":[\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX2\"],\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"},\"customLabel\":true},\"68989fb9-3c56-406d-bb30-3d3a56a19d1b\":{\"label\":\"CPU avg\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.cpu.recent_utilization\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":1}}},\"customLabel\":true}},\"columnOrder\":[\"03bdc1b7-9f72-4d24-89ae-72014a51a251\",\"8bf5c093-6115-4f73-a279-1dd576647e20\",\"68989fb9-3c56-406d-bb30-3d3a56a19d1b\",\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7d\",\"bc1e385f-8a20-4227-980c-ee1f462e9c5b\",\"fc9f178f-1bf3-4ec9-b709-2cf563038d8b\",\"fd3d4405-64dd-4bdd-b5a6-79a89e9d7730\",\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX0\",\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX1\",\"b39b043b-9abc-4a0e-b15c-f82e84f0fb7dX2\"],\"sampling\":1,\"ignoreGlobalFilters\":false,\"incompleteColumns\":{}}}},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"enhancements\":{}}},{\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":25,\"w\":24,\"h\":15,\"i\":\"5e044c2f-a316-4180-8f21-571fec481377\"},\"panelIndex\":\"5e044c2f-a316-4180-8f21-571fec481377\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-7f101489-db13-43e3-a1cd-fc0e9117361a\",\"type\":\"index-pattern\"},{\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-2df2bccd-257b-4ec4-ba84-b022128ff511\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"maxLines\":1,\"showSingleSeries\":true,\"shouldTruncate\":true,\"isInside\":false},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"yTitle\":\"Usage [bytes]\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"area\",\"layers\":[{\"layerId\":\"7f101489-db13-43e3-a1cd-fc0e9117361a\",\"accessors\":[\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\",\"7d04d69b-99a3-462c-b4fd-0b51bd50a508\"],\"position\":\"top\",\"seriesType\":\"area\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\"},{\"layerId\":\"2df2bccd-257b-4ec4-ba84-b022128ff511\",\"layerType\":\"data\",\"accessors\":[\"8cbe1326-c46a-437b-ad96-5fb9feefa997\"],\"seriesType\":\"line\",\"xAccessor\":\"51a76fb0-bc4e-4c0c-aa43-38b96b8778a0\"}],\"valuesInLegend\":false},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"7f101489-db13-43e3-a1cd-fc0e9117361a\":{\"columns\":{\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\":{\"label\":\"Avg. committed\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.committed\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"}},\"7d04d69b-99a3-462c-b4fd-0b51bd50a508\":{\"label\":\"Avg. used\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"}}},\"columnOrder\":[\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\",\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\",\"7d04d69b-99a3-462c-b4fd-0b51bd50a508\"],\"sampling\":1,\"ignoreGlobalFilters\":false,\"incompleteColumns\":{},\"indexPatternId\":\"apm_static_data_view_id_default\"},\"2df2bccd-257b-4ec4-ba84-b022128ff511\":{\"linkToLayers\":[],\"columns\":{\"51a76fb0-bc4e-4c0c-aa43-38b96b8778a0\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"8cbe1326-c46a-437b-ad96-5fb9feefa997\":{\"label\":\"Limit\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.limit\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"}}},\"columnOrder\":[\"51a76fb0-bc4e-4c0c-aa43-38b96b8778a0\",\"8cbe1326-c46a-437b-ad96-5fb9feefa997\"],\"sampling\":1,\"ignoreGlobalFilters\":false,\"incompleteColumns\":{},\"indexPatternId\":\"apm_static_data_view_id_default\"}},\"currentIndexPatternId\":\"apm_static_data_view_id_default\"},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Heap memory usage\"},{\"type\":\"lens\",\"gridData\":{\"x\":24,\"y\":10,\"w\":24,\"h\":15,\"i\":\"5dd8b3f8-67f4-41d3-84f2-37d20d0f4020\"},\"panelIndex\":\"5dd8b3f8-67f4-41d3-84f2-37d20d0f4020\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-7f101489-db13-43e3-a1cd-fc0e9117361a\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"maxLines\":1,\"showSingleSeries\":true,\"shouldTruncate\":true,\"isInside\":false},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"yTitle\":\"Usage [bytes]\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"area\",\"layers\":[{\"layerId\":\"7f101489-db13-43e3-a1cd-fc0e9117361a\",\"accessors\":[\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\",\"7d04d69b-99a3-462c-b4fd-0b51bd50a508\"],\"position\":\"top\",\"seriesType\":\"area\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\"}],\"valuesInLegend\":false},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"7f101489-db13-43e3-a1cd-fc0e9117361a\":{\"columns\":{\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\":{\"label\":\"Avg. committed\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.committed\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type : \\\"non_heap\\\" \",\"language\":\"kuery\"}},\"7d04d69b-99a3-462c-b4fd-0b51bd50a508\":{\"label\":\"Avg. used\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}}},\"customLabel\":true,\"filter\":{\"query\":\"labels.jvm_memory_type : \\\"non_heap\\\" \",\"language\":\"kuery\"}}},\"columnOrder\":[\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\",\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\",\"7d04d69b-99a3-462c-b4fd-0b51bd50a508\"],\"sampling\":1,\"ignoreGlobalFilters\":false,\"incompleteColumns\":{},\"indexPatternId\":\"apm_static_data_view_id_default\"}},\"currentIndexPatternId\":\"apm_static_data_view_id_default\"},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Non-heap memory usage\"},{\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":40,\"w\":24,\"h\":15,\"i\":\"ca9786a7-abfe-452c-9c89-ab331870ca68\"},\"panelIndex\":\"ca9786a7-abfe-452c-9c89-ab331870ca68\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-7f101489-db13-43e3-a1cd-fc0e9117361a\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"maxLines\":1,\"showSingleSeries\":true,\"shouldTruncate\":true,\"isInside\":false},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"yTitle\":\"Usage [%]\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"area\",\"layers\":[{\"layerId\":\"7f101489-db13-43e3-a1cd-fc0e9117361a\",\"accessors\":[\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\"],\"position\":\"top\",\"seriesType\":\"line\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\",\"splitAccessor\":\"40532e8d-8c6f-4e08-a07f-4fd9a058d5cf\"}],\"valuesInLegend\":false},\"query\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"7f101489-db13-43e3-a1cd-fc0e9117361a\":{\"columns\":{\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX0\":{\"label\":\"Part of Avg. usage\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"filter\":{\"query\":\"\",\"language\":\"kuery\"},\"params\":{\"emptyAsNull\":false},\"customLabel\":true},\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX1\":{\"label\":\"Part of Avg. usage\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.limit\",\"isBucketed\":false,\"scale\":\"ratio\",\"filter\":{\"query\":\"\",\"language\":\"kuery\"},\"params\":{\"emptyAsNull\":false},\"customLabel\":true},\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX2\":{\"label\":\"Part of Avg. usage\",\"dataType\":\"number\",\"operationType\":\"math\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"tinymathAst\":{\"type\":\"function\",\"name\":\"divide\",\"args\":[\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX0\",\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX1\"],\"location\":{\"min\":0,\"max\":50},\"text\":\"average(jvm.memory.used)/average(jvm.memory.limit)\"}},\"references\":[\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX0\",\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX1\"],\"customLabel\":true},\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\":{\"label\":\"Avg. usage\",\"dataType\":\"number\",\"operationType\":\"formula\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"formula\":\"average(jvm.memory.used)/average(jvm.memory.limit)\",\"isFormulaBroken\":false,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":2}}},\"references\":[\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX2\"],\"filter\":{\"query\":\"\",\"language\":\"kuery\"},\"customLabel\":true},\"40532e8d-8c6f-4e08-a07f-4fd9a058d5cf\":{\"label\":\"Top 3 values of labels.jvm_memory_pool_name\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"labels.jvm_memory_pool_name\",\"isBucketed\":true,\"params\":{\"size\":3,\"orderBy\":{\"type\":\"alphabetical\",\"fallback\":true},\"orderDirection\":\"asc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"},\"include\":[],\"exclude\":[],\"includeIsRegex\":false,\"excludeIsRegex\":false}}},\"columnOrder\":[\"40532e8d-8c6f-4e08-a07f-4fd9a058d5cf\",\"ef5df4a6-4c75-41f2-8aca-c15b4bcf394c\",\"009fb3d0-5ef3-450e-822c-ab6d936c50eb\",\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX0\",\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX1\",\"009fb3d0-5ef3-450e-822c-ab6d936c50ebX2\"],\"sampling\":1,\"ignoreGlobalFilters\":false,\"incompleteColumns\":{}}}},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"hidePanelTitles\":false,\"enhancements\":{},\"description\":\"\"},\"title\":\"Heap memory usage by pool\"},{\"type\":\"lens\",\"gridData\":{\"x\":24,\"y\":25,\"w\":24,\"h\":15,\"i\":\"4d8c0963-10dc-4ade-bb61-cbce3965daa5\"},\"panelIndex\":\"4d8c0963-10dc-4ade-bb61-cbce3965daa5\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsDatatable\",\"type\":\"lens\",\"references\":[{\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-c250b2e7-1fbf-4b7b-9f85-ddfd0edeb332\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"columns\":[{\"isTransposed\":false,\"columnId\":\"4bee55ff-0735-4106-8e03-c68b714c86bd\"},{\"isTransposed\":false,\"columnId\":\"6630a2e5-966f-42e9-9621-60dfc2b7acfd\",\"colorMode\":\"none\"},{\"columnId\":\"0e3b242f-bb52-44fd-bb92-41cc1d0b9e06\",\"isTransposed\":false},{\"columnId\":\"31a2ee0a-02ec-46e9-877a-0e86e2c09abb\",\"isTransposed\":false,\"colorMode\":\"none\"},{\"columnId\":\"8c139e35-5893-41aa-a82d-f1c9e16fac1b\",\"isTransposed\":false,\"colorMode\":\"text\",\"palette\":{\"name\":\"custom\",\"type\":\"palette\",\"params\":{\"steps\":5,\"stops\":[{\"color\":\"#209280\",\"stop\":0.5},{\"color\":\"#54b399\",\"stop\":0.6},{\"color\":\"#d6bf57\",\"stop\":0.7},{\"color\":\"#e7664c\",\"stop\":0.8},{\"color\":\"#cc5642\",\"stop\":1.8}],\"name\":\"custom\",\"colorStops\":[{\"color\":\"#209280\",\"stop\":0},{\"color\":\"#54b399\",\"stop\":0.5},{\"color\":\"#d6bf57\",\"stop\":0.6},{\"color\":\"#e7664c\",\"stop\":0.7},{\"color\":\"#cc5642\",\"stop\":0.8}],\"continuity\":\"above\",\"reverse\":false,\"rangeMin\":0,\"rangeMax\":null,\"rangeType\":\"number\"}}}],\"layerId\":\"c250b2e7-1fbf-4b7b-9f85-ddfd0edeb332\",\"layerType\":\"data\"},\"query\":{\"query\":\"labels.jvm_memory_type :\\\"heap\\\" \",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"c250b2e7-1fbf-4b7b-9f85-ddfd0edeb332\":{\"columns\":{\"4bee55ff-0735-4106-8e03-c68b714c86bd\":{\"label\":\"Memory pool\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"labels.jvm_memory_pool_name\",\"isBucketed\":true,\"params\":{\"size\":5,\"orderBy\":{\"type\":\"column\",\"columnId\":\"6630a2e5-966f-42e9-9621-60dfc2b7acfd\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"},\"include\":[],\"exclude\":[],\"includeIsRegex\":false,\"excludeIsRegex\":false},\"customLabel\":true},\"6630a2e5-966f-42e9-9621-60dfc2b7acfd\":{\"label\":\"Committed [bytes]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.committed\",\"isBucketed\":false,\"scale\":\"ratio\",\"reducedTimeRange\":\"5m\",\"params\":{\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}},\"emptyAsNull\":true},\"customLabel\":true},\"0e3b242f-bb52-44fd-bb92-41cc1d0b9e06\":{\"label\":\"Limit [bytes]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.limit\",\"isBucketed\":false,\"scale\":\"ratio\",\"reducedTimeRange\":\"5m\",\"params\":{\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}},\"emptyAsNull\":true},\"customLabel\":true},\"31a2ee0a-02ec-46e9-877a-0e86e2c09abb\":{\"label\":\"Used [bytes]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"reducedTimeRange\":\"5m\",\"params\":{\"format\":{\"id\":\"bytes\",\"params\":{\"decimals\":2}},\"emptyAsNull\":true},\"customLabel\":true},\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX0\":{\"label\":\"Part of Used [%]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.used\",\"isBucketed\":false,\"scale\":\"ratio\",\"filter\":{\"query\":\"jvm.memory.used: *\",\"language\":\"kuery\"},\"reducedTimeRange\":\"5m\",\"params\":{\"emptyAsNull\":false},\"customLabel\":true},\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX1\":{\"label\":\"Part of Used [%]\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.memory.limit\",\"isBucketed\":false,\"scale\":\"ratio\",\"filter\":{\"query\":\"jvm.memory.limit: *\",\"language\":\"kuery\"},\"reducedTimeRange\":\"5m\",\"params\":{\"emptyAsNull\":false},\"customLabel\":true},\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX2\":{\"label\":\"Part of Used [%]\",\"dataType\":\"number\",\"operationType\":\"math\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"tinymathAst\":{\"type\":\"function\",\"name\":\"divide\",\"args\":[\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX0\",\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX1\"],\"location\":{\"min\":0,\"max\":103},\"text\":\"average(jvm.memory.used, kql='jvm.memory.used: *')/average(jvm.memory.limit, kql='jvm.memory.limit: *')\"}},\"references\":[\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX0\",\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX1\"],\"customLabel\":true},\"8c139e35-5893-41aa-a82d-f1c9e16fac1b\":{\"label\":\"Used [%]\",\"dataType\":\"number\",\"operationType\":\"formula\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"formula\":\"average(jvm.memory.used, kql='jvm.memory.used: *')/average(jvm.memory.limit, kql='jvm.memory.limit: *')\",\"isFormulaBroken\":false,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":2}}},\"references\":[\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX2\"],\"reducedTimeRange\":\"5m\",\"customLabel\":true}},\"columnOrder\":[\"4bee55ff-0735-4106-8e03-c68b714c86bd\",\"0e3b242f-bb52-44fd-bb92-41cc1d0b9e06\",\"6630a2e5-966f-42e9-9621-60dfc2b7acfd\",\"31a2ee0a-02ec-46e9-877a-0e86e2c09abb\",\"8c139e35-5893-41aa-a82d-f1c9e16fac1b\",\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX0\",\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX1\",\"8c139e35-5893-41aa-a82d-f1c9e16fac1bX2\"],\"incompleteColumns\":{},\"sampling\":1,\"indexPatternId\":\"apm_static_data_view_id_default\"}},\"currentIndexPatternId\":\"apm_static_data_view_id_default\"},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Heap memory pools\"},{\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":10,\"w\":24,\"h\":15,\"i\":\"298e0934-8feb-44b8-8e5e-246a173a7036\"},\"panelIndex\":\"298e0934-8feb-44b8-8e5e-246a173a7036\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"type\":\"index-pattern\",\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-f29b4866-f576-49a4-af42-efafad81d0ff\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"bottom\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"line\",\"layers\":[{\"layerId\":\"f29b4866-f576-49a4-af42-efafad81d0ff\",\"accessors\":[\"2cb44b2f-fff3-45e4-b40e-e067daf21b52\",\"2d12ce33-9691-4f4a-9717-eab6e4fed767\",\"3ac12c4e-f2c9-4914-b461-1ec3e96ac6e7\",\"28a6e0b4-1f21-4b22-b006-aa2d8ff69b27\"],\"position\":\"top\",\"seriesType\":\"line\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"fd579e72-9688-4cc3-987a-814c255ef7a4\",\"yConfig\":[{\"forAccessor\":\"3ac12c4e-f2c9-4914-b461-1ec3e96ac6e7\",\"color\":\"#d6bf57\"},{\"forAccessor\":\"28a6e0b4-1f21-4b22-b006-aa2d8ff69b27\",\"color\":\"#da8b45\"}]}],\"yTitle\":\"Utilization [%]\"},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"f29b4866-f576-49a4-af42-efafad81d0ff\":{\"columns\":{\"fd579e72-9688-4cc3-987a-814c255ef7a4\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"2cb44b2f-fff3-45e4-b40e-e067daf21b52\":{\"label\":\"System average\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.system.cpu.utilization\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":2}}},\"customLabel\":true},\"2d12ce33-9691-4f4a-9717-eab6e4fed767\":{\"label\":\"System max\",\"dataType\":\"number\",\"operationType\":\"max\",\"sourceField\":\"jvm.system.cpu.utilization\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":2}}},\"customLabel\":true},\"3ac12c4e-f2c9-4914-b461-1ec3e96ac6e7\":{\"label\":\"Process average\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.cpu.recent_utilization\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":2}}},\"customLabel\":true},\"28a6e0b4-1f21-4b22-b006-aa2d8ff69b27\":{\"label\":\"Process max\",\"dataType\":\"number\",\"operationType\":\"max\",\"sourceField\":\"jvm.cpu.recent_utilization\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true,\"format\":{\"id\":\"percent\",\"params\":{\"decimals\":2,\"compact\":false}}},\"customLabel\":true}},\"columnOrder\":[\"fd579e72-9688-4cc3-987a-814c255ef7a4\",\"2cb44b2f-fff3-45e4-b40e-e067daf21b52\",\"2d12ce33-9691-4f4a-9717-eab6e4fed767\",\"3ac12c4e-f2c9-4914-b461-1ec3e96ac6e7\",\"28a6e0b4-1f21-4b22-b006-aa2d8ff69b27\"],\"incompleteColumns\":{},\"sampling\":1,\"indexPatternId\":\"apm_static_data_view_id_default\"}},\"currentIndexPatternId\":\"apm_static_data_view_id_default\"},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"CPU Usage\"},{\"type\":\"lens\",\"gridData\":{\"x\":24,\"y\":40,\"w\":24,\"h\":15,\"i\":\"042cf2ef-9cd4-458c-87be-e6ac2c9d6d7e\"},\"panelIndex\":\"042cf2ef-9cd4-458c-87be-e6ac2c9d6d7e\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"description\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"apm_static_data_view_id_default\",\"name\":\"indexpattern-datasource-layer-ba118f97-82fd-4867-ae97-a071c22c7360\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"bottom\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"line\",\"layers\":[{\"layerId\":\"ba118f97-82fd-4867-ae97-a071c22c7360\",\"accessors\":[\"adb88f79-f380-4a6a-9f90-91316ececf1f\",\"92bdf4ef-b458-4c05-b4a3-d65db50c0ecc\"],\"position\":\"top\",\"seriesType\":\"line\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"69640a9f-0f72-46d0-94b2-47930dc0272e\"}],\"yTitle\":\"Thread count\"},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"formBased\":{\"layers\":{\"ba118f97-82fd-4867-ae97-a071c22c7360\":{\"columns\":{\"69640a9f-0f72-46d0-94b2-47930dc0272e\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"adb88f79-f380-4a6a-9f90-91316ececf1f\":{\"label\":\"Max\",\"dataType\":\"number\",\"operationType\":\"max\",\"sourceField\":\"jvm.thread.count\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true},\"customLabel\":true},\"92bdf4ef-b458-4c05-b4a3-d65db50c0ecc\":{\"label\":\"Average\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"jvm.thread.count\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true},\"customLabel\":true}},\"columnOrder\":[\"69640a9f-0f72-46d0-94b2-47930dc0272e\",\"92bdf4ef-b458-4c05-b4a3-d65db50c0ecc\",\"adb88f79-f380-4a6a-9f90-91316ececf1f\"],\"sampling\":1,\"ignoreGlobalFilters\":false,\"incompleteColumns\":{}}}},\"indexpattern\":{\"layers\":{}},\"textBased\":{\"layers\":{}}},\"internalReferences\":[],\"adHocDataViews\":{}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Thread count\"}]","timeRestore":false,"title":"JVM-Dashboard - otel","version":2},"coreMigrationVersion":"8.8.0","created_at":"2024-04-30T09:07:18.434Z","created_by":"u_2555277038_cloud","id":"f29edbb0-2a0e-11ee-ba40-b1a1a11f1941","managed":false,"references":[{"id":"apm_static_data_view_id_default","name":"7b6cce32-fe3c-47a3-8784-6646ee4d5b24:indexpattern-datasource-layer-ffdfcd10-9cab-4806-813b-5c1c5053584e","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"5e044c2f-a316-4180-8f21-571fec481377:indexpattern-datasource-layer-7f101489-db13-43e3-a1cd-fc0e9117361a","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"5e044c2f-a316-4180-8f21-571fec481377:indexpattern-datasource-layer-2df2bccd-257b-4ec4-ba84-b022128ff511","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"5dd8b3f8-67f4-41d3-84f2-37d20d0f4020:indexpattern-datasource-layer-7f101489-db13-43e3-a1cd-fc0e9117361a","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"ca9786a7-abfe-452c-9c89-ab331870ca68:indexpattern-datasource-layer-7f101489-db13-43e3-a1cd-fc0e9117361a","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"4d8c0963-10dc-4ade-bb61-cbce3965daa5:indexpattern-datasource-layer-c250b2e7-1fbf-4b7b-9f85-ddfd0edeb332","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"298e0934-8feb-44b8-8e5e-246a173a7036:indexpattern-datasource-layer-f29b4866-f576-49a4-af42-efafad81d0ff","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"042cf2ef-9cd4-458c-87be-e6ac2c9d6d7e:indexpattern-datasource-layer-ba118f97-82fd-4867-ae97-a071c22c7360","type":"index-pattern"},{"id":"apm_static_data_view_id_default","name":"controlGroup_1b6a901c-d055-485f-b404-9a86fd52985d:optionsListDataView","type":"index-pattern"}],"type":"dashboard","typeMigrationVersion":"10.2.0","updated_at":"2024-04-30T09:07:18.434Z","version":"WzkyNiwyXQ=="} From 4aeb7905722fc4c3befa96ad7913fde8d26586f3 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar <dario.gieselaar@elastic.co> Date: Wed, 26 Jun 2024 15:46:23 +0200 Subject: [PATCH 19/40] [Obs AI Assistant] Keep connection open, limit no of fields (#186811) Keeps the connection open even when there is no data, to prevent long-running operations from timing out. Additionally, puts an upper limit of field names to be analyzed. --- .../get_relevant_field_names.ts | 14 +++++++++--- .../functions/get_dataset_info/index.ts | 4 ++-- .../server/service/util/flush_buffer.ts | 22 ++++++++++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts index 557f09784c7f9..74d786bb6727d 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/get_relevant_field_names.ts @@ -33,7 +33,7 @@ export async function getRelevantFieldNames({ messages: Message[]; chat: FunctionCallChatFunction; signal: AbortSignal; -}): Promise<{ fields: string[] }> { +}): Promise<{ fields: string[]; stats: { analyzed: number; total: number } }> { const dataViewsService = await dataViews.dataViewsServiceFactory(savedObjectsClient, esClient); const hasAnyHitsResponse = await esClient.search({ @@ -89,8 +89,13 @@ export async function getRelevantFieldNames({ const shortIdTable = new ShortIdTable(); + const MAX_CHUNKS = 5; + const FIELD_NAMES_PER_CHUNK = 250; + + const fieldNamesToAnalyze = fieldNames.slice(0, MAX_CHUNKS * FIELD_NAMES_PER_CHUNK); + const relevantFields = await Promise.all( - chunk(fieldNames, 250).map(async (fieldsInChunk) => { + chunk(fieldNamesToAnalyze, FIELD_NAMES_PER_CHUNK).map(async (fieldsInChunk) => { const chunkResponse$ = ( await chat('get_relevant_dataset_names', { signal, @@ -165,5 +170,8 @@ export async function getRelevantFieldNames({ }) ); - return { fields: relevantFields.flat() }; + return { + fields: relevantFields.flat(), + stats: { analyzed: fieldNamesToAnalyze.length, total: fieldNames.length }, + }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts index 4b9128ed549f3..57cac3a4e0c0f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts @@ -48,7 +48,7 @@ export function registerGetDatasetInfoFunction({ try { const body = await esClient.asCurrentUser.indices.resolveIndex({ - name: index === '' ? '*' : index, + name: index === '' ? '*' : index.split(','), expand_wildcards: 'open', }); indices = [ @@ -87,11 +87,11 @@ export function registerGetDatasetInfoFunction({ signal, chat, }); - return { content: { indices: [index], fields: relevantFieldNames.fields, + stats: relevantFieldNames.stats, }, }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts index eb494ec80bb50..a9826a180c969 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/flush_buffer.ts @@ -6,7 +6,7 @@ */ import { repeat } from 'lodash'; -import { identity, Observable, OperatorFunction } from 'rxjs'; +import { Observable, OperatorFunction } from 'rxjs'; import { BufferFlushEvent, StreamingChatResponseEventType, @@ -22,10 +22,6 @@ import { export function flushBuffer<T extends StreamingChatResponseEventWithoutError | TokenCountEvent>( isCloud: boolean ): OperatorFunction<T, T | BufferFlushEvent> { - if (!isCloud) { - return identity; - } - return (source: Observable<T>) => new Observable<T | BufferFlushEvent>((subscriber) => { const cloudProxyBufferSize = 4096; @@ -41,7 +37,15 @@ export function flushBuffer<T extends StreamingChatResponseEventWithoutError | T } }; - const intervalId = setInterval(flushBufferIfNeeded, 250); + const keepAlive = () => { + subscriber.next({ + data: '0', + type: StreamingChatResponseEventType.BufferFlush, + }); + }; + + const flushIntervalId = isCloud ? setInterval(flushBufferIfNeeded, 250) : undefined; + const keepAliveIntervalId = setInterval(keepAlive, 30_000); source.subscribe({ next: (value) => { @@ -52,11 +56,13 @@ export function flushBuffer<T extends StreamingChatResponseEventWithoutError | T subscriber.next(value); }, error: (error) => { - clearInterval(intervalId); + clearInterval(flushIntervalId); + clearInterval(keepAliveIntervalId); subscriber.error(error); }, complete: () => { - clearInterval(intervalId); + clearInterval(flushIntervalId); + clearInterval(keepAliveIntervalId); subscriber.complete(); }, }); From 82f9dea0aa5174bd82a8593def1b8fd61f3bc7ed Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Wed, 26 Jun 2024 09:55:55 -0400 Subject: [PATCH 20/40] [Bug][Investigations] - Configure timeline adjustable row height (#186117) Connects the row height slider value to the actual table height. May want to wait to merge this as the performance seems to lag a bit Addresses https://github.com/elastic/kibana/issues/184825 --- ...stom_timeline_data_grid_body.test.tsx.snap | 19 ++++++++++- .../custom_timeline_data_grid_body.tsx | 33 ++++++++++++++++--- .../unified_components/data_table/index.tsx | 2 ++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap index 2c8c9d593b775..d11a5f23cbda6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap @@ -28,6 +28,7 @@ exports[`CustomTimelineDataGridBody should render exactly as snapshots 1`] = ` .c0 . euiDataGridRowCell--controlColumn { height: 40px; + min-height: 40px; } .c0 .udt--customRow { @@ -57,12 +58,28 @@ exports[`CustomTimelineDataGridBody should render exactly as snapshots 1`] = ` -webkit-box-align: center; -ms-flex-align: center; align-items: center; - height: 36px; + height: 40px; } .c1 .euiDataGridRowCell, .c1 .euiDataGridRowCell__content { + -webkit-align-items: flex-start; + -webkit-box-align: flex-start; + -ms-flex-align: flex-start; + align-items: flex-start; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; height: 100%; + min-height: 40px; } .c1 .euiDataGridRowCell .unifiedDataTable__rowControl, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/custom_timeline_data_grid_body.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/custom_timeline_data_grid_body.tsx index 7002360f5a346..fecfb56f87b14 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/custom_timeline_data_grid_body.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/custom_timeline_data_grid_body.tsx @@ -31,11 +31,15 @@ export type CustomTimelineDataGridBodyProps = EuiDataGridCustomBodyProps & { eventIdToNoteIds?: Record<string, string[]> | null; eventIdsAddingNotes?: Set<string>; onToggleShowNotes: (eventId?: string) => void; + rowHeight?: number; refetch?: () => void; }; const emptyNotes: string[] = []; +// THE DataGrid Row default is 34px, but we make ours 40 to account for our row actions +const DEFAULT_UDT_ROW_HEIGHT = 40; + /** * * In order to render the additional row with every event ( which displays the row-renderer, notes and notes editor) @@ -56,6 +60,7 @@ export const CustomTimelineDataGridBody: FC<CustomTimelineDataGridBodyProps> = m visibleColumns, visibleRowData, rows, + rowHeight, enabledRowRenderers, events = [], eventIdToNoteIds = {}, @@ -98,6 +103,7 @@ export const CustomTimelineDataGridBody: FC<CustomTimelineDataGridBodyProps> = m rowIndex={rowIndex} key={rowIndex} visibleColumns={visibleColumns} + rowHeight={rowHeight} Cell={Cell} enabledRowRenderers={enabledRowRenderers} notes={notes} @@ -127,7 +133,8 @@ const CustomGridRow = styled.div.attrs<{ width: fit-content; border-bottom: 1px solid ${(props) => (props.theme as EuiTheme).eui.euiBorderThin}; . euiDataGridRowCell--controlColumn { - height: 40px; + height: ${(props: { $cssRowHeight: string }) => props.$cssRowHeight}; + min-height: ${DEFAULT_UDT_ROW_HEIGHT}px; } .udt--customRow { border-radius: 0; @@ -160,10 +167,15 @@ const CustomGridRowCellWrapper = styled.div.attrs<{ }))` display: flex; align-items: center; - height: 36px; + height: ${(props: { $cssRowHeight: string }) => props.$cssRowHeight}; .euiDataGridRowCell, .euiDataGridRowCell__content { + align-items: flex-start; + display: flex; + flex-direction: column; + justify-content: center; height: 100%; + min-height: ${DEFAULT_UDT_ROW_HEIGHT}px; .unifiedDataTable__rowControl { margin-top: 0; } @@ -182,9 +194,19 @@ type CustomTimelineDataGridSingleRowProps = { onToggleShowNotes: (eventId?: string) => void; } & Pick< CustomTimelineDataGridBodyProps, - 'visibleColumns' | 'Cell' | 'enabledRowRenderers' | 'refetch' + 'visibleColumns' | 'Cell' | 'enabledRowRenderers' | 'refetch' | 'rowHeight' >; +const calculateRowHeightInPixels = (lineHeightMultiple: number): string => { + // The line height multiple can be negative to indicate "auto" in the unified data table + if (lineHeightMultiple < 0) return 'auto'; + // The base line-height in pixels is 16px. This would be calculated default by the datagird and we could use + // the `configRowHeight` prop, but since we own control of our rows via `customGridBody` we have to calculate it ourselves. + const baseRowLineHeightInPx = 16; + const rowHeightInPixels = DEFAULT_UDT_ROW_HEIGHT + baseRowLineHeightInPx * lineHeightMultiple; + return `${rowHeightInPixels}px`; +}; + /** * * RenderCustomBody component above uses this component to display a single row. @@ -204,6 +226,7 @@ const CustomDataGridSingleRow = memo(function CustomDataGridSingleRow( eventId = '', onToggleShowNotes, refetch, + rowHeight: rowHeightMultiple = 0, } = props; const dispatch = useDispatch(); const { canShowRowRenderer } = useStatefulRowRenderer({ @@ -211,6 +234,7 @@ const CustomDataGridSingleRow = memo(function CustomDataGridSingleRow( rowRenderers: enabledRowRenderers, }); + const cssRowHeight: string = calculateRowHeightInPixels(rowHeightMultiple); /** * removes the border between the actual row ( timelineEvent) and `TimelineEventDetail` row * which renders the row-renderer, notes and notes editor @@ -250,9 +274,10 @@ const CustomDataGridSingleRow = memo(function CustomDataGridSingleRow( return ( <CustomGridRow className={`${rowIndex % 2 === 0 ? 'euiDataGridRow--striped' : ''}`} + $cssRowHeight={cssRowHeight} key={rowIndex} > - <CustomGridRowCellWrapper className={eventTypeRowClassName}> + <CustomGridRowCellWrapper className={eventTypeRowClassName} $cssRowHeight={cssRowHeight}> {visibleColumns.map((column, colIndex) => { // Skip the expanded row cell - we'll render it manually outside of the flex wrapper if (column.id !== TIMELINE_EVENT_DETAIL_ROW_ID) { 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 d7e22f116511a..f512fcbe04a0c 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 @@ -390,6 +390,7 @@ export const TimelineDataTableComponent: React.FC<DataTableProps> = memo( visibleColumns={visibleColumns} visibleRowData={visibleRowData} eventIdToNoteIds={eventIdToNoteIds} + rowHeight={rowHeight} setCustomGridBodyProps={setCustomGridBodyProps} events={events} enabledRowRenderers={enabledRowRenderers} @@ -405,6 +406,7 @@ export const TimelineDataTableComponent: React.FC<DataTableProps> = memo( eventIdToNoteIds, cellContext?.eventIdsAddingNotes, cellContext?.onToggleShowNotes, + rowHeight, refetch, ] ); From 4da72b698b6f6363261f951b5b7ab7960243ae03 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm <matthias.wilhelm@elastic.co> Date: Wed, 26 Jun 2024 16:08:25 +0200 Subject: [PATCH 21/40] [Discover][Surrounding documents] Improve recording of performance metrics (#184980) Addresses performance metric issues for "View Surrounding Documents" in Discover. Two issues are resolved: * A performance metric was recorded even when no request was executed. * The main fetching function did not return a Promise, causing the performance metric to not wait for the request to be resolved. --- .../discover/public/application/context/context_app.tsx | 2 +- .../application/context/hooks/use_context_app_fetch.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/discover/public/application/context/context_app.tsx b/src/plugins/discover/public/application/context/context_app.tsx index 5c7372f8d1d24..dc22a77fecede 100644 --- a/src/plugins/discover/public/application/context/context_app.tsx +++ b/src/plugins/discover/public/application/context/context_app.tsx @@ -141,7 +141,7 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => await fetchContextRows(); } - if (analytics) { + if (analytics && fetchType) { const fetchDuration = window.performance.now() - startTime; reportPerformanceMetricEvent(analytics, { eventName: 'discoverSurroundingDocsFetch', diff --git a/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.tsx b/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.tsx index f0feaa2d63230..0428ff131238f 100644 --- a/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.tsx +++ b/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.tsx @@ -184,8 +184,10 @@ export function useContextAppFetch({ [fetchSurroundingRows] ); - const fetchAllRows = useCallback(() => { - fetchAnchorRow().then((anchor) => anchor && fetchContextRows(anchor)); + const fetchAllRows = useCallback(async () => { + const anchor = await fetchAnchorRow(); + if (!anchor) return; + return await fetchContextRows(anchor); }, [fetchAnchorRow, fetchContextRows]); const resetFetchedState = useCallback(() => { From feef37db77a359d9d9160d0bdad4f9dde0f80dac Mon Sep 17 00:00:00 2001 From: Gloria Hornero <gloria.hornero@elastic.co> Date: Wed, 26 Jun 2024 16:09:13 +0200 Subject: [PATCH 22/40] [Security Solution] Fixes api tests executed on MKI (#186976) ## Summary After moving from basic to API authentication, API tests started to fail on MKI environments since the `TEST_CLOUD_HOST_NAME` environment variable is needed to get the correct information in this type of environments. In this PR we are fixing it by adding the needed environment variable. --- .../scripts/mki_api_ftr_execution.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_api_integration/scripts/mki_api_ftr_execution.ts b/x-pack/test/security_solution_api_integration/scripts/mki_api_ftr_execution.ts index 3dff7e2c1d071..68c33647d5073 100644 --- a/x-pack/test/security_solution_api_integration/scripts/mki_api_ftr_execution.ts +++ b/x-pack/test/security_solution_api_integration/scripts/mki_api_ftr_execution.ts @@ -161,6 +161,7 @@ export const cli = () => { TEST_CLOUD: testCloud.toString(), TEST_ES_URL: testEsUrl, TEST_KIBANA_URL: testKibanaUrl, + TEST_CLOUD_HOST_NAME: new URL(BASE_ENV_URL).hostname, }; statusCode = await executeCommand(command, envVars, log); From 08dc25b4ea6174032b5717029fec7295698849e4 Mon Sep 17 00:00:00 2001 From: Christos Nasikas <christos.nasikas@elastic.co> Date: Wed, 26 Jun 2024 17:10:42 +0300 Subject: [PATCH 23/40] [ResponseOps][Connectors] Remove feature flag for ServiceNow additional fields (#186949) ## Summary In https://github.com/elastic/kibana/pull/184023, we introduced the "additional fields" field for ServiceNow ITSM and SecOps. The field was under a feature flag to follow the intermediate release process. This PR reverts commit 6a593e930802353ee5189e72db2e28f15bf0da42 to remove the feature flag. ### 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) --- .../lib/servicenow/additional_fields.test.tsx | 22 +++---------------- .../lib/servicenow/additional_fields.tsx | 10 --------- 2 files changed, 3 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.test.tsx index 33f4fe3923b88..b7a6d4e914168 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.test.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.test.tsx @@ -36,32 +36,16 @@ describe('Credentials', () => { expect(await screen.findByText(value)).toBeInTheDocument(); }); - /** - * Test for the intermediate release process - */ - it('does not show the component if the value is undefined', async () => { - render( - <IntlProvider locale="en"> - <AdditionalFields {...props} value={undefined} /> - </IntlProvider> - ); - - expect(screen.queryByTestId('additional_fieldsJsonEditor')).not.toBeInTheDocument(); - }); - it('changes the value correctly', async () => { const newValue = JSON.stringify({ bar: 'test' }); render( <IntlProvider locale="en"> - <AdditionalFields {...props} /> + <AdditionalFields {...props} value={undefined} /> </IntlProvider> ); - const editor = await screen.findByTestId('additional_fieldsJsonEditor'); - - userEvent.clear(editor); - userEvent.paste(editor, newValue); + userEvent.paste(await screen.findByTestId('additional_fieldsJsonEditor'), newValue); await waitFor(() => { expect(onChange).toHaveBeenCalledWith(newValue); @@ -75,7 +59,7 @@ describe('Credentials', () => { render( <IntlProvider locale="en"> - <AdditionalFields {...props} /> + <AdditionalFields {...props} value={undefined} /> </IntlProvider> ); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.tsx b/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.tsx index b9d3602112c53..7b14dbca7462e 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/lib/servicenow/additional_fields.tsx @@ -25,16 +25,6 @@ export const AdditionalFieldsComponent: React.FC<AdditionalFieldsProps> = ({ messageVariables, onChange, }) => { - /** - * Hide the component if the value is not defined. - * This is needed for the intermediate release process. - * Users will not be able to use the field if they have never set it. - * On the next Serverless release the check will be removed. - */ - if (value === undefined) { - return null; - } - return ( <JsonEditorWithMessageVariables messageVariables={messageVariables} From 985a28fd3bac204059ddd2ef62be17eb1d978b1b Mon Sep 17 00:00:00 2001 From: Jon <jon@elastic.co> Date: Wed, 26 Jun 2024 09:15:03 -0500 Subject: [PATCH 24/40] Update obs-onboarding cypress CI config (#186926) - removes parallelism: 2 from step definition. The test suites are not sharded. - Updates the path used to trigger a test run. The previous path is out of date. --- .../pipelines/pull_request/observability_onboarding_cypress.yml | 1 - .buildkite/scripts/pipelines/pull_request/pipeline.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml index 300c148a09b3f..b5831e7bb471d 100644 --- a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml +++ b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml @@ -8,7 +8,6 @@ steps: - build - quick_checks timeout_in_minutes: 120 - parallelism: 2 retry: automatic: - exit_status: '-1' diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 035ab108a6b88..c6b28bc20c6f3 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -83,7 +83,7 @@ const getPipeline = (filename: string, removeSteps = true) => { if ( (await doAnyChangesMatch([ - /^x-pack\/plugins\/observability_onboarding/, + /^x-pack\/plugins\/observability_solution\/observability_onboarding/, /^x-pack\/plugins\/fleet/, ])) || GITHUB_PR_LABELS.includes('ci:all-cypress-suites') From 0ffd02c1d223a438577f9b421b8967a57c3214e0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 07:24:14 -0700 Subject: [PATCH 25/40] Update dependency @elastic/charts to v66.0.4 (main) (#186836) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [@elastic/charts](https://togithub.com/elastic/elastic-charts) | [`66.0.3` -> `66.0.4`](https://renovatebot.com/diffs/npm/@elastic%2fcharts/66.0.3/66.0.4) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@elastic%2fcharts/66.0.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@elastic%2fcharts/66.0.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@elastic%2fcharts/66.0.3/66.0.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@elastic%2fcharts/66.0.3/66.0.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>elastic/elastic-charts (@​elastic/charts)</summary> ### [`v66.0.4`](https://togithub.com/elastic/elastic-charts/blob/HEAD/CHANGELOG.md#6604-2024-06-24) [Compare Source](https://togithub.com/elastic/elastic-charts/compare/v66.0.3...v66.0.4) ##### Bug Fixes - **deps:** update dependency [@​elastic/eui](https://togithub.com/elastic/eui) to v95 ([#​2462](https://togithub.com/elastic/elastic-charts/issues/2462)) ([040c354](https://togithub.com/elastic/elastic-charts/commit/040c354d349127697c0ac1a60f4cb103db600535)) - option to disable the isolated point styles on line and area charts ([#​2472](https://togithub.com/elastic/elastic-charts/issues/2472)) ([ae16815](https://togithub.com/elastic/elastic-charts/commit/ae1681516ac43fd6b9aca851635483c9ed6e9512)) - outside rect annotation placement and group relations ([#​2471](https://togithub.com/elastic/elastic-charts/issues/2471)) ([d46fb41](https://togithub.com/elastic/elastic-charts/commit/d46fb410ac1459ca7d943620ab830ce1924d76ab)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. â™» **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/elastic/kibana). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjQxMy4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJUZWFtOlZpc3VhbGl6YXRpb25zIiwiYmFja3BvcnQ6c2tpcCIsInJlbGVhc2Vfbm90ZTpza2lwIl19--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: nickofthyme <nicholas.partridge@elastic.co> --- package.json | 2 +- .../gauge_component.test.tsx.snap | 2 ++ .../partition_vis_component.test.tsx.snap | 12 +++++++++++ .../__snapshots__/xy_chart.test.tsx.snap | 20 +++++++++++++++++++ .../__snapshots__/donut_chart.test.tsx.snap | 2 ++ yarn.lock | 8 ++++---- 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d96f38fa52b39..37f8acb87d2de 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "@elastic/apm-rum": "^5.16.0", "@elastic/apm-rum-core": "^5.21.0", "@elastic/apm-rum-react": "^2.0.2", - "@elastic/charts": "66.0.3", + "@elastic/charts": "66.0.4", "@elastic/datemath": "5.0.3", "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.13.1", diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap index 5614bcff2c305..1211da678af7a 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap @@ -38,6 +38,7 @@ exports[`GaugeComponent renders the chart 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -427,6 +428,7 @@ exports[`GaugeComponent renders the chart 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap index 74065bc03081c..db39a86f8ae4c 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap @@ -268,6 +268,7 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -657,6 +658,7 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -1200,6 +1202,7 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -1589,6 +1592,7 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -2192,6 +2196,7 @@ exports[`PartitionVisComponent should render correct structure for multi-metric }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -2581,6 +2586,7 @@ exports[`PartitionVisComponent should render correct structure for multi-metric }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -3186,6 +3192,7 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -3575,6 +3582,7 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -4118,6 +4126,7 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -4507,6 +4516,7 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -5005,6 +5015,7 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -5394,6 +5405,7 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, diff --git a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap index c70967794def7..12e7f4c4a93a5 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap @@ -610,6 +610,7 @@ exports[`XYChart component it renders area 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -999,6 +1000,7 @@ exports[`XYChart component it renders area 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -2163,6 +2165,7 @@ exports[`XYChart component it renders bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -2552,6 +2555,7 @@ exports[`XYChart component it renders bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -3716,6 +3720,7 @@ exports[`XYChart component it renders horizontal bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -4105,6 +4110,7 @@ exports[`XYChart component it renders horizontal bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -5269,6 +5275,7 @@ exports[`XYChart component it renders line 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -5658,6 +5665,7 @@ exports[`XYChart component it renders line 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -6822,6 +6830,7 @@ exports[`XYChart component it renders stacked area 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -7211,6 +7220,7 @@ exports[`XYChart component it renders stacked area 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -8375,6 +8385,7 @@ exports[`XYChart component it renders stacked bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -8764,6 +8775,7 @@ exports[`XYChart component it renders stacked bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -9928,6 +9940,7 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -10317,6 +10330,7 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -11511,6 +11525,7 @@ exports[`XYChart component split chart should render split chart if both, splitR }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -11900,6 +11915,7 @@ exports[`XYChart component split chart should render split chart if both, splitR }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -13302,6 +13318,7 @@ exports[`XYChart component split chart should render split chart if splitColumnA }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -13691,6 +13708,7 @@ exports[`XYChart component split chart should render split chart if splitColumnA }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -15086,6 +15104,7 @@ exports[`XYChart component split chart should render split chart if splitRowAcce }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -15475,6 +15494,7 @@ exports[`XYChart component split chart should render split chart if splitRowAcce }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap index 2569e62ad20ca..639557a2b9e1a 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap @@ -51,6 +51,7 @@ exports[`DonutChart component passes correct props without errors for valid prop }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, @@ -440,6 +441,7 @@ exports[`DonutChart component passes correct props without errors for valid prop }, }, "isolatedPoint": Object { + "enabled": true, "fill": "white", "opacity": 1, "radius": 2, diff --git a/yarn.lock b/yarn.lock index ce3018938a8f9..b7ca9a8e6eda0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1658,10 +1658,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@66.0.3": - version "66.0.3" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-66.0.3.tgz#16b2290fd37d7ca4d5eb96bd63b947b59cace39d" - integrity sha512-McCg8X72U4DGqMihlQnuixsCoJEQHAt27lBKYLJWH9n6N/2EUDsdejUPIuiYqCRrEUyUOUq2XcyJMgOw4It50A== +"@elastic/charts@66.0.4": + version "66.0.4" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-66.0.4.tgz#aabb145687805ca7f491df22c15d7d535ca80031" + integrity sha512-fxOivMRUtcTrSOKTqxxDN5XVCzaW0lVrydCxGGHg3NoYEBtOktnF8SWATO8EYfg5cSBDcVbLGOnscqM84Q2aDA== dependencies: "@popperjs/core" "^2.11.8" bezier-easing "^2.1.0" From 199e2ad44e9b1b652df4474e984be7a0e52e7b77 Mon Sep 17 00:00:00 2001 From: Nikita Indik <nikita.indik@elastic.co> Date: Wed, 26 Jun 2024 16:29:32 +0200 Subject: [PATCH 26/40] [Security Solution] Add "Customized Elastic rule" badge to Rule Details page (#186914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Resolves: https://github.com/elastic/kibana/issues/180170** ## Summary This PR adds a "Customized Elastic rule" badge to the Rule Details page. This badge is only displayed if a rule has `rule_source.is_customized` set to `true` and the feature flag is turned on. Tests for this feature will be added later under a separate ticket (https://github.com/elastic/kibana/issues/186916). ### Screenshots **Customized Elastic rule – has badge** <img width="827" alt="Scherm­afbeelding 2024-06-25 om 19 29 47" src="https://github.com/elastic/kibana/assets/15949146/be64271f-5f91-46a9-aa71-35594c788586"> **Custom rule – no badge** <img width="827" alt="Scherm­afbeelding 2024-06-25 om 19 29 02" src="https://github.com/elastic/kibana/assets/15949146/c576bf52-efde-46dd-88af-9fdf5f0b44ea"> --- .../model/rule_schema/index.ts | 1 + .../model/rule_schema/utils.ts | 12 +++++++ .../pages/rule_details/index.tsx | 8 +++-- .../customized_prebuilt_rule_badge.tsx | 35 +++++++++++++++++++ .../components/rule_details/translations.ts | 7 ++++ 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/utils.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/customized_prebuilt_rule_badge.tsx diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/index.ts index 5bb393c1fd419..4645be2d5e9dd 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/index.ts @@ -7,6 +7,7 @@ export * from './common_attributes.gen'; export * from './rule_schemas.gen'; +export * from './utils'; export * from './specific_attributes/eql_attributes.gen'; export * from './specific_attributes/ml_attributes.gen'; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/utils.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/utils.ts new file mode 100644 index 0000000000000..d7e51d5b7d091 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/utils.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 type { RuleResponse } from './rule_schemas.gen'; + +export function isCustomizedPrebuiltRule(rule: RuleResponse): boolean { + return rule.rule_source?.type === 'external' && rule.rule_source.is_customized; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx index da80b8ff6d015..71ae7791fab0d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx @@ -139,6 +139,7 @@ import { RuleSnoozeBadge } from '../../../rule_management/components/rule_snooze import { useBoolState } from '../../../../common/hooks/use_bool_state'; import { RuleDefinitionSection } from '../../../rule_management/components/rule_details/rule_definition_section'; import { RuleScheduleSection } from '../../../rule_management/components/rule_details/rule_schedule_section'; +import { CustomizedPrebuiltRuleBadge } from '../../../rule_management/components/rule_details/customized_prebuilt_rule_badge'; import { ManualRuleRunModal } from '../../../rule_gaps/components/manual_rule_run'; import { useManualRuleRunConfirmation } from '../../../rule_gaps/components/manual_rule_run/use_manual_rule_run_confirmation'; // eslint-disable-next-line no-restricted-imports @@ -592,15 +593,16 @@ const RuleDetailsPageComponent: React.FC<DetectionEngineComponentProps> = ({ border subtitle={subTitle} subtitle2={ - <> - <EuiFlexGroup gutterSize="xs" alignItems="center" justifyContent="flexStart"> + <EuiFlexGroup gutterSize="m" alignItems="center" justifyContent="flexStart"> + <CustomizedPrebuiltRuleBadge rule={rule} /> + <EuiFlexGroup alignItems="center" gutterSize="xs"> <EuiFlexItem grow={false}> {ruleStatusI18n.STATUS} {':'} </EuiFlexItem> {ruleStatusInfo} </EuiFlexGroup> - </> + </EuiFlexGroup> } title={title} badgeOptions={badgeOptions} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/customized_prebuilt_rule_badge.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/customized_prebuilt_rule_badge.tsx new file mode 100644 index 0000000000000..56a559a91794a --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/customized_prebuilt_rule_badge.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBadge } from '@elastic/eui'; +import * as i18n from './translations'; +import { isCustomizedPrebuiltRule } from '../../../../../common/api/detection_engine'; +import type { RuleResponse } from '../../../../../common/api/detection_engine'; +import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; + +interface CustomizedPrebuiltRuleBadgeProps { + rule: RuleResponse | null; +} + +export const CustomizedPrebuiltRuleBadge: React.FC<CustomizedPrebuiltRuleBadgeProps> = ({ + rule, +}) => { + const isPrebuiltRulesCustomizationEnabled = useIsExperimentalFeatureEnabled( + 'prebuiltRulesCustomizationEnabled' + ); + + if (!isPrebuiltRulesCustomizationEnabled) { + return null; + } + + if (rule === null || !isCustomizedPrebuiltRule(rule)) { + return null; + } + + return <EuiBadge color="hollow">{i18n.CUSTOMIZED_PREBUILT_RULE_LABEL}</EuiBadge>; +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/translations.ts index 3e75677d54da9..a5fab42457e44 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/translations.ts @@ -349,3 +349,10 @@ export const MAX_SIGNALS_FIELD_LABEL = i18n.translate( defaultMessage: 'Max alerts per run', } ); + +export const CUSTOMIZED_PREBUILT_RULE_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.customizedPrebuiltRuleLabel', + { + defaultMessage: 'Customized Elastic rule', + } +); From 8f5533d1661649047f2574d8993023ecaf49f8e2 Mon Sep 17 00:00:00 2001 From: Lisa Cawley <lcawley@elastic.co> Date: Wed, 26 Jun 2024 07:58:55 -0700 Subject: [PATCH 27/40] [DOCS] Release notes for 8.14.2 (#186920) --- docs/CHANGELOG.asciidoc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 3e18a1445ff4c..cafc1b6d78ce5 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -10,6 +10,7 @@ Review important information about the {kib} 8.x releases. +* <<release-notes-8.14.2>> * <<release-notes-8.14.1>> * <<release-notes-8.14.0>> * <<release-notes-8.13.4>> @@ -67,6 +68,25 @@ Review important information about the {kib} 8.x releases. * <<release-notes-8.0.0-alpha1>> -- + +[[release-notes-8.14.2]] +== {kib} 8.14.2 + +The 8.14.2 release includes the following bug fixes. + +[float] +[[fixes-v8.14.2]] +=== Bug Fixes + +Alerting:: +* Rule runs recovered actions without ever running active actions ({kibana-pull}183646[#183646]). +Fleet:: +* Updates health_check endpoint to accept hosts ids ({kibana-pull}185014[#185014]). +Machine Learning:: +* AIOps Log Rate Analysis: Fixes text field selection ({kibana-pull}186176[#186176]). +Presentation:: +* Fixes PresentationPanelError component throwing when error.message is empty string ({kibana-pull}186098[#186098]). + [[release-notes-8.14.1]] == {kib} 8.14.1 From cc80e9573be2af0a20207ef6df24e752af6d83c9 Mon Sep 17 00:00:00 2001 From: Pablo Machado <pablo.nevesmachado@elastic.co> Date: Wed, 26 Jun 2024 17:02:02 +0200 Subject: [PATCH 28/40] [Security Solution] Fix flaky risk engine upgrade cypress test (#186975) ## Summary I took a quick look at the test. It asserts that the risk score table inside the dashboard page will show no data after an upgrade. But it still shows one row of data, and the test fails. All the failures show the same data inside the table. `user:test` and `host:siem-kibana` which are common test values If the test logic is correct, there are 2 possibilities: 1. A previous test populated the risk-score index and didn't clean it up. 2. A previous test or the rule created on the before hook populates the `alerts` index and the risk engine init populates the `risk-score` index with that alert score. If we clean the alerts and ensure that no rule creates more alerts, the test should pass. flaky test runner: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6407 --- .../entity_analytics/dashboards/upgrade_risk_score.cy.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts index 518980c29c908..ee229539c8dbd 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { getNewRule } from '../../../objects/rule'; import { UPGRADE_RISK_SCORE_BUTTON, USERS_TABLE, @@ -23,7 +22,6 @@ import { } from '../../../tasks/api_calls/risk_scores'; import { clickUpgradeRiskScore } from '../../../tasks/risk_scores'; -import { createRule } from '../../../tasks/api_calls/rules'; import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; @@ -32,15 +30,15 @@ import { RiskScoreEntity } from '../../../tasks/risk_scores/common'; import { ENTITY_ANALYTICS_URL } from '../../../urls/navigation'; import { upgradeRiskEngine } from '../../../tasks/entity_analytics'; import { deleteRiskEngineConfiguration } from '../../../tasks/api_calls/risk_engine'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; const spaceId = 'default'; -// Failing: See https://github.com/elastic/kibana/issues/185024 -describe.skip('Upgrade risk scores', { tags: ['@ess'] }, () => { +describe('Upgrade risk scores', { tags: ['@ess'] }, () => { beforeEach(() => { login(); deleteRiskEngineConfiguration(); - createRule(getNewRule({ rule_id: 'rule1' })); + deleteAlertsAndRules(); }); describe('show upgrade risk button', () => { From fdef7704944aa96689a7b460a8388e9d6f0d282c Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet <nicolas.chaulet@elastic.co> Date: Wed, 26 Jun 2024 11:04:33 -0400 Subject: [PATCH 29/40] [Fleet] Fix use read only context (#186861) --- .../sections/agent_policy/edit_package_policy_page/index.tsx | 2 +- .../applications/integrations/hooks/use_read_only_context.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index 15928ab8bc133..53e7f2688ef79 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -130,7 +130,7 @@ export const EditPackagePolicyForm = memo<{ }); const canWriteIntegrationPolicies = useAuthz().integrations.writeIntegrationPolicies; - useSetIsReadOnly(canWriteIntegrationPolicies); + useSetIsReadOnly(!canWriteIntegrationPolicies); const newSecrets = useMemo(() => { if (!packageInfo) { return []; diff --git a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_read_only_context.tsx b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_read_only_context.tsx index a1cc117cea673..fd30ef4b85090 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_read_only_context.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_read_only_context.tsx @@ -33,7 +33,7 @@ export function useIsReadOnly() { export function useSetIsReadOnly(isReadOnly: boolean) { const context = useContext(ReadOnlyContext); useEffect(() => { - context.setIsReadOnly(true); + context.setIsReadOnly(isReadOnly); return () => context.setIsReadOnly(false); - }, [context]); + }, [context, isReadOnly]); } From 1dee2872f3c611c19178face6be8e9367d3780b2 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet <pierre.gayvallet@elastic.co> Date: Wed, 26 Jun 2024 17:29:15 +0200 Subject: [PATCH 30/40] Bump `@elastic/elasticsearch` to `8.14.0` (reloaded) (#186848) ## Summary Reopening https://github.com/elastic/kibana/pull/186326 with my account, non-internal PRs are just terrible to work with --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Tiago Costa <tiago.costa@elastic.co> Co-authored-by: Aleh Zasypkin <aleh.zasypkin@elastic.co> --- package.json | 2 +- .../src/lib/apis/find.isolated.test.ts | 2 +- .../src/lib/apis/find.test.ts | 6 ++--- .../lib/repository.security_extension.test.ts | 8 +++--- .../src/create_or_update_data_stream.test.ts | 1 + .../components/result/result_metadata.ts | 2 +- .../common/data_views/data_view_lazy.ts | 1 - .../file_metadata_client/adapters/es_index.ts | 2 +- .../saved_objects/delete_unknown_types.ts | 2 +- .../apis/ui_metric/ui_metric.ts | 6 ++--- .../src/components/api_keys_api_client.ts | 25 +++++------------ .../lib/get_summarized_alerts_query.ts | 2 +- .../lib/create_concrete_write_index.test.ts | 1 + .../server/create_indices/create_indices.ts | 1 - .../anonymization_fields/helpers.ts | 3 ++- .../attack_discovery/transforms.ts | 3 ++- .../conversations/transforms.ts | 3 ++- .../knowledge_base/transforms.ts | 3 ++- .../prompts/helpers.ts | 3 ++- .../server/lib/crawler/fetch_crawlers.ts | 2 +- .../server/lib/stats/get_sync_jobs.ts | 2 +- .../agent_policies_to_agent_ids.ts | 2 +- .../server/services/agents/action_status.ts | 2 +- .../fleet/server/services/agents/helpers.ts | 2 +- .../server/services/artifacts/mappings.ts | 2 +- .../server/services/files/client_from_host.ts | 2 +- .../fleet/server/services/files/index.ts | 4 +-- .../security/uninstall_token_service/index.ts | 2 +- .../templates/register_add_policy_route.ts | 1 + .../register_update_route.ts | 1 - .../server/routes/api/templates/lib.ts | 1 + .../utils/transform_elastic_to_list_item.ts | 3 ++- .../register_jobs_monitoring_rule_type.ts | 2 ++ .../settings/agent_configuration/route.ts | 4 +-- .../server/templates/entities_template.ts | 2 -- .../log_entries/kibana_log_entries_adapter.ts | 2 +- .../public/hooks/use_fetch_alert_data.ts | 2 +- .../server/service/client/index.ts | 6 ++--- .../service/knowledge_base_service/index.ts | 4 +-- .../recall_from_connectors.ts | 2 +- .../hooks/use_simple_run_once_monitors.ts | 2 +- .../simple/simple_test_results.tsx | 2 +- .../lib/requests/get_last_successful_check.ts | 2 +- .../server/queries/get_journey_details.ts | 2 +- .../lib/requests/get_last_successful_check.ts | 2 +- .../osquery/public/results/results_table.tsx | 3 ++- .../server/lib/tasks/execute_report.ts | 8 +++--- .../server/alert_data_client/alerts_client.ts | 3 ++- .../resource_installer.test.ts | 1 + .../routes/deprecations/kibana_user_role.ts | 2 +- .../session_management/session_index.ts | 6 +++-- .../data_generators/fleet_agent_generator.ts | 3 ++- .../components/alerts_table/actions.tsx | 9 ++++--- .../cypress/support/response_actions.ts | 3 ++- .../sentinel_one_actions_client.ts | 6 +++-- .../endpoint/services/actions/utils/utils.ts | 15 +++++++---- .../migrations/create_migration_index.ts | 1 - .../rule_types/__mocks__/es_results.ts | 18 ++++++++++--- .../rule_types/esql/fetch_source_documents.ts | 3 ++- .../factories/utils/build_alert.test.ts | 1 + .../rule_types/factories/wrap_hits_factory.ts | 3 ++- .../enrich_signal_threat_matches.ts | 12 ++++++--- .../get_signals_map_from_threat_index.ts | 3 ++- .../threat_enrichment_factory.ts | 3 ++- .../indicator_match/threat_mapping/utils.ts | 3 ++- .../utils/wrap_suppressed_alerts.ts | 3 ++- .../factory/users/managed_details/index.ts | 3 ++- .../geo_containment/lib/get_shape_filters.ts | 2 +- .../server/monitoring/workload_statistics.ts | 2 ++ .../plugins/task_manager/server/task_store.ts | 4 +-- .../factory/helpers/build_ecs_objects.ts | 3 ++- .../factory/helpers/format_timeline_data.ts | 6 +++-- .../common/lib/get_moment/get_moment.ts | 2 +- .../alerts_as_data_conflicts.ts | 6 ++--- .../apis/ml/annotations/delete_annotations.ts | 6 ++--- .../apis/ml/annotations/update_annotations.ts | 8 +++--- .../common/lib/api/index.ts | 4 +-- .../tests/common/cases/delete_cases.ts | 2 +- .../tests/common/cases/migrations.ts | 4 +-- .../tests/common/cases/patch_cases.ts | 16 +++++------ .../tests/common/comments/delete_comment.ts | 2 +- .../tests/common/comments/delete_comments.ts | 2 +- .../tests/common/comments/post_comment.ts | 20 +++++++------- .../internal/bulk_create_attachments.ts | 20 +++++++------- .../apis/epm/custom_ingest_pipeline.ts | 2 +- .../apis/epm/final_pipeline.ts | 2 +- .../apis/epm/routing_rules.ts | 2 +- .../alert_status/alert_status.ts | 4 +-- .../alert_status/alert_status_ess.ts | 4 +-- .../set_alert_tags.ts | 8 +++--- .../assignments/assignments.ts | 18 ++++++------- .../assignments/assignments_ess.ts | 2 +- .../assignments/assignments_serverless.ts | 2 +- .../execution_logic/custom_query.ts | 2 +- .../execution_logic/eql_alert_suppression.ts | 2 +- .../execution_logic/esql_suppression.ts | 2 +- .../indicator_match_alert_suppression.ts | 2 +- .../new_terms_alert_suppression.ts | 2 +- .../threshold_alert_suppression.ts | 2 +- yarn.lock | 27 +++++++++++-------- 100 files changed, 243 insertions(+), 197 deletions(-) diff --git a/package.json b/package.json index 37f8acb87d2de..097c4af89a4f2 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@elastic/charts": "66.0.4", "@elastic/datemath": "5.0.3", "@elastic/ecs": "^8.11.1", - "@elastic/elasticsearch": "^8.13.1", + "@elastic/elasticsearch": "^8.14.0", "@elastic/ems-client": "8.5.1", "@elastic/eui": "95.1.0-backport.0", "@elastic/filesaver": "1.1.2", diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts index b2a30d24a7bee..a339025003062 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts @@ -22,7 +22,7 @@ const hitToSavedObject = (hit: estypes.SearchHit<any>): SavedObject => { const type = hit._source.type; return { type, - id: hit._id, + id: hit._id!, references: [], attributes: hit._source[type], }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts index 755d535b3bd2b..daf636aebb850 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts @@ -262,7 +262,7 @@ describe('find', () => { noNamespaceSearchResults.hits.hits.forEach((doc, i) => { expect(response.saved_objects[i]).toEqual({ - id: doc._id.replace(/(index-pattern|config|globalType)\:/, ''), + id: doc._id!.replace(/(index-pattern|config|globalType)\:/, ''), type: doc._source!.type, originId: doc._source!.originId, ...mockTimestampFields, @@ -293,7 +293,7 @@ describe('find', () => { namespacedSearchResults.hits.hits.forEach((doc, i) => { expect(response.saved_objects[i]).toEqual({ - id: doc._id.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), + id: doc._id!.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), type: doc._source!.type, originId: doc._source!.originId, ...mockTimestampFields, @@ -337,7 +337,7 @@ describe('find', () => { ); expectMigrationArgs({ type, - id: noNamespaceSearchResults.hits.hits[0]._id.replace( + id: noNamespaceSearchResults.hits.hits[0]._id!.replace( /(index-pattern|config|globalType)\:/, '' ), diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts index 74d0e85785e12..ef6d9bc2d6bc5 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts @@ -769,7 +769,7 @@ describe('SavedObjectsRepository Security Extension', () => { expect(result.saved_objects).toHaveLength(4); generatedResults.hits.hits.forEach((doc, i) => { expect(result.saved_objects[i]).toEqual({ - id: doc._id.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), + id: doc._id!.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), type: doc._source!.type, originId: doc._source!.originId, ...mockTimestampFields, @@ -825,7 +825,7 @@ describe('SavedObjectsRepository Security Extension', () => { generatedResults.hits.hits.forEach((doc, i) => { expect(result.saved_objects[i]).toEqual({ - id: doc._id.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), + id: doc._id!.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), type: doc._source!.type, originId: doc._source!.originId, ...mockTimestampFields, @@ -882,7 +882,7 @@ describe('SavedObjectsRepository Security Extension', () => { generatedResults.hits.hits.forEach((doc, i) => { expect(result.saved_objects[i]).toEqual({ - id: doc._id.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), + id: doc._id!.replace(/(foo-namespace\:)?(index-pattern|config|globalType)\:/, ''), type: doc._source!.type, originId: doc._source!.originId, ...mockTimestampFields, @@ -927,7 +927,7 @@ describe('SavedObjectsRepository Security Extension', () => { objects: generatedResults.hits.hits.map((obj) => { return { type: obj._source?.type, - id: obj._id.slice(obj._id.lastIndexOf(':') + 1), // find removes the space/type from the ID in the original raw doc + id: obj._id!.slice(obj._id!.lastIndexOf(':') + 1), // find removes the space/type from the ID in the original raw doc existingNamespaces: obj._source?.namespaces ?? obj._source?.namespace ? [obj._source?.namespace] : [], }; diff --git a/packages/kbn-data-stream-adapter/src/create_or_update_data_stream.test.ts b/packages/kbn-data-stream-adapter/src/create_or_update_data_stream.test.ts index cc587dcaebfad..29c2dc855326e 100644 --- a/packages/kbn-data-stream-adapter/src/create_or_update_data_stream.test.ts +++ b/packages/kbn-data-stream-adapter/src/create_or_update_data_stream.test.ts @@ -21,6 +21,7 @@ esClient.indices.putMapping.mockResolvedValue({ acknowledged: true }); esClient.indices.putSettings.mockResolvedValue({ acknowledged: true }); const simulateIndexTemplateResponse = { template: { mappings: { is_managed: true } } }; +// @ts-expect-error test data type mismatch esClient.indices.simulateIndexTemplate.mockResolvedValue(simulateIndexTemplateResponse); const name = 'test_data_stream'; diff --git a/packages/kbn-search-index-documents/components/result/result_metadata.ts b/packages/kbn-search-index-documents/components/result/result_metadata.ts index 629b09779a01b..51d7c74eadde8 100644 --- a/packages/kbn-search-index-documents/components/result/result_metadata.ts +++ b/packages/kbn-search-index-documents/components/result/result_metadata.ts @@ -33,6 +33,6 @@ export const resultTitle = (result: SearchHit): string | undefined => { }; export const resultMetaData = (result: SearchHit): MetaDataProps => ({ - id: result._id, + id: result._id!, title: resultTitle(result), }); diff --git a/src/plugins/data_views/common/data_views/data_view_lazy.ts b/src/plugins/data_views/common/data_views/data_view_lazy.ts index 0fbb7f2ae21e0..5bab48ff7b300 100644 --- a/src/plugins/data_views/common/data_views/data_view_lazy.ts +++ b/src/plugins/data_views/common/data_views/data_view_lazy.ts @@ -503,7 +503,6 @@ export class DataViewLazy extends AbstractDataView { } getRuntimeMappings(): estypes.MappingRuntimeFields { - // @ts-expect-error composite type is not yet supported by es client but it can be forced return this.runtimeFieldMap; } diff --git a/src/plugins/files/server/file_client/file_metadata_client/adapters/es_index.ts b/src/plugins/files/server/file_client/file_metadata_client/adapters/es_index.ts index 37f8d3ddd6791..3aed345e7692f 100644 --- a/src/plugins/files/server/file_client/file_metadata_client/adapters/es_index.ts +++ b/src/plugins/files/server/file_client/file_metadata_client/adapters/es_index.ts @@ -253,7 +253,7 @@ export class EsIndexFilesMetadataClient<M = unknown> implements FileMetadataClie return { total: (result.hits.total as SearchTotalHits).value, - files: result.hits.hits.map((r) => ({ id: r._id, metadata: r._source?.file! })), + files: result.hits.hits.map((r) => ({ id: r._id!, metadata: r._source?.file! })), }; } diff --git a/test/api_integration/apis/saved_objects/delete_unknown_types.ts b/test/api_integration/apis/saved_objects/delete_unknown_types.ts index f361199a8fdfa..5a821e6e609a9 100644 --- a/test/api_integration/apis/saved_objects/delete_unknown_types.ts +++ b/test/api_integration/apis/saved_objects/delete_unknown_types.ts @@ -48,7 +48,7 @@ export default function ({ getService }: FtrProviderContext) { id: hit._id, })) .sort((a, b) => { - return a.id > b.id ? 1 : -1; + return a.id! > b.id! ? 1 : -1; }); }; diff --git a/test/api_integration/apis/ui_metric/ui_metric.ts b/test/api_integration/apis/ui_metric/ui_metric.ts index 1c965d3533367..fe15c3d7f37be 100644 --- a/test/api_integration/apis/ui_metric/ui_metric.ts +++ b/test/api_integration/apis/ui_metric/ui_metric.ts @@ -51,7 +51,7 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); const response = await es.search({ index: '.kibana', q: 'type:ui-metric' }); - const ids = response.hits.hits.map(({ _id }: { _id: string }) => _id); + const ids = response.hits.hits.map(({ _id }: { _id?: string }) => _id!); expect(ids.includes('ui-metric:myApp:myEvent')).to.eql(true); }); @@ -76,7 +76,7 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); const response = await es.search({ index: '.kibana', q: 'type:ui-metric' }); - const ids = response.hits.hits.map(({ _id }: { _id: string }) => _id); + const ids = response.hits.hits.map(({ _id }: { _id?: string }) => _id!); expect(ids.includes('ui-metric:myApp:myEvent')).to.eql(true); expect(ids.includes(`ui-metric:myApp:${uniqueEventName}`)).to.eql(true); expect(ids.includes(`ui-metric:kibana-user_agent:${userAgentMetric.userAgent}`)).to.eql(true); @@ -103,7 +103,7 @@ export default function ({ getService }: FtrProviderContext) { } = await es.search<any>({ index: '.kibana', q: 'type:ui-metric' }); const countTypeEvent = hits.find( - (hit: { _id: string }) => hit._id === `ui-metric:myApp:${uniqueEventName}` + (hit: { _id?: string }) => hit._id! === `ui-metric:myApp:${uniqueEventName}` ); expect(countTypeEvent?._source['ui-metric'].count).to.eql(3); }); diff --git a/x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts b/x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts index b8341d0082496..30cc9f214ebf5 100644 --- a/x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts +++ b/x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts @@ -15,7 +15,12 @@ import type { UpdateAPIKeyResult, } from '@kbn/security-plugin-types-server'; -import type { ApiKeyToInvalidate, QueryApiKeyResult } from '@kbn/security-plugin-types-common'; +import type { + ApiKeyToInvalidate, + CategorizedApiKey, + QueryApiKeyResult, +} from '@kbn/security-plugin-types-common'; +import type { Criteria } from '@elastic/eui'; export type { CreateAPIKeyParams, CreateAPIKeyResult, UpdateAPIKeyParams, UpdateAPIKeyResult }; @@ -29,23 +34,7 @@ export interface InvalidateApiKeysResponse { errors: any[]; } -export interface QueryApiKeySortOptions { - field: - | 'id' - | 'type' - | 'name' - | 'username' - | 'realm' - | 'creation' - | 'metadata' - | 'role_descriptors' - | 'expiration' - | 'invalidated' - | 'limited_by' - | '_sort' - | 'expired'; - direction: 'asc' | 'desc'; -} +export type QueryApiKeySortOptions = Required<Criteria<CategorizedApiKey>>['sort']; export interface QueryApiKeyParams { query: QueryContainer; diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts b/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts index 2ae2962718748..e9e706331f360 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts @@ -417,7 +417,7 @@ const getHitsWithCount = <AlertData extends RuleAlertData>( const expandedSource = expandFlattenedAlert(formattedSource as object) as Alert & AlertData; return { - _id, + _id: _id!, _index, ...expandedSource, }; diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts b/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts index 8ffb73508e1d9..f8e2f8c089529 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts @@ -645,6 +645,7 @@ describe('createConcreteWriteIndex', () => { it(`should log and return when simulating updated mappings returns null`, async () => { clusterClient.indices.getAlias.mockImplementation(async () => GetAliasResponse); clusterClient.indices.getDataStream.mockImplementation(async () => GetDataStreamResponse); + // @ts-expect-error type mismatch: mappings cannot be null clusterClient.indices.simulateIndexTemplate.mockImplementationOnce(async () => ({ ...SimulateTemplateResponse, template: { ...SimulateTemplateResponse.template, mappings: null }, diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.ts b/x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.ts index 81366e8c07ffe..7a1f49e2ac01f 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.ts @@ -253,7 +253,6 @@ const updateIndexTemplate = async ( }, _meta, composed_of: composedOf.filter((ct) => ct !== STACK_COMPONENT_TEMPLATE_LOGS_SETTINGS), - // @ts-expect-error es client do not contains this yet ignore_missing_component_templates: composedOf.filter((templateName) => templateName.endsWith('@custom') ), diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/anonymization_fields/helpers.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/anonymization_fields/helpers.ts index 7ebfbcf023442..60375a918398c 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/anonymization_fields/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/anonymization_fields/helpers.ts @@ -53,7 +53,8 @@ export const transformESSearchToAnonymizationFields = ( anonymized: anonymizationFieldSchema.anonymized, updatedAt: anonymizationFieldSchema.updated_at, namespace: anonymizationFieldSchema.namespace, - id: hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: hit._id!, }; return anonymizationField; diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/attack_discovery/transforms.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/attack_discovery/transforms.ts index ce9035f66588f..d23757fd053d0 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/attack_discovery/transforms.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/attack_discovery/transforms.ts @@ -19,7 +19,8 @@ export const transformESSearchToAttackDiscovery = ( const adSchema = hit._source!; const ad: AttackDiscoveryResponse = { timestamp: adSchema['@timestamp'], - id: hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: hit._id!, backingIndex: hit._index, createdAt: adSchema.created_at, updatedAt: adSchema.updated_at, diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/transforms.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/transforms.ts index eb8df26625864..39798aeb2fd5e 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/transforms.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/transforms.ts @@ -81,7 +81,8 @@ export const transformESSearchToConversations = ( return acc; }, {}), namespace: conversationSchema.namespace, - id: hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: hit._id!, }; return conversation; diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/transforms.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/transforms.ts index f185c5ba8fdc2..475f9f880ee13 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/transforms.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/transforms.ts @@ -19,7 +19,8 @@ export const transformESSearchToKnowledgeBaseEntry = ( const kbEntrySchema = hit._source!; const kbEntry: KnowledgeBaseEntryResponse = { timestamp: kbEntrySchema['@timestamp'], - id: hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: hit._id!, createdAt: kbEntrySchema.created_at, createdBy: kbEntrySchema.created_by, updatedAt: kbEntrySchema.updated_at, diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/prompts/helpers.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/prompts/helpers.ts index 84e683121ae75..3a64dc8bb3252 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/prompts/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/prompts/helpers.ts @@ -62,7 +62,8 @@ export const transformESSearchToPrompts = ( isNewConversationDefault: promptSchema.is_new_conversation_default, updatedAt: promptSchema.updated_at, namespace: promptSchema.namespace, - id: hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: hit._id!, name: promptSchema.name, promptType: promptSchema.prompt_type, isShared: promptSchema.is_shared, diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts index b4766cf0d9d4b..519ddb60539ad 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts @@ -111,6 +111,6 @@ export const fetchCrawlerDocumentIdByIndexName = async ( query: { term: { index_name: indexName } }, _source: '_id', }); - const crawlerId = crawlerResult.hits.hits[0]?._id; + const crawlerId = crawlerResult.hits.hits[0]?._id!; return crawlerId; }; diff --git a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts index ffa8d7ab1892f..f0d0016158207 100644 --- a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts +++ b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts @@ -31,7 +31,7 @@ export const fetchSyncJobsStats = async ( scroll: '10s', stored_fields: [], }); - const ids = connectorIdsResult.hits.hits.map((hit) => hit._id); + const ids = connectorIdsResult.hits.hits.map((hit) => hit._id!); const orphanedJobsCountResponse = await client.asCurrentUser.count({ index: CONNECTORS_JOBS_INDEX, query: getOrphanedJobsCountQuery(ids, isCrawler), diff --git a/x-pack/plugins/fleet/server/services/agent_policies/agent_policies_to_agent_ids.ts b/x-pack/plugins/fleet/server/services/agent_policies/agent_policies_to_agent_ids.ts index 4410aa4494bb6..0586f924633b6 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/agent_policies_to_agent_ids.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/agent_policies_to_agent_ids.ts @@ -43,5 +43,5 @@ export const getAgentIdsForAgentPolicies = async ( }, }); - return res.hits.hits.map((hit) => hit._id); + return res.hits.hits.map((hit) => hit._id!); }; diff --git a/x-pack/plugins/fleet/server/services/agents/action_status.ts b/x-pack/plugins/fleet/server/services/agents/action_status.ts index 60716e23f9666..1435857ffe670 100644 --- a/x-pack/plugins/fleet/server/services/agents/action_status.ts +++ b/x-pack/plugins/fleet/server/services/agents/action_status.ts @@ -323,7 +323,7 @@ async function getHostNames(esClient: ElasticsearchClient, agentIds: string[]) { _source: ['local_metadata.host.name'], }); const hostNames = agentsRes.hits.hits.reduce((acc: { [key: string]: string }, curr) => { - acc[curr._id] = (curr._source as any).local_metadata.host.name; + acc[curr._id!] = (curr._source as any).local_metadata.host.name; return acc; }, {}); diff --git a/x-pack/plugins/fleet/server/services/agents/helpers.ts b/x-pack/plugins/fleet/server/services/agents/helpers.ts index 2ddad0c24abab..7433fa441953d 100644 --- a/x-pack/plugins/fleet/server/services/agents/helpers.ts +++ b/x-pack/plugins/fleet/server/services/agents/helpers.ts @@ -58,7 +58,7 @@ export function searchHitToAgent( })) : undefined; const agent: Agent = { - id: hit._id, + id: hit._id!, type: hit._source?.type!, namespaces: hit._source?.namespaces, active: hit._source?.active!, diff --git a/x-pack/plugins/fleet/server/services/artifacts/mappings.ts b/x-pack/plugins/fleet/server/services/artifacts/mappings.ts index 3645f957417e3..8d5382f1fb193 100644 --- a/x-pack/plugins/fleet/server/services/artifacts/mappings.ts +++ b/x-pack/plugins/fleet/server/services/artifacts/mappings.ts @@ -27,7 +27,7 @@ export const esSearchHitToArtifact = < }: T): Artifact => { return { ...attributesNotNeedingRename, - id, + id: id!, compressionAlgorithm, decodedSha256, decodedSize, diff --git a/x-pack/plugins/fleet/server/services/files/client_from_host.ts b/x-pack/plugins/fleet/server/services/files/client_from_host.ts index 4329743f92fbf..814d342ddd993 100644 --- a/x-pack/plugins/fleet/server/services/files/client_from_host.ts +++ b/x-pack/plugins/fleet/server/services/files/client_from_host.ts @@ -180,7 +180,7 @@ export class FleetFromHostFilesClient implements FleetFromHostFileClientInterfac } = fileDoc._source; const file: FleetFile = { - id: fileDoc._id, + id: fileDoc._id!, agents: [agentId], sha256: hash?.sha256 ?? '', created: new Date(created).toISOString(), diff --git a/x-pack/plugins/fleet/server/services/files/index.ts b/x-pack/plugins/fleet/server/services/files/index.ts index 203bc374b2bf1..c7a00ee597f62 100644 --- a/x-pack/plugins/fleet/server/services/files/index.ts +++ b/x-pack/plugins/fleet/server/services/files/index.ts @@ -78,12 +78,12 @@ export async function fileIdsWithoutChunksByIndex( ): Promise<{ fileIdsByIndex: FileIdsByIndex; allFileIds: Set<string> }> { const allFileIds: Set<string> = new Set(); const noChunkFileIdsByIndex = files.reduce((acc, file) => { - allFileIds.add(file._id); + allFileIds.add(file._id!); const { index: metadataIndex } = parseFileStorageIndex(file._index); const fileIds = acc[metadataIndex]; - acc[metadataIndex] = fileIds ? fileIds.add(file._id) : new Set([file._id]); + acc[metadataIndex] = fileIds ? fileIds.add(file._id!) : new Set([file._id!]); return acc; }, {} as FileIdsByIndex); diff --git a/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts b/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts index 211026bf6e487..4cb5aa1221db7 100644 --- a/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts +++ b/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts @@ -284,7 +284,7 @@ export class UninstallTokenService implements UninstallTokenServiceInterface { ? `${this.soClient.getCurrentNamespace()}:` : ''; return { - id: _id.replace(`${namespacePrefix}${UNINSTALL_TOKENS_SAVED_OBJECT_TYPE}:`, ''), + id: _id!.replace(`${namespacePrefix}${UNINSTALL_TOKENS_SAVED_OBJECT_TYPE}:`, ''), policy_id: policyId, policy_name: policyIdNameDictionary[policyId] ?? null, created_at: _source.created_at, diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_add_policy_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_add_policy_route.ts index 3f6b4ce843e89..ef119db413707 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_add_policy_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_add_policy_route.ts @@ -78,6 +78,7 @@ async function updateIndexTemplate( } if (isLegacy) { + // @ts-expect-error Types of property auto_expand_replicas are incompatible. return client.indices.putTemplate({ name: templateName, body: indexTemplate }); } // @ts-expect-error Type 'IndexSettings' is not assignable to type 'IndicesIndexSettings'. diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/register_update_route.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/register_update_route.ts index 65d939ef5f886..eb9fdb87d9a74 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/register_update_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/register_update_route.ts @@ -43,7 +43,6 @@ export const registerUpdateRoute = ({ template: template as estypes.IndicesIndexState, version, _meta, - // @ts-expect-error deprecated property is not yet part of the API types deprecated, }, }); diff --git a/x-pack/plugins/index_management/server/routes/api/templates/lib.ts b/x-pack/plugins/index_management/server/routes/api/templates/lib.ts index f900e76ac17f5..757ba6fd6da7f 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/lib.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/lib.ts @@ -55,6 +55,7 @@ export const saveTemplate = async ({ body: { index_patterns, version, + // @ts-expect-error Types of property auto_expand_replicas are incompatible. settings, mappings, aliases, diff --git a/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts b/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts index 46ac86a5c8aae..a41a78a6b8fed 100644 --- a/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts +++ b/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts @@ -61,7 +61,8 @@ export const transformElasticHitsToListItem = ({ created_at, created_by, deserializer, - id: _id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: _id!, list_id, // meta can be null if deleted (empty in PUT payload), since update_by_query set deleted values as null // return it as undefined to keep it consistent with payload diff --git a/x-pack/plugins/ml/server/lib/alerts/register_jobs_monitoring_rule_type.ts b/x-pack/plugins/ml/server/lib/alerts/register_jobs_monitoring_rule_type.ts index 6afb7dc38e88b..b311a637eb2d7 100644 --- a/x-pack/plugins/ml/server/lib/alerts/register_jobs_monitoring_rule_type.ts +++ b/x-pack/plugins/ml/server/lib/alerts/register_jobs_monitoring_rule_type.ts @@ -288,6 +288,7 @@ export function registerJobsMonitoringRuleType({ id: alertName, actionGroup: ANOMALY_DETECTION_JOB_REALTIME_ISSUE, context, + // @ts-expect-error type mismatch payload, }); }); @@ -301,6 +302,7 @@ export function registerJobsMonitoringRuleType({ alertsClient.setAlertData({ id: recoveredAlertId, context: testResult.context, + // @ts-expect-error type mismatch payload: testResult.payload, }); } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts index 08bc47c44822a..1b3787e285eef 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/settings/agent_configuration/route.ts @@ -130,7 +130,7 @@ const deleteAgentConfigurationRoute = createApmServerRoute({ logger.info(`Deleting config ${service.name}/${service.environment} (${exactConfig.id})`); const deleteConfigurationResult = await deleteConfiguration({ - configurationId: exactConfig.id, + configurationId: exactConfig.id!, internalESClient, }); @@ -266,7 +266,7 @@ const agentConfigurationSearchRoute = createApmServerRoute({ if (willMarkAsApplied) { await markAppliedByAgent({ - id: configuration._id, + id: configuration._id!, body: configuration._source, internalESClient, }); diff --git a/x-pack/plugins/observability_solution/entity_manager/server/templates/entities_template.ts b/x-pack/plugins/observability_solution/entity_manager/server/templates/entities_template.ts index f7d66a0b2a731..d728edcf01418 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/templates/entities_template.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/templates/entities_template.ts @@ -41,10 +41,8 @@ export const entitiesIndexTemplateConfig: IndicesPutIndexTemplateRequest = { { entity_metrics: { mapping: { - // @ts-expect-error this should work per: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html#match-mapping-type type: '{dynamic_type}', }, - // @ts-expect-error this should work per: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html#match-mapping-type match_mapping_type: ['long', 'double'], path_match: 'entity.metrics.*', }, diff --git a/x-pack/plugins/observability_solution/logs_shared/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts b/x-pack/plugins/observability_solution/logs_shared/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts index e4eed9b61d349..a6ce92ad25126 100644 --- a/x-pack/plugins/observability_solution/logs_shared/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts +++ b/x-pack/plugins/observability_solution/logs_shared/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts @@ -225,7 +225,7 @@ function mapHitsToLogEntryDocuments(hits: SortedSearchHit[], fields: string[]): ); return { - id: hit._id, + id: hit._id!, index: hit._index, cursor: { time: hit.sort[0], tiebreaker: hit.sort[1] }, fields: logFields, diff --git a/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_data.ts b/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_data.ts index ce1a5ed10a8e0..b9254a979a53c 100644 --- a/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_data.ts +++ b/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_data.ts @@ -63,7 +63,7 @@ const getAlertsGroupedById = ( return data.hits.hits.reduce( (acc, { _id, _index, _source }) => ({ ...acc, - [_id]: { + [_id!]: { _id, _index, ..._source, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts index ad5aed727ff1b..139955742ef6e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts @@ -153,7 +153,7 @@ export class ObservabilityAIAssistantClient { } await this.dependencies.esClient.asInternalUser.delete({ - id: conversation._id, + id: conversation._id!, index: conversation._index, refresh: true, }); @@ -634,7 +634,7 @@ export class ObservabilityAIAssistantClient { ); await this.dependencies.esClient.asInternalUser.update({ - id: persistedConversation._id, + id: persistedConversation._id!, index: persistedConversation._index, doc: updatedConversation, refresh: true, @@ -663,7 +663,7 @@ export class ObservabilityAIAssistantClient { ); await this.dependencies.esClient.asInternalUser.update({ - id: document._id, + id: document._id!, index: document._index, doc: { conversation: { title } }, refresh: true, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts index c59e27d8c82a3..45330f9da2f2b 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts @@ -344,7 +344,7 @@ export class KnowledgeBaseService { return response.hits.hits.map((hit) => ({ ...hit._source!, score: hit._score!, - id: hit._id, + id: hit._id!, })); } @@ -515,7 +515,7 @@ export class KnowledgeBaseService { ...hit._source!, role: hit._source!.role ?? KnowledgeBaseEntryRole.UserEntry, score: hit._score, - id: hit._id, + id: hit._id!, })), }; } catch (error) { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_connectors.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_connectors.ts index e042a9422721e..34c8a6208d655 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_connectors.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/recall_from_connectors.ts @@ -89,7 +89,7 @@ export async function recallFromConnectors({ text: JSON.stringify(hit._source), score: hit._score!, is_correction: false, - id: hit._id, + id: hit._id!, })); return results; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_simple_run_once_monitors.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_simple_run_once_monitors.ts index cfa986a6426a3..4cc61d61688f4 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_simple_run_once_monitors.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_simple_run_once_monitors.ts @@ -70,7 +70,7 @@ export const useSimpleRunOnceMonitors = ({ // Whenever a new found document is fetched, update lastUpdated const docsChecksum = docs - .map(({ _id }: { _id: string }) => _id) + .map(({ _id }: { _id?: string }) => _id!) .reduce((acc, cur) => acc + cur, ''); if (docsChecksum !== lastUpdated.current.checksum) { // Mutating lastUpdated diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/simple/simple_test_results.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/simple/simple_test_results.tsx index a3f07d6cfbc14..9ebcc12af8192 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/simple/simple_test_results.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/simple/simple_test_results.tsx @@ -31,7 +31,7 @@ export function SimpleTestResults({ testRunId, expectPings, onDone }: Props) { ); return summaryDocs.map((updatedDoc) => ({ ...updatedDoc, - ...(prevById[updatedDoc.docId] ?? {}), + ...(prevById[updatedDoc.docId!] ?? {}), })); }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_last_successful_check.ts b/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_last_successful_check.ts index d90f694315015..d3f94a11cf2fa 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_last_successful_check.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_last_successful_check.ts @@ -105,6 +105,6 @@ export const getLastSuccessfulCheck = async ({ return { ...check, timestamp: check['@timestamp'], - docId: result.hits.hits[0]._id, + docId: result.hits.hits[0]._id!, }; }; diff --git a/x-pack/plugins/observability_solution/synthetics/server/queries/get_journey_details.ts b/x-pack/plugins/observability_solution/synthetics/server/queries/get_journey_details.ts index bc60f32046ed1..a5288a20dad74 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/queries/get_journey_details.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/queries/get_journey_details.ts @@ -165,7 +165,7 @@ export const getJourneyDetails = async ({ return { timestamp: journeySource['@timestamp'], - journey: { ...journeySource, _id: foundJourney._id }, + journey: { ...journeySource, _id: foundJourney._id! }, ...(summaryPing && 'state' in summaryPing && summaryPing.state ? { summary: { diff --git a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/requests/get_last_successful_check.ts b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/requests/get_last_successful_check.ts index 99a75c28bf566..2b11d46bca3fb 100644 --- a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/requests/get_last_successful_check.ts +++ b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/requests/get_last_successful_check.ts @@ -101,6 +101,6 @@ export const getLastSuccessfulCheck: UMElasticsearchQueryFn< return { ...check, timestamp: check['@timestamp'], - docId: result.hits.hits[0]._id, + docId: result.hits.hits[0]._id!, }; }; diff --git a/x-pack/plugins/osquery/public/results/results_table.tsx b/x-pack/plugins/osquery/public/results/results_table.tsx index 48a3e7f355a18..dfb0d5dad88a4 100644 --- a/x-pack/plugins/osquery/public/results/results_table.tsx +++ b/x-pack/plugins/osquery/public/results/results_table.tsx @@ -342,7 +342,8 @@ const ResultsTableComponent: React.FC<ResultsTableComponentProps> = ({ }; const eventId = data[visibleRowIndex]?._id; - return <AddToTimelineButton field="_id" value={eventId} isIcon={true} />; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return <AddToTimelineButton field="_id" value={eventId!} isIcon={true} />; }, }, ]; diff --git a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts index 598055cb175d1..46dea6d8b1190 100644 --- a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts +++ b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts @@ -241,8 +241,8 @@ export class ExecuteReportTask implements ReportingTask { eventTracker?.claimJob({ timeSinceCreation }); const resp = await store.setReportClaimed(claimedReport, doc); - claimedReport._seq_no = resp._seq_no; - claimedReport._primary_term = resp._primary_term; + claimedReport._seq_no = resp._seq_no!; + claimedReport._primary_term = resp._primary_term!; return claimedReport; } @@ -366,8 +366,8 @@ export class ExecuteReportTask implements ReportingTask { const resp = await store.setReportCompleted(report, doc); this.logger.info(`Saved ${report.jobtype} job ${docId}`); - report._seq_no = resp._seq_no; - report._primary_term = resp._primary_term; + report._seq_no = resp._seq_no!; + report._primary_term = resp._primary_term!; // event tracking of completed job const eventTracker = this.getEventTracker(report); diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts index 0c449d4f4126a..e45bbecf93cec 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts @@ -344,7 +344,8 @@ export class AlertsClient { throw Boom.badData(errorMessage); } - if (result?.hits?.hits != null && result?.hits.hits.length > 0) { + if (result?.hits.hits.length > 0) { + // @ts-expect-error type mismatch: SearchHit._id is optional await this.ensureAllAuthorized(result.hits.hits, operation); result?.hits.hits.map((item) => diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts index f2cbe8ef5aeb7..335ab73dd8fe6 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts @@ -567,6 +567,7 @@ describe('resourceInstaller', () => { it('gracefully fails on empty mappings', async () => { const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); + // @ts-expect-error wrong response type mockClusterClient.indices.simulateIndexTemplate.mockImplementation(async () => ({})); const { installer, indexInfo, logger } = setup(mockClusterClient); diff --git a/x-pack/plugins/security/server/routes/deprecations/kibana_user_role.ts b/x-pack/plugins/security/server/routes/deprecations/kibana_user_role.ts index 2df81edf2d75b..e7c2e06abbb8e 100644 --- a/x-pack/plugins/security/server/routes/deprecations/kibana_user_role.ts +++ b/x-pack/plugins/security/server/routes/deprecations/kibana_user_role.ts @@ -114,7 +114,7 @@ export function defineKibanaUserRoleDeprecationRoutes({ router, logger }: RouteD } for (const [mappingNameToUpdate, mappingToUpdate] of roleMappingsWithKibanaUserRole) { - const roles = mappingToUpdate.roles.filter((role) => role !== KIBANA_USER_ROLE_NAME); + const roles = mappingToUpdate.roles?.filter((role) => role !== KIBANA_USER_ROLE_NAME) ?? []; if (!roles.includes(KIBANA_ADMIN_ROLE_NAME)) { roles.push(KIBANA_ADMIN_ROLE_NAME); } diff --git a/x-pack/plugins/security/server/session_management/session_index.ts b/x-pack/plugins/security/server/session_management/session_index.ts index 32c5206c6eeb9..9f11e9224243c 100644 --- a/x-pack/plugins/security/server/session_management/session_index.ts +++ b/x-pack/plugins/security/server/session_management/session_index.ts @@ -487,7 +487,7 @@ export class SessionIndex { for await (const sessionValues of this.getSessionValuesInBatches()) { const operations = sessionValues.map(({ _id, _source }) => { const { usernameHash, provider } = _source!; - auditLogger.log(sessionCleanupEvent({ sessionId: _id, usernameHash, provider })); + auditLogger.log(sessionCleanupEvent({ sessionId: _id!, usernameHash, provider })); return { delete: { _id } }; }); @@ -1029,7 +1029,9 @@ export class SessionIndex { return []; } - return response.hits?.hits?.map((hit) => ({ sid: hit._id, ...sessionGroups[index] })) ?? []; + return ( + response.hits?.hits?.map((hit) => ({ sid: hit._id!, ...sessionGroups[index] })) ?? [] + ); } ); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts index 62fa05d794725..43463b0336b58 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts @@ -65,7 +65,8 @@ export class FleetAgentGenerator extends BaseDataGenerator<Agent> { // Casting here is needed because several of the attributes in `FleetServerAgent` are // defined as optional, but required in `Agent` type. ...(hit._source as Agent), - id: hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: hit._id!, policy_revision: hit._source?.policy_revision_idx, access_api_key: undefined, status: this.randomAgentStatus(), diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx index 7a3ed25b8084e..c1465be7e67e0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx @@ -471,7 +471,8 @@ const createThresholdTimeline = async ( ...acc, { ...formatAlertToEcsSignal(_source), - _id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + _id: _id!, _index, timestamp: _source['@timestamp'], }, @@ -629,7 +630,8 @@ const createNewTermsTimeline = async ( ...acc, { ...formatAlertToEcsSignal(_source), - _id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + _id: _id!, _index, timestamp: _source['@timestamp'], }, @@ -795,7 +797,8 @@ const createSuppressedTimeline = async ( ...acc, { ...formatAlertToEcsSignal(_source), - _id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + _id: _id!, _index, timestamp: _source['@timestamp'], }, diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/response_actions.ts b/x-pack/plugins/security_solution/public/management/cypress/support/response_actions.ts index d0d9befddd6a1..1f4619695978d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/response_actions.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/response_actions.ts @@ -54,7 +54,8 @@ export const responseActionTasks = ( data: tamperedDataString, }, }; - return updateActionDoc(esClient, newActionDoc._id, tamperedDoc); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return updateActionDoc(esClient, newActionDoc._id!, tamperedDoc); }, }); }; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts index be612c3f2864d..470bb8f4d4914 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts @@ -792,7 +792,8 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl { if (isolateActivityResponseDoc && isolateActivityResponseDoc._source) { const s1ActivityData = isolateActivityResponseDoc._source.sentinel_one.activity; - const elasticDocId = isolateActivityResponseDoc._id; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const elasticDocId = isolateActivityResponseDoc._id!; const s1AgentId = s1ActivityData.agent.id; const activityLogEntryId = s1ActivityData.id; const activityLogEntryType = s1ActivityData.type; @@ -987,7 +988,8 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl { error, meta: { activityLogEntryId, - elasticDocId: s1Hit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + elasticDocId: s1Hit._id!, downloadUrl, createdAt: s1ActivityDoc?.sentinel_one.activity.updated_at ?? '', filename: s1ActivityDoc?.sentinel_one.activity.data.flattened.filename ?? '', diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.ts index cd7680d3bd3ac..f5087b18e03d6 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/utils/utils.ts @@ -487,11 +487,13 @@ export const categorizeResponseResults = ({ return isResponseDoc ? { type: ActivityLogItemTypes.RESPONSE, - item: { id: e._id, data: e._source as LogsEndpointActionResponse }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + item: { id: e._id!, data: e._source as LogsEndpointActionResponse }, } : { type: ActivityLogItemTypes.FLEET_RESPONSE, - item: { id: e._id, data: e._source as EndpointActionResponse }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + item: { id: e._id!, data: e._source as EndpointActionResponse }, }; }) : []; @@ -511,11 +513,13 @@ export const categorizeActionResults = ({ return isActionDoc ? { type: ActivityLogItemTypes.ACTION, - item: { id: e._id, data: e._source as LogsEndpointAction }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + item: { id: e._id!, data: e._source as LogsEndpointAction }, } : { type: ActivityLogItemTypes.FLEET_ACTION, - item: { id: e._id, data: e._source as EndpointAction }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + item: { id: e._id!, data: e._source as EndpointAction }, }; }) : []; @@ -530,7 +534,8 @@ export const formatEndpointActionResults = ( ? results?.map((e) => { return { type: ActivityLogItemTypes.ACTION, - item: { id: e._id, data: e._source as LogsEndpointAction }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + item: { id: e._id!, data: e._source as LogsEndpointAction }, }; }) : []; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/create_migration_index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/create_migration_index.ts index fb27d2dfd71aa..30e4eb0b4e276 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/create_migration_index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/migrations/create_migration_index.ts @@ -37,7 +37,6 @@ export const createMigrationIndex = async ({ body: { settings: { index: { - // @ts-expect-error `name` is required on IndicesIndexSettingsLifecycle lifecycle: { indexing_complete: true, }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts index 8d134ad215396..57892d65da35f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/es_results.ts @@ -121,7 +121,10 @@ export const sampleDocWithSortId = ( export const sampleDocNoSortId = ( someUuid: string = sampleIdGuid, ip?: string -): SignalSourceHit & { _source: Required<SignalSourceHit>['_source'] } => ({ +): SignalSourceHit & { + _source: Required<SignalSourceHit>['_source']; + _id: Required<SignalSourceHit>['_id']; +} => ({ _index: 'myFakeSignalIndex', _score: 100, _version: 1, @@ -144,7 +147,10 @@ export const sampleDocNoSortId = ( export const sampleAlertDocNoSortId = ( someUuid: string = sampleIdGuid, ip?: string -): SignalSourceHit & { _source: Required<SignalSourceHit>['_source'] } => ({ +): SignalSourceHit & { + _id: Required<SignalSourceHit>['_id']; + _source: Required<SignalSourceHit>['_source']; +} => ({ ...sampleDocNoSortId(someUuid, ip), _source: { event: { @@ -173,7 +179,10 @@ export const sampleAlertDocNoSortId = ( export const sampleAlertDocAADNoSortId = ( someUuid: string = sampleIdGuid, ip?: string -): AlertSourceHit & { _source: Required<AlertSourceHit>['_source'] } => ({ +): AlertSourceHit & { + _id: Required<AlertSourceHit>['_id']; + _source: Required<AlertSourceHit>['_source']; +} => ({ _index: 'myFakeSignalIndex', _score: 100, _version: 1, @@ -337,6 +346,7 @@ export const sampleDocNoSortIdWithTimestamp = ( someUuid: string = sampleIdGuid, ip?: string ): SignalSourceHit & { + _id: Required<SignalSourceHit>['_id']; _source: Required<SignalSourceHit>['_source'] & { '@timestamp': string }; } => { const doc = sampleDocNoSortId(someUuid, ip); @@ -353,6 +363,7 @@ export const sampleAlertDocNoSortIdWithTimestamp = ( someUuid: string = sampleIdGuid, ip?: string ): SignalSourceHit & { + _id: Required<SignalSourceHit>['_id']; _source: Required<SignalSourceHit>['_source'] & { '@timestamp': string }; } => { const doc = sampleAlertDocNoSortId(someUuid, ip); @@ -369,6 +380,7 @@ export const sampleAlertDocAADNoSortIdWithTimestamp = ( someUuid: string = sampleIdGuid, ip?: string ): AlertSourceHit & { + _id: Required<AlertSourceHit>['_id']; _source: Required<AlertSourceHit>['_source'] & { '@timestamp': string }; } => { const doc = sampleAlertDocAADNoSortId(someUuid, ip); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/fetch_source_documents.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/fetch_source_documents.ts index 204953552a329..13828c0ed6770 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/fetch_source_documents.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/fetch_source_documents.ts @@ -59,7 +59,8 @@ export const fetchSourceDocuments = async ({ return response.hits.hits.reduce<Record<string, { fields: estypes.SearchHit['fields'] }>>( (acc, hit) => { - acc[hit._id] = { fields: hit.fields }; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + acc[hit._id!] = { fields: hit.fields }; return acc; }, {} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.test.ts index 4cf64c60de22e..ffb5f6ee45170 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_alert.test.ts @@ -47,6 +47,7 @@ import { import { getCompleteRuleMock, getQueryRuleParams } from '../../../rule_schema/mocks'; type SignalDoc = SignalSourceHit & { + _id: Required<SignalSourceHit>['_id']; _source: Required<SignalSourceHit>['_source'] & { [TIMESTAMP]: string }; }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/wrap_hits_factory.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/wrap_hits_factory.ts index 4e7c72f7dbf50..6b21ed226c165 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/wrap_hits_factory.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/wrap_hits_factory.ts @@ -45,7 +45,8 @@ export const wrapHitsFactory = const wrappedDocs = events.map((event): WrappedFieldsLatest<BaseFieldsLatest> => { const id = generateId( event._index, - event._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + event._id!, String(event._version), `${spaceId}:${completeRule.alertId}` ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/enrich_signal_threat_matches.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/enrich_signal_threat_matches.ts index 303b7fa9eebfe..8f98eab1a93e9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/enrich_signal_threat_matches.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/enrich_signal_threat_matches.ts @@ -13,7 +13,8 @@ import type { ThreatEnrichment, ThreatListItem, ThreatMatchNamedQuery } from './ export const MAX_NUMBER_OF_SIGNAL_MATCHES = 200; -const getSignalId = (signal: SignalSourceHit): string => signal._id; +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +const getSignalId = (signal: SignalSourceHit): string => signal._id!; export const groupAndMergeSignalMatches = (signalHits: SignalSourceHit[]): SignalSourceHit[] => { const dedupedHitsMap = signalHits.reduce<Record<string, SignalSourceHit>>((acc, signalHit) => { @@ -84,7 +85,8 @@ const enrichSignalWithThreatMatches = ( // new issues. const existingEnrichmentValue = get(signalHit._source, 'threat.enrichments') ?? []; const existingEnrichments = [existingEnrichmentValue].flat(); // ensure enrichments is an array - const newEnrichmentsWithoutAtomic = enrichmentsWithoutAtomic[signalHit._id] ?? []; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const newEnrichmentsWithoutAtomic = enrichmentsWithoutAtomic[signalHit._id!] ?? []; const newEnrichments = newEnrichmentsWithoutAtomic.map((enrichment) => ({ ...enrichment, matched: { @@ -124,9 +126,11 @@ export const enrichSignalThreatMatchesFromSignalsMap = async ( const enrichmentsWithoutAtomic: Record<string, ThreatEnrichment[]> = {}; uniqueHits.forEach((hit) => { - enrichmentsWithoutAtomic[hit._id] = buildEnrichments({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + enrichmentsWithoutAtomic[hit._id!] = buildEnrichments({ indicatorPath, - queries: signalsMap.get(hit._id) ?? [], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + queries: signalsMap.get(hit._id!) ?? [], threats: matchedThreats, }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/get_signals_map_from_threat_index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/get_signals_map_from_threat_index.ts index 7d0f49b548f37..309516a57335c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/get_signals_map_from_threat_index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/get_signals_map_from_threat_index.ts @@ -66,7 +66,8 @@ export async function getSignalsQueryMapFromThreatIndex( const signalMatch = signalsQueryMap.get(signalId); const threatQuery = { - id: threatHit._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: threatHit._id!, index: threatHit._index, field: decodedQuery.field, value: decodedQuery.value, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/threat_enrichment_factory.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/threat_enrichment_factory.ts index 1bf61512135e0..df1b0080d3bef 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/threat_enrichment_factory.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/threat_enrichment_factory.ts @@ -30,7 +30,8 @@ export const threatEnrichmentFactory = ({ const threatEnrichment = (signals: SignalSourceHit[]): Promise<SignalSourceHit[]> => { const getThreats = async () => { const threatIds = signals - .map((s) => s._id) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + .map((s) => s._id!) .reduce<string[]>((acc, id) => { return [ ...new Set([ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/utils.ts index 2c1f74e99e925..da72d121c371c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/utils.ts @@ -243,7 +243,8 @@ export const getSignalValueMap = ({ if (!acc[field][fieldValue]) { acc[field][fieldValue] = []; } - acc[field][fieldValue].push(event._id); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + acc[field][fieldValue].push(event._id!); }); return acc; }, {}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts index 3268c78dd8ab3..89328f176567d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts @@ -62,7 +62,8 @@ export const wrapSuppressedAlerts = ({ const id = generateId( event._index, - event._id, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + event._id!, String(event._version), `${spaceId}:${completeRule.alertId}` ); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/users/managed_details/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/users/managed_details/index.ts index c46d3bd027873..ede67662e2398 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/users/managed_details/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/users/managed_details/index.ts @@ -15,6 +15,7 @@ import { buildManagedUserDetailsQuery } from './query.managed_user_details.dsl'; import type { UsersQueries } from '../../../../../../common/search_strategy/security_solution/users'; import type { + ManagedUserHit, ManagedUserHits, ManagedUserDetailsStrategyResponse, ManagedUserFields, @@ -43,7 +44,7 @@ export const managedUserDetails: SecuritySolutionFactory<UsersQueries.managedDet ); const managedUsers = buckets.reduce<ManagedUserHits>((acc, bucket) => { - acc[bucket.key] = bucket.latest_hit.hits.hits[0]; + acc[bucket.key] = bucket.latest_hit.hits.hits[0] as ManagedUserHit; return acc; }, {}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts index 54931a524d4e6..e2626b565dcda 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts @@ -92,7 +92,7 @@ export async function getShapeFilters( const filters: Record<string, unknown> = {}; const shapesIdsNamesMap: Record<string, unknown> = {}; for (let i = 0; i < hits.length; i++) { - const boundaryHit: BoundaryHit = hits[i]; + const boundaryHit = hits[i] as BoundaryHit; filters[boundaryHit._id] = { geo_shape: { [geoField]: { diff --git a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts index 9fa41b0c45665..6c372ce0fc453 100644 --- a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts +++ b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts @@ -173,7 +173,9 @@ export function createWorkloadAggregator( field: 'task.runAt', ranges: [ { + // @ts-expect-error type regression introduced by https://github.com/elastic/elasticsearch-specification/pull/2552 from: `now`, + // @ts-expect-error type regression introduced by https://github.com/elastic/elasticsearch-specification/pull/2552 to: `now+${asInterval(scheduleDensityBuckets * pollInterval)}`, }, ], diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts index 3cc50a05259a5..b922d10ee5cf1 100644 --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -504,9 +504,9 @@ export class TaskStore { for (const task of tasks) { if (task._seq_no == null || task._primary_term == null) continue; - const esId = task._id.startsWith('task:') ? task._id.slice(5) : task._id; + const esId = task._id!.startsWith('task:') ? task._id!.slice(5) : task._id!; versionMap.set(esId, { - esId: task._id, + esId: task._id!, seqNo: task._seq_no, primaryTerm: task._primary_term, }); diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.ts index 0f24be8526d05..3b9891e79d9ab 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.ts @@ -27,6 +27,7 @@ export const buildEcsObjects = (hit: EventHit): Ecs => { } return acc; }, - { _id: hit._id, timestamp: getTimestamp(hit), _index: hit._index } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + { _id: hit._id!, timestamp: getTimestamp(hit), _index: hit._index } ); }; diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.ts index 6899222946fb3..f56cfd32391d4 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.ts @@ -22,9 +22,11 @@ export const formatTimelineData = async ( uniq([...ecsFields, ...dataFields]).reduce<Promise<TimelineEdges>>( async (acc, fieldName) => { const flattenedFields: TimelineEdges = await acc; - flattenedFields.node._id = hit._id; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + flattenedFields.node._id = hit._id!; flattenedFields.node._index = hit._index; - flattenedFields.node.ecs._id = hit._id; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + flattenedFields.node.ecs._id = hit._id!; flattenedFields.node.ecs.timestamp = getTimestamp(hit); flattenedFields.node.ecs._index = hit._index; if (hit.sort && hit.sort.length > 1) { diff --git a/x-pack/plugins/watcher/common/lib/get_moment/get_moment.ts b/x-pack/plugins/watcher/common/lib/get_moment/get_moment.ts index c47443dd66773..39f8222fb4e8b 100644 --- a/x-pack/plugins/watcher/common/lib/get_moment/get_moment.ts +++ b/x-pack/plugins/watcher/common/lib/get_moment/get_moment.ts @@ -7,7 +7,7 @@ import moment from 'moment'; -export function getMoment(date?: string | number | null) { +export function getMoment(date?: string | number | null | Date) { if (!date) { return null; } diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts index 95132afc0122c..8d75c66905b3a 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts @@ -99,7 +99,7 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F await esTestIndexTool.waitForDocs(source, 'rule-starting-2'); log(`ad-hoc update the alert doc`); - await adHocUpdate(es, aadIndex, initialDocs[0]._id); + await adHocUpdate(es, aadIndex, initialDocs[0]._id!); log(`signal the rule to finish`); await esTestIndexTool.indexDoc(source, 'rule-complete-2'); @@ -157,8 +157,8 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F await esTestIndexTool.waitForDocs(source, 'rule-starting-2'); log(`ad-hoc update the 2nd and 4th alert docs`); - await adHocUpdate(es, aadIndex, initialDocs[1]._id); - await adHocUpdate(es, aadIndex, initialDocs[3]._id); + await adHocUpdate(es, aadIndex, initialDocs[1]._id!); + await adHocUpdate(es, aadIndex, initialDocs[3]._id!); log(`signal the rule to finish`); await esTestIndexTool.indexDoc(source, 'rule-complete-2'); diff --git a/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts b/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts index 421d59d3d7b50..1c23805e264d1 100644 --- a/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts +++ b/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts @@ -39,7 +39,7 @@ export default ({ getService }: FtrProviderContext) => { const annotationsForJob = await ml.api.getAnnotations(jobIds[0]); expect(annotationsForJob).to.have.length(1); - const annotationIdToDelete = annotationsForJob[0]._id; + const annotationIdToDelete = annotationsForJob[0]._id!; const { body, status } = await supertest .delete(`/internal/ml/annotations/delete/${annotationIdToDelete}`) @@ -57,7 +57,7 @@ export default ({ getService }: FtrProviderContext) => { const annotationsForJob = await ml.api.getAnnotations(jobIds[1]); expect(annotationsForJob).to.have.length(1); - const annotationIdToDelete = annotationsForJob[0]._id; + const annotationIdToDelete = annotationsForJob[0]._id!; const { body, status } = await supertest .delete(`/internal/ml/annotations/delete/${annotationIdToDelete}`) @@ -75,7 +75,7 @@ export default ({ getService }: FtrProviderContext) => { const annotationsForJob = await ml.api.getAnnotations(jobIds[2]); expect(annotationsForJob).to.have.length(1); - const annotationIdToDelete = annotationsForJob[0]._id; + const annotationIdToDelete = annotationsForJob[0]._id!; const { body, status } = await supertest .delete(`/internal/ml/annotations/delete/${annotationIdToDelete}`) diff --git a/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts b/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts index dd7ff75374490..6b7c437eb77ca 100644 --- a/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts +++ b/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts @@ -69,7 +69,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body._id).to.eql(originalAnnotation._id); expect(body.result).to.eql('updated'); - const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id); + const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id!); if (updatedAnnotation) { Object.keys(commonAnnotationUpdateRequestBody).forEach((key) => { @@ -100,7 +100,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body._id).to.eql(originalAnnotation._id); expect(body.result).to.eql('updated'); - const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id); + const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id!); if (updatedAnnotation) { Object.keys(commonAnnotationUpdateRequestBody).forEach((key) => { const field = key as keyof Annotation; @@ -131,7 +131,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body.error).to.eql('Forbidden'); expect(body.message).to.eql('Forbidden'); - const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id); + const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id!); expect(updatedAnnotation).to.eql(originalAnnotation._source); }); @@ -157,7 +157,7 @@ export default ({ getService }: FtrProviderContext) => { .send(annotationUpdateRequestBodyWithMissingFields); ml.api.assertResponseStatusCode(200, status, body); - const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id); + const updatedAnnotation = await ml.api.getAnnotationById(originalAnnotation._id!); if (updatedAnnotation) { Object.keys(annotationUpdateRequestBodyWithMissingFields).forEach((key) => { if (key !== '_id') { diff --git a/x-pack/test/cases_api_integration/common/lib/api/index.ts b/x-pack/test/cases_api_integration/common/lib/api/index.ts index 6582601f0f1a9..d9aeafe6c7bf2 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/index.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/index.ts @@ -107,9 +107,9 @@ export const getSignalsWithES = async ({ return signals.body.hits.hits.reduce((acc, hit) => { let indexMap = acc.get(hit._index); if (indexMap === undefined) { - indexMap = new Map<string, estypes.SearchHit<SignalHit>>([[hit._id, hit]]); + indexMap = new Map<string, estypes.SearchHit<SignalHit>>([[hit._id!, hit]]); } else { - indexMap.set(hit._id, hit); + indexMap.set(hit._id!, hit); } acc.set(hit._index, indexMap); return acc; diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts index ef0e09f1a477d..fbfa4354683a5 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts @@ -262,7 +262,7 @@ export default ({ getService }: FtrProviderContext): void => { await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); await createAlertsIndex(supertest, log); const signals = await createSecuritySolutionAlerts(supertest, log, 2); - alerts = [signals.hits.hits[0], signals.hits.hits[1]]; + alerts = [signals.hits.hits[0] as Alerts[number], signals.hits.hits[1] as Alerts[number]]; }); afterEach(async () => { diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts index 723646a1763e6..0a3bd5ab1519d 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts @@ -569,7 +569,7 @@ export default function createGetTests({ getService }: FtrProviderContext) { const casesFromES = await getCaseSavedObjectsFromES({ es }); for (const hit of casesFromES.body.hits.hits) { - const caseID = hit._id; + const caseID = hit._id!; expect(expectedSeverityValues[caseID]).not.to.be(undefined); expect(hit._source?.cases.severity).to.eql(expectedSeverityValues[caseID]); } @@ -588,7 +588,7 @@ export default function createGetTests({ getService }: FtrProviderContext) { const casesFromES = await getCaseSavedObjectsFromES({ es }); for (const hit of casesFromES.body.hits.hits) { - const caseID = hit._id; + const caseID = hit._id!; expect(expectedStatusValues[caseID]).not.to.be(undefined); expect(hit._source?.cases.status).to.eql(expectedStatusValues[caseID]); } diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts index 07349749f0a2a..07cb4cee269bb 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts @@ -1742,7 +1742,7 @@ export default ({ getService }: FtrProviderContext): void => { supertest, caseId: postedCase.id, params: { - alertId: alert._id, + alertId: alert._id!, index: alert._index, rule: { id: 'id', @@ -1774,7 +1774,7 @@ export default ({ getService }: FtrProviderContext): void => { const { body: updatedAlert } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQueryAlertIds([alert._id])) + .send(getQueryAlertIds([alert._id!])) .expect(200); expect(updatedAlert.hits.hits[0]._source?.['kibana.alert.workflow_status']).eql( @@ -1805,7 +1805,7 @@ export default ({ getService }: FtrProviderContext): void => { supertest, caseId: postedCase.id, params: { - alertId: alert._id, + alertId: alert._id!, index: alert._index, type: AttachmentType.alert, rule: { @@ -1832,7 +1832,7 @@ export default ({ getService }: FtrProviderContext): void => { const { body: updatedAlert } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQueryAlertIds([alert._id])) + .send(getQueryAlertIds([alert._id!])) .expect(200); expect(updatedAlert.hits.hits[0]._source?.['kibana.alert.workflow_status']).eql('open'); @@ -1861,7 +1861,7 @@ export default ({ getService }: FtrProviderContext): void => { supertest, caseId: postedCase.id, params: { - alertId: alert._id, + alertId: alert._id!, index: alert._index, rule: { id: 'id', @@ -1906,7 +1906,7 @@ export default ({ getService }: FtrProviderContext): void => { const { body: updatedAlert } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQueryAlertIds([alert._id])) + .send(getQueryAlertIds([alert._id!])) .expect(200); expect(updatedAlert.hits.hits[0]._source?.['kibana.alert.workflow_status']).eql( @@ -1933,7 +1933,7 @@ export default ({ getService }: FtrProviderContext): void => { supertest, caseId: postedCase.id, params: { - alertId: alert._id, + alertId: alert._id!, index: alert._index, type: AttachmentType.alert, rule: { @@ -1975,7 +1975,7 @@ export default ({ getService }: FtrProviderContext): void => { const { body: updatedAlert } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQueryAlertIds([alert._id])) + .send(getQueryAlertIds([alert._id!])) .expect(200); expect(updatedAlert.hits.hits[0]._source['kibana.alert.workflow_status']).eql('open'); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comment.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comment.ts index 6a7426dd95104..8f78bad67249b 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comment.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comment.ts @@ -127,7 +127,7 @@ export default ({ getService }: FtrProviderContext): void => { await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); await createAlertsIndex(supertest, log); const signals = await createSecuritySolutionAlerts(supertest, log, 2); - alerts = [signals.hits.hits[0], signals.hits.hits[1]]; + alerts = [signals.hits.hits[0] as Alerts[number], signals.hits.hits[1] as Alerts[number]]; }); afterEach(async () => { diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comments.ts index 3a73f14aca9b0..5607a8d61e6c8 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/delete_comments.ts @@ -129,7 +129,7 @@ export default ({ getService }: FtrProviderContext): void => { await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); await createAlertsIndex(supertest, log); const signals = await createSecuritySolutionAlerts(supertest, log, 2); - alerts = [signals.hits.hits[0], signals.hits.hits[1]]; + alerts = [signals.hits.hits[0] as Alerts[number], signals.hits.hits[1] as Alerts[number]]; }); afterEach(async () => { diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts index 1d2f58fed13f3..a9689575fb524 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts @@ -632,13 +632,13 @@ export default ({ getService }: FtrProviderContext): void => { await createCommentAndRefreshIndex({ caseId: postedCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, expectedHttpCode: attachmentExpectedHttpCode, auth: attachmentAuth, }); - const updatedAlert = await getSecuritySolutionAlerts(supertest, [alert._id]); + const updatedAlert = await getSecuritySolutionAlerts(supertest, [alert._id!]); expect(updatedAlert.hits.hits[0]._source?.[ALERT_WORKFLOW_STATUS]).eql( expectedAlertStatus @@ -661,12 +661,12 @@ export default ({ getService }: FtrProviderContext): void => { for (const theCase of cases) { await createCommentAndRefreshIndex({ caseId: theCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, }); } - const updatedAlert = await getSecuritySolutionAlerts(supertest, [alert._id]); + const updatedAlert = await getSecuritySolutionAlerts(supertest, [alert._id!]); const caseIds = cases.map((theCase) => theCase.id); expect(updatedAlert.hits.hits[0]._source?.[ALERT_CASE_IDS]).eql(caseIds); @@ -741,11 +741,11 @@ export default ({ getService }: FtrProviderContext): void => { await createCommentAndRefreshIndex({ caseId: postedCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, }); - const updatedAlertSecondTime = await getSecuritySolutionAlerts(supertest, [alert._id]); + const updatedAlertSecondTime = await getSecuritySolutionAlerts(supertest, [alert._id!]); expect(updatedAlertSecondTime.hits.hits[0]._source?.[ALERT_CASE_IDS]).eql([ postedCase.id, ]); @@ -762,7 +762,7 @@ export default ({ getService }: FtrProviderContext): void => { await createCommentAndRefreshIndex({ caseId: postedCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, expectedHttpCode: 400, }); @@ -784,7 +784,7 @@ export default ({ getService }: FtrProviderContext): void => { await createCommentAndRefreshIndex({ caseId: postedCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, expectedHttpCode: 200, auth: { user: secOnlyReadAlerts, space: 'space1' }, @@ -807,7 +807,7 @@ export default ({ getService }: FtrProviderContext): void => { await createCommentAndRefreshIndex({ caseId: postedCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, expectedHttpCode: 403, auth: { user: obsSec, space: 'space1' }, @@ -830,7 +830,7 @@ export default ({ getService }: FtrProviderContext): void => { await createCommentAndRefreshIndex({ caseId: postedCase.id, - alertId: alert._id, + alertId: alert._id!, alertIndex: alert._index, expectedHttpCode: 200, auth: { user: secSolutionOnlyReadNoIndexAlerts, space: 'space1' }, diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts index 1e460515e9f84..7a2cce01af0dd 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts @@ -883,12 +883,12 @@ export default ({ getService }: FtrProviderContext): void => { expect(alert._source?.[ALERT_WORKFLOW_STATUS]).eql('open'); alerts.push({ - id: alert._id, + id: alert._id!, index: alert._index, }); indices.push(alert._index); - ids.push(alert._id); + ids.push(alert._id!); }); await bulkCreateAttachmentsAndRefreshIndex({ @@ -921,13 +921,13 @@ export default ({ getService }: FtrProviderContext): void => { for (const theCase of cases) { await bulkCreateAttachmentsAndRefreshIndex({ caseId: theCase.id, - alerts: [{ id: alert._id, index: alert._index }], + alerts: [{ id: alert._id!, index: alert._index }], }); } await es.indices.refresh({ index: alert._index }); - const updatedAlert = await getSecuritySolutionAlerts(supertest, [alert._id]); + const updatedAlert = await getSecuritySolutionAlerts(supertest, [alert._id!]); const caseIds = cases.map((theCase) => theCase.id); expect(updatedAlert.hits.hits[0]._source?.[ALERT_CASE_IDS]).eql(caseIds); @@ -1002,10 +1002,10 @@ export default ({ getService }: FtrProviderContext): void => { await bulkCreateAttachmentsAndRefreshIndex({ caseId: postedCase.id, - alerts: [{ id: alert._id, index: alert._index }], + alerts: [{ id: alert._id!, index: alert._index }], }); - const updatedAlertSecondTime = await getSecuritySolutionAlerts(supertest, [alert._id]); + const updatedAlertSecondTime = await getSecuritySolutionAlerts(supertest, [alert._id!]); expect(updatedAlertSecondTime.hits.hits[0]._source?.[ALERT_CASE_IDS]).eql([ postedCase.id, ]); @@ -1022,7 +1022,7 @@ export default ({ getService }: FtrProviderContext): void => { await bulkCreateAttachmentsAndRefreshIndex({ caseId: postedCase.id, - alerts: [{ id: alert._id, index: alert._index }], + alerts: [{ id: alert._id!, index: alert._index }], expectedHttpCode: 400, }); }); @@ -1043,7 +1043,7 @@ export default ({ getService }: FtrProviderContext): void => { await bulkCreateAttachmentsAndRefreshIndex({ caseId: postedCase.id, - alerts: [{ id: alert._id, index: alert._index }], + alerts: [{ id: alert._id!, index: alert._index }], expectedHttpCode: 200, auth: { user: secOnlyReadAlerts, space: 'space1' }, }); @@ -1065,7 +1065,7 @@ export default ({ getService }: FtrProviderContext): void => { await bulkCreateAttachmentsAndRefreshIndex({ caseId: postedCase.id, - alerts: [{ id: alert._id, index: alert._index }], + alerts: [{ id: alert._id!, index: alert._index }], expectedHttpCode: 403, auth: { user: obsSec, space: 'space1' }, }); @@ -1087,7 +1087,7 @@ export default ({ getService }: FtrProviderContext): void => { await bulkCreateAttachmentsAndRefreshIndex({ caseId: postedCase.id, - alerts: [{ id: alert._id, index: alert._index }], + alerts: [{ id: alert._id!, index: alert._index }], expectedHttpCode: 200, auth: { user: secSolutionOnlyReadNoIndexAlerts, space: 'space1' }, }); diff --git a/x-pack/test/fleet_api_integration/apis/epm/custom_ingest_pipeline.ts b/x-pack/test/fleet_api_integration/apis/epm/custom_ingest_pipeline.ts index 6c93e3e6eb14d..93476c0d252fc 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/custom_ingest_pipeline.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/custom_ingest_pipeline.ts @@ -55,7 +55,7 @@ export default function (providerContext: FtrProviderContext) { for (const hit of res.hits.hits) { await es.delete({ - id: hit._id, + id: hit._id!, index: hit._index, }); } diff --git a/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts b/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts index 0aedab4496616..e5cf4c241767a 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts @@ -69,7 +69,7 @@ export default function (providerContext: FtrProviderContext) { for (const hit of res.hits.hits) { await es.delete({ - id: hit._id, + id: hit._id!, index: hit._index, }); } diff --git a/x-pack/test/fleet_api_integration/apis/epm/routing_rules.ts b/x-pack/test/fleet_api_integration/apis/epm/routing_rules.ts index c030913bfbcb6..33ef065ee7d49 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/routing_rules.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/routing_rules.ts @@ -56,7 +56,7 @@ export default function (providerContext: FtrProviderContext) { for (const hit of res.hits.hits) { await es.delete({ - id: hit._id, + id: hit._id!, index: hit._index, }); } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status.ts index 0f9f863161e35..1a26ae97e3817 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status.ts @@ -152,7 +152,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alertsOpen = await getAlertsByIds(supertest, log, [id]); - const alertIds = alertsOpen.hits.hits.map((alert) => alert._id); + const alertIds = alertsOpen.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_SIGNALS_STATUS_URL) @@ -182,7 +182,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alertsOpen = await getAlertsByIds(supertest, log, [id]); - const alertIds = alertsOpen.hits.hits.map((alert) => alert._id); + const alertIds = alertsOpen.hits.hits.map((alert) => alert._id!); // set all of the alerts to the state of closed. There is no reason to use a waitUntil here // as this route intentionally has a waitFor within it and should only return when the query has diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status_ess.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status_ess.ts index 1b25b5b499e9c..9541badc5e6de 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status_ess.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/alert_status/alert_status_ess.ts @@ -97,7 +97,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alertsOpen = await getAlertsByIds(supertest, log, [id]); - const alertIds = alertsOpen.hits.hits.map((alert) => alert._id); + const alertIds = alertsOpen.hits.hits.map((alert) => alert._id!); // set all of the alerts to the state of closed. There is no reason to use a waitUntil here // as this route intentionally has a waitFor within it and should only return when the query has @@ -141,7 +141,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 1, [id]); const alertsOpen = await getAlertsByIds(supertest, log, [id]); - const alertIds = alertsOpen.hits.hits.map((alert) => alert._id); + const alertIds = alertsOpen.hits.hits.map((alert) => alert._id!); // Try to set all of the alerts to the state of closed. // This should not be possible with the given user. diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts index 961150d0908c2..f3a0206a58abf 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/set_alert_tags.ts @@ -99,7 +99,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_TAGS_URL) @@ -133,7 +133,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_TAGS_URL) @@ -179,7 +179,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_TAGS_URL) @@ -225,7 +225,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_TAGS_URL) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts index 0a2e64df60534..b445c6f81f99c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments.ts @@ -118,7 +118,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); const alertId = alertIds[0]; await supertest @@ -153,7 +153,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_ASSIGNEES_URL) @@ -190,7 +190,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); const alertId = alertIds[0]; // Assign users @@ -242,7 +242,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); // Assign users await supertest @@ -293,7 +293,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_ASSIGNEES_URL) @@ -330,7 +330,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_ASSIGNEES_URL) @@ -376,7 +376,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_ASSIGNEES_URL) @@ -425,7 +425,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_ASSIGNEES_URL) @@ -474,7 +474,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERT_ASSIGNEES_URL) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_ess.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_ess.ts index 3ec8bbf7bdbfc..569934bea4985 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_ess.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_ess.ts @@ -65,7 +65,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); const userAndRole = ROLES.reader; await createUserAndRole(getService, userAndRole); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts index 7282f0f7f7dcc..1cb5121069f23 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/trial_license_complete_tier/assignments/assignments_serverless.ts @@ -63,7 +63,7 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccess({ supertest, log, id }); await waitForAlertsToBePresent(supertest, log, 10, [id]); const alerts = await getAlertsByIds(supertest, log, [id]); - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); // Try to set all of the alerts to the state of closed. // This should not be possible with the given user. 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 e2009873d4af6..692f986e6e6a6 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 @@ -951,7 +951,7 @@ export default ({ getService }: FtrProviderContext) => { // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERTS_STATUS_URL) .set('kbn-xsrf', 'true') diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts index b0a0e3f8b66ba..33ece3e69cb8c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts @@ -210,7 +210,7 @@ export default ({ getService }: FtrProviderContext) => { // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERTS_STATUS_URL) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts index 39724206cfab3..90fd1463f15dd 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts @@ -210,7 +210,7 @@ export default ({ getService }: FtrProviderContext) => { expect(alerts.hits.hits).toHaveLength(1); // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERTS_STATUS_URL) .set('kbn-xsrf', 'true') 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/indicator_match_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts index 1868fbdef1555..833a54cd9042a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts @@ -326,7 +326,7 @@ export default ({ getService }: FtrProviderContext) => { // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERTS_STATUS_URL) .set('kbn-xsrf', 'true') 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/new_terms_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts index 4a2644a9737a6..11bda2226c786 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts @@ -231,7 +231,7 @@ export default ({ getService }: FtrProviderContext) => { expect(alerts.hits.hits).toHaveLength(1); // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERTS_STATUS_URL) .set('kbn-xsrf', 'true') 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/threshold_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts index d97bd0d517314..85e0bd504fb36 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts @@ -193,7 +193,7 @@ export default ({ getService }: FtrProviderContext) => { // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. - const alertIds = alerts.hits.hits.map((alert) => alert._id); + const alertIds = alerts.hits.hits.map((alert) => alert._id!); await supertest .post(DETECTION_ENGINE_ALERTS_STATUS_URL) .set('kbn-xsrf', 'true') diff --git a/yarn.lock b/yarn.lock index b7ca9a8e6eda0..7006daff3273e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1715,12 +1715,12 @@ "@elastic/transport" "^8.3.1" tslib "^2.4.0" -"@elastic/elasticsearch@^8.13.1": - version "8.13.1" - resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-8.13.1.tgz#0fbe8318cf7f21c599165bb901277428639d57ec" - integrity sha512-2G4Vu6OHw4+XTrp7AGIcOEezpPEoVrWg2JTK1v/exEKSLYquZkUdd+m4yOL3/UZ6bTj7hmXwrmYzW76BnLCkJQ== +"@elastic/elasticsearch@^8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-8.14.0.tgz#93b1f2a7cb6cc5cd1ceebf5060576bc690432e0a" + integrity sha512-MGrgCI4y+Ozssf5Q2IkVJlqt5bUMnKIICG2qxeOfrJNrVugMCBCAQypyesmSSocAtNm8IX3LxfJ3jQlFHmKe2w== dependencies: - "@elastic/transport" "~8.4.1" + "@elastic/transport" "^8.6.0" tslib "^2.4.0" "@elastic/ems-client@8.5.1": @@ -1895,17 +1895,17 @@ undici "^5.21.2" yaml "^2.2.2" -"@elastic/transport@^8.3.1", "@elastic/transport@~8.4.1": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-8.4.1.tgz#f98c5a5e2156bcb3f01170b4aca7e7de4d8b61b8" - integrity sha512-/SXVuVnuU5b4dq8OFY4izG+dmGla185PcoqgK6+AJMpmOeY1QYVNbWtCwvSvoAANN5D/wV+EBU8+x7Vf9EphbA== +"@elastic/transport@^8.3.1", "@elastic/transport@^8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-8.6.0.tgz#8de9794c87eb0fd2bdb2c6c1e32792aeb06b32bc" + integrity sha512-/Ucpztrc+urZK8yCtFBUu2LePYJNnukgZSUUApUzGH/SxejqkH526Nph7aru8I0vZwdW5wqgCHSOIq3J7tIxGg== dependencies: debug "^4.3.4" hpagent "^1.0.0" ms "^2.1.3" secure-json-parse "^2.4.0" tslib "^2.4.0" - undici "^5.22.1" + undici "^6.12.0" "@emotion/babel-plugin-jsx-pragmatic@^0.2.1": version "0.2.1" @@ -30672,13 +30672,18 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@^5.21.2, undici@^5.22.1: +undici@^5.21.2: version "5.28.4" resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== dependencies: "@fastify/busboy" "^2.0.0" +undici@^6.12.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.0.tgz#99f6e7ab4e4116dbbedf4e734e8c267f926f20a4" + integrity sha512-9gGwbSLgYMjp4r6M5P9bhqhx1E+RyUIHqZE0r7BmrRoqroJUG6xlVu5TXH9DnwmCPLkcaVNrcYtxUE9d3InnyQ== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" From bd401f60ed9c74f0a88a4f93c190233224c9ac30 Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" <joey.poon@elastic.co> Date: Wed, 26 Jun 2024 08:30:43 -0700 Subject: [PATCH 31/40] [Security Solution] only meter endpoints that are billable (#186580) ## Summary Updates the endpoint metering task to only grab heartbeats if `billable: true` or if `billable` doesn't exist (for backwards compatibility). ### 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 - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### 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) --- .../data_loaders/index_endpoint_hearbeats.ts | 38 +++++++++++++++++-- .../endpoint/services/metering_service.ts | 34 +++++++++++++++-- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hearbeats.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hearbeats.ts index 552dc6e0efc27..10a3af979a125 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hearbeats.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hearbeats.ts @@ -19,6 +19,18 @@ export interface DeletedEndpointHeartbeats { data: estypes.BulkResponse; } +interface EndpointHeartbeat { + '@timestamp': string; + agent: { + id: string; + }; + event: { + agent_id_status: string; + ingested: string; + }; + billable?: boolean; +} + export const indexEndpointHeartbeats = async ( esClient: Client, log: ToolingLog, @@ -27,10 +39,10 @@ export const indexEndpointHeartbeats = async ( log.debug(`Indexing ${count} endpoint heartbeats`); const startTime = new Date(); - const docs = Array.from({ length: count }).map((_, i) => { + const docs: EndpointHeartbeat[] = Array.from({ length: count }).map((_, i) => { const ingested = new Date(startTime.getTime() + i).toISOString(); - return { + const heartbeatDoc: EndpointHeartbeat = { '@timestamp': '2024-06-11T13:03:37Z', agent: { id: `agent-${i}`, @@ -40,9 +52,29 @@ export const indexEndpointHeartbeats = async ( ingested, }, }; + // billable: true and missing billable are billed + if (i % 2) { + heartbeatDoc.billable = true; + } + return heartbeatDoc; }); - const operations = docs.flatMap((doc) => [ + // billable: false are not billed + const invalidDocs: EndpointHeartbeat[] = [ + { + '@timestamp': '2024-06-11T13:03:37Z', + agent: { + id: 'agent-billable-false', + }, + event: { + agent_id_status: 'auth_metadata_missing', + ingested: new Date().toISOString(), + }, + billable: false, + }, + ]; + + const operations = docs.concat(invalidDocs).flatMap((doc) => [ { index: { _index: ENDPOINT_HEARTBEAT_INDEX, diff --git a/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts b/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts index f3401a25db190..2d253633b7231 100644 --- a/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts +++ b/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts @@ -87,14 +87,40 @@ export class EndpointMeteringService { sort: 'event.ingested', size: METERING_SERVICE_BATCH_SIZE, query: { - range: { - 'event.ingested': { - gt: since.toISOString(), + bool: { + must: { + range: { + 'event.ingested': { + gt: since.toISOString(), + }, + }, }, + should: [ + { + term: { + billable: true, + }, + }, + { + bool: { + must_not: [ + { + exists: { + field: 'billable', + }, + }, + ], + }, + }, + ], + minimum_should_match: 1, }, }, }, - { signal: abortController.signal, ignore: [404] } + { + signal: abortController.signal, + ignore: [404], + } ); } From 650983a41f1a13c1af401e129e24bec5190c5dd0 Mon Sep 17 00:00:00 2001 From: Alexey Antonov <alexwizp@gmail.com> Date: Wed, 26 Jun 2024 18:35:42 +0300 Subject: [PATCH 32/40] fix: [Obs AIOps > Notifications][SCREEN READER]: Table rows need TH[scope="row"] for SR usability: 0004 (#186966) Closes: https://github.com/elastic/observability-dev/issues/3541 ## Summary `rowHeader` attribute was added for the following table <img width="1441" alt="image" src="https://github.com/elastic/kibana/assets/20072247/6e059ca5-d757-40c2-82fb-a262233a7bfc"> --- .../application/notifications/components/notifications_list.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx index cb2f64c69050b..0cfb482fda7f7 100644 --- a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx +++ b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx @@ -397,6 +397,7 @@ export const NotificationsList: FC = () => { <EuiBasicTable<NotificationItem> columns={columns} + rowHeader="timestamp" items={itemsPerPage} itemId={'id'} loading={isLoading} From d4011ae6550b2ecb951ccc5aaf84d83da8a5da8f Mon Sep 17 00:00:00 2001 From: Brad White <Ikuni17@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:08:04 -0600 Subject: [PATCH 33/40] [CI] Switch to prod FIPS image (#186939) ## Summary The FIPS image has been promoted to `prod` project so use it instead of `qa`. --- .buildkite/pipeline-utils/agent_images.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/pipeline-utils/agent_images.ts b/.buildkite/pipeline-utils/agent_images.ts index 0d1c2f859b0a1..0606f036b1c64 100644 --- a/.buildkite/pipeline-utils/agent_images.ts +++ b/.buildkite/pipeline-utils/agent_images.ts @@ -20,7 +20,7 @@ const DEFAULT_AGENT_IMAGE_CONFIG: AgentImageConfig = { const FIPS_AGENT_IMAGE_CONFIG: AgentImageConfig = { provider: 'gcp', image: 'family/kibana-fips-ubuntu-2004', - imageProject: 'elastic-images-qa', + imageProject: 'elastic-images-prod', }; const GITHUB_PR_LABELS = process.env.GITHUB_PR_LABELS ?? ''; From a46ea29bbd72a4ba02e692abd853014bd9e0cb3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= <alejandro.haro@elastic.co> Date: Wed, 26 Jun 2024 18:08:57 +0200 Subject: [PATCH 34/40] chore(launchdarkly): Update renovate rule (#186979) --- renovate.json | 1 - 1 file changed, 1 deletion(-) diff --git a/renovate.json b/renovate.json index f0995502bb1bc..f519bef463c01 100644 --- a/renovate.json +++ b/renovate.json @@ -50,7 +50,6 @@ "reviewers": ["team:kibana-security", "team:kibana-core"], "matchBaseBranches": ["main"], "labels": ["release_note:skip", "Team:Security", "Team:Core", "backport:prev-minor"], - "prCreation": "not-pending", "minimumReleaseAge": "7 days", "enabled": true }, From cf47eb5aa8004a553a4f05d8e7d19d656c2cf933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= <soren.louv@elastic.co> Date: Wed, 26 Jun 2024 18:17:58 +0200 Subject: [PATCH 35/40] [Obs AI Assistant] Fix flaky e2e test (contextual insights for APM errors) (#184642) Closes https://github.com/elastic/kibana/issues/184071 https://github.com/elastic/kibana/issues/184029 Fixes flaky e2e tests - set static `error.grouping_key`. This required a small change in synthtrace. - retry clicking on contextual insight component to ensure the accordion is open. --- .../src/lib/apm/apm_error.ts | 8 +-- .../src/lib/apm/instance.ts | 13 ++++- .../components/insight/insight_base.tsx | 2 +- .../common/create_llm_proxy.ts | 6 +-- .../tests/complete/complete.spec.ts | 6 +-- .../common/ui/index.ts | 1 + .../tests/contextual_insights/index.spec.ts | 54 ++++++++++++------- 7 files changed, 59 insertions(+), 31 deletions(-) diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts index 250375623dfc3..30773ce7148c1 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts @@ -25,9 +25,11 @@ export class ApmError extends Serializable<ApmFields> { this.fields['error.grouping_name'] || this.fields['error.exception']?.[0]?.message; const [data] = super.serialize(); - data['error.grouping_key'] = errorMessage - ? generateLongIdWithSeed(errorMessage) - : generateLongId(); + + data['error.grouping_key'] = + this.fields['error.grouping_key'] ?? + (errorMessage ? generateLongIdWithSeed(errorMessage) : generateLongId()); + return [data]; } diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts index 4b3cfde40825c..88a595b573112 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts @@ -72,9 +72,20 @@ export class Instance extends Entity<ApmFields> { 'error.grouping_name': getErrorGroupingKey(message), }); } - error({ message, type, culprit }: { message: string; type?: string; culprit?: string }) { + error({ + message, + type, + culprit, + groupingKey, + }: { + message: string; + type?: string; + culprit?: string; + groupingKey?: string; + }) { return new ApmError({ ...this.fields, + ...(groupingKey ? { 'error.grouping_key': groupingKey } : {}), 'error.exception': [{ message, ...(type ? { type } : {}) }], 'error.culprit': culprit, }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx index 7e54d7671237c..97f2e0a71a0c6 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight_base.tsx @@ -60,7 +60,7 @@ export function InsightBase({ return ( <EuiPanel hasBorder hasShadow={false}> <EuiAccordion - id="obsAiAssistantInsight" + id="obsAiAssistantInsightContainer" arrowProps={{ css: { alignSelf: 'flex-start' } }} buttonContent={ <EuiFlexGroup wrap responsive={false} gutterSize="m" data-test-subj={dataTestSubj}> diff --git a/x-pack/test/observability_ai_assistant_api_integration/common/create_llm_proxy.ts b/x-pack/test/observability_ai_assistant_api_integration/common/create_llm_proxy.ts index 4952135c3d623..cce12d2c1b958 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/common/create_llm_proxy.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/common/create_llm_proxy.ts @@ -98,7 +98,7 @@ export class LlmProxy { waitForIntercept: () => Promise<LlmResponseSimulator>; } : { - complete: () => Promise<void>; + waitAndComplete: () => Promise<void>; } { const waitForInterceptPromise = Promise.race([ new Promise<LlmResponseSimulator>((outerResolve) => { @@ -149,7 +149,7 @@ export class LlmProxy { }); }), new Promise<LlmResponseSimulator>((_, reject) => { - setTimeout(() => reject(new Error(`Interceptor "${name}" timed out after 5000ms`)), 5000); + setTimeout(() => reject(new Error(`Interceptor "${name}" timed out after 20000ms`)), 20000); }), ]); @@ -162,7 +162,7 @@ export class LlmProxy { : responseChunks.split(' ').map((token, i) => (i === 0 ? token : ` ${token}`)); return { - complete: async () => { + waitAndComplete: async () => { const simulator = await waitForInterceptPromise; for (const chunk of parsedChunks) { await simulator.next(chunk); diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts index eb5ed07d3ea08..6be64a1daf3ff 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts @@ -414,11 +414,11 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }, ]) - .complete(); + .waitAndComplete(); proxy .intercept('conversation', (body) => !isFunctionTitleRequest(body), 'Good morning, sir!') - .complete(); + .waitAndComplete(); const createResponse = await observabilityAIAssistantAPIClient .editorUser({ @@ -450,7 +450,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { proxy .intercept('conversation', (body) => !isFunctionTitleRequest(body), 'Good night, sir!') - .complete(); + .waitAndComplete(); const updatedResponse = await observabilityAIAssistantAPIClient .editorUser({ diff --git a/x-pack/test/observability_ai_assistant_functional/common/ui/index.ts b/x-pack/test/observability_ai_assistant_functional/common/ui/index.ts index b7234648c8464..d0a45f61e17be 100644 --- a/x-pack/test/observability_ai_assistant_functional/common/ui/index.ts +++ b/x-pack/test/observability_ai_assistant_functional/common/ui/index.ts @@ -44,6 +44,7 @@ const pages = { saveButton: 'create-connector-flyout-save-btn', }, contextualInsights: { + container: 'obsAiAssistantInsightContainer', button: 'obsAiAssistantInsightButton', text: 'obsAiAssistantInsightResponse', }, diff --git a/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts b/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts index 4a6992b6362e6..aff0d91173dd3 100644 --- a/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts +++ b/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts @@ -17,14 +17,13 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ApiTest({ getService, getPageObjects }: FtrProviderContext) { const ui = getService('observabilityAIAssistantUI'); + const find = getService('find'); const testSubjects = getService('testSubjects'); const supertest = getService('supertest'); const retry = getService('retry'); const log = getService('log'); - const browser = getService('browser'); - const deployment = getService('deployment'); const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - const { common } = getPageObjects(['header', 'common']); + const { header, common } = getPageObjects(['header', 'common']); async function createSynthtraceErrors() { const start = moment().subtract(5, 'minutes').valueOf(); @@ -45,7 +44,11 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte .transaction({ transactionName: 'GET /banana' }) .errors( serviceInstance - .error({ message: 'Some exception', type: 'exception' }) + .error({ + message: 'Some exception', + type: 'exception', + groupingKey: 'some-expection-key', + }) .timestamp(timestamp) ) .duration(10) @@ -87,9 +90,22 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte } async function navigateToError() { - await common.navigateToApp('apm'); - await browser.get(`${deployment.getHostPort()}/app/apm/services/opbeans-go/errors/`); - await testSubjects.click('errorGroupId'); + await common.navigateToUrl('apm', 'services/opbeans-go/errors/some-expection-key', { + shouldUseHashForSubUrl: false, + }); + await header.waitUntilLoadingHasFinished(); + } + + // open contextual insights component and ensure it was opened + async function openContextualInsights() { + await retry.tryForTime(5 * 1000, async () => { + await testSubjects.click(ui.pages.contextualInsights.button); + const isOpen = + (await ( + await find.byCssSelector(`[aria-controls="${ui.pages.contextualInsights.container}"]`) + ).getAttribute('aria-expanded')) === 'true'; + expect(isOpen).to.be(true); + }); } describe('Contextual insights for APM errors', () => { @@ -113,16 +129,14 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte ]); }); - // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/184029 - describe.skip('when there are no connectors', () => { + describe('when there are no connectors', () => { it('should not show the contextual insight component', async () => { await navigateToError(); await testSubjects.missingOrFail(ui.pages.contextualInsights.button); }); }); - // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/184071 - describe.skip('when there are connectors', () => { + describe('when there are connectors', () => { let proxy: LlmProxy; before(async () => { @@ -137,17 +151,17 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte it('should show the contextual insight component on the APM error details page', async () => { await navigateToError(); - proxy - .intercept( - 'conversation', - (body) => !isFunctionTitleRequest(body), - 'This error is nothing to worry about. Have a nice day!' - ) - .complete(); + const interceptor = proxy.intercept( + 'conversation', + (body) => !isFunctionTitleRequest(body), + 'This error is nothing to worry about. Have a nice day!' + ); + + await openContextualInsights(); - await testSubjects.click(ui.pages.contextualInsights.button); + await interceptor.waitAndComplete(); - await retry.try(async () => { + await retry.tryForTime(5 * 1000, async () => { const llmResponse = await testSubjects.getVisibleText(ui.pages.contextualInsights.text); expect(llmResponse).to.contain('This error is nothing to worry about. Have a nice day!'); }); From 5116e76e1ca94da0366bc034675cbb9fd32aae20 Mon Sep 17 00:00:00 2001 From: Ying Mao <ying.mao@elastic.co> Date: Wed, 26 Jun 2024 12:42:24 -0400 Subject: [PATCH 36/40] [Response Ops][Alerting] Adding severity levels to action groups and determining if alert is improving (#184163) ## Summary * Adds optional severity levels to action group definition * Determines whether alert severity "is improving" based on previous action group and current action group of alert if severity levels are defined for action groups. * Persists this as `kibana.alert.severity_improving` inside the alert document * Persists `kibana.alert.previous_action_group` inside the alert document ## To Verify I've created a verification branch: https://github.com/elastic/kibana/pull/184523 that updates the metric threshold rule type to have action group severity levels. Verification instructions in that PR summary. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../kbn-alerting-types/action_group_types.ts | 5 + .../src/field_maps/alert_field_map.ts | 12 ++ .../src/schemas/generated/alert_schema.ts | 2 + .../src/schemas/generated/security_schema.ts | 2 + .../src/default_alerts_as_data.ts | 10 ++ .../field_maps/mapping_from_field_map.test.ts | 6 + .../alerts_client/alerts_client.test.ts | 12 ++ .../server/alerts_client/alerts_client.ts | 9 ++ .../alerts_client/lib/build_new_alert.test.ts | 9 ++ .../alerts_client/lib/build_new_alert.ts | 2 + .../lib/build_ongoing_alert.test.ts | 103 ++++++++++++ .../alerts_client/lib/build_ongoing_alert.ts | 14 +- .../lib/build_recovered_alert.test.ts | 16 ++ .../lib/build_recovered_alert.ts | 6 + .../lib/build_updated_recovered_alert.test.ts | 4 + .../lib/build_updated_recovered_alert.ts | 13 +- .../server/alerts_client/lib/index.ts | 1 + .../lib/is_alert_improving.test.ts | 146 ++++++++++++++++++ .../alerts_client/lib/is_alert_improving.ts | 49 ++++++ .../server/alerts_client/lib/test_fixtures.ts | 2 + .../alert_as_data_fields.test.ts.snap | 80 ++++++++++ .../server/rule_type_registry.test.ts | 106 +++++++++++++ .../alerting/server/rule_type_registry.ts | 21 +++ ...type_registry_deprecated_consumers.test.ts | 1 + ...rule_type_registry_deprecated_consumers.ts | 1 + .../task_runner/ad_hoc_task_runner.test.ts | 2 + .../task_runner_alerts_client.test.ts | 2 + .../slo/common/constants.ts | 4 + .../technical_rule_field_map.test.ts | 10 ++ .../common/plugins/alerts/server/plugin.ts | 3 + .../plugins/alerts/server/rule_types.ts | 73 +++++++++ .../tests/alerting/group4/alert_severity.ts | 138 +++++++++++++++++ .../group4/alerts_as_data/alerts_as_data.ts | 30 ++++ .../alerts_as_data_conflicts.ts | 2 + .../tests/alerting/group4/index.ts | 1 + .../common/alerting/alert_documents.ts | 8 + .../common/alerting/summary_actions.ts | 5 + 37 files changed, 905 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.test.ts create mode 100644 x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.ts create mode 100644 x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alert_severity.ts diff --git a/packages/kbn-alerting-types/action_group_types.ts b/packages/kbn-alerting-types/action_group_types.ts index dbb0d6ac0a78f..52e79af7dfa2f 100644 --- a/packages/kbn-alerting-types/action_group_types.ts +++ b/packages/kbn-alerting-types/action_group_types.ts @@ -6,7 +6,12 @@ * Side Public License, v 1. */ +export interface ActionGroupSeverity { + level: number; +} + export interface ActionGroup<ActionGroupIds extends string> { id: ActionGroupIds; name: string; + severity?: ActionGroupSeverity; } diff --git a/packages/kbn-alerts-as-data-utils/src/field_maps/alert_field_map.ts b/packages/kbn-alerts-as-data-utils/src/field_maps/alert_field_map.ts index 54a09c67d59ad..73a3535857041 100644 --- a/packages/kbn-alerts-as-data-utils/src/field_maps/alert_field_map.ts +++ b/packages/kbn-alerts-as-data-utils/src/field_maps/alert_field_map.ts @@ -17,6 +17,7 @@ import { ALERT_CONSECUTIVE_MATCHES, ALERT_INSTANCE_ID, ALERT_LAST_DETECTED, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_REASON, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, @@ -29,6 +30,7 @@ import { ALERT_RULE_TAGS, ALERT_RULE_TYPE_ID, ALERT_RULE_UUID, + ALERT_SEVERITY_IMPROVING, ALERT_START, ALERT_STATUS, ALERT_TIME_RANGE, @@ -97,6 +99,11 @@ export const alertFieldMap = { required: false, array: false, }, + [ALERT_PREVIOUS_ACTION_GROUP]: { + type: 'keyword', + array: false, + required: false, + }, [ALERT_REASON]: { type: 'keyword', array: false, @@ -165,6 +172,11 @@ export const alertFieldMap = { array: false, required: true, }, + [ALERT_SEVERITY_IMPROVING]: { + type: 'boolean', + array: false, + required: false, + }, [ALERT_START]: { type: 'date', array: false, diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/alert_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/alert_schema.ts index 8a5d2a56bc329..935a09971c613 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/alert_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/alert_schema.ts @@ -93,11 +93,13 @@ const AlertOptional = rt.partial({ 'kibana.alert.flapping_history': schemaBooleanArray, 'kibana.alert.last_detected': schemaDate, 'kibana.alert.maintenance_window_ids': schemaStringArray, + 'kibana.alert.previous_action_group': schemaString, 'kibana.alert.reason': schemaString, 'kibana.alert.rule.execution.timestamp': schemaDate, 'kibana.alert.rule.execution.uuid': schemaString, 'kibana.alert.rule.parameters': schemaUnknown, 'kibana.alert.rule.tags': schemaStringArray, + 'kibana.alert.severity_improving': schemaBoolean, 'kibana.alert.start': schemaDate, 'kibana.alert.time_range': schemaDateRange, 'kibana.alert.url': schemaString, diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts index fd585473fe596..14fdb859ed3e9 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/security_schema.ts @@ -151,6 +151,7 @@ const SecurityAlertOptional = rt.partial({ 'kibana.alert.original_event.start': schemaDate, 'kibana.alert.original_event.timezone': schemaString, 'kibana.alert.original_event.url': schemaString, + 'kibana.alert.previous_action_group': schemaString, 'kibana.alert.reason': schemaString, 'kibana.alert.risk_score': schemaNumber, 'kibana.alert.rule.author': schemaString, @@ -180,6 +181,7 @@ const SecurityAlertOptional = rt.partial({ 'kibana.alert.rule.updated_by': schemaString, 'kibana.alert.rule.version': schemaString, 'kibana.alert.severity': schemaString, + 'kibana.alert.severity_improving': schemaBoolean, 'kibana.alert.start': schemaDate, 'kibana.alert.suppression.docs_count': schemaStringOrNumber, 'kibana.alert.suppression.end': schemaDate, diff --git a/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts b/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts index ce334e5d0fc55..4503679686bab 100644 --- a/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts +++ b/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts @@ -24,6 +24,12 @@ const VERSION = `${KIBANA_NAMESPACE}.version` as const; // kibana.alert.action_group - framework action group ID for this alert const ALERT_ACTION_GROUP = `${ALERT_NAMESPACE}.action_group` as const; +// kibana.alert.previous_action_group +const ALERT_PREVIOUS_ACTION_GROUP = `${ALERT_NAMESPACE}.previous_action_group` as const; + +// kibana.alert.severity_improving +const ALERT_SEVERITY_IMPROVING = `${ALERT_NAMESPACE}.severity_improving` as const; + // kibana.alert.case_ids - array of cases associated with the alert const ALERT_CASE_IDS = `${ALERT_NAMESPACE}.case_ids` as const; @@ -129,6 +135,7 @@ const fields = { ALERT_CONSECUTIVE_MATCHES, ALERT_INSTANCE_ID, ALERT_LAST_DETECTED, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_REASON, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, @@ -141,6 +148,7 @@ const fields = { ALERT_RULE_TAGS, ALERT_RULE_TYPE_ID, ALERT_RULE_UUID, + ALERT_SEVERITY_IMPROVING, ALERT_START, ALERT_STATUS, ALERT_TIME_RANGE, @@ -171,6 +179,7 @@ export { ALERT_CONSECUTIVE_MATCHES, ALERT_INSTANCE_ID, ALERT_LAST_DETECTED, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_REASON, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, @@ -183,6 +192,7 @@ export { ALERT_RULE_TAGS, ALERT_RULE_TYPE_ID, ALERT_RULE_UUID, + ALERT_SEVERITY_IMPROVING, ALERT_START, ALERT_STATUS, ALERT_TIME_RANGE, diff --git a/x-pack/plugins/alerting/common/alert_schema/field_maps/mapping_from_field_map.test.ts b/x-pack/plugins/alerting/common/alert_schema/field_maps/mapping_from_field_map.test.ts index ad28d03235caf..aad7bb2823606 100644 --- a/x-pack/plugins/alerting/common/alert_schema/field_maps/mapping_from_field_map.test.ts +++ b/x-pack/plugins/alerting/common/alert_schema/field_maps/mapping_from_field_map.test.ts @@ -243,6 +243,9 @@ describe('mappingFromFieldMap', () => { last_detected: { type: 'date', }, + previous_action_group: { + type: 'keyword', + }, reason: { type: 'keyword', fields: { @@ -293,6 +296,9 @@ describe('mappingFromFieldMap', () => { }, }, }, + severity_improving: { + type: 'boolean', + }, start: { type: 'date', }, 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 ef6f93d5894a2..94def475cb387 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 @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { elasticsearchServiceMock, loggingSystemMock } from '@kbn/core/server/mocks'; import type { UpdateByQueryRequest } from '@elastic/elasticsearch/lib/api/types'; import { UntypedNormalizedRuleType } from '../rule_type_registry'; @@ -22,6 +23,7 @@ import { ALERT_FLAPPING_HISTORY, ALERT_INSTANCE_ID, ALERT_MAINTENANCE_WINDOW_IDS, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, ALERT_RULE_EXECUTION_TIMESTAMP, @@ -33,6 +35,7 @@ import { ALERT_RULE_TAGS, ALERT_RULE_TYPE_ID, ALERT_RULE_UUID, + ALERT_SEVERITY_IMPROVING, ALERT_START, ALERT_STATUS, ALERT_TIME_RANGE, @@ -235,6 +238,7 @@ const getNewIndexedAlertDoc = (overrides = {}) => ({ [ALERT_RULE_TYPE_ID]: 'test.rule-type', [ALERT_RULE_TAGS]: ['rule-', '-tags'], [ALERT_RULE_UUID]: '1', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_START]: date, [ALERT_STATUS]: 'active', [ALERT_TIME_RANGE]: { gte: date }, @@ -253,6 +257,8 @@ const getOngoingIndexedAlertDoc = (overrides = {}) => ({ [ALERT_FLAPPING_HISTORY]: [true, false], [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z' }, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', + [ALERT_SEVERITY_IMPROVING]: undefined, ...overrides, }); @@ -267,6 +273,8 @@ const getRecoveredIndexedAlertDoc = (overrides = {}) => ({ [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: date }, [ALERT_STATUS]: 'recovered', [ALERT_CONSECUTIVE_MATCHES]: 0, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', + [ALERT_SEVERITY_IMPROVING]: true, ...overrides, }); @@ -682,6 +690,7 @@ describe('Alerts Client', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [true, false], [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_RULE_CATEGORY]: 'My test rule', [ALERT_RULE_CONSUMER]: 'bar', [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', @@ -964,6 +973,7 @@ describe('Alerts Client', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [true, false, false, false], [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_RULE_CATEGORY]: 'My test rule', [ALERT_RULE_CONSUMER]: 'bar', [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', @@ -1013,6 +1023,7 @@ describe('Alerts Client', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [true, true], [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_RULE_CATEGORY]: 'My test rule', [ALERT_RULE_CONSUMER]: 'bar', [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', @@ -1023,6 +1034,7 @@ describe('Alerts Client', () => { [ALERT_RULE_TYPE_ID]: 'test.rule-type', [ALERT_RULE_TAGS]: ['rule-', '-tags'], [ALERT_RULE_UUID]: '1', + [ALERT_SEVERITY_IMPROVING]: true, [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: date, [ALERT_STATUS]: 'recovered', diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts index 6267d0785f381..66cc1a3077481 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.ts @@ -58,6 +58,7 @@ import { getLifecycleAlertsQueries, getMaintenanceWindowAlertsQuery, getContinualAlertsQuery, + isAlertImproving, } from './lib'; import { isValidAlertIndexName } from '../alerts_service'; import { resolveAlertConflicts } from './lib/alert_conflict_resolver'; @@ -431,6 +432,13 @@ export class AlertsClient< this.fetchedAlerts.data.hasOwnProperty(id) && get(this.fetchedAlerts.data[id], ALERT_STATUS) === 'active' ) { + const isImproving = isAlertImproving< + AlertData, + LegacyState, + LegacyContext, + ActionGroupIds, + RecoveryActionGroupId + >(this.fetchedAlerts.data[id], activeAlerts[id], this.ruleType.actionGroups); activeAlertsToIndex.push( buildOngoingAlert< AlertData, @@ -442,6 +450,7 @@ export class AlertsClient< alert: this.fetchedAlerts.data[id], legacyAlert: activeAlerts[id], rule: this.rule, + isImproving, runTimestamp: this.runTimestampString, timestamp: currentTime, payload: this.reportedAlerts[id], diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.test.ts index 280c49df36ed0..8c814c528c384 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.test.ts @@ -27,6 +27,7 @@ import { ALERT_TIME_RANGE, ALERT_CONSECUTIVE_MATCHES, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_SEVERITY_IMPROVING, } from '@kbn/rule-data-utils'; import { alertRule } from './test_fixtures'; @@ -54,6 +55,7 @@ describe('buildNewAlert', () => { [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-28T12:27:28.159Z', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), [ALERT_WORKFLOW_STATUS]: 'open', @@ -86,6 +88,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), @@ -123,6 +126,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [true, false, false, false, true, true], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-1', 'maint-321'], [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), @@ -165,6 +169,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), @@ -197,6 +202,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_RULE_EXECUTION_TIMESTAMP]: '2030-12-15T02:44:13.124Z', [ALERT_STATUS]: 'active', @@ -245,6 +251,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), @@ -297,6 +304,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), @@ -351,6 +359,7 @@ describe('buildNewAlert', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.ts index cc77099a11623..223c5a7912814 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_new_alert.ts @@ -28,6 +28,7 @@ import { TIMESTAMP, VERSION, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_SEVERITY_IMPROVING, } from '@kbn/rule-data-utils'; import { DeepPartial } from '@kbn/utility-types'; import { Alert as LegacyAlert } from '../../alert/alert'; @@ -94,6 +95,7 @@ export const buildNewAlert = < [ALERT_CONSECUTIVE_MATCHES]: legacyAlert.getActiveCount(), [ALERT_STATUS]: 'active', [ALERT_UUID]: legacyAlert.getUuid(), + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_WORKFLOW_STATUS]: get(cleanedPayload, ALERT_WORKFLOW_STATUS, 'open'), ...(legacyAlert.getState().duration ? { [ALERT_DURATION]: nanosToMicros(legacyAlert.getState().duration) } diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.test.ts index 136a2b62962be..9f3909369a41b 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.test.ts @@ -28,6 +28,8 @@ import { ALERT_TIME_RANGE, ALERT_CONSECUTIVE_MATCHES, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_SEVERITY_IMPROVING, + ALERT_PREVIOUS_ACTION_GROUP, } from '@kbn/rule-data-utils'; import { alertRule, existingFlattenedNewAlert, existingExpandedNewAlert } from './test_fixtures'; @@ -49,6 +51,7 @@ for (const flattened of [true, false]) { alert: existingAlert, legacyAlert, rule: alertRule, + isImproving: true, timestamp: '2023-03-29T12:27:28.159Z', kibanaVersion: '8.9.0', }) @@ -61,7 +64,9 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_DURATION]: 36000, [ALERT_STATUS]: 'active', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z' }, @@ -110,6 +115,7 @@ for (const flattened of [true, false]) { alert: existingAlert, legacyAlert, rule: updatedRule, + isImproving: false, timestamp: '2023-03-29T12:27:28.159Z', kibanaVersion: '8.9.0', }) @@ -122,7 +128,9 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DURATION]: 36000, @@ -188,6 +196,7 @@ for (const flattened of [true, false]) { alert, legacyAlert, rule: alertRule, + isImproving: null, timestamp: '2023-03-29T12:27:28.159Z', kibanaVersion: '8.9.0', }) @@ -201,6 +210,7 @@ for (const flattened of [true, false]) { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [false, false, true, true], [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-xyz'], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DURATION]: 36000, @@ -230,6 +240,83 @@ for (const flattened of [true, false]) { }); }); + test('should return alert document with updated isImproving', () => { + const legacyAlert = new LegacyAlert<{}, {}, 'error' | 'warning'>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert + .scheduleActions('error') + .replaceState({ start: '2023-03-28T12:27:28.159Z', duration: '36000000' }); + + const alert = flattened + ? { + ...existingAlert, + [ALERT_SEVERITY_IMPROVING]: true, + } + : { + ...existingAlert, + kibana: { + // @ts-expect-error + ...existingAlert.kibana, + alert: { + // @ts-expect-error + ...existingAlert.kibana.alert, + severity_improving: true, + }, + }, + }; + + expect( + buildOngoingAlert<{}, {}, {}, 'error' | 'warning', 'recovered'>({ + // @ts-expect-error + alert, + legacyAlert, + rule: alertRule, + isImproving: null, + timestamp: '2023-03-29T12:27:28.159Z', + kibanaVersion: '8.9.0', + }) + ).toEqual({ + ...alertRule, + [TIMESTAMP]: '2023-03-29T12:27:28.159Z', + [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + [EVENT_ACTION]: 'active', + [ALERT_ACTION_GROUP]: 'error', + [ALERT_CONSECUTIVE_MATCHES]: 0, + [ALERT_FLAPPING]: false, + [ALERT_FLAPPING_HISTORY]: [], + [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', + [ALERT_STATUS]: 'active', + [ALERT_WORKFLOW_STATUS]: 'open', + [ALERT_SEVERITY_IMPROVING]: undefined, + [ALERT_DURATION]: 36000, + [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z' }, + [SPACE_IDS]: ['default'], + [VERSION]: '8.9.0', + [TAGS]: ['rule-', '-tags'], + ...(flattened + ? { + [EVENT_KIND]: 'signal', + [ALERT_INSTANCE_ID]: 'alert-A', + [ALERT_START]: '2023-03-28T12:27:28.159Z', + [ALERT_UUID]: 'abcdefg', + } + : { + event: { + kind: 'signal', + }, + kibana: { + alert: { + instance: { id: 'alert-A' }, + start: '2023-03-28T12:27:28.159Z', + uuid: 'abcdefg', + }, + }, + }), + }); + }); + test('should return alert document with updated payload if specified', () => { const legacyAlert = new LegacyAlert<{}, {}, 'error' | 'warning'>('alert-A', { meta: { uuid: 'abcdefg' }, @@ -272,6 +359,7 @@ for (const flattened of [true, false]) { legacyAlert, rule: alertRule, timestamp: '2023-03-29T12:27:28.159Z', + isImproving: true, payload: { count: 2, url: `https://url2`, @@ -291,7 +379,9 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DURATION]: 36000, @@ -335,6 +425,7 @@ for (const flattened of [true, false]) { alert: existingAlert, legacyAlert, rule: alertRule, + isImproving: false, runTimestamp: '2030-12-15T02:44:13.124Z', timestamp: '2023-03-29T12:27:28.159Z', kibanaVersion: '8.9.0', @@ -348,7 +439,9 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_DURATION]: 36000, [ALERT_STATUS]: 'active', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z' }, @@ -425,6 +518,7 @@ for (const flattened of [true, false]) { alert, legacyAlert, rule: alertRule, + isImproving: null, timestamp: '2023-03-29T12:27:28.159Z', payload: { count: 2, @@ -447,6 +541,7 @@ for (const flattened of [true, false]) { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DURATION]: 36000, @@ -526,6 +621,7 @@ for (const flattened of [true, false]) { alert, legacyAlert, rule: alertRule, + isImproving: true, timestamp: '2023-03-29T12:27:28.159Z', payload: { count: 2, @@ -548,7 +644,9 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DURATION]: 36000, @@ -615,6 +713,7 @@ for (const flattened of [true, false]) { alert, legacyAlert, rule: alertRule, + isImproving: false, timestamp: '2023-03-29T12:27:28.159Z', kibanaVersion: '8.9.0', } @@ -630,7 +729,9 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DURATION]: 36000, @@ -711,6 +812,7 @@ for (const flattened of [true, false]) { rule: alertRule, timestamp: '2023-03-29T12:27:28.159Z', kibanaVersion: '8.9.0', + isImproving: null, payload: { count: 2, url: `https://url2`, @@ -731,6 +833,7 @@ for (const flattened of [true, false]) { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], [ALERT_MAINTENANCE_WINDOW_IDS]: [], + [ALERT_PREVIOUS_ACTION_GROUP]: 'error', [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'custom_status', [ALERT_DURATION]: 36000, diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.ts index 6c62005873221..74672cbe0a2cd 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_ongoing_alert.ts @@ -13,7 +13,9 @@ import { ALERT_DURATION, ALERT_FLAPPING, ALERT_FLAPPING_HISTORY, + ALERT_SEVERITY_IMPROVING, ALERT_MAINTENANCE_WINDOW_IDS, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_RULE_EXECUTION_TIMESTAMP, ALERT_RULE_TAGS, ALERT_TIME_RANGE, @@ -24,6 +26,7 @@ import { VERSION, } from '@kbn/rule-data-utils'; import { DeepPartial } from '@kbn/utility-types'; +import { get, omit } from 'lodash'; import { Alert as LegacyAlert } from '../../alert/alert'; import { AlertInstanceContext, AlertInstanceState, RuleAlertData } from '../../types'; import type { AlertRule } from '../types'; @@ -41,6 +44,7 @@ interface BuildOngoingAlertOpts< alert: Alert & AlertData; legacyAlert: LegacyAlert<LegacyState, LegacyContext, ActionGroupIds | RecoveryActionGroupId>; rule: AlertRule; + isImproving: boolean | null; payload?: DeepPartial<AlertData>; runTimestamp?: string; timestamp: string; @@ -62,6 +66,7 @@ export const buildOngoingAlert = < alert, legacyAlert, payload, + isImproving, rule, runTimestamp, timestamp, @@ -78,6 +83,9 @@ export const buildOngoingAlert = < // Make sure that any alert fields that are updateable are flattened. const refreshableAlertFields = replaceRefreshableAlertFields(alert); + // Omit fields that are overwrite-able with undefined value + const cleanedAlert = omit(alert, ALERT_SEVERITY_IMPROVING); + const alertUpdates = { // Set latest rule configuration ...rule, @@ -110,6 +118,8 @@ export const buildOngoingAlert = < ...(legacyAlert.getState().duration ? { [ALERT_DURATION]: nanosToMicros(legacyAlert.getState().duration) } : {}), + ...(isImproving != null ? { [ALERT_SEVERITY_IMPROVING]: isImproving } : {}), + [ALERT_PREVIOUS_ACTION_GROUP]: get(alert, ALERT_ACTION_GROUP), [SPACE_IDS]: rule[SPACE_IDS], [VERSION]: kibanaVersion, [TAGS]: Array.from( @@ -136,12 +146,12 @@ export const buildOngoingAlert = < // 'kibana.alert.field1': 'value2' // } // the expanded field from the existing alert is removed - const cleanedAlert = removeUnflattenedFieldsFromAlert(alert, { + const expandedAlert = removeUnflattenedFieldsFromAlert(cleanedAlert, { ...cleanedPayload, ...alertUpdates, ...refreshableAlertFields, }); - return deepmerge.all([cleanedAlert, refreshableAlertFields, cleanedPayload, alertUpdates], { + return deepmerge.all([expandedAlert, refreshableAlertFields, cleanedPayload, alertUpdates], { arrayMerge: (_, sourceArray) => sourceArray, }) as Alert & AlertData; }; diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts index ebaa829c0988b..c63543b99232d 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts @@ -29,6 +29,8 @@ import { ALERT_END, ALERT_CONSECUTIVE_MATCHES, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_PREVIOUS_ACTION_GROUP, + ALERT_SEVERITY_IMPROVING, } from '@kbn/rule-data-utils'; import { alertRule, @@ -69,6 +71,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', @@ -135,6 +139,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-1', 'maint-321'], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', @@ -231,6 +237,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-1', 'maint-321'], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', @@ -291,6 +299,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', @@ -395,6 +405,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-1', 'maint-321'], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', @@ -497,6 +509,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-1', 'maint-321'], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', @@ -598,6 +612,8 @@ for (const flattened of [true, false]) { [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [], + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: 'default', [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'custom_status', diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts index 0f874d857736e..bfcea9e29edf6 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts @@ -24,8 +24,11 @@ import { ALERT_START, ALERT_CONSECUTIVE_MATCHES, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_PREVIOUS_ACTION_GROUP, + ALERT_SEVERITY_IMPROVING, } from '@kbn/rule-data-utils'; import { DeepPartial } from '@kbn/utility-types'; +import { get } from 'lodash'; import { Alert as LegacyAlert } from '../../alert/alert'; import { AlertInstanceContext, AlertInstanceState, RuleAlertData } from '../../types'; import type { AlertRule } from '../types'; @@ -95,6 +98,9 @@ export const buildRecoveredAlert = < [ALERT_FLAPPING]: legacyAlert.getFlapping(), // Set latest flapping_history [ALERT_FLAPPING_HISTORY]: legacyAlert.getFlappingHistory(), + // Alert is recovering from active state so by default it is improving + [ALERT_SEVERITY_IMPROVING]: true, + [ALERT_PREVIOUS_ACTION_GROUP]: get(alert, ALERT_ACTION_GROUP), // Set latest maintenance window IDs [ALERT_MAINTENANCE_WINDOW_IDS]: legacyAlert.getMaintenanceWindowIds(), // Set latest match count, should be 0 diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts index b953814d4151e..69e196563a0e4 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts @@ -27,6 +27,7 @@ import { ALERT_END, ALERT_RULE_EXECUTION_TIMESTAMP, ALERT_CONSECUTIVE_MATCHES, + ALERT_PREVIOUS_ACTION_GROUP, } from '@kbn/rule-data-utils'; import { alertRule, @@ -70,6 +71,7 @@ describe('buildUpdatedRecoveredAlert', () => { [ALERT_TIME_RANGE]: { gte: '2023-03-27T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, [ALERT_FLAPPING]: true, [ALERT_FLAPPING_HISTORY]: [false, false, true, true], + [ALERT_PREVIOUS_ACTION_GROUP]: 'recovered', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-x'], [ALERT_STATUS]: 'recovered', @@ -119,6 +121,7 @@ describe('buildUpdatedRecoveredAlert', () => { [ALERT_TIME_RANGE]: { gte: '2023-03-27T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, [ALERT_FLAPPING]: true, [ALERT_FLAPPING_HISTORY]: [false, false, true, true], + [ALERT_PREVIOUS_ACTION_GROUP]: 'recovered', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-x'], [ALERT_STATUS]: 'recovered', @@ -186,6 +189,7 @@ describe('buildUpdatedRecoveredAlert', () => { [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_FLAPPING]: true, [ALERT_FLAPPING_HISTORY]: [false, false, true, true], + [ALERT_PREVIOUS_ACTION_GROUP]: 'recovered', [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', [SPACE_IDS]: ['default'], diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts index d393f5f513f6e..06972c81e496d 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts @@ -8,14 +8,17 @@ import deepmerge from 'deepmerge'; import type { Alert } from '@kbn/alerts-as-data-utils'; import { + ALERT_ACTION_GROUP, ALERT_FLAPPING, ALERT_FLAPPING_HISTORY, + ALERT_SEVERITY_IMPROVING, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_RULE_EXECUTION_TIMESTAMP, ALERT_RULE_EXECUTION_UUID, TIMESTAMP, } from '@kbn/rule-data-utils'; import { RawAlertInstance } from '@kbn/alerting-state-types'; -import { get } from 'lodash'; +import { get, omit } from 'lodash'; import { RuleAlertData } from '../../types'; import { AlertRule } from '../types'; import { removeUnflattenedFieldsFromAlert, replaceRefreshableAlertFields } from './format_alert'; @@ -43,6 +46,9 @@ export const buildUpdatedRecoveredAlert = <AlertData extends RuleAlertData>({ // Make sure that any alert fields that are updatable are flattened. const refreshableAlertFields = replaceRefreshableAlertFields(alert); + // Omit fields that are overwrite-able with undefined value + const cleanedAlert = omit(alert, ALERT_SEVERITY_IMPROVING); + const alertUpdates = { // Set latest rule configuration ...rule, @@ -57,6 +63,7 @@ export const buildUpdatedRecoveredAlert = <AlertData extends RuleAlertData>({ // not get returned for summary alerts. In the future, we may want to restore this and add another field to the // alert doc indicating that this is an ongoing recovered alert that can be used for querying. [ALERT_RULE_EXECUTION_UUID]: get(alert, ALERT_RULE_EXECUTION_UUID), + [ALERT_PREVIOUS_ACTION_GROUP]: get(alert, ALERT_ACTION_GROUP), }; // Clean the existing alert document so any nested fields that will be updated @@ -74,12 +81,12 @@ export const buildUpdatedRecoveredAlert = <AlertData extends RuleAlertData>({ // 'kibana.alert.field1': 'value2' // } // the expanded field from the existing alert is removed - const cleanedAlert = removeUnflattenedFieldsFromAlert(alert, { + const expandedAlert = removeUnflattenedFieldsFromAlert(cleanedAlert, { ...alertUpdates, ...refreshableAlertFields, }); - return deepmerge.all([cleanedAlert, refreshableAlertFields, alertUpdates], { + return deepmerge.all([expandedAlert, refreshableAlertFields, alertUpdates], { arrayMerge: (_, sourceArray) => sourceArray, }) as Alert & AlertData; }; diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/index.ts b/x-pack/plugins/alerting/server/alerts_client/lib/index.ts index edd9660bba4c7..ba69d921b6570 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/index.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/index.ts @@ -20,3 +20,4 @@ export { export { expandFlattenedAlert } from './format_alert'; export { sanitizeBulkErrorResponse } from './sanitize_bulk_response'; export { initializeAlertsClient } from './initialize_alerts_client'; +export { isAlertImproving } from './is_alert_improving'; diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.test.ts new file mode 100644 index 0000000000000..e2b4136dac163 --- /dev/null +++ b/x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.test.ts @@ -0,0 +1,146 @@ +/* + * 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 { cloneDeep } from 'lodash'; +import { set } from '@kbn/safer-lodash-set'; +import { ALERT_ACTION_GROUP } from '@kbn/rule-data-utils'; +import { Alert as LegacyAlert } from '../../alert'; +import { isAlertImproving } from './is_alert_improving'; +import { existingExpandedNewAlert, existingFlattenedNewAlert } from './test_fixtures'; +import { ActionGroup } from '../../types'; + +const actionGroupsWithSeverity: Array<ActionGroup<string>> = [ + { id: 'info', name: 'Info', severity: { level: 0 } }, + { id: 'warning', name: 'Warning', severity: { level: 1 } }, + { id: 'error', name: 'Error', severity: { level: 2 } }, + { id: 'critical', name: 'Critical Error', severity: { level: 3 } }, +]; + +const actionGroupsWithoutSeverity: Array<ActionGroup<string>> = [ + { id: 'info', name: 'Info' }, + { id: 'warning', name: 'Warning' }, + { id: 'error', name: 'Error' }, + { id: 'critical', name: 'Critical Error' }, +]; + +type TestActionGroupIds = 'info' | 'error' | 'warning' | 'critical'; + +for (const flattened of [true, false]) { + // existing alert action group = 'error' + const existingAlert = flattened ? existingFlattenedNewAlert : existingExpandedNewAlert; + + describe(`isAlertImproving for ${flattened ? 'flattened' : 'expanded'} existing alert`, () => { + test('should return null if no scheduled action group', () => { + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + existingAlert, + legacyAlert, + actionGroupsWithSeverity + ) + ).toEqual(null); + }); + + test('should return false if no previous action group', () => { + // existing alert action group = 'error' + const copyAlert = cloneDeep(existingAlert); + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert.scheduleActions('warning'); + + set(copyAlert, ALERT_ACTION_GROUP, undefined); + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + copyAlert, + legacyAlert, + actionGroupsWithSeverity + ) + ).toEqual(null); + }); + + test('should return false if no severity defined for action groups', () => { + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert.scheduleActions('warning'); + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + existingAlert, + legacyAlert, + actionGroupsWithoutSeverity + ) + ).toEqual(null); + }); + + test('should return null if severity stays the same', () => { + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert.scheduleActions('error'); + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + existingAlert, + legacyAlert, + actionGroupsWithSeverity + ) + ).toEqual(null); + }); + + test('should return false if severity degrades', () => { + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert.scheduleActions('critical'); + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + existingAlert, + legacyAlert, + actionGroupsWithSeverity + ) + ).toEqual(false); + }); + + test('should return true if severity improves', () => { + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert.scheduleActions('warning'); + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + existingAlert, + legacyAlert, + actionGroupsWithSeverity + ) + ).toEqual(true); + }); + + test('should return true if severity improves multiple levels', () => { + const legacyAlert = new LegacyAlert<{}, {}, TestActionGroupIds>('alert-A', { + meta: { uuid: 'abcdefg' }, + }); + legacyAlert.scheduleActions('info'); + expect( + isAlertImproving<{}, {}, {}, TestActionGroupIds, 'recovered'>( + // @ts-expect-error + existingAlert, + legacyAlert, + actionGroupsWithSeverity + ) + ).toEqual(true); + }); + }); +} diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.ts b/x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.ts new file mode 100644 index 0000000000000..cf8b3205606ee --- /dev/null +++ b/x-pack/plugins/alerting/server/alerts_client/lib/is_alert_improving.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 { get } from 'lodash'; +import type { Alert } from '@kbn/alerts-as-data-utils'; +import { ALERT_ACTION_GROUP } from '@kbn/rule-data-utils'; +import { Alert as LegacyAlert } from '../../alert'; +import { ActionGroup, AlertInstanceState, AlertInstanceContext, RuleAlertData } from '../../types'; + +export const isAlertImproving = < + AlertData extends RuleAlertData, + LegacyState extends AlertInstanceState, + LegacyContext extends AlertInstanceContext, + ActionGroupIds extends string, + RecoveryActionGroupId extends string +>( + alert: Alert & AlertData, + legacyAlert: LegacyAlert<LegacyState, LegacyContext, ActionGroupIds | RecoveryActionGroupId>, + actionGroups: Array<ActionGroup<string>> +): boolean | null => { + const currentActionGroup = legacyAlert.getScheduledActionOptions()?.actionGroup; + const previousActionGroup = get(alert, ALERT_ACTION_GROUP); + + if (!currentActionGroup || !previousActionGroup) { + return null; + } + + // Get action group definitions + const currentActionGroupDef = actionGroups.find((ag) => ag.id === currentActionGroup); + const previousActionGroupDef = actionGroups.find((ag) => ag.id === previousActionGroup); + if ( + currentActionGroupDef && + previousActionGroupDef && + currentActionGroupDef.severity && + previousActionGroupDef.severity + ) { + const toRet = + currentActionGroupDef.severity.level === previousActionGroupDef.severity.level + ? null + : currentActionGroupDef.severity.level < previousActionGroupDef.severity.level; + return toRet; + } + + return null; +}; diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/test_fixtures.ts b/x-pack/plugins/alerting/server/alerts_client/lib/test_fixtures.ts index 096d8ab6a39a7..a0ce91d145911 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/test_fixtures.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/test_fixtures.ts @@ -35,6 +35,7 @@ import { ALERT_START, ALERT_TIME_RANGE, ALERT_END, + ALERT_SEVERITY_IMPROVING, } from '@kbn/rule-data-utils'; import { AlertRule } from '../types'; import { expandFlattenedAlert } from './format_alert'; @@ -115,6 +116,7 @@ export const existingFlattenedRecoveredAlert = { [ALERT_MAINTENANCE_WINDOW_IDS]: ['maint-x'], [ALERT_CONSECUTIVE_MATCHES]: 0, [ALERT_STATUS]: 'recovered', + [ALERT_SEVERITY_IMPROVING]: false, }; export const existingExpandedNewAlert = expandFlattenedAlert(existingFlattenedNewAlert); diff --git a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap index 6e741c8627070..74c9ce9d49d25 100644 --- a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap +++ b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap @@ -979,6 +979,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -1225,6 +1230,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -2036,6 +2046,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -2282,6 +2297,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -3093,6 +3113,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -3339,6 +3364,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -4150,6 +4180,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -4396,6 +4431,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -5207,6 +5247,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -5453,6 +5498,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -6270,6 +6320,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -6516,6 +6571,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -7327,6 +7387,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -7573,6 +7638,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, @@ -8384,6 +8454,11 @@ Object { "required": true, "type": "date", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "required": false, @@ -8630,6 +8705,11 @@ Object { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, diff --git a/x-pack/plugins/alerting/server/rule_type_registry.test.ts b/x-pack/plugins/alerting/server/rule_type_registry.test.ts index 709533bb898f2..3ee3551a301d5 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.test.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.test.ts @@ -312,6 +312,59 @@ describe('Create Lifecycle', () => { ); }); + test('throws if RuleType action groups contain duplicate severity levels', () => { + const ruleType: RuleType< + never, + never, + never, + never, + never, + 'high' | 'medium' | 'low' | 'nodata', + 'recovered', + {} + > = { + id: 'test', + name: 'Test', + actionGroups: [ + { + id: 'high', + name: 'Default', + severity: { level: 3 }, + }, + { + id: 'medium', + name: 'Default', + severity: { level: 0 }, + }, + { + id: 'low', + name: 'Default', + severity: { level: 0 }, + }, + { + id: 'nodata', + name: 'Default', + }, + ], + defaultActionGroupId: 'medium', + minimumLicenseRequired: 'basic', + isExportable: true, + executor: jest.fn(), + category: 'test', + producer: 'alerts', + validate: { + params: { validate: (params) => params }, + }, + }; + const registry = new RuleTypeRegistry(ruleTypeRegistryParams); + + expect(() => registry.register(ruleType)).toThrowError( + new Error( + `Rule type [id="${ruleType.id}"] cannot be registered. Action group definitions cannot contain duplicate severity levels.` + ) + ); + }); + test('allows an RuleType to specify a custom recovery group', () => { const ruleType: RuleType<never, never, never, never, never, 'default', 'backToAwesome', {}> = { @@ -380,6 +433,59 @@ describe('Create Lifecycle', () => { expect(registry.get('test').ruleTaskTimeout).toBe('13m'); }); + test('allows RuleType action groups to specify severity levels', () => { + const actionGroups: Array<ActionGroup<'high' | 'medium' | 'low' | 'nodata'>> = [ + { + id: 'high', + name: 'Default', + severity: { level: 2 }, + }, + { + id: 'medium', + name: 'Default', + severity: { level: 1 }, + }, + { + id: 'low', + name: 'Default', + severity: { level: 0 }, + }, + { + id: 'nodata', + name: 'Default', + }, + ]; + const ruleType: RuleType< + never, + never, + never, + never, + never, + 'high' | 'medium' | 'low' | 'nodata', + 'recovered', + {} + > = { + id: 'test', + name: 'Test', + actionGroups, + defaultActionGroupId: 'medium', + minimumLicenseRequired: 'basic', + isExportable: true, + executor: jest.fn(), + category: 'test', + producer: 'alerts', + validate: { + params: { validate: (params) => params }, + }, + }; + const registry = new RuleTypeRegistry(ruleTypeRegistryParams); + registry.register(ruleType); + expect(registry.get('test').actionGroups).toEqual([ + ...actionGroups, + { id: 'recovered', name: 'Recovered' }, + ]); + }); + test('throws if the custom recovery group is contained in the RuleType action groups', () => { const ruleType: RuleType< never, diff --git a/x-pack/plugins/alerting/server/rule_type_registry.ts b/x-pack/plugins/alerting/server/rule_type_registry.ts index 50ab1f113ab8b..d1ffe59df3b6f 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.ts @@ -508,6 +508,27 @@ function augmentActionGroupsWithReserved< ); } + const activeActionGroupSeverities = new Set<number>(); + actionGroups.forEach((actionGroup) => { + if (!!actionGroup.severity) { + if (activeActionGroupSeverities.has(actionGroup.severity.level)) { + throw new Error( + i18n.translate( + 'xpack.alerting.ruleTypeRegistry.register.duplicateActionGroupSeverityError', + { + defaultMessage: + 'Rule type [id="{id}"] cannot be registered. Action group definitions cannot contain duplicate severity levels.', + values: { + id, + }, + } + ) + ); + } + activeActionGroupSeverities.add(actionGroup.severity.level); + } + }); + return { ...ruleType, ...(config?.rules?.overwriteProducer ? { producer: config.rules.overwriteProducer } : {}), diff --git a/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.test.ts b/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.test.ts index e54e2570ada09..cb0e7dc6ac03a 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.test.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.test.ts @@ -80,6 +80,7 @@ describe('rule_type_registry_deprecated_consumers', () => { "test.patternLongRunning.cancelAlertsOnRuleTimeout", "test.patternSuccessOrFailure", "test.restricted-noop", + "test.severity", "test.throw", "test.unrestricted-noop", "test.validation", diff --git a/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.ts b/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.ts index e91e99203e8d4..e6979c9f44822 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry_deprecated_consumers.ts @@ -73,6 +73,7 @@ export const ruleTypeIdWithValidLegacyConsumers: Record<string, string[]> = { 'test.patternLongRunning.cancelAlertsOnRuleTimeout': [ALERTING_FEATURE_ID], 'test.patternSuccessOrFailure': [ALERTING_FEATURE_ID], 'test.restricted-noop': [ALERTING_FEATURE_ID], + 'test.severity': [ALERTING_FEATURE_ID], 'test.throw': [ALERTING_FEATURE_ID], 'test.unrestricted-noop': [ALERTING_FEATURE_ID], 'test.validation': [ALERTING_FEATURE_ID], diff --git a/x-pack/plugins/alerting/server/task_runner/ad_hoc_task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/ad_hoc_task_runner.test.ts index f532fdf04eed9..f768f85d17748 100644 --- a/x-pack/plugins/alerting/server/task_runner/ad_hoc_task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/ad_hoc_task_runner.test.ts @@ -67,6 +67,7 @@ import { ALERT_FLAPPING, ALERT_FLAPPING_HISTORY, ALERT_INSTANCE_ID, + ALERT_SEVERITY_IMPROVING, ALERT_MAINTENANCE_WINDOW_IDS, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, @@ -483,6 +484,7 @@ describe('Ad Hoc Task Runner', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [true], [ALERT_INSTANCE_ID]: '1', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_CONSECUTIVE_MATCHES]: 1, [ALERT_RULE_CATEGORY]: 'My test rule', 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 2a13bd4cd7c54..69bc11bc48dc8 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 @@ -98,6 +98,7 @@ import { VERSION, ALERT_CONSECUTIVE_MATCHES, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_SEVERITY_IMPROVING, } from '@kbn/rule-data-utils'; import { backfillClientMock } from '../backfill_client/backfill_client.mock'; import { ConnectorAdapterRegistry } from '../connector_adapters/connector_adapter_registry'; @@ -570,6 +571,7 @@ describe('Task Runner', () => { [ALERT_FLAPPING]: false, [ALERT_FLAPPING_HISTORY]: [true], [ALERT_INSTANCE_ID]: '1', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_RULE_CATEGORY]: 'My test rule', [ALERT_RULE_CONSUMER]: 'bar', diff --git a/x-pack/plugins/observability_solution/slo/common/constants.ts b/x-pack/plugins/observability_solution/slo/common/constants.ts index a70a5fe082730..37558bda23732 100644 --- a/x-pack/plugins/observability_solution/slo/common/constants.ts +++ b/x-pack/plugins/observability_solution/slo/common/constants.ts @@ -15,6 +15,7 @@ export const ALERT_ACTION = { name: i18n.translate('xpack.slo.alerting.burnRate.alertAction', { defaultMessage: 'Critical', }), + severity: { level: 3 }, }; export const HIGH_PRIORITY_ACTION_ID = 'slo.burnRate.high'; @@ -23,6 +24,7 @@ export const HIGH_PRIORITY_ACTION = { name: i18n.translate('xpack.slo.alerting.burnRate.highPriorityAction', { defaultMessage: 'High', }), + severity: { level: 2 }, }; export const MEDIUM_PRIORITY_ACTION_ID = 'slo.burnRate.medium'; @@ -31,6 +33,7 @@ export const MEDIUM_PRIORITY_ACTION = { name: i18n.translate('xpack.slo.alerting.burnRate.mediumPriorityAction', { defaultMessage: 'Medium', }), + severity: { level: 1 }, }; export const LOW_PRIORITY_ACTION_ID = 'slo.burnRate.low'; @@ -39,6 +42,7 @@ export const LOW_PRIORITY_ACTION = { name: i18n.translate('xpack.slo.alerting.burnRate.lowPriorityAction', { defaultMessage: 'Low', }), + severity: { level: 0 }, }; export const SUPPRESSED_PRIORITY_ACTION_ID = 'slo.burnRate.suppressed'; diff --git a/x-pack/plugins/rule_registry/common/assets/field_maps/technical_rule_field_map.test.ts b/x-pack/plugins/rule_registry/common/assets/field_maps/technical_rule_field_map.test.ts index 528354eed3d05..1b4b897664b84 100644 --- a/x-pack/plugins/rule_registry/common/assets/field_maps/technical_rule_field_map.test.ts +++ b/x-pack/plugins/rule_registry/common/assets/field_maps/technical_rule_field_map.test.ts @@ -82,6 +82,11 @@ it('matches snapshot', () => { "required": false, "type": "keyword", }, + "kibana.alert.previous_action_group": Object { + "array": false, + "required": false, + "type": "keyword", + }, "kibana.alert.reason": Object { "array": false, "multi_fields": Array [ @@ -245,6 +250,11 @@ it('matches snapshot', () => { "required": false, "type": "keyword", }, + "kibana.alert.severity_improving": Object { + "array": false, + "required": false, + "type": "boolean", + }, "kibana.alert.start": Object { "array": false, "required": false, diff --git a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts index 5ecb376a95ca8..4cafa57d3d480 100644 --- a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts +++ b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts @@ -92,6 +92,7 @@ export class FixturePlugin implements Plugin<void, void, FixtureSetupDeps, Fixtu 'test.patternFiringAad', 'test.waitingRule', 'test.patternFiringAutoRecoverFalse', + 'test.severity', ], privileges: { all: { @@ -123,6 +124,7 @@ export class FixturePlugin implements Plugin<void, void, FixtureSetupDeps, Fixtu 'test.patternFiringAad', 'test.waitingRule', 'test.patternFiringAutoRecoverFalse', + 'test.severity', ], }, }, @@ -157,6 +159,7 @@ export class FixturePlugin implements Plugin<void, void, FixtureSetupDeps, Fixtu 'test.patternFiringAad', 'test.waitingRule', 'test.patternFiringAutoRecoverFalse', + 'test.severity', ], }, }, diff --git a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/rule_types.ts b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/rule_types.ts index 109f01f6b6d57..498020cb4b7d2 100644 --- a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/rule_types.ts +++ b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/rule_types.ts @@ -1032,6 +1032,78 @@ function getWaitingRuleType(logger: Logger) { return result; } +function getSeverityRuleType() { + const paramsSchema = schema.object({ + pattern: schema.arrayOf( + schema.oneOf([schema.literal('low'), schema.literal('medium'), schema.literal('high')]) + ), + }); + type ParamsType = TypeOf<typeof paramsSchema>; + interface State extends RuleTypeState { + patternIndex?: number; + } + const result: RuleType< + ParamsType, + never, + State, + {}, + {}, + 'low' | 'medium' | 'high', + 'recovered', + { patternIndex: number; instancePattern: boolean[] } + > = { + id: 'test.severity', + name: 'Test: Rule type with severity', + actionGroups: [ + { id: 'low', name: 'Low', severity: { level: 0 } }, + { id: 'medium', name: 'Medium', severity: { level: 1 } }, + { id: 'high', name: 'High', severity: { level: 2 } }, + ], + category: 'management', + producer: 'alertsFixture', + defaultActionGroupId: 'low', + minimumLicenseRequired: 'basic', + isExportable: true, + doesSetRecoveryContext: true, + validate: { params: paramsSchema }, + async executor(executorOptions) { + const { services, state, params } = executorOptions; + const pattern = params.pattern; + if (!Array.isArray(pattern)) throw new Error('pattern is not an array'); + + const alertsClient = services.alertsClient; + if (!alertsClient) { + throw new Error(`Expected alertsClient to be defined but it is not`); + } + + // get the pattern index, return if past it + const patternIndex = state.patternIndex ?? 0; + if (patternIndex >= pattern.length) { + return { state: { patternIndex } }; + } + + alertsClient.report({ id: '*', actionGroup: pattern[patternIndex] }); + + // set recovery payload + for (const recoveredAlert of alertsClient.getRecoveredAlerts()) { + alertsClient.setAlertData({ id: recoveredAlert.alert.getId() }); + } + + return { + state: { + patternIndex: patternIndex + 1, + }, + }; + }, + alerts: { + context: 'test.severity', + shouldWrite: true, + mappings: { fieldMap: {} }, + }, + }; + return result; +} + async function sendSignal( logger: Logger, es: ElasticsearchClient, @@ -1325,4 +1397,5 @@ export function defineRuleTypes( alerting.registerType(getPatternFiringAutoRecoverFalseRuleType()); alerting.registerType(getPatternFiringAlertsAsDataRuleType()); alerting.registerType(getWaitingRuleType(logger)); + alerting.registerType(getSeverityRuleType()); } diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alert_severity.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alert_severity.ts new file mode 100644 index 0000000000000..533bd593e3588 --- /dev/null +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alert_severity.ts @@ -0,0 +1,138 @@ +/* + * 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 type { Alert } from '@kbn/alerts-as-data-utils'; +import { SearchHit } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { + ALERT_ACTION_GROUP, + ALERT_SEVERITY_IMPROVING, + ALERT_PREVIOUS_ACTION_GROUP, +} from '@kbn/rule-data-utils'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import { getEventLog, getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../common/lib'; +import { Spaces } from '../../../scenarios'; + +// eslint-disable-next-line import/no-default-export +export default function createAlertSeverityTests({ getService }: FtrProviderContext) { + const es = getService('es'); + const retry = getService('retry'); + const supertest = getService('supertest'); + const space = Spaces.default; + + const alertsAsDataIndex = '.alerts-test.severity.alerts-default'; + + describe('improving alert severity', () => { + const objectRemover = new ObjectRemover(supertest); + + afterEach(async () => { + await objectRemover.removeAll(); + }); + after(async () => { + await es.deleteByQuery({ + index: alertsAsDataIndex, + query: { match_all: {} }, + conflicts: 'proceed', + }); + }); + + it('should correctly set severity_improving and previous_action_group data in alert document', async () => { + const pattern = [ + 'low', + 'low', + 'medium', + 'high', + 'high', + 'low', + 'high', + 'medium', + 'medium', + 'low', + ]; + const { body: createdRule } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + rule_type_id: 'test.severity', + schedule: { interval: '1d' }, + throttle: null, + params: { + pattern, + }, + }) + ) + .expect(200); + const ruleId = createdRule.id; + objectRemover.add(space.id, ruleId, 'rule', 'alerting'); + + const allAlertDocs: Alert[] = []; + for (let i = 0; i < pattern.length; i++) { + // Wait for execution to finish + await waitForEventLogDocs(ruleId, new Map([['execute', { equal: i + 1 }]])); + + // Get alert after last execution + const alertDocs = await queryForAlertDocs<Alert>(); + expect(alertDocs.length).to.eql(1); + allAlertDocs.push(alertDocs[0]._source!); + + // Run another execution + await supertest + .post(`${getUrlPrefix(space.id)}/internal/alerting/rule/${ruleId}/_run_soon`) + .set('kbn-xsrf', 'foo') + .expect(204); + } + + // Verify action group and previous action group are set as expected + for (let i = 0; i < pattern.length; i++) { + expect(allAlertDocs[i][ALERT_ACTION_GROUP]).to.eql(pattern[i]); + + if (i >= 1) { + expect(allAlertDocs[i][ALERT_PREVIOUS_ACTION_GROUP]).to.eql(pattern[i - 1]); + } else { + expect(allAlertDocs[i][ALERT_PREVIOUS_ACTION_GROUP]).to.be(undefined); + } + } + + // Verify severity_improving is set correctly + expect(allAlertDocs[0][ALERT_SEVERITY_IMPROVING]).to.eql(false); + expect(allAlertDocs[1][ALERT_SEVERITY_IMPROVING]).to.be(undefined); + expect(allAlertDocs[2][ALERT_SEVERITY_IMPROVING]).to.eql(false); + expect(allAlertDocs[3][ALERT_SEVERITY_IMPROVING]).to.eql(false); + expect(allAlertDocs[4][ALERT_SEVERITY_IMPROVING]).to.be(undefined); + expect(allAlertDocs[5][ALERT_SEVERITY_IMPROVING]).to.eql(true); + expect(allAlertDocs[6][ALERT_SEVERITY_IMPROVING]).to.eql(false); + expect(allAlertDocs[7][ALERT_SEVERITY_IMPROVING]).to.eql(true); + expect(allAlertDocs[8][ALERT_SEVERITY_IMPROVING]).to.be(undefined); + expect(allAlertDocs[9][ALERT_SEVERITY_IMPROVING]).to.eql(true); + }); + }); + + async function queryForAlertDocs<T>(): Promise<Array<SearchHit<T>>> { + const searchResult = await es.search({ + index: alertsAsDataIndex, + body: { query: { match_all: {} } }, + }); + return searchResult.hits.hits as Array<SearchHit<T>>; + } + + async function waitForEventLogDocs( + id: string, + actions: Map<string, { gte: number } | { equal: number }> + ) { + return await retry.try(async () => { + return await getEventLog({ + getService, + spaceId: space.id, + type: 'alert', + id, + provider: 'alerting', + actions, + }); + }); + } +} diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data.ts index 99464a5f4069d..1604fa24bfe79 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data.ts @@ -17,6 +17,8 @@ import { ALERT_FLAPPING, ALERT_FLAPPING_HISTORY, ALERT_INSTANCE_ID, + ALERT_SEVERITY_IMPROVING, + ALERT_PREVIOUS_ACTION_GROUP, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, ALERT_RULE_EXECUTION_TIMESTAMP, @@ -62,6 +64,8 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F 'kibana.alert.flapping_history', 'kibana.alert.rule.execution.uuid', 'kibana.alert.rule.execution.timestamp', + 'kibana.alert.severity_improving', + 'kibana.alert.previous_action_group', ]; describe('alerts as data', () => { @@ -169,6 +173,9 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F // tags should equal rule tags because rule type doesn't set any tags expect(source.tags).to.eql(['foo']); + + // new alerts automatically get severity_improving set to false + expect(source[ALERT_SEVERITY_IMPROVING]).to.equal(false); } let alertDoc: SearchHit<PatternFiringAlert> | undefined = alertDocsRun1.find( @@ -256,6 +263,10 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F expect(alertADocRun2[ALERT_WORKFLOW_STATUS]).to.eql(alertADocRun1[ALERT_WORKFLOW_STATUS]); expect(alertADocRun2[ALERT_TIME_RANGE]?.gte).to.equal(alertADocRun1[ALERT_TIME_RANGE]?.gte); + // no severity levels for this rule type + expect(alertADocRun2[ALERT_SEVERITY_IMPROVING]).to.be(undefined); + expect(alertADocRun2[ALERT_PREVIOUS_ACTION_GROUP]).to.equal('default'); + // alertB, run 2 // status is updated to recovered, duration is updated, end time is set alertDoc = alertDocsRun2.find((doc) => doc._source![ALERT_INSTANCE_ID] === 'alertB'); @@ -295,6 +306,10 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F // time_range.lte should be set to end time expect(alertBDocRun2[ALERT_TIME_RANGE]?.lte).to.equal(alertBDocRun2[ALERT_END]); + // recovered alerts automatically get severity_improving set to true + expect(alertBDocRun2[ALERT_SEVERITY_IMPROVING]).to.equal(true); + expect(alertBDocRun2[ALERT_PREVIOUS_ACTION_GROUP]).to.equal('default'); + // alertC, run 2 // status is updated to recovered, duration is updated, end time is set alertDoc = alertDocsRun2.find((doc) => doc._source![ALERT_INSTANCE_ID] === 'alertC'); @@ -334,6 +349,10 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F // time_range.lte should be set to end time expect(alertCDocRun2[ALERT_TIME_RANGE]?.lte).to.equal(alertCDocRun2[ALERT_END]); + // recovered alerts automatically get severity_improving set to true + expect(alertBDocRun2[ALERT_SEVERITY_IMPROVING]).to.equal(true); + expect(alertCDocRun2[ALERT_PREVIOUS_ACTION_GROUP]).to.equal('default'); + // -------------------------- // RUN 3 - 1 re-active (alertC), 1 still recovered (alertB), 1 ongoing (alertA) // -------------------------- @@ -401,6 +420,10 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F expect(alertADocRun3[ALERT_WORKFLOW_STATUS]).to.eql(alertADocRun2[ALERT_WORKFLOW_STATUS]); expect(alertADocRun3[ALERT_TIME_RANGE]?.gte).to.equal(alertADocRun2[ALERT_TIME_RANGE]?.gte); + // no severity levels for this rule type + expect(alertADocRun3[ALERT_SEVERITY_IMPROVING]).to.be(undefined); + expect(alertADocRun3[ALERT_PREVIOUS_ACTION_GROUP]).to.equal('default'); + // alertB doc should be unchanged from prior run because it is still recovered // but its flapping history should be updated alertDoc = alertDocsRun3.find((doc) => doc._source![ALERT_INSTANCE_ID] === 'alertB'); @@ -420,6 +443,9 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F false, ]); + expect(alertBDocRun3[ALERT_SEVERITY_IMPROVING]).to.be(undefined); + expect(alertBDocRun3[ALERT_PREVIOUS_ACTION_GROUP]).to.equal('recovered'); + // alertC should have 2 docs const alertCDocs = alertDocsRun3.filter( (doc) => doc._source![ALERT_INSTANCE_ID] === 'alertC' @@ -462,6 +488,10 @@ export default function createAlertsAsDataInstallResourcesTest({ getService }: F expect(alertCDocRun3[EVENT_KIND]).to.eql('signal'); expect(alertCDocRun3[ALERT_WORKFLOW_STATUS]).to.eql('open'); expect(alertCDocRun3[ALERT_TIME_RANGE]?.gte).to.equal(alertCDocRun3[ALERT_START]); + + // new alerts automatically get severity_improving set to false + expect(alertCDocRun3[ALERT_SEVERITY_IMPROVING]).to.equal(false); + expect(alertCDocRun3[ALERT_PREVIOUS_ACTION_GROUP]).to.be(undefined); }); }); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts index 8d75c66905b3a..59fd7eeb5d6fa 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_conflicts.ts @@ -287,6 +287,8 @@ const SkipFields = [ 'kibana.alert.workflow_tags', 'kibana.alert.workflow_status', 'kibana.alert.consecutive_matches', + 'kibana.alert.severity_improving', + 'kibana.alert.previous_action_group', ]; function log(message: string) { diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/index.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/index.ts index 86c239250d109..79dae86b6a8d5 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/index.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/index.ts @@ -30,6 +30,7 @@ export default function alertingTests({ loadTestFile, getService }: FtrProviderC loadTestFile(require.resolve('./flapping_history')); loadTestFile(require.resolve('./check_registered_rule_types')); loadTestFile(require.resolve('./alert_delay')); + loadTestFile(require.resolve('./alert_severity')); loadTestFile(require.resolve('./generate_alert_schemas')); // Do not place test files here, due to https://github.com/elastic/kibana/issues/123059 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 3e0f400d35e78..a8106a85a9bc9 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 @@ -13,6 +13,7 @@ import { ALERT_FLAPPING, ALERT_FLAPPING_HISTORY, ALERT_INSTANCE_ID, + ALERT_SEVERITY_IMPROVING, ALERT_MAINTENANCE_WINDOW_IDS, ALERT_REASON, ALERT_RULE_CATEGORY, @@ -38,6 +39,7 @@ import { VERSION, ALERT_CONSECUTIVE_MATCHES, ALERT_RULE_EXECUTION_TIMESTAMP, + ALERT_PREVIOUS_ACTION_GROUP, } from '@kbn/rule-data-utils'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { createEsQueryRule } from './helpers/alerting_api_helper'; @@ -155,6 +157,8 @@ export default function ({ getService }: FtrProviderContext) { 'kibana.alert.url', 'kibana.version', 'kibana.alert.consecutive_matches', + 'kibana.alert.severity_improving', + 'kibana.alert.previous_action_group', ]; for (const field of fields) { @@ -274,6 +278,8 @@ export default function ({ getService }: FtrProviderContext) { expect(hits2[ALERT_DURATION]).not.to.be(0); expect(hits2[ALERT_RULE_EXECUTION_TIMESTAMP]).to.eql(hits2['@timestamp']); expect(hits2[ALERT_CONSECUTIVE_MATCHES]).to.be.greaterThan(hits1[ALERT_CONSECUTIVE_MATCHES]); + expect(hits2[ALERT_PREVIOUS_ACTION_GROUP]).to.be('query matched'); + expect(hits2[ALERT_SEVERITY_IMPROVING]).to.be(undefined); // remove fields we know will be different const fields = [ @@ -285,6 +291,8 @@ export default function ({ getService }: FtrProviderContext) { 'kibana.alert.rule.execution.uuid', 'kibana.alert.rule.execution.timestamp', 'kibana.alert.consecutive_matches', + 'kibana.alert.severity_improving', + 'kibana.alert.previous_action_group', ]; for (const field of fields) { 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 0058e15d85c97..27f27f33bd163 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 @@ -11,6 +11,7 @@ import { ALERT_ACTION_GROUP, ALERT_FLAPPING, ALERT_INSTANCE_ID, + ALERT_SEVERITY_IMPROVING, ALERT_RULE_CATEGORY, ALERT_RULE_CONSUMER, ALERT_RULE_NAME, @@ -24,6 +25,7 @@ import { ALERT_WORKFLOW_STATUS, SPACE_IDS, TAGS, + ALERT_PREVIOUS_ACTION_GROUP, } from '@kbn/rule-data-utils'; import { omit, padStart } from 'lodash'; import { FtrProviderContext } from '../../../ftr_provider_context'; @@ -194,6 +196,7 @@ export default function ({ getService }: FtrProviderContext) { [ALERT_ACTION_GROUP]: 'query matched', [ALERT_FLAPPING]: false, [ALERT_INSTANCE_ID]: 'query matched', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_RULE_CATEGORY]: 'Elasticsearch query', @@ -323,6 +326,7 @@ export default function ({ getService }: FtrProviderContext) { [ALERT_ACTION_GROUP]: 'query matched', [ALERT_FLAPPING]: false, [ALERT_INSTANCE_ID]: 'query matched', + [ALERT_SEVERITY_IMPROVING]: false, [ALERT_STATUS]: 'active', [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_RULE_CATEGORY]: 'Elasticsearch query', @@ -546,6 +550,7 @@ export default function ({ getService }: FtrProviderContext) { ['kibana.alert.evaluation.threshold']: -1, ['kibana.alert.evaluation.value']: '0', [ALERT_ACTION_GROUP]: 'query matched', + [ALERT_PREVIOUS_ACTION_GROUP]: 'query matched', [ALERT_FLAPPING]: false, [ALERT_INSTANCE_ID]: 'query matched', [ALERT_STATUS]: 'active', From 84fa85a641b8cb7746bb392c2480ffaa729876a4 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:47:40 -0700 Subject: [PATCH 37/40] [Unified Data Table] Fix visual line clamping with EuiDescriptionList description (#186570) ## Summary See https://github.com/elastic/eui/issues/7780#issuecomment-2179754777 ### Before <img width="651" alt="" src="https://github.com/elastic/kibana/assets/549407/f527216b-06ba-42e2-8774-c227d4263aaf"> ### After <img width="643" alt="" src="https://github.com/elastic/kibana/assets/549407/652352bd-79e4-4c7c-8e79-0479178b55c3"> ### Checklist Delete any items that are not applicable to this PR. - ~[ ] 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> --- packages/kbn-unified-data-table/src/components/data_table.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/kbn-unified-data-table/src/components/data_table.scss b/packages/kbn-unified-data-table/src/components/data_table.scss index 28864457af269..4e56e3450ffcb 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.scss +++ b/packages/kbn-unified-data-table/src/components/data_table.scss @@ -138,6 +138,7 @@ padding-inline: 0; background: transparent; font-weight: $euiFontWeightBold; + line-height: inherit; // Required for EuiDataGrid lineCount to work correctly } .unifiedDataTable__descriptionListDescription { @@ -145,6 +146,7 @@ padding-inline: 0; word-break: break-all; white-space: normal; + line-height: inherit; // Required for EuiDataGrid lineCount to work correctly // Special handling for images coming from the image field formatter img { From fdfcc52af8389907b736c940d31777f9b9ab482c Mon Sep 17 00:00:00 2001 From: Philippe Oberti <philippe.oberti@elastic.co> Date: Wed, 26 Jun 2024 11:48:41 -0500 Subject: [PATCH 38/40] [Security Solution][Notes] - use correct mardowneditor and avatar (#186958) --- .../left/components/notes_list.test.tsx | 59 +++++++++++++++---- .../left/components/notes_list.tsx | 13 +++- .../left/components/test_ids.ts | 1 + 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx index 5f561d34f15d9..481de258215b0 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx @@ -5,16 +5,17 @@ * 2.0. */ -import { render } from '@testing-library/react'; +import { render, within } from '@testing-library/react'; import React from 'react'; import { ADD_NOTE_LOADING_TEST_ID, DELETE_NOTE_BUTTON_TEST_ID, + NOTE_AVATAR_TEST_ID, NOTES_COMMENT_TEST_ID, NOTES_LOADING_TEST_ID, } from './test_ids'; import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; -import { DELETE_NOTE_ERROR, FETCH_NOTES_ERROR, NO_NOTES, NotesList } from './notes_list'; +import { FETCH_NOTES_ERROR, NO_NOTES, NotesList } from './notes_list'; import { ReqStatus } from '../../../../notes/store/notes.slice'; const mockAddError = jest.fn(); @@ -46,6 +47,7 @@ describe('NotesList', () => { expect(getByTestId(`${NOTES_COMMENT_TEST_ID}-0`)).toBeInTheDocument(); expect(getByText('note-1')).toBeInTheDocument(); expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toBeInTheDocument(); + expect(getByTestId(`${NOTE_AVATAR_TEST_ID}-0`)).toBeInTheDocument(); }); it('should render loading spinner if notes are being fetched', () => { @@ -117,6 +119,33 @@ describe('NotesList', () => { }); }); + it('should render ? in avatar is user is missing', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + fetchNotesByDocumentId: ReqStatus.Failed, + }, + error: { + ...mockGlobalState.notes.error, + fetchNotesByDocumentId: { type: 'http', status: 500 }, + }, + }, + }); + + render( + <TestProviders store={store}> + <NotesList eventId={'event-id'} /> + </TestProviders> + ); + + expect(mockAddError).toHaveBeenCalledWith(null, { + title: FETCH_NOTES_ERROR, + }); + }); + it('should render create loading when user creates a new note', () => { const store = createMockStore({ ...mockGlobalState, @@ -177,25 +206,29 @@ describe('NotesList', () => { ...mockGlobalState, notes: { ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - deleteNote: ReqStatus.Failed, - }, - error: { - ...mockGlobalState.notes.error, - deleteNote: { type: 'http', status: 500 }, + entities: { + '1': { + eventId: 'event-id', + noteId: '1', + note: 'note-1', + timelineId: '', + created: 1663882629000, + createdBy: 'elastic', + updated: 1663882629000, + updatedBy: null, + version: 'version', + }, }, }, }); - render( + const { getByTestId } = render( <TestProviders store={store}> <NotesList eventId={'event-id'} /> </TestProviders> ); + const { getByText } = within(getByTestId(`${NOTE_AVATAR_TEST_ID}-0`)); - expect(mockAddError).toHaveBeenCalledWith(null, { - title: DELETE_NOTE_ERROR, - }); + expect(getByText('?')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx index 3ddff35c04bd3..ae6d9d261f62f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx @@ -7,18 +7,20 @@ import React, { memo, useCallback, useEffect, useState } from 'react'; import { + EuiAvatar, EuiButtonIcon, EuiComment, EuiCommentList, EuiLoadingElastic, - EuiMarkdownFormat, } from '@elastic/eui'; import { useDispatch, useSelector } from 'react-redux'; import { FormattedRelative } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; +import { MarkdownRenderer } from '../../../../common/components/markdown_editor'; import { ADD_NOTE_LOADING_TEST_ID, DELETE_NOTE_BUTTON_TEST_ID, + NOTE_AVATAR_TEST_ID, NOTES_COMMENT_TEST_ID, NOTES_LOADING_TEST_ID, } from './test_ids'; @@ -138,8 +140,15 @@ export const NotesList = memo(({ eventId }: NotesListProps) => { isLoading={deletingNoteId === note.noteId && deleteStatus === ReqStatus.Loading} /> } + timelineAvatar={ + <EuiAvatar + data-test-subj={`${NOTE_AVATAR_TEST_ID}-${index}`} + size="l" + name={note.updatedBy || '?'} + /> + } > - <EuiMarkdownFormat textSize="s">{note.note || ''}</EuiMarkdownFormat> + <MarkdownRenderer>{note.note || ''}</MarkdownRenderer> </EuiComment> ))} {createStatus === ReqStatus.Loading && ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts index 9b5c670f1ba26..48ad53d50a6d7 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts @@ -97,4 +97,5 @@ export const NOTES_COMMENT_TEST_ID = `${PREFIX}NotesComment` as const; export const ADD_NOTE_LOADING_TEST_ID = `${PREFIX}AddNotesLoading` as const; export const ADD_NOTE_MARKDOWN_TEST_ID = `${PREFIX}AddNotesMarkdown` as const; export const ADD_NOTE_BUTTON_TEST_ID = `${PREFIX}AddNotesButton` as const; +export const NOTE_AVATAR_TEST_ID = `${PREFIX}NoteAvatar` as const; export const DELETE_NOTE_BUTTON_TEST_ID = `${PREFIX}DeleteNotesButton` as const; From 72090ee7c37f11bad728e4b0d7ab89aecd06dafa Mon Sep 17 00:00:00 2001 From: Tim Sullivan <tsullivan@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:00:49 -0700 Subject: [PATCH 39/40] [Files] Use server-side authc.getCurrentUser from core.security (#186922) Part of https://github.com/elastic/kibana/issues/186574 Background: This PR serves as an example of a plugin migrating away from depending on the Security plugin, which is a high priority effort for the last release before 9.0. The Files plugin uses the `authc.getCurrentUser` method to attribute the current user to files that are created in the system. ### Checklist Delete any items that are not applicable to this PR. - [ ] [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 --- src/plugins/files/server/routes/file_kind/create.ts | 6 +++--- src/plugins/files/server/routes/types.ts | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/plugins/files/server/routes/file_kind/create.ts b/src/plugins/files/server/routes/file_kind/create.ts index 9121e27df0ac1..b15cb96a2ce93 100644 --- a/src/plugins/files/server/routes/file_kind/create.ts +++ b/src/plugins/files/server/routes/file_kind/create.ts @@ -31,12 +31,12 @@ export type Endpoint<M = unknown> = CreateRouteDefinition< FilesClient['create'] >; -export const handler: CreateHandler<Endpoint> = async ({ fileKind, files }, req, res) => { - const { fileService, security } = await files; +export const handler: CreateHandler<Endpoint> = async ({ core, fileKind, files }, req, res) => { + const [{ security }, { fileService }] = await Promise.all([core, files]); const { body: { name, alt, meta, mimeType }, } = req; - const user = security?.authc.getCurrentUser(req); + const user = security.authc.getCurrentUser(); const file = await fileService.asCurrentUser().create({ fileKind, name, diff --git a/src/plugins/files/server/routes/types.ts b/src/plugins/files/server/routes/types.ts index 9a1332137c811..5095ae8ab51a2 100644 --- a/src/plugins/files/server/routes/types.ts +++ b/src/plugins/files/server/routes/types.ts @@ -17,14 +17,12 @@ import type { ResponseError, RouteMethod, } from '@kbn/core/server'; -import type { SecurityPluginStart } from '@kbn/security-plugin/server'; import type { FileServiceStart } from '../file_service'; import { Counters } from '../usage'; import { AnyEndpoint } from './api_routes'; export interface FilesRequestHandlerContext extends RequestHandlerContext { files: Promise<{ - security?: SecurityPluginStart; fileService: { asCurrentUser: () => FileServiceStart; asInternalUser: () => FileServiceStart; From 15a495a1b25312e8fac19740780bde16f4a5f0f2 Mon Sep 17 00:00:00 2001 From: Tim Sullivan <tsullivan@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:03:25 -0700 Subject: [PATCH 40/40] [Image Embeddable] Use client-side authc.getCurrentUser from core.security (#186917) Part of https://github.com/elastic/kibana/issues/186574 Background: This PR serves as an example of a plugin migrating away from depending on the Security plugin, which is a high priority effort for the last release before 9.0. The Image Embeddable plugin uses the `authc.getCurrentUser` method as a means to allow the user to delete image files that are attributed to them. ### Checklist Delete any items that are not applicable to this PR. - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../public/components/image_editor/open_image_editor.tsx | 6 +++--- .../image_embeddable/public/services/kibana_services.ts | 3 --- src/plugins/image_embeddable/tsconfig.json | 1 - 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx b/src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx index dd2932164c014..c737640a4f1b9 100644 --- a/src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx +++ b/src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx @@ -14,7 +14,7 @@ import { FilesContext } from '@kbn/shared-ux-file-context'; import { ImageConfig } from '../../image_embeddable/types'; import { FileImageMetadata, imageEmbeddableFileKind } from '../../imports'; -import { coreServices, filesService, securityService } from '../../services/kibana_services'; +import { coreServices, filesService } from '../../services/kibana_services'; import { createValidateUrl } from '../../utils/validate_url'; import { ImageViewerContext } from '../image_viewer/image_viewer_context'; @@ -27,8 +27,8 @@ export const openImageEditor = async ({ }): Promise<ImageConfig> => { const { ImageEditorFlyout } = await import('./image_editor_flyout'); - const { overlays, theme, i18n, http } = coreServices; - const user = securityService ? await securityService.authc.getCurrentUser() : undefined; + const { overlays, theme, i18n, http, security } = coreServices; + const user = await security.authc.getCurrentUser(); const filesClient = filesService.filesClientFactory.asUnscoped<FileImageMetadata>(); /** diff --git a/src/plugins/image_embeddable/public/services/kibana_services.ts b/src/plugins/image_embeddable/public/services/kibana_services.ts index a04328bb6e041..84711a3c2350c 100644 --- a/src/plugins/image_embeddable/public/services/kibana_services.ts +++ b/src/plugins/image_embeddable/public/services/kibana_services.ts @@ -11,7 +11,6 @@ import { BehaviorSubject } from 'rxjs'; import { CoreStart } from '@kbn/core/public'; import { FilesStart } from '@kbn/files-plugin/public'; import { ScreenshotModePluginStart } from '@kbn/screenshot-mode-plugin/public'; -import { SecurityPluginStart } from '@kbn/security-plugin-types-public'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { ImageEmbeddableStartDependencies } from '../plugin'; @@ -20,7 +19,6 @@ export let coreServices: CoreStart; export let filesService: FilesStart; export let uiActionsService: UiActionsStart; export let screenshotModeService: ScreenshotModePluginStart | undefined; -export let securityService: SecurityPluginStart | undefined; export let trackUiMetric: ( type: string, @@ -48,7 +46,6 @@ export const setKibanaServices = ( ) => { coreServices = kibanaCore; filesService = deps.files; - securityService = deps.security; uiActionsService = deps.uiActions; screenshotModeService = deps.screenshotMode; diff --git a/src/plugins/image_embeddable/tsconfig.json b/src/plugins/image_embeddable/tsconfig.json index 7e54325cb7762..d9863cf7fd6ac 100644 --- a/src/plugins/image_embeddable/tsconfig.json +++ b/src/plugins/image_embeddable/tsconfig.json @@ -23,7 +23,6 @@ "@kbn/presentation-containers", "@kbn/presentation-publishing", "@kbn/react-kibana-mount", - "@kbn/security-plugin-types-public", "@kbn/embeddable-enhanced-plugin" ], "exclude": ["target/**/*"]