From 62a163cc955c6bf06e556041d86c188e2612a03f Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:02:12 -0500 Subject: [PATCH 01/28] Update dependency @types/selenium-webdriver to ^4.1.26 (main) (#191906) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/selenium-webdriver](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/selenium-webdriver) ([source](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/selenium-webdriver)) | devDependencies | patch | [`^4.1.25` -> `^4.1.26`](https://renovatebot.com/diffs/npm/@types%2fselenium-webdriver/4.1.25/4.1.26) | --- ### 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. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c00147f5f65c5..1380fea8eeea2 100644 --- a/package.json +++ b/package.json @@ -1600,7 +1600,7 @@ "@types/redux-actions": "^2.6.1", "@types/resolve": "^1.20.1", "@types/seedrandom": ">=2.0.0 <4.0.0", - "@types/selenium-webdriver": "^4.1.25", + "@types/selenium-webdriver": "^4.1.26", "@types/semver": "^7.5.8", "@types/set-value": "^2.0.0", "@types/sinon": "^7.0.13", diff --git a/yarn.lock b/yarn.lock index b1866feb1cd80..84151aa6f23a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11229,10 +11229,10 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== -"@types/selenium-webdriver@^4.1.25": - version "4.1.25" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.25.tgz#9f04cbe716529f74b3d86a445c000aedec7813a6" - integrity sha512-Jnlg7h7WDq4k8N2p/zp1ax6qizvU9Pn37I/HR/KX8k5TIU1wfUAuBy8CA6x8drAqa9PY3kYykmmyNHU4tX91LQ== +"@types/selenium-webdriver@^4.1.26": + version "4.1.26" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.26.tgz#09c696a341cf8cfc1641cded11d14813350b6ca9" + integrity sha512-PUgqsyNffal0eAU0bzGlh37MJo558aporAPZoKqBeB/pF7zhKl1S3zqza0GpwFqgoigNxWhEIJzru75eeYco/w== dependencies: "@types/node" "*" "@types/ws" "*" From 0be5efd71b2a1310943439785d7b6787b6fbcf95 Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Tue, 3 Sep 2024 19:25:09 +0200 Subject: [PATCH 02/28] [Dataset Quality] Create the basic degraded fields flyout (#191597) ## Summary Closes - https://github.com/elastic/kibana/issues/190328 Delivered as part of this PR - [x] Added a new Degraded Field Flyout with a basic List of data point for the degraded Field - [x] A new endpoint to display possible values. This endpoint will query to get the latest values, maximum 4 - [x] URL supports Flyout state - [x] API Tests for the new endpoint - [x] E2E tests for the flyout ## Screenshot image --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../locators/dataset_quality_details.ts | 1 + .../src/lib/logs/index.ts | 1 + .../data_quality/common/url_schema/common.ts | 4 +- .../dataset_quality_details_url_schema_v1.ts | 1 + .../dataset_quality_details/url_schema_v1.ts | 2 + .../dataset_quality/common/api_types.ts | 7 ++ .../common/data_streams_stats/types.ts | 7 ++ .../dataset_quality/common/translations.ts | 28 +++++ .../degraded_fields => common}/spark_plot.tsx | 2 +- .../dataset_quality_details.tsx | 27 +++-- .../degraded_field_flyout/field_info.tsx | 108 +++++++++++++++++ .../degraded_field_flyout/index.tsx | 56 +++++++++ .../overview/degraded_fields/columns.tsx | 63 ++++++++-- .../overview/degraded_fields/table.tsx | 23 +++- .../dataset_quality_details/public_state.ts | 2 + .../dataset_quality_details/types.ts | 2 +- .../use_dataset_quality_details_state.ts | 11 +- .../public/hooks/use_degraded_fields.ts | 39 +++++- .../data_stream_details_client.ts | 27 +++++ .../services/data_stream_details/types.ts | 6 +- .../state_machine.ts | 65 ++++++++++ .../types.ts | 22 ++++ .../get_degraded_field_values/index.ts | 65 ++++++++++ .../server/routes/data_streams/routes.ts | 30 +++++ .../degraded_field_values.spec.ts | 99 +++++++++++++++ .../apps/dataset_quality/data/logs_data.ts | 6 +- .../dataset_quality_details.ts | 2 +- ...t_quality_details_degraded_field_flyout.ts | 108 +++++++++++++++++ .../functional/apps/dataset_quality/index.ts | 1 + .../page_objects/dataset_quality.ts | 44 ++++++- .../degraded_field_values.ts | 110 +++++++++++++++++ .../dataset_quality_api_integration/index.ts | 1 + .../dataset_quality/data/logs_data.ts | 6 +- .../dataset_quality_details.ts | 3 +- ...t_quality_details_degraded_field_flyout.ts | 114 ++++++++++++++++++ .../observability/dataset_quality/index.ts | 1 + 36 files changed, 1047 insertions(+), 47 deletions(-) rename x-pack/plugins/observability_solution/dataset_quality/public/components/{dataset_quality_details/overview/degraded_fields => common}/spark_plot.tsx (97%) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_values/index.ts create mode 100644 x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts create mode 100644 x-pack/test/functional/apps/dataset_quality/dataset_quality_details_degraded_field_flyout.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/degraded_field_values.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details_degraded_field_flyout.ts diff --git a/packages/deeplinks/observability/locators/dataset_quality_details.ts b/packages/deeplinks/observability/locators/dataset_quality_details.ts index 6f51bbbfe7ce3..0586b23a408fc 100644 --- a/packages/deeplinks/observability/locators/dataset_quality_details.ts +++ b/packages/deeplinks/observability/locators/dataset_quality_details.ts @@ -40,4 +40,5 @@ export interface DataQualityDetailsLocatorParams extends SerializableRecord { degradedFields?: { table?: DegradedFieldsTable; }; + expandedDegradedField?: string; } diff --git a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts index 9f0ba5ef4adbb..438597cfd5161 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts @@ -66,6 +66,7 @@ export type LogDocument = Fields & 'event.duration': number; 'event.start': Date; 'event.end': Date; + test_field: string | string[]; date: Date; severity: string; msg: string; diff --git a/x-pack/plugins/data_quality/common/url_schema/common.ts b/x-pack/plugins/data_quality/common/url_schema/common.ts index d184fbffe475e..eb929faee1b00 100644 --- a/x-pack/plugins/data_quality/common/url_schema/common.ts +++ b/x-pack/plugins/data_quality/common/url_schema/common.ts @@ -45,9 +45,9 @@ export const degradedFieldRT = rt.exact( export const dataStreamRT = new rt.Type( 'dataStreamRT', (input: unknown): input is string => - typeof input === 'string' && (input.match(/-/g) || []).length === 2, + typeof input === 'string' && (input.match(/-/g) || []).length >= 2, (input, context) => - typeof input === 'string' && (input.match(/-/g) || []).length === 2 + typeof input === 'string' && (input.match(/-/g) || []).length >= 2 ? rt.success(input) : rt.failure(input, context), rt.identity diff --git a/x-pack/plugins/data_quality/common/url_schema/dataset_quality_details_url_schema_v1.ts b/x-pack/plugins/data_quality/common/url_schema/dataset_quality_details_url_schema_v1.ts index cc92663ff31e9..e177a325b353b 100644 --- a/x-pack/plugins/data_quality/common/url_schema/dataset_quality_details_url_schema_v1.ts +++ b/x-pack/plugins/data_quality/common/url_schema/dataset_quality_details_url_schema_v1.ts @@ -18,6 +18,7 @@ export const urlSchemaRT = rt.exact( timeRange: timeRangeRT, breakdownField: rt.string, degradedFields: degradedFieldRT, + expandedDegradedField: rt.string, }), ]) ); diff --git a/x-pack/plugins/data_quality/public/routes/dataset_quality_details/url_schema_v1.ts b/x-pack/plugins/data_quality/public/routes/dataset_quality_details/url_schema_v1.ts index 551ae51892adf..1b08d9832c093 100644 --- a/x-pack/plugins/data_quality/public/routes/dataset_quality_details/url_schema_v1.ts +++ b/x-pack/plugins/data_quality/public/routes/dataset_quality_details/url_schema_v1.ts @@ -18,6 +18,7 @@ export const getStateFromUrlValue = ( timeRange: urlValue.timeRange, degradedFields: urlValue.degradedFields, breakdownField: urlValue.breakdownField, + expandedDegradedField: urlValue.expandedDegradedField, }); export const getUrlValueFromState = ( @@ -28,6 +29,7 @@ export const getUrlValueFromState = ( timeRange: state.timeRange, degradedFields: state.degradedFields, breakdownField: state.breakdownField, + expandedDegradedField: state.expandedDegradedField, v: 1, }); diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts index a869d3fa70652..6a514650b195d 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts @@ -113,6 +113,13 @@ export const getDataStreamDegradedFieldsResponseRt = rt.type({ export type DegradedFieldResponse = rt.TypeOf; +export const degradedFieldValuesRt = rt.type({ + field: rt.string, + values: rt.array(rt.string), +}); + +export type DegradedFieldValues = rt.TypeOf; + export const dataStreamSettingsRt = rt.partial({ createdOn: rt.union([rt.null, rt.number]), // rt.null is needed because `createdOn` is not available on Serverless integration: rt.string, diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts index 79fdbfbd7dd96..1e5adedc20f3a 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts @@ -34,6 +34,13 @@ export type GetDataStreamDegradedFieldsQueryParams = export type GetDataStreamDegradedFieldsParams = GetDataStreamDegradedFieldsPathParams & GetDataStreamDegradedFieldsQueryParams; +/* +Types for Degraded Field Values inside a DataStream + */ + +export type GetDataStreamDegradedFieldValuesPathParams = + APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values`>['params']['path']; + /* Types for DataStream Settings */ diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts index 959932bd0c5ac..cdaacd2f43cff 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts @@ -374,3 +374,31 @@ export const integrationVersionText = i18n.translate( defaultMessage: 'Version', } ); +export const fieldColumnName = i18n.translate('xpack.datasetQuality.details.degradedField.field', { + defaultMessage: 'Field', +}); + +export const countColumnName = i18n.translate('xpack.datasetQuality.details.degradedField.count', { + defaultMessage: 'Docs count', +}); + +export const lastOccurrenceColumnName = i18n.translate( + 'xpack.datasetQuality.details.degradedField.lastOccurrence', + { + defaultMessage: 'Last occurrence', + } +); + +export const degradedFieldValuesColumnName = i18n.translate( + 'xpack.datasetQuality.details.degradedField.values', + { + defaultMessage: 'Values', + } +); + +export const fieldIgnoredText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.fieldIgnored', + { + defaultMessage: 'field ignored', + } +); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/spark_plot.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/common/spark_plot.tsx similarity index 97% rename from x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/spark_plot.tsx rename to x-pack/plugins/observability_solution/dataset_quality/public/components/common/spark_plot.tsx index dcf1d4032c886..0f032ff47825a 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/spark_plot.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/common/spark_plot.tsx @@ -16,7 +16,7 @@ import { } from '@elastic/eui'; import { ScaleType, Settings, Tooltip, Chart, BarSeries } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; -import { Coordinate } from '../../../../../common/types'; +import { Coordinate } from '../../../common/types'; export function SparkPlot({ valueLabel, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/dataset_quality_details.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/dataset_quality_details.tsx index 56632cdad8cfa..d818ffe9aaf1b 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/dataset_quality_details.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/dataset_quality_details.tsx @@ -6,16 +6,20 @@ */ import React, { useEffect } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule } from '@elastic/eui'; +import { dynamic } from '@kbn/shared-ux-utility'; import { useDatasetDetailsTelemetry, useDatasetQualityDetailsState } from '../../hooks'; import { DataStreamNotFoundPrompt } from './index_not_found_prompt'; import { Header } from './header'; import { Overview } from './overview'; import { Details } from './details'; +const DegradedFieldFlyout = dynamic(() => import('./degraded_field_flyout')); + // Allow for lazy loading // eslint-disable-next-line import/no-default-export export default function DatasetQualityDetails() { - const { isIndexNotFoundError, dataStream } = useDatasetQualityDetailsState(); + const { isIndexNotFoundError, dataStream, expandedDegradedField } = + useDatasetQualityDetailsState(); const { startTracking } = useDatasetDetailsTelemetry(); useEffect(() => { @@ -24,14 +28,17 @@ export default function DatasetQualityDetails() { return isIndexNotFoundError ? ( ) : ( - - -
- - - -
- - + <> + + +
+ + + +
+ + + {expandedDegradedField && } + ); } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx new file mode 100644 index 0000000000000..5e6756be96630 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { + EuiBadge, + EuiBadgeGroup, + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiSkeletonRectangle, + EuiTextColor, + EuiTitle, + formatNumber, +} from '@elastic/eui'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '@kbn/field-types'; + +import { NUMBER_FORMAT } from '../../../../common/constants'; +import { + countColumnName, + degradedFieldValuesColumnName, + lastOccurrenceColumnName, +} from '../../../../common/translations'; +import { useDegradedFields } from '../../../hooks'; +import { SparkPlot } from '../../common/spark_plot'; + +export const DegradedFieldInfo = () => { + const { + renderedItems, + fieldFormats, + expandedDegradedField, + degradedFieldValues, + isDegradedFieldsLoading, + isDegradedFieldsValueLoading, + } = useDegradedFields(); + + const dateFormatter = fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.DATE, [ + ES_FIELD_TYPES.DATE, + ]); + + const fieldList = useMemo(() => { + return renderedItems.find((item) => { + return item.name === expandedDegradedField; + }); + }, [renderedItems, expandedDegradedField]); + + return ( + + + + + {countColumnName} + + + + + + + + + + + {lastOccurrenceColumnName} + + + + {dateFormatter.convert(fieldList?.lastOccurrence)} + + + + + + + {degradedFieldValuesColumnName} + + + + + + {degradedFieldValues?.values.map((value) => ( + + + {value} + + + ))} + + + + + + + ); +}; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx new file mode 100644 index 0000000000000..84d997296b8a9 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.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 React from 'react'; +import { + EuiBadge, + EuiFlyout, + EuiFlyoutHeader, + EuiFlyoutBody, + EuiSpacer, + EuiText, + EuiTitle, + useGeneratedHtmlId, +} from '@elastic/eui'; +import { useDegradedFields } from '../../../hooks'; +import { + fieldIgnoredText, + overviewDegradedFieldsSectionTitle, +} from '../../../../common/translations'; +import { DegradedFieldInfo } from './field_info'; + +// Allow for lazy loading +// eslint-disable-next-line import/no-default-export +export default function DegradedFieldFlyout() { + const { closeDegradedFieldFlyout, expandedDegradedField } = useDegradedFields(); + const pushedFlyoutTitleId = useGeneratedHtmlId({ + prefix: 'pushedFlyoutTitle', + }); + + return ( + + + {overviewDegradedFieldsSectionTitle} + + + + {expandedDegradedField} {fieldIgnoredText} + + + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/columns.tsx index cfdf3b8d4a521..30c67ddeb9c34 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/columns.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/columns.tsx @@ -6,37 +6,74 @@ */ import React from 'react'; +import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; -import type { EuiBasicTableColumn } from '@elastic/eui'; +import { EuiBasicTableColumn, EuiButtonIcon } from '@elastic/eui'; import type { FieldFormat } from '@kbn/field-formats-plugin/common'; import { formatNumber } from '@elastic/eui'; import { DegradedField } from '../../../../../common/api_types'; -import { SparkPlot } from './spark_plot'; +import { SparkPlot } from '../../../common/spark_plot'; import { NUMBER_FORMAT } from '../../../../../common/constants'; +import { + countColumnName, + fieldColumnName, + lastOccurrenceColumnName, +} from '../../../../../common/translations'; -const fieldColumnName = i18n.translate('xpack.datasetQuality.details.degradedField.field', { - defaultMessage: 'Field', -}); - -const countColumnName = i18n.translate('xpack.datasetQuality.details.degradedField.count', { - defaultMessage: 'Docs count', -}); - -const lastOccurrenceColumnName = i18n.translate( - 'xpack.datasetQuality.details.degradedField.lastOccurrence', +const expandDatasetAriaLabel = i18n.translate( + 'xpack.datasetQuality.details.degradedFieldTable.expandLabel', + { + defaultMessage: 'Expand', + } +); +const collapseDatasetAriaLabel = i18n.translate( + 'xpack.datasetQuality.details.degradedFieldTable.collapseLabel', { - defaultMessage: 'Last occurrence', + defaultMessage: 'Collapse', } ); export const getDegradedFieldsColumns = ({ dateFormatter, isLoading, + expandedDegradedField, + openDegradedFieldFlyout, }: { dateFormatter: FieldFormat; isLoading: boolean; + expandedDegradedField?: string; + openDegradedFieldFlyout: (name: string) => void; }): Array> => [ + { + name: '', + field: 'name', + render: (_, { name }) => { + const isExpanded = name === expandedDegradedField; + + const onExpandClick = () => { + openDegradedFieldFlyout(name); + }; + + return ( + + ); + }, + width: '40px', + css: css` + &.euiTableCellContent { + padding: 0; + } + `, + }, { name: fieldColumnName, field: 'name', diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/table.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/table.tsx index c8a6e623febab..14f0227e57c19 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/table.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/table.tsx @@ -16,19 +16,32 @@ import { import { useDegradedFields } from '../../../../hooks/use_degraded_fields'; export const DegradedFieldTable = () => { - const { isLoading, pagination, renderedItems, onTableChange, sort, fieldFormats } = - useDegradedFields(); + const { + isDegradedFieldsLoading, + pagination, + renderedItems, + onTableChange, + sort, + fieldFormats, + expandedDegradedField, + openDegradedFieldFlyout, + } = useDegradedFields(); const dateFormatter = fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.DATE, [ ES_FIELD_TYPES.DATE, ]); - const columns = getDegradedFieldsColumns({ dateFormatter, isLoading }); + const columns = getDegradedFieldsColumns({ + dateFormatter, + isLoading: isDegradedFieldsLoading, + expandedDegradedField, + openDegradedFieldFlyout, + }); return ( { 'data-test-subj': 'datasetQualityDetailsDegradedTableRow', }} noItemsMessage={ - isLoading ? ( + isDegradedFieldsLoading ? ( overviewDegradedFieldsTableLoadingText ) : ( + Pick > & { dataStream: string; } & { diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_details_state.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_details_state.ts index 146ff9e5aa413..c24e78911b941 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_details_state.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_details_state.ts @@ -21,8 +21,14 @@ export const useDatasetQualityDetailsState = () => { services: { fieldFormats }, } = useKibanaContextForPlugin(); - const { dataStream, degradedFields, timeRange, breakdownField, isIndexNotFoundError } = - useSelector(service, (state) => state.context) ?? {}; + const { + dataStream, + degradedFields, + timeRange, + breakdownField, + isIndexNotFoundError, + expandedDegradedField, + } = useSelector(service, (state) => state.context) ?? {}; const isNonAggregatable = useSelector(service, (state) => state.matches('initializing.nonAggregatableDataset.done') @@ -143,5 +149,6 @@ export const useDatasetQualityDetailsState = () => { integrationDetails, canUserAccessDashboards, canUserViewIntegrations, + expandedDegradedField, }; }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts index 86aed2df77120..6d52048715621 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts @@ -24,8 +24,8 @@ export function useDegradedFields() { services: { fieldFormats }, } = useKibanaContextForPlugin(); - const degradedFields = useSelector(service, (state) => state.context.degradedFields) ?? {}; - const { data, table } = degradedFields; + const { degradedFields, expandedDegradedField } = useSelector(service, (state) => state.context); + const { data, table } = degradedFields ?? {}; const { page, rowsPerPage, sort } = table; const totalItemCount = data?.length ?? 0; @@ -62,17 +62,48 @@ export function useDegradedFields() { return sortedItems.slice(page * rowsPerPage, (page + 1) * rowsPerPage); }, [data, sort.field, sort.direction, page, rowsPerPage]); - const isLoading = useSelector(service, (state) => + const isDegradedFieldsLoading = useSelector(service, (state) => state.matches('initializing.dataStreamDegradedFields.fetching') ); + const closeDegradedFieldFlyout = useCallback( + () => service.send({ type: 'CLOSE_DEGRADED_FIELD_FLYOUT' }), + [service] + ); + + const openDegradedFieldFlyout = useCallback( + (fieldName: string) => { + if (expandedDegradedField === fieldName) { + service.send({ type: 'CLOSE_DEGRADED_FIELD_FLYOUT' }); + } else { + service.send({ type: 'OPEN_DEGRADED_FIELD_FLYOUT', fieldName }); + } + }, + [expandedDegradedField, service] + ); + + const degradedFieldValues = useSelector(service, (state) => + state.matches('initializing.initializeFixItFlow.ignoredValues.done') + ? state.context.degradedFieldValues + : undefined + ); + + const isDegradedFieldsValueLoading = useSelector(service, (state) => { + return !state.matches('initializing.initializeFixItFlow.ignoredValues.done'); + }); + return { - isLoading, + isDegradedFieldsLoading, pagination, onTableChange, renderedItems, sort: { sort }, fieldFormats, totalItemCount, + expandedDegradedField, + openDegradedFieldFlyout, + closeDegradedFieldFlyout, + degradedFieldValues, + isDegradedFieldsValueLoading, }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts index 5f944bd3fcde7..9572b4419cbe7 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts @@ -8,6 +8,8 @@ import { HttpStart } from '@kbn/core/public'; import { decodeOrThrow } from '@kbn/io-ts-utils'; import { + DegradedFieldValues, + degradedFieldValuesRt, getDataStreamDegradedFieldsResponseRt, getDataStreamsDetailsResponseRt, getDataStreamsSettingsResponseRt, @@ -21,6 +23,7 @@ import { DataStreamSettings, DegradedFieldResponse, GetDataStreamDegradedFieldsParams, + GetDataStreamDegradedFieldValuesPathParams, GetDataStreamDetailsParams, GetDataStreamDetailsResponse, GetDataStreamSettingsParams, @@ -102,6 +105,30 @@ export class DataStreamDetailsClient implements IDataStreamDetailsClient { )(response); } + public async getDataStreamDegradedFieldValues({ + dataStream, + degradedField, + }: GetDataStreamDegradedFieldValuesPathParams): Promise { + const response = await this.http + .get( + `/internal/dataset_quality/data_streams/${dataStream}/degraded_field/${degradedField}/values` + ) + .catch((error) => { + throw new DatasetQualityError( + `Failed to fetch data stream degraded field Value": ${error}`, + error + ); + }); + + return decodeOrThrow( + degradedFieldValuesRt, + (message: string) => + new DatasetQualityError( + `Failed to decode data stream degraded field values response: ${message}"` + ) + )(response); + } + public async getIntegrationDashboards({ integration }: GetIntegrationDashboardsParams) { const response = await this.http .get( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts index 40eaf499a3032..31b2a47f70819 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts @@ -15,9 +15,10 @@ import { GetIntegrationDashboardsParams, GetDataStreamDegradedFieldsParams, DegradedFieldResponse, + GetDataStreamDegradedFieldValuesPathParams, } from '../../../common/data_streams_stats'; import { GetDataStreamIntegrationParams } from '../../../common/data_stream_details/types'; -import { Dashboard } from '../../../common/api_types'; +import { Dashboard, DegradedFieldValues } from '../../../common/api_types'; export type DataStreamDetailsServiceSetup = void; @@ -35,6 +36,9 @@ export interface IDataStreamDetailsClient { getDataStreamDegradedFields( params: GetDataStreamDegradedFieldsParams ): Promise; + getDataStreamDegradedFieldValues( + params: GetDataStreamDegradedFieldValuesPathParams + ): Promise; getIntegrationDashboards(params: GetIntegrationDashboardsParams): Promise; getDataStreamIntegration( params: GetDataStreamIntegrationParams diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts index c18f3d479ee95..86dbc879093f2 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts @@ -22,6 +22,7 @@ import { DataStreamDetails, DataStreamSettings, DegradedFieldResponse, + DegradedFieldValues, NonAggregatableDatasets, } from '../../../common/api_types'; import { fetchNonAggregatableDatasetsFailedNotifier } from '../common/notifications'; @@ -175,6 +176,15 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( target: 'done', actions: ['storeDegradedFieldTableOptions'], }, + OPEN_DEGRADED_FIELD_FLYOUT: { + target: + '#DatasetQualityDetailsController.initializing.initializeFixItFlow.ignoredValues', + actions: ['storeExpandedDegradedField'], + }, + CLOSE_DEGRADED_FIELD_FLYOUT: { + target: 'done', + actions: ['storeExpandedDegradedField'], + }, }, }, }, @@ -267,6 +277,42 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( }, }, }, + initializeFixItFlow: { + initial: 'closed', + type: 'parallel', + states: { + ignoredValues: { + initial: 'fetching', + states: { + fetching: { + invoke: { + src: 'loadDegradedFieldValues', + onDone: { + target: 'done', + actions: ['storeDegradedFieldValues'], + }, + onError: [ + { + target: '#DatasetQualityDetailsController.indexNotFound', + cond: 'isIndexNotFoundError', + }, + { + target: 'done', + }, + ], + }, + }, + done: { + on: { + UPDATE_TIME_RANGE: { + target: 'fetching', + }, + }, + }, + }, + }, + }, + }, }, }, indexNotFound: { @@ -317,6 +363,13 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( } : {}; }), + storeDegradedFieldValues: assign((_, event: DoneInvokeEvent) => { + return 'data' in event + ? { + degradedFieldValues: event.data, + } + : {}; + }), storeDegradedFieldTableOptions: assign((context, event) => { return 'degraded_field_criteria' in event ? { @@ -327,6 +380,11 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( } : {}; }), + storeExpandedDegradedField: assign((context, event) => { + return { + expandedDegradedField: 'fieldName' in event ? event.fieldName : undefined, + }; + }), resetDegradedFieldPageAndRowsPerPage: assign((context, _event) => ({ degradedFields: { ...context.degradedFields, @@ -472,6 +530,13 @@ export const createDatasetQualityDetailsControllerStateMachine = ({ end, }); }, + + loadDegradedFieldValues: (context) => { + return dataStreamDetailsClient.getDataStreamDegradedFieldValues({ + dataStream: context.dataStream, + degradedField: context.expandedDegradedField!, + }); + }, loadDataStreamSettings: (context) => { return dataStreamDetailsClient.getDataStreamSettings({ dataStream: context.dataStream, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts index 2cd344248b969..3d57987743d68 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts @@ -13,6 +13,7 @@ import { DataStreamSettings, DegradedField, DegradedFieldResponse, + DegradedFieldValues, NonAggregatableDatasets, } from '../../../common/api_types'; import { TableCriteria, TimeRangeConfig } from '../../../common/types'; @@ -43,6 +44,7 @@ export interface WithDefaultControllerState { isBreakdownFieldEcs?: boolean; isIndexNotFoundError?: boolean; integration?: Integration; + expandedDegradedField?: string; } export interface WithDataStreamDetails { @@ -74,6 +76,10 @@ export interface WithIntegration { integrationDashboards?: Dashboard[]; } +export interface WithDegradedFieldValues { + degradedFieldValues: DegradedFieldValues; +} + export type DefaultDatasetQualityDetailsContext = Pick< WithDefaultControllerState, 'degradedFields' | 'timeRange' | 'isIndexNotFoundError' @@ -110,6 +116,14 @@ export type DatasetQualityDetailsControllerTypeState = value: 'initializing.dataStreamDegradedFields.done'; context: WithDefaultControllerState & WithDegradedFieldsData; } + | { + value: 'initializing.initializeFixItFlow.ignoredValues.fetching'; + context: WithDefaultControllerState & WithDegradedFieldsData; + } + | { + value: 'initializing.initializeFixItFlow.ignoredValues.done'; + context: WithDefaultControllerState & WithDegradedFieldsData & WithDegradedFieldValues; + } | { value: | 'initializing.dataStreamSettings.initializeIntegrations' @@ -133,6 +147,13 @@ export type DatasetQualityDetailsControllerEvent = type: 'UPDATE_TIME_RANGE'; timeRange: TimeRangeConfig; } + | { + type: 'OPEN_DEGRADED_FIELD_FLYOUT'; + fieldName: string | undefined; + } + | { + type: 'CLOSE_DEGRADED_FIELD_FLYOUT'; + } | { type: 'BREAKDOWN_FIELD_CHANGE'; breakdownField: string | undefined; @@ -146,6 +167,7 @@ export type DatasetQualityDetailsControllerEvent = | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent + | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_values/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_values/index.ts new file mode 100644 index 0000000000000..faf7fd0467d88 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_values/index.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { SearchHit } from '@kbn/es-types'; +import { DegradedFieldValues } from '../../../../common/api_types'; +import { createDatasetQualityESClient } from '../../../utils'; +import { _IGNORED, TIMESTAMP } from '../../../../common/es_fields'; + +export async function getDegradedFieldValues({ + esClient, + dataStream, + degradedField, +}: { + esClient: ElasticsearchClient; + dataStream: string; + degradedField: string; +}): Promise { + const datasetQualityESClient = createDatasetQualityESClient(esClient); + + const response = await datasetQualityESClient.search({ + index: dataStream, + size: 4, + fields: [degradedField], + query: { term: { [_IGNORED]: degradedField } }, + sort: [ + { + [TIMESTAMP]: { + order: 'desc', + }, + }, + ], + }); + + const values = extractAndDeduplicateValues(response.hits.hits, degradedField); + + return { + field: degradedField, + values, + }; +} + +function extractAndDeduplicateValues(searchHits: SearchHit[], key: string): string[] { + const values: string[] = []; + + searchHits.forEach((hit: any) => { + const fieldValue = hit.ignored_field_values?.[key]; + if (fieldValue) { + if (Array.isArray(fieldValue)) { + values.push(...fieldValue); + } else { + values.push(fieldValue); + } + } + }); + + // Flatten and deduplicate the array + const deduplicatedValues = Array.from(new Set(values.flat())); + + return deduplicatedValues; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts index 54a229cb790e7..dd0e278acb948 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts @@ -15,6 +15,7 @@ import { NonAggregatableDatasets, DegradedFieldResponse, DatasetUserPrivileges, + DegradedFieldValues, } from '../../../common/api_types'; import { rangeRt, typeRt, typesRt } from '../../types/default_api_types'; import { createDatasetQualityServerRoute } from '../create_datasets_quality_server_route'; @@ -25,6 +26,7 @@ import { getDataStreamsStats } from './get_data_streams_stats'; import { getDegradedDocsPaginated } from './get_degraded_docs'; import { getNonAggregatableDataStreams } from './get_non_aggregatable_data_streams'; import { getDegradedFields } from './get_degraded_fields'; +import { getDegradedFieldValues } from './get_degraded_field_values'; const statsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/stats', @@ -192,6 +194,33 @@ const degradedFieldsRoute = createDatasetQualityServerRoute({ }, }); +const degradedFieldValuesRoute = createDatasetQualityServerRoute({ + endpoint: + 'GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values', + params: t.type({ + path: t.type({ + dataStream: t.string, + degradedField: t.string, + }), + }), + options: { + tags: [], + }, + async handler(resources): Promise { + const { context, params } = resources; + const { dataStream, degradedField } = params.path; + const coreContext = await context.core; + + const esClient = coreContext.elasticsearch.client.asCurrentUser; + + return await getDegradedFieldValues({ + esClient, + dataStream, + degradedField, + }); + }, +}); + const dataStreamSettingsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', params: t.type({ @@ -258,6 +287,7 @@ export const dataStreamsRouteRepository = { ...nonAggregatableDatasetsRoute, ...nonAggregatableDatasetRoute, ...degradedFieldsRoute, + ...degradedFieldValuesRoute, ...dataStreamDetailsRoute, ...dataStreamSettingsRoute, }; diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts new file mode 100644 index 0000000000000..a9f676cde946a --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { DatasetQualityApiClientKey } from '../../common/config'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +const MORE_THAN_1024_CHARS = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; + +const ANOTHER_1024_CHARS = + 'grape fig tangerine tangerine kiwi lemon papaya cherry nectarine papaya mango cherry nectarine fig cherry fig grape mango mango quince fig strawberry mango quince date kiwi quince raspberry apple kiwi banana quince fig papaya grape mango cherry banana mango cherry lemon cherry tangerine fig quince quince papaya tangerine grape strawberry banana kiwi grape mango papaya nectarine banana nectarine kiwi papaya lemon apple lemon orange fig cherry grape apple nectarine papaya orange fig papaya date mango papaya mango cherry tangerine papaya apple banana papaya cherry strawberry grape raspberry lemon date papaya mango kiwi cherry fig banana banana apple date strawberry mango tangerine date lemon kiwi quince date orange orange papaya date apple fig tangerine quince tangerine date papaya banana banana orange raspberry papaya apple nectarine lemon raspberry raspberry mango cherry kiwi cherry cherry nectarine cherry date strawberry banana orange mango mango tangerine quince papaya papaya kiwi papaya strawberry date mango'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + const synthtrace = getService('logSynthtraceEsClient'); + const datasetQualityApiClient = getService('datasetQualityApiClient'); + const start = '2024-08-28T08:00:00.000Z'; + const end = '2024-08-28T08:02:00.000Z'; + const degradedFieldDataset = 'nginx.error'; + const degradedFieldsDatastream = 'logs-nginx.error-default'; + const degradedFieldName = 'test_field'; + const regularFieldName = 'service.name'; + const serviceName = 'my-service'; + + async function callApiAs({ + user, + dataStream, + degradedField, + }: { + user: DatasetQualityApiClientKey; + dataStream: string; + degradedField: string; + }) { + return await datasetQualityApiClient[user]({ + endpoint: + 'GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values', + params: { + path: { + dataStream, + degradedField, + }, + }, + }); + } + + registry.when('Degraded Fields Values per field', { config: 'basic' }, () => { + describe('gets the degraded fields values for a given field', () => { + before(async () => { + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a error message') + .logLevel(MORE_THAN_1024_CHARS) + .timestamp(timestamp) + .dataset(degradedFieldDataset) + .defaults({ + 'log.file.path': '/error.log', + 'service.name': serviceName + 1, + 'trace.id': MORE_THAN_1024_CHARS, + test_field: [ANOTHER_1024_CHARS, 'hello world', MORE_THAN_1024_CHARS], + }) + ), + ]); + }); + + after(async () => { + await synthtrace.clean(); + }); + + it('returns no values when provided field has no degraded values', async () => { + const resp = await callApiAs({ + user: 'datasetQualityLogsUser', + dataStream: degradedFieldsDatastream, + degradedField: regularFieldName, + }); + expect(resp.body.values.length).to.be(0); + }); + + it('returns values when provided field has degraded values', async () => { + const resp = await callApiAs({ + user: 'datasetQualityLogsUser', + dataStream: degradedFieldsDatastream, + degradedField: degradedFieldName, + }); + expect(resp.body.values.length).to.be(2); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts b/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts index 168aeb4b4df21..3692a17709a2e 100644 --- a/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts +++ b/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts @@ -169,7 +169,7 @@ export function createDegradedFieldsRecord({ .defaults({ 'trace.id': generateShortId(), 'agent.name': 'synth-agent', - 'cloud.availability_zone': MORE_THAN_1024_CHARS, + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], }) .timestamp(timestamp), log @@ -213,5 +213,7 @@ const CLUSTER = [ const SERVICE_NAMES = [`synth-service-0`, `synth-service-1`, `synth-service-2`]; -const MORE_THAN_1024_CHARS = +export const MORE_THAN_1024_CHARS = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; +export const ANOTHER_1024_CHARS = + 'grape fig tangerine tangerine kiwi lemon papaya cherry nectarine papaya mango cherry nectarine fig cherry fig grape mango mango quince fig strawberry mango quince date kiwi quince raspberry apple kiwi banana quince fig papaya grape mango cherry banana mango cherry lemon cherry tangerine fig quince quince papaya tangerine grape strawberry banana kiwi grape mango papaya nectarine banana nectarine kiwi papaya lemon apple lemon orange fig cherry grape apple nectarine papaya orange fig papaya date mango papaya mango cherry tangerine papaya apple banana papaya cherry strawberry grape raspberry lemon date papaya mango kiwi cherry fig banana banana apple date strawberry mango tangerine date lemon kiwi quince date orange orange papaya date apple fig tangerine quince tangerine date papaya banana banana orange raspberry papaya apple nectarine lemon raspberry raspberry mango cherry kiwi cherry cherry nectarine cherry date strawberry banana orange mango mango tangerine quince papaya papaya kiwi papaya strawberry date mango'; diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts index 3ac6cf8b46945..3b93f0ceccfeb 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts @@ -371,7 +371,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const rows = await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); - expect(rows.length).to.eql(2); + expect(rows.length).to.eql(3); }); it('should display Spark Plot for every row of degraded fields', async () => { diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_details_degraded_field_flyout.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_details_degraded_field_flyout.ts new file mode 100644 index 0000000000000..4729f5a14629d --- /dev/null +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_details_degraded_field_flyout.ts @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { DatasetQualityFtrProviderContext } from './config'; +import { + createDegradedFieldsRecord, + datasetNames, + defaultNamespace, + getInitialTestLogs, + ANOTHER_1024_CHARS, + MORE_THAN_1024_CHARS, +} from './data'; + +export default function ({ getService, getPageObjects }: DatasetQualityFtrProviderContext) { + const PageObjects = getPageObjects([ + 'common', + 'navigationalSearch', + 'observabilityLogsExplorer', + 'datasetQuality', + ]); + const testSubjects = getService('testSubjects'); + const synthtrace = getService('logSynthtraceEsClient'); + const retry = getService('retry'); + const to = '2024-01-01T12:00:00.000Z'; + const degradedDatasetName = datasetNames[2]; + const degradedDataStreamName = `logs-${degradedDatasetName}-${defaultNamespace}`; + + describe('Degraded fields flyout', () => { + before(async () => { + await synthtrace.index([ + // Ingest basic logs + getInitialTestLogs({ to, count: 4 }), + // Ingest Degraded Logs + createDegradedFieldsRecord({ + to: new Date().toISOString(), + count: 2, + dataset: degradedDatasetName, + }), + ]); + }); + + after(async () => { + await synthtrace.clean(); + }); + + describe('degraded field flyout open-close', () => { + it('should open and close the flyout when user clicks on the expand button', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDataStreamName, + }); + + await PageObjects.datasetQuality.openDegradedFieldFlyout('test_field'); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + + await PageObjects.datasetQuality.closeFlyout(); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + + it('should open the flyout when navigating to the page with degradedField in URL State', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDataStreamName, + expandedDegradedField: 'test_field', + }); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + + await PageObjects.datasetQuality.closeFlyout(); + }); + }); + + describe('values exist', () => { + it('should display the degraded field values', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDataStreamName, + expandedDegradedField: 'test_field', + }); + + await retry.tryForTime(5000, async () => { + const cloudAvailabilityZoneValueExists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', + ANOTHER_1024_CHARS + ); + const cloudAvailabilityZoneValue2Exists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', + MORE_THAN_1024_CHARS + ); + expect(cloudAvailabilityZoneValueExists).to.be(true); + expect(cloudAvailabilityZoneValue2Exists).to.be(true); + }); + + await PageObjects.datasetQuality.closeFlyout(); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/dataset_quality/index.ts b/x-pack/test/functional/apps/dataset_quality/index.ts index ec975f6cafff6..4d4db08d34c88 100644 --- a/x-pack/test/functional/apps/dataset_quality/index.ts +++ b/x-pack/test/functional/apps/dataset_quality/index.ts @@ -15,5 +15,6 @@ export default function ({ loadTestFile }: DatasetQualityFtrProviderContext) { loadTestFile(require.resolve('./dataset_quality_table_filters')); loadTestFile(require.resolve('./dataset_quality_privileges')); loadTestFile(require.resolve('./dataset_quality_details')); + loadTestFile(require.resolve('./dataset_quality_details_degraded_field_flyout')); }); } diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index 8fdc021af79fc..29dd452c7592c 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -5,6 +5,7 @@ * 2.0. */ +import expect from '@kbn/expect'; import querystring from 'querystring'; import rison from '@kbn/rison'; import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; @@ -91,6 +92,9 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv datasetQualityTable: 'datasetQualityTable', datasetQualityFiltersContainer: 'datasetQualityFiltersContainer', datasetQualityExpandButton: 'datasetQualityExpandButton', + datasetQualityDetailsDegradedFieldsExpandButton: + 'datasetQualityDetailsDegradedFieldsExpandButton', + datasetQualityDetailsDegradedFieldFlyout: 'datasetQualityDetailsDegradedFieldFlyout', datasetDetailsContainer: 'datasetDetailsContainer', datasetQualityDetailsTitle: 'datasetQualityDetailsTitle', datasetQualityDetailsDegradedFieldTable: 'datasetQualityDetailsDegradedFieldTable', @@ -127,6 +131,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv 'unifiedHistogramBreakdownSelectorSelectorSearch', unifiedHistogramBreakdownSelectorSelectable: 'unifiedHistogramBreakdownSelectorSelectable', managementHome: 'managementHome', + euiFlyoutCloseButton: 'euiFlyoutCloseButton', }; return { @@ -193,6 +198,10 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv } }, + async waitUntilDegradedFieldFlyoutLoaded() { + await testSubjects.existOrFail(testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout); + }, + async parseSummaryPanel(excludeKeys: string[] = []): Promise { const isStateful = !excludeKeys.includes('estimatedData'); @@ -282,7 +291,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv async parseDegradedFieldTable() { await this.waitUntilTableLoaded(); const table = await this.getDatasetQualityDetailsDegradedFieldTable(); - return this.parseTable(table, ['Field', 'Docs count', 'Last Occurrence']); + return this.parseTable(table, ['0', 'Field', 'Docs count', 'Last Occurrence']); }, async filterForIntegrations(integrations: string[]) { @@ -398,6 +407,39 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ); }, + async openDegradedFieldFlyout(fieldName: string) { + await this.waitUntilTableLoaded(); + const cols = await this.parseDegradedFieldTable(); + const fieldNameCol = cols.Field; + const fieldNameColCellTexts = await fieldNameCol.getCellTexts(); + const testDatasetRowIndex = fieldNameColCellTexts.findIndex((dName) => dName === fieldName); + + expect(testDatasetRowIndex).to.be.greaterThan(-1); + + const expandColumn = cols['0']; + const expandButtons = await expandColumn.getCellChildren( + `[data-test-subj=${testSubjectSelectors.datasetQualityDetailsDegradedFieldsExpandButton}]` + ); + + expect(expandButtons.length).to.be.greaterThan(0); + + const fieldExpandButton = expandButtons[testDatasetRowIndex]; + + // Check if 'title' attribute is "Expand" or "Collapse" + const isCollapsed = (await fieldExpandButton.getAttribute('title')) === 'Expand'; + + // Open if collapsed + if (isCollapsed) { + await fieldExpandButton.click(); + } + + await this.waitUntilDegradedFieldFlyoutLoaded(); + }, + + async closeFlyout() { + return testSubjects.click(testSubjectSelectors.euiFlyoutCloseButton); + }, + async parseTable(tableWrapper: WebElementWrapper, columnNamesOrIndexes: string[]) { const headerElementWrappers = await tableWrapper.findAllByCssSelector('thead th, thead td'); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/degraded_field_values.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/degraded_field_values.ts new file mode 100644 index 0000000000000..397e191d450a8 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/degraded_field_values.ts @@ -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 { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { DatasetQualityFtrContextProvider } from './common/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; + +const MORE_THAN_1024_CHARS = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; + +const ANOTHER_1024_CHARS = + 'grape fig tangerine tangerine kiwi lemon papaya cherry nectarine papaya mango cherry nectarine fig cherry fig grape mango mango quince fig strawberry mango quince date kiwi quince raspberry apple kiwi banana quince fig papaya grape mango cherry banana mango cherry lemon cherry tangerine fig quince quince papaya tangerine grape strawberry banana kiwi grape mango papaya nectarine banana nectarine kiwi papaya lemon apple lemon orange fig cherry grape apple nectarine papaya orange fig papaya date mango papaya mango cherry tangerine papaya apple banana papaya cherry strawberry grape raspberry lemon date papaya mango kiwi cherry fig banana banana apple date strawberry mango tangerine date lemon kiwi quince date orange orange papaya date apple fig tangerine quince tangerine date papaya banana banana orange raspberry papaya apple nectarine lemon raspberry raspberry mango cherry kiwi cherry cherry nectarine cherry date strawberry banana orange mango mango tangerine quince papaya papaya kiwi papaya strawberry date mango'; + +export default function ApiTest({ getService }: DatasetQualityFtrContextProvider) { + const synthtrace = getService('logSynthtraceEsClient'); + const datasetQualityApiClient = getService('datasetQualityApiClient'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const start = '2024-08-28T08:00:00.000Z'; + const end = '2024-08-28T08:02:00.000Z'; + const degradedFieldDataset = 'nginx.error'; + const degradedFieldsDatastream = 'logs-nginx.error-default'; + const degradedFieldName = 'test_field'; + const regularFieldName = 'service.name'; + const serviceName = 'my-service'; + + async function callApiAs({ + dataStream, + degradedField, + roleAuthc, + internalReqHeader, + }: { + dataStream: string; + degradedField: string; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; + }) { + return await datasetQualityApiClient.slsUser({ + endpoint: + 'GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values', + params: { + path: { + dataStream, + degradedField, + }, + }, + roleAuthc, + internalReqHeader, + }); + } + + describe('Degraded Fields Values per field', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a error message') + .logLevel(MORE_THAN_1024_CHARS) + .timestamp(timestamp) + .dataset(degradedFieldDataset) + .defaults({ + 'log.file.path': '/error.log', + 'service.name': serviceName + 1, + 'trace.id': MORE_THAN_1024_CHARS, + test_field: [ANOTHER_1024_CHARS, 'hello world', MORE_THAN_1024_CHARS], + }) + ), + ]); + }); + + after(async () => { + await synthtrace.clean(); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it('returns no values when provided field has no degraded values', async () => { + const resp = await callApiAs({ + dataStream: degradedFieldsDatastream, + degradedField: regularFieldName, + roleAuthc, + internalReqHeader, + }); + expect(resp.body.values.length).to.be(0); + }); + + it('returns values when provided field has degraded values', async () => { + const resp = await callApiAs({ + dataStream: degradedFieldsDatastream, + degradedField: degradedFieldName, + roleAuthc, + internalReqHeader, + }); + expect(resp.body.values.length).to.be(2); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts index f4022fd009833..86c8527139846 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts @@ -10,5 +10,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('Dataset Quality', function () { loadTestFile(require.resolve('./data_stream_details')); loadTestFile(require.resolve('./data_stream_settings')); + loadTestFile(require.resolve('./degraded_field_values')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts index 168aeb4b4df21..3692a17709a2e 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts @@ -169,7 +169,7 @@ export function createDegradedFieldsRecord({ .defaults({ 'trace.id': generateShortId(), 'agent.name': 'synth-agent', - 'cloud.availability_zone': MORE_THAN_1024_CHARS, + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], }) .timestamp(timestamp), log @@ -213,5 +213,7 @@ const CLUSTER = [ const SERVICE_NAMES = [`synth-service-0`, `synth-service-1`, `synth-service-2`]; -const MORE_THAN_1024_CHARS = +export const MORE_THAN_1024_CHARS = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; +export const ANOTHER_1024_CHARS = + 'grape fig tangerine tangerine kiwi lemon papaya cherry nectarine papaya mango cherry nectarine fig cherry fig grape mango mango quince fig strawberry mango quince date kiwi quince raspberry apple kiwi banana quince fig papaya grape mango cherry banana mango cherry lemon cherry tangerine fig quince quince papaya tangerine grape strawberry banana kiwi grape mango papaya nectarine banana nectarine kiwi papaya lemon apple lemon orange fig cherry grape apple nectarine papaya orange fig papaya date mango papaya mango cherry tangerine papaya apple banana papaya cherry strawberry grape raspberry lemon date papaya mango kiwi cherry fig banana banana apple date strawberry mango tangerine date lemon kiwi quince date orange orange papaya date apple fig tangerine quince tangerine date papaya banana banana orange raspberry papaya apple nectarine lemon raspberry raspberry mango cherry kiwi cherry cherry nectarine cherry date strawberry banana orange mango mango tangerine quince papaya papaya kiwi papaya strawberry date mango'; diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts index bca31c506a770..a007ddc6c10a7 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts @@ -28,7 +28,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'navigationalSearch', 'observabilityLogsExplorer', 'datasetQuality', - 'svlCommonNavigation', 'svlCommonPage', ]); const testSubjects = getService('testSubjects'); @@ -375,7 +374,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const rows = await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); - expect(rows.length).to.eql(2); + expect(rows.length).to.eql(3); }); it('should display Spark Plot for every row of degraded fields', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details_degraded_field_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details_degraded_field_flyout.ts new file mode 100644 index 0000000000000..41e476cd69e29 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details_degraded_field_flyout.ts @@ -0,0 +1,114 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { + createDegradedFieldsRecord, + datasetNames, + defaultNamespace, + getInitialTestLogs, + ANOTHER_1024_CHARS, + MORE_THAN_1024_CHARS, +} from './data'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects([ + 'common', + 'navigationalSearch', + 'observabilityLogsExplorer', + 'datasetQuality', + 'svlCommonPage', + ]); + const testSubjects = getService('testSubjects'); + const synthtrace = getService('svlLogsSynthtraceClient'); + const retry = getService('retry'); + const to = '2024-01-01T12:00:00.000Z'; + const degradedDatasetName = datasetNames[2]; + const degradedDataStreamName = `logs-${degradedDatasetName}-${defaultNamespace}`; + + describe('Degraded fields flyout', () => { + before(async () => { + await synthtrace.index([ + // Ingest basic logs + getInitialTestLogs({ to, count: 4 }), + // Ingest Degraded Logs + createDegradedFieldsRecord({ + to: new Date().toISOString(), + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.svlCommonPage.loginWithPrivilegedRole(); + }); + + after(async () => { + // await synthtrace.clean(); + }); + + describe('degraded field flyout open-close', () => { + it('should open and close the flyout when user clicks on the expand button', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDataStreamName, + }); + + await PageObjects.datasetQuality.openDegradedFieldFlyout('test_field'); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + + await PageObjects.datasetQuality.closeFlyout(); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + + it('should open the flyout when navigating to the page with degradedField in URL State', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDataStreamName, + expandedDegradedField: 'test_field', + }); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + + await PageObjects.datasetQuality.closeFlyout(); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + }); + + describe('values exist', () => { + it('should display the degraded field values', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDataStreamName, + expandedDegradedField: 'test_field', + }); + + await retry.tryForTime(5000, async () => { + const cloudAvailabilityZoneValueExists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', + ANOTHER_1024_CHARS + ); + const cloudAvailabilityZoneValue2Exists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', + MORE_THAN_1024_CHARS + ); + expect(cloudAvailabilityZoneValueExists).to.be(true); + expect(cloudAvailabilityZoneValue2Exists).to.be(true); + }); + + await PageObjects.datasetQuality.closeFlyout(); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/index.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/index.ts index 683c879ae4e3d..699c05de7330f 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/index.ts @@ -15,5 +15,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_quality_table_filters')); loadTestFile(require.resolve('./dataset_quality_privileges')); loadTestFile(require.resolve('./dataset_quality_details')); + loadTestFile(require.resolve('./dataset_quality_details_degraded_field_flyout')); }); } From 738002fc8974ad6e087cc98c110118a83761beaa Mon Sep 17 00:00:00 2001 From: Elastic Machine Date: Tue, 3 Sep 2024 18:26:57 +0100 Subject: [PATCH 03/28] [main] Sync bundled packages with Package Storage (#192007) Automated by https://buildkite.com/elastic/package-storage-infra-kibana-discover-release-branches/builds/1219 --- fleet_packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fleet_packages.json b/fleet_packages.json index 4ff38b376c6f9..1e4e5b1c4e17b 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -56,6 +56,6 @@ }, { "name": "security_detection_engine", - "version": "8.15.3" + "version": "8.15.4" } ] \ No newline at end of file From bcb030e558eb0144c05a11c54c520c424a68a597 Mon Sep 17 00:00:00 2001 From: seanrathier Date: Tue, 3 Sep 2024 13:29:50 -0400 Subject: [PATCH 04/28] [Cloud Security] [Agentless] [Bug] Fix error log [object Object] - createAgentlessAgent function in Fleet is not showing the error in the logs. (#190635) --- .../server/services/agents/agentless_agent.ts | 63 ++++++++---- .../cloud_tests/agentless_sanity.ts | 98 +++++++++++++++++++ 2 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 x-pack/test/cloud_security_posture_functional/cloud_tests/agentless_sanity.ts diff --git a/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts b/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts index 54e2c400627d3..7f2c0dfaf1190 100644 --- a/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts +++ b/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts @@ -95,44 +95,62 @@ class AgentlessAgentService { requestConfig.data.stack_version = appContextService.getKibanaVersion(); } - logger.debug( - `Creating agentless agent with request config ${JSON.stringify({ - ...requestConfig, - httpsAgent: { - ...requestConfig.httpsAgent, - options: { - ...requestConfig.httpsAgent.options, - cert: requestConfig.httpsAgent.options.cert ? 'REDACTED' : undefined, - key: requestConfig.httpsAgent.options.key ? 'REDACTED' : undefined, - ca: requestConfig.httpsAgent.options.ca ? 'REDACTED' : undefined, - }, + const requestConfigDebug = JSON.stringify({ + ...requestConfig, + httpsAgent: { + ...requestConfig.httpsAgent, + options: { + ...requestConfig.httpsAgent.options, + cert: requestConfig.httpsAgent.options.cert ? 'REDACTED' : undefined, + key: requestConfig.httpsAgent.options.key ? 'REDACTED' : undefined, + ca: requestConfig.httpsAgent.options.ca ? 'REDACTED' : undefined, }, - })}` - ); + }, + }); + + logger.debug(`Creating agentless agent with request config ${requestConfigDebug}`); const response = await axios(requestConfig).catch( (error: Error | AxiosError) => { if (!axios.isAxiosError(error)) { - logger.error(`Creating agentless failed with an error ${error}`); + logger.error( + `Creating agentless failed with an error ${error} ${JSON.stringify( + requestConfigDebug + )}` + ); throw new AgentlessAgentCreateError(error.message); } + + const errorLogCodeCause = `${error.code} ${this.convertCauseErrorsToString(error)}`; + if (error.response) { + // The request was made and the server responded with a status code and error data logger.error( - `Creating agentless failed with a response status code that falls out of the range of 2xx: ${error.response.status} ${error.response.statusText} ${requestConfig.data}` + `Creating agentless failed because the Agentless API responding with a status code that falls out of the range of 2xx: ${JSON.stringify( + error.response.status + )}} ${JSON.stringify(error.response.data)}} ${JSON.stringify(requestConfigDebug)}` ); throw new AgentlessAgentCreateError( `the Agentless API could not create the agentless agent` ); } else if (error.request) { + // The request was made but no response was received logger.error( - `Creating agentless failed to receive a response from the Agentless API ${JSON.stringify( - error.cause + `Creating agentless agent failed while sending the request to the Agentless API: ${errorLogCodeCause} ${JSON.stringify( + requestConfigDebug )}` ); throw new AgentlessAgentCreateError(`no response received from the Agentless API`); } else { - logger.error(`Creating agentless failed to create the request ${error.cause}`); - throw new AgentlessAgentCreateError('the request could not be created'); + // Something happened in setting up the request that triggered an Error + logger.error( + `Creating agentless agent failed to be created ${errorLogCodeCause} ${JSON.stringify( + requestConfigDebug + )}` + ); + throw new AgentlessAgentCreateError( + 'the Agentless API could not create the agentless agent' + ); } } ); @@ -141,6 +159,13 @@ class AgentlessAgentService { return response; } + private convertCauseErrorsToString = (error: AxiosError) => { + if (error.cause instanceof AggregateError) { + return error.cause.errors.map((e: Error) => e.message); + } + return error.cause; + }; + private async getFleetUrlAndTokenForAgentlessAgent( esClient: ElasticsearchClient, policyId: string, diff --git a/x-pack/test/cloud_security_posture_functional/cloud_tests/agentless_sanity.ts b/x-pack/test/cloud_security_posture_functional/cloud_tests/agentless_sanity.ts new file mode 100644 index 0000000000000..d1a27bf5d8c1d --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/cloud_tests/agentless_sanity.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { CLOUD_CREDENTIALS_PACKAGE_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; +import expect from '@kbn/expect'; +import type { FtrProviderContext } from '../ftr_provider_context'; +// eslint-disable-next-line import/no-default-export +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const pageObjects = getPageObjects([ + 'common', + 'cspSecurity', + 'security', + 'header', + 'cisAddIntegration', + ]); + + const CIS_AWS_OPTION_TEST_ID = 'cisAwsTestId'; + + const AWS_SINGLE_ACCOUNT_TEST_ID = 'awsSingleTestId'; + + describe('Agentless cloud', function () { + let cisIntegration: typeof pageObjects.cisAddIntegration; + let cisIntegrationAws: typeof pageObjects.cisAddIntegration.cisAws; + + before(async () => { + cisIntegration = pageObjects.cisAddIntegration; + cisIntegrationAws = pageObjects.cisAddIntegration.cisAws; // Start the usage api mock server on port 8081 + }); + + after(async () => { + await pageObjects.cspSecurity.logout(); + }); + + it(`should create agentless-agent`, async () => { + const integrationPolicyName = `cloud_security_posture-${new Date().toISOString()}`; + await cisIntegration.navigateToAddIntegrationCspmWithVersionPage( + CLOUD_CREDENTIALS_PACKAGE_VERSION + ); + + await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); + await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); + + await cisIntegration.inputIntegrationName(integrationPolicyName); + + await cisIntegration.selectSetupTechnology('agentless'); + await cisIntegration.selectAwsCredentials('direct'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + await cisIntegration.clickSaveButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegrationAws.showPostInstallCloudFormationModal()).to.be(false); + + await cisIntegration.navigateToIntegrationCspList(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegration.getFirstCspmIntegrationPageIntegration()).to.be( + integrationPolicyName + ); + expect(await cisIntegration.getFirstCspmIntegrationPageAgent()).to.be( + `Agentless policy for ${integrationPolicyName}` + ); + }); + + it(`should create default agent-based agent`, async () => { + const integrationPolicyName = `cloud_security_posture-${new Date().toISOString()}`; + + await cisIntegration.navigateToAddIntegrationCspmWithVersionPage( + CLOUD_CREDENTIALS_PACKAGE_VERSION + ); + + await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); + await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); + + await cisIntegration.inputIntegrationName(integrationPolicyName); + + await cisIntegration.clickSaveButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegrationAws.showPostInstallCloudFormationModal()).to.be(true); + + const agentPolicyName = await cisIntegration.getAgentBasedPolicyValue(); + + await cisIntegration.navigateToIntegrationCspList(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegration.getFirstCspmIntegrationPageIntegration()).to.be( + integrationPolicyName + ); + expect(await cisIntegration.getFirstCspmIntegrationPageAgent()).to.be(agentPolicyName); + }); + }); +} From 3c9198abeb3368ef87301340fe9c45a67ae401f1 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:37:36 +0100 Subject: [PATCH 05/28] [Security Solution][Detection Engine] update query automatically in rule create form through AI assistant (#190963) ## Summary - addresses https://github.com/elastic/kibana/issues/187270 ### UX Introduced button in code block Screenshot 2024-08-21 at 16 35 51 ### DEMO https://github.com/user-attachments/assets/32419edc-4bfa-4f4e-892b-2a6abb3c0f27 ### 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] 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 was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../impl/assistant/index.tsx | 2 +- .../impl/assistant_context/index.tsx | 10 +++- .../impl/new_chat/index.test.tsx | 21 +++++++ .../impl/new_chat/index.tsx | 19 +++++- .../assistant/content/conversations/index.tsx | 9 +++ .../public/assistant/helpers.tsx | 59 +++++++++++-------- .../update_query_in_form/index.test.tsx | 32 ++++++++++ .../assistant/update_query_in_form/index.tsx | 44 ++++++++++++++ .../update_query_in_form/translations.ts | 15 +++++ .../components/ai_assistant/index.test.tsx | 4 +- .../components/ai_assistant/index.tsx | 29 ++++++++- .../step_define_rule/index.test.tsx | 42 +++++++++++-- .../components/step_define_rule/index.tsx | 8 ++- .../pages/detection_engine/translations.ts | 7 +++ .../cypress/e2e/ai_assistant/prompts.cy.ts | 6 +- 15 files changed, 266 insertions(+), 41 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.tsx create mode 100644 x-pack/plugins/security_solution/public/assistant/update_query_in_form/translations.ts diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx index f6e7b320611b1..3a8c47d90b3f1 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -263,7 +263,7 @@ const AssistantComponent: React.FC = ({ // Add min-height to all codeblocks so timeline icon doesn't overflow const codeBlockContainers = [...document.getElementsByClassName('euiCodeBlock')]; // @ts-ignore-expect-error - codeBlockContainers.forEach((e) => (e.style.minHeight = '75px')); + codeBlockContainers.forEach((e) => (e.style.minHeight = '85px')); //// const onToggleShowAnonymizedValues = useCallback(() => { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx index d8c6c558a524e..b9f2f789f1df8 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx @@ -8,7 +8,7 @@ import { EuiCommentProps } from '@elastic/eui'; import type { HttpSetup } from '@kbn/core-http-browser'; import { omit } from 'lodash/fp'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo, useState, useRef } from 'react'; import type { IToasts } from '@kbn/core-notifications-browser'; import { ActionTypeRegistryContract } from '@kbn/triggers-actions-ui-plugin/public'; import { useLocalStorage, useSessionStorage } from 'react-use'; @@ -137,6 +137,7 @@ export interface UseAssistantContext { basePromptContexts: PromptContextTemplate[]; unRegisterPromptContext: UnRegisterPromptContext; currentAppId: string; + codeBlockRef: React.MutableRefObject<(codeBlock: string) => void>; } const AssistantContext = React.createContext(undefined); @@ -237,6 +238,11 @@ export const AssistantProvider: React.FC = ({ */ const [selectedSettingsTab, setSelectedSettingsTab] = useState(null); + /** + * Setting code block ref that can be used to store callback from parent components + */ + const codeBlockRef = useRef(() => {}); + const getLastConversationId = useCallback( // if a conversationId has been provided, use that // if not, check local storage @@ -284,6 +290,7 @@ export const AssistantProvider: React.FC = ({ setLastConversationId: setLocalStorageLastConversationId, baseConversations, currentAppId, + codeBlockRef, }), [ actionTypeRegistry, @@ -316,6 +323,7 @@ export const AssistantProvider: React.FC = ({ setLocalStorageLastConversationId, baseConversations, currentAppId, + codeBlockRef, ] ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.test.tsx index 09b186903c0bd..b1fa87f12e864 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.test.tsx @@ -18,6 +18,11 @@ jest.mock('../assistant/use_assistant_overlay', () => ({ useAssistantOverlay: () => mockUseAssistantOverlay, })); +let mockUseAssistantContext = { codeBlockRef: { current: null } }; +jest.mock('../..', () => ({ + useAssistantContext: () => mockUseAssistantContext, +})); + const defaultProps: Props = { category: 'alert', description: 'Test description', @@ -27,6 +32,9 @@ const defaultProps: Props = { }; describe('NewChat', () => { + beforeEach(() => { + mockUseAssistantContext = { codeBlockRef: { current: null } }; + }); afterEach(() => { jest.clearAllMocks(); }); @@ -118,4 +126,17 @@ describe('NewChat', () => { expect(onShowOverlaySpy).toHaveBeenCalled(); }); + + it('assigns onExportCodeBlock callback to context codeBlock reference', () => { + const onExportCodeBlock = jest.fn(); + render(); + + expect(mockUseAssistantContext.codeBlockRef.current).toBe(onExportCodeBlock); + }); + + it('does not change assigns context codeBlock reference if onExportCodeBlock not defined', () => { + render(); + + expect(mockUseAssistantContext.codeBlockRef.current).toBe(null); + }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx index d45f94b7d0b49..76786e51a3226 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx @@ -6,7 +6,8 @@ */ import { EuiButtonEmpty, EuiLink } from '@elastic/eui'; -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo, useEffect } from 'react'; +import { useAssistantContext } from '../..'; import { PromptContext } from '../assistant/prompt_context/types'; import { useAssistantOverlay } from '../assistant/use_assistant_overlay'; @@ -29,6 +30,8 @@ export type Props = Omit & { asLink?: boolean; /** Optional callback when overlay shows */ onShowOverlay?: () => void; + /** Optional callback that returns copied code block */ + onExportCodeBlock?: (codeBlock: string) => void; }; const NewChatComponent: React.FC = ({ @@ -45,6 +48,7 @@ const NewChatComponent: React.FC = ({ isAssistantEnabled, asLink = false, onShowOverlay, + onExportCodeBlock, }) => { const { showAssistantOverlay } = useAssistantOverlay( category, @@ -56,12 +60,25 @@ const NewChatComponent: React.FC = ({ tooltip, isAssistantEnabled ); + const { codeBlockRef } = useAssistantContext(); const showOverlay = useCallback(() => { showAssistantOverlay(true); onShowOverlay?.(); }, [showAssistantOverlay, onShowOverlay]); + useEffect(() => { + if (onExportCodeBlock) { + codeBlockRef.current = onExportCodeBlock; + } + + return () => { + if (onExportCodeBlock) { + codeBlockRef.current = () => {}; + } + }; + }, [codeBlockRef, onExportCodeBlock]); + const icon = useMemo(() => { if (iconType === null) { return undefined; diff --git a/x-pack/plugins/security_solution/public/assistant/content/conversations/index.tsx b/x-pack/plugins/security_solution/public/assistant/content/conversations/index.tsx index 9234095990016..4332827c43ce1 100644 --- a/x-pack/plugins/security_solution/public/assistant/content/conversations/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/content/conversations/index.tsx @@ -10,6 +10,7 @@ import type { Conversation } from '@kbn/elastic-assistant'; import { DATA_QUALITY_DASHBOARD_CONVERSATION_ID } from '@kbn/ecs-data-quality-dashboard'; import { DETECTION_RULES_CONVERSATION_ID } from '../../../detections/pages/detection_engine/rules/translations'; +import { DETECTION_RULES_CREATE_FORM_CONVERSATION_ID } from '../../../detections/pages/detection_engine/translations'; import { ALERT_SUMMARY_CONVERSATION_ID, EVENT_SUMMARY_CONVERSATION_ID, @@ -41,6 +42,14 @@ export const BASE_SECURITY_CONVERSATIONS: Record = { messages: [], replacements: {}, }, + [DETECTION_RULES_CREATE_FORM_CONVERSATION_ID]: { + id: '', + title: DETECTION_RULES_CREATE_FORM_CONVERSATION_ID, + category: 'assistant', + isDefault: true, + messages: [], + replacements: {}, + }, [EVENT_SUMMARY_CONVERSATION_ID]: { id: '', title: EVENT_SUMMARY_CONVERSATION_ID, diff --git a/x-pack/plugins/security_solution/public/assistant/helpers.tsx b/x-pack/plugins/security_solution/public/assistant/helpers.tsx index 61856ea1b17f3..84d0b9ac0fb62 100644 --- a/x-pack/plugins/security_solution/public/assistant/helpers.tsx +++ b/x-pack/plugins/security_solution/public/assistant/helpers.tsx @@ -13,9 +13,9 @@ import { replaceAnonymizedValuesWithOriginalValues } from '@kbn/elastic-assistan import type { TimelineEventsDetailsItem } from '../../common/search_strategy'; import type { Rule } from '../detection_engine/rule_management/logic'; import { SendToTimelineButton } from './send_to_timeline'; - +import { DETECTION_RULES_CREATE_FORM_CONVERSATION_ID } from '../detections/pages/detection_engine/translations'; export const LOCAL_STORAGE_KEY = `securityAssistant`; - +import { UpdateQueryInFormButton } from './update_query_in_form'; export interface QueryField { field: string; values: string; @@ -84,30 +84,37 @@ export const augmentMessageCodeBlocks = ( document.querySelectorAll(`.message-${messageIndex} .euiCodeBlock__controls`)[ codeBlockIndex ], - button: sendToTimelineEligibleQueryTypes.includes(codeBlock.type) ? ( - - - - ) : null, + button: ( + <> + {sendToTimelineEligibleQueryTypes.includes(codeBlock.type) ? ( + + + + ) : null} + {DETECTION_RULES_CREATE_FORM_CONVERSATION_ID === currentConversation.title ? ( + + ) : null} + + ), }; }) ); diff --git a/x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.test.tsx b/x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.test.tsx new file mode 100644 index 0000000000000..a3de86ea1aa78 --- /dev/null +++ b/x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.test.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { UpdateQueryInFormButton } from '.'; + +const mockUseAssistantContext = { codeBlockRef: { current: jest.fn() } }; +jest.mock('@kbn/elastic-assistant', () => ({ + useAssistantContext: () => mockUseAssistantContext, +})); + +describe('UpdateQueryInFormButton', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('calls codeBlockRef callback on click', () => { + const testQuery = 'from auditbeat* | limit 10'; + render(); + + userEvent.click(screen.getByTestId('update-query-in-form-button')); + + expect(mockUseAssistantContext.codeBlockRef.current).toHaveBeenCalledWith(testQuery); + }); +}); diff --git a/x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.tsx b/x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.tsx new file mode 100644 index 0000000000000..640e61a803ba3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/assistant/update_query_in_form/index.tsx @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FC, PropsWithChildren } from 'react'; +import React from 'react'; +import { EuiButtonEmpty, EuiToolTip, EuiIcon } from '@elastic/eui'; +import { useAssistantContext } from '@kbn/elastic-assistant'; + +import { UPDATE_QUERY_IN_FORM_TOOLTIP } from './translations'; + +export interface UpdateQueryInFormButtonProps { + query: string; +} + +export const UpdateQueryInFormButton: FC> = ({ + query, +}) => { + const { codeBlockRef } = useAssistantContext(); + + const handleClick = () => { + codeBlockRef?.current?.(query); + }; + + return ( + + + + + + ); +}; + +UpdateQueryInFormButton.displayName = 'UpdateQueryInFormButton'; diff --git a/x-pack/plugins/security_solution/public/assistant/update_query_in_form/translations.ts b/x-pack/plugins/security_solution/public/assistant/update_query_in_form/translations.ts new file mode 100644 index 0000000000000..c3e8252522951 --- /dev/null +++ b/x-pack/plugins/security_solution/public/assistant/update_query_in_form/translations.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const UPDATE_QUERY_IN_FORM_TOOLTIP = i18n.translate( + 'xpack.securitySolution.assistant.updateQueryInFormTooltip', + { + defaultMessage: 'Update query in form', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.test.tsx index 9ec6cba770c71..e5c5f3f800b62 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.test.tsx @@ -26,14 +26,14 @@ describe('AiAssistant', () => { it('does not render chat component when does not have hasAssistantPrivilege', () => { useAssistantAvailabilityMock.mockReturnValue({ hasAssistantPrivilege: false }); - const { container } = render(, { + const { container } = render(, { wrapper: TestProviders, }); expect(container).toBeEmptyDOMElement(); }); it('renders chat component when has hasAssistantPrivilege', () => { - render(, { + render(, { wrapper: TestProviders, }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.tsx index 83ce75d53f79f..7085073d6adc6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/ai_assistant/index.tsx @@ -13,7 +13,7 @@ import { NewChat, AssistantAvatar } from '@kbn/elastic-assistant'; import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../../../common/lib/telemetry'; import { useAssistantAvailability } from '../../../../assistant/use_assistant_availability'; -import * as i18nAssistant from '../../../../detections/pages/detection_engine/rules/translations'; +import * as i18nAssistant from '../../../../detections/pages/detection_engine/translations'; import type { DefineStepRule } from '../../../../detections/pages/detection_engine/rules/types'; import type { FormHook, ValidationError } from '../../../../shared_imports'; @@ -38,10 +38,15 @@ const retrieveErrorMessages = (errors: ValidationError[]): string => interface AiAssistantProps { getFields: FormHook['getFields']; + setFieldValue: FormHook['setFieldValue']; language?: string | undefined; } -const AiAssistantComponent: React.FC = ({ getFields, language }) => { +const AiAssistantComponent: React.FC = ({ + getFields, + setFieldValue, + language, +}) => { const { hasAssistantPrivilege, isAssistantEnabled } = useAssistantAvailability(); const languageName = getLanguageName(language); @@ -68,6 +73,23 @@ Proposed solution should be valid and must not contain new line symbols (\\n)`; track(METRIC_TYPE.COUNT, TELEMETRY_EVENT.OPEN_ASSISTANT_ON_RULE_QUERY_ERROR); }, []); + const handleOnExportCodeBlock = useCallback( + (codeBlock) => { + const queryField = getFields().queryBar; + const queryBar = queryField.value as DefineStepRule['queryBar']; + + // sometimes AI assistant include redundant backtick symbols in code block + const newQuery = codeBlock.replaceAll('`', ''); + if (queryBar.query.query !== newQuery) { + setFieldValue('queryBar', { + ...queryBar, + query: { ...queryBar.query, query: newQuery }, + }); + } + }, + [getFields, setFieldValue] + ); + if (!hasAssistantPrivilege) { return null; } @@ -84,7 +106,7 @@ Proposed solution should be valid and must not contain new line symbols (\\n)`; {i18n.ASK_ASSISTANT_ERROR_BUTTON} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx index 5dd884c57c198..3e7d19ad7db5f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx @@ -625,14 +625,48 @@ describe('StepDefineRule', () => { }); describe('AI assistant', () => { - it('renders assistant when query is not valid', () => { - render(, { - wrapper: TestProviders, - }); + it('renders assistant when query is not valid and not empty', () => { + const initialState = { + queryBar: { + query: { query: '*:*', language: 'kuery' }, + filters: [], + saved_id: null, + }, + }; + render( + , + { + wrapper: TestProviders, + } + ); expect(screen.getByTestId('ai-assistant')).toBeInTheDocument(); }); + it('does not render assistant when query is not valid and empty', () => { + const initialState = { + queryBar: { + query: { query: '', language: 'kuery' }, + filters: [], + saved_id: null, + }, + }; + render( + , + { + wrapper: TestProviders, + } + ); + + expect(screen.queryByTestId('ai-assistant')).toBe(null); + }); + it('does not render assistant when query is valid', () => { render(, { wrapper: TestProviders, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx index cc4d968d1b525..6b9780b8c029b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx @@ -953,8 +953,12 @@ const StepDefineRuleComponent: FC = ({ - {!isMlRule(ruleType) && !isQueryBarValid && ( - + {!isMlRule(ruleType) && !isQueryBarValid && queryBar?.query?.query && ( + )} {isQueryRule(ruleType) && ( diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts index 9127e902a9c6c..d9ed0ef6369f0 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts @@ -95,3 +95,10 @@ export const ML_RULES_UNAVAILABLE = (totalRules: number) => defaultMessage: '{totalRules} {totalRules, plural, =1 {rule requires} other {rules require}} Machine Learning to enable.', }); + +export const DETECTION_RULES_CREATE_FORM_CONVERSATION_ID = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleManagement.detectionRulesCreateEditFormConversationId', + { + defaultMessage: 'Detection Rules Create form', + } +); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts index f31866d4ec9bf..ff8e137a874ce 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts @@ -88,7 +88,11 @@ describe('AI Assistant Prompts', { tags: ['@ess', '@serverless'] }, () => { it('Add prompt from system prompt selector and set multiple conversations (including current) as default conversation', () => { visitGetStartedPage(); openAssistant(); - createSystemPrompt(testPrompt.title, testPrompt.prompt, ['Welcome', 'Alert summary']); + createSystemPrompt(testPrompt.title, testPrompt.prompt, [ + 'Welcome', + 'Alert summary', + 'Data Quality Dashboard', + ]); assertSystemPrompt(testPrompt.title); typeAndSendMessage('hello'); assertMessageSent('hello', true, testPrompt.prompt); From 448c9e13283a3ee0661ed22092f2cdd01825b77c Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 3 Sep 2024 21:21:02 +0200 Subject: [PATCH 06/28] [Obs AI Assistant] Don't fail calls where messages have data (#191952) In https://github.com/elastic/kibana/pull/191607, we fixed a bug around `strictKeysRt` not strictly checking object types in arrays. That exposed a bug in our `messageRt` type where we define `data` incorrectly, which means that any conversation that has data (as the result of some function calls) will fail with a 400. This PR corrects that mistake. --- .../server/routes/runtime_types.ts | 6 ++---- .../tests/complete/complete.spec.ts | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts index 968c182ed75cf..b7f8b9daa8a58 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/runtime_types.ts @@ -17,8 +17,6 @@ import { type StarterPrompt, } from '../../common/types'; -const serializeableRt = t.any; - export const messageRt: t.Type = t.type({ '@timestamp': t.string, message: t.intersection([ @@ -35,6 +33,7 @@ export const messageRt: t.Type = t.type({ content: t.string, name: t.string, event: t.string, + data: t.string, function_call: t.intersection([ t.type({ name: t.string, @@ -45,8 +44,7 @@ export const messageRt: t.Type = t.type({ ]), }), t.partial({ - arguments: serializeableRt, - data: serializeableRt, + arguments: t.string, }), ]), }), 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 d33d43ab9d454..04d85d6dc282c 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 @@ -54,6 +54,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { message: { role: MessageRole.User, content: 'Good morning, bot!', + // make sure it doesn't 400 on `data` being set + data: '{}', }, }, ]; From 84c6815a1152049c74db00da48522d0624603856 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 3 Sep 2024 22:29:56 +0200 Subject: [PATCH 07/28] Fix `InvokeAIRaw` bedrock subaction's schema (#192015) ## Summary Fix regression on `InvokeAIRaw` bedrock subaction introduced by https://github.com/elastic/kibana/pull/191434 --- .../connector_types.test.ts.snap | 49 +------------------ .../stack_connectors/common/bedrock/schema.ts | 7 ++- .../stack_connectors/common/bedrock/types.ts | 2 +- .../server/connector_types/bedrock/bedrock.ts | 14 +++--- 4 files changed, 16 insertions(+), 56 deletions(-) diff --git a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap index 6e4392e3f737e..c52ef2f2f6478 100644 --- a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap +++ b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap @@ -1083,51 +1083,14 @@ Object { "keys": Object { "content": Object { "flags": Object { - "default": [Function], "error": [Function], - "presence": "optional", }, "metas": Array [ Object { - "x-oas-optional": true, - }, - ], - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "rawContent": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "items": Array [ - Object { - "flags": Object { - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - ], - "type": "any", - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, + "x-oas-any-type": true, }, ], - "type": "array", + "type": "any", }, "role": Object { "flags": Object { @@ -1144,14 +1107,6 @@ Object { "type": "string", }, }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], "type": "object", }, ], diff --git a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts index 03f4f5cc01735..15ac45c0cf597 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts @@ -78,7 +78,12 @@ export const InvokeAIActionResponseSchema = schema.object({ }); export const InvokeAIRawActionParamsSchema = schema.object({ - messages: schema.arrayOf(BedrockMessageSchema), + messages: schema.arrayOf( + schema.object({ + role: schema.string(), + content: schema.any(), + }) + ), model: schema.maybe(schema.string()), temperature: schema.maybe(schema.number()), stopSequences: schema.maybe(schema.arrayOf(schema.string())), diff --git a/x-pack/plugins/stack_connectors/common/bedrock/types.ts b/x-pack/plugins/stack_connectors/common/bedrock/types.ts index 3b02f40d2de62..9d742e5f892a8 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/types.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/types.ts @@ -35,5 +35,5 @@ export type RunActionResponse = TypeOf; export type StreamingResponse = TypeOf; export type DashboardActionParams = TypeOf; export type DashboardActionResponse = TypeOf; -export type BedRockMessage = TypeOf; +export type BedrockMessage = TypeOf; export type BedrockToolChoice = TypeOf; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts index c2c773bdeaf87..9bd5c64404f64 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts @@ -32,7 +32,7 @@ import type { InvokeAIRawActionParams, InvokeAIRawActionResponse, RunApiLatestResponse, - BedRockMessage, + BedrockMessage, BedrockToolChoice, } from '../../../common/bedrock/types'; import { @@ -422,7 +422,7 @@ const formatBedrockBody = ({ tools, toolChoice, }: { - messages: BedRockMessage[]; + messages: BedrockMessage[]; stopSequences?: string[]; temperature?: number; maxTokens?: number; @@ -440,9 +440,9 @@ const formatBedrockBody = ({ tool_choice: toolChoice, }); -interface FormattedBedRockMessage { +interface FormattedBedrockMessage { role: string; - content: string | BedRockMessage['rawContent']; + content: string | BedrockMessage['rawContent']; } /** @@ -452,15 +452,15 @@ interface FormattedBedRockMessage { * @param messages */ const ensureMessageFormat = ( - messages: BedRockMessage[], + messages: BedrockMessage[], systemPrompt?: string ): { - messages: FormattedBedRockMessage[]; + messages: FormattedBedrockMessage[]; system?: string; } => { let system = systemPrompt ? systemPrompt : ''; - const newMessages = messages.reduce((acc, m) => { + const newMessages = messages.reduce((acc, m) => { if (m.role === 'system') { system = `${system.length ? `${system}\n` : ''}${m.content}`; return acc; From 03bb0b2b5df5488dc882147ebab885043b68da19 Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Tue, 3 Sep 2024 14:47:42 -0600 Subject: [PATCH 08/28] [Dashboard] Compressed Styles for Controls (#190636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Closes https://github.com/elastic/kibana/issues/190355 This builds off @ryankeairns work in https://github.com/elastic/kibana/pull/189839 to have the compressed styles for controls Applied to new controls in example apps: ![Screenshot 2024-08-27 at 1 45 45 PM](https://github.com/user-attachments/assets/748204e2-66c3-4638-bce8-3cad34337848) Applied to existing dashboard controls: ![Screenshot 2024-08-27 at 1 35 25 PM](https://github.com/user-attachments/assets/af1796ef-2fa9-4760-bcc2-18a4d69dcdcb) --- .../component/control_frame_component.tsx | 1 + .../public/control_group/control_group.scss | 3 +-- .../options_list/components/options_list.scss | 2 +- .../components/options_list_control.tsx | 1 + .../components/range_slider_control.tsx | 1 + .../components/control_panel.scss | 5 +++-- .../components/control_panel.tsx | 2 ++ .../components/options_list_control.tsx | 2 +- .../components/range_slider_control.tsx | 1 + .../components/time_slider_anchored_range.tsx | 1 + .../time_slider_sliding_window_range.tsx | 1 + .../viewport/_dashboard_viewport.scss | 1 - .../screenshots/baseline/area_chart.png | Bin 128091 -> 50251 bytes .../baseline/dashboard_controls_dark.png | Bin 95445 -> 52560 bytes .../baseline/dashboard_controls_light.png | Bin 95332 -> 51893 bytes .../screenshots/baseline/tsvb_dashboard.png | Bin 77429 -> 31060 bytes 16 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/plugins/controls/public/control_group/component/control_frame_component.tsx b/src/plugins/controls/public/control_group/component/control_frame_component.tsx index e4c647737f48c..5da9a3233275f 100644 --- a/src/plugins/controls/public/control_group/component/control_frame_component.tsx +++ b/src/plugins/controls/public/control_group/component/control_frame_component.tsx @@ -96,6 +96,7 @@ export const ControlFrame = ({ 'controlFrameFormControlLayout--twoLine': controlStyle === 'twoLine', })} fullWidth + compressed prepend={ <> {(embeddable && customPrepend) ?? null} diff --git a/src/plugins/controls/public/control_group/control_group.scss b/src/plugins/controls/public/control_group/control_group.scss index 9619e68274e16..e797f3b421297 100644 --- a/src/plugins/controls/public/control_group/control_group.scss +++ b/src/plugins/controls/public/control_group/control_group.scss @@ -6,7 +6,6 @@ $controlMinWidth: $euiSize * 14; .controlsWrapper { display: flex; align-items: center; - min-height: $euiSize * 4; .controlGroup--endButtonGroup { align-self: end; @@ -47,7 +46,7 @@ $controlMinWidth: $euiSize * 14; .controlFrame__draggable { cursor: grabbing; - height: $euiButtonHeight; + height: $euiButtonHeightSmall; align-items: center; border-radius: $euiBorderRadius; font-weight: $euiFontWeightSemiBold; diff --git a/src/plugins/controls/public/options_list/components/options_list.scss b/src/plugins/controls/public/options_list/components/options_list.scss index fc1cdf68e3fec..f7175b74c792e 100644 --- a/src/plugins/controls/public/options_list/components/options_list.scss +++ b/src/plugins/controls/public/options_list/components/options_list.scss @@ -8,7 +8,7 @@ } .optionsList--filterBtn { - height: $euiButtonHeight; + height: $euiButtonHeightSmall; &.optionsList--filterBtnPlaceholder { color: $euiTextSubduedColor; diff --git a/src/plugins/controls/public/options_list/components/options_list_control.tsx b/src/plugins/controls/public/options_list/components/options_list_control.tsx index ef3aa89bcc2cc..cf18eaf53fc31 100644 --- a/src/plugins/controls/public/options_list/components/options_list_control.tsx +++ b/src/plugins/controls/public/options_list/components/options_list_control.tsx @@ -214,6 +214,7 @@ export const OptionsListControl = ({ className={classNames('optionsList--filterGroup', { 'optionsList--filterGroupSingle': controlStyle !== 'twoLine', })} + compressed > { id={id} fullWidth showTicks + compressed step={step} ticks={ticks} levels={levels} diff --git a/src/plugins/controls/public/react_controls/control_group/components/control_panel.scss b/src/plugins/controls/public/react_controls/control_group/components/control_panel.scss index a66d39e95818a..bb05f663ca42f 100644 --- a/src/plugins/controls/public/react_controls/control_group/components/control_panel.scss +++ b/src/plugins/controls/public/react_controls/control_group/components/control_panel.scss @@ -1,7 +1,7 @@ .controlPanel { width: 100%; max-inline-size: 100% !important; - height: $euiButtonHeight; + height: $euiButtonHeightSmall; box-shadow: none !important; background-color: $euiFormBackgroundColor !important; border-radius: 0 $euiBorderRadius $euiBorderRadius 0 !important; @@ -11,11 +11,12 @@ } &--labelWrapper { - height: 100%; + height: $euiFormControlCompressedHeight; .controlPanel--label { @include euiTextTruncate; padding: 0; + height: $euiButtonHeightSmall; } } diff --git a/src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx index 9ed24904f25cd..66ca8bef9df1e 100644 --- a/src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx +++ b/src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx @@ -155,10 +155,12 @@ export const ControlPanel = diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx index 5411b6122ac25..cad81a1920081 100644 --- a/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx @@ -173,7 +173,7 @@ export const OptionsListControl = ({ ); return ( - + = ({ min={displayedMin} max={displayedMax} isLoading={isLoading} + compressed inputPopoverProps={{ className: controlPanelClassName, panelMinWidth: MIN_POPOVER_WIDTH, diff --git a/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_anchored_range.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_anchored_range.tsx index 0671442bf4120..54d0d83e102d8 100644 --- a/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_anchored_range.tsx +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_anchored_range.tsx @@ -39,6 +39,7 @@ export function TimeSliderAnchoredRange(props: Props) { max={props.timeRangeMax} step={props.stepSize} ticks={props.ticks} + compressed /> ); } diff --git a/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_sliding_window_range.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_sliding_window_range.tsx index 584c20328496f..55f9eb3dc6210 100644 --- a/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_sliding_window_range.tsx +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_sliding_window_range.tsx @@ -35,6 +35,7 @@ export function TimeSliderSlidingWindowRange(props: Props) { step={props.stepSize} ticks={props.ticks} isDraggable + compressed /> ); } diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss b/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss index d5196f140292f..f0c51724b551b 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss @@ -18,7 +18,6 @@ .dshDashboardViewport-controls { margin: 0 $euiSizeS 0 $euiSizeS; padding-top: $euiSizeS; - padding-bottom: $euiSizeXS; } .dashboardViewport--screenshotMode .controlsWrapper--empty { diff --git a/test/functional/screenshots/baseline/area_chart.png b/test/functional/screenshots/baseline/area_chart.png index fb2e7e295e3e9330625e1dd05d096eaf09ea1e9a..07004fbb366551aef787d17667c2b3503e353355 100644 GIT binary patch literal 50251 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%0AY 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

(_glj3Zv+l3Zy^k?^Wk)PVC44YIA9<$T19XS z*bKsRdK73G8FBddJV4I~ZTHC+DXNqLcg%B8ZTwkzoNIJSI6g z5~$yR&Vb7k;q1#7CAe5Cxg#uNk!TPfuhu*8TM~Sva@l;cZYdUD_XU&W_T;VWeBSgl zpS`1FtrgrH%f}$465d*43IdUe7fT+yw^S69v8W;5?^1na zum_Za=ETa%Gx~n0U#A#cK4?E#nP0xo>tEY>#7)S-VT75@sbnzL`RPCbJUzviP$Afq z`R1K9k%i+=-S}2$rxWOT}GTP2n{p_3tk{%_=FlavrXGB-CF-TO?IR4ZLdXjky`9P?jizNj|6j{)oGXFV2kK;vvcBZrUg;`0;7K<^(s=*w z;vVBCd=P&x_%X8h%~v;8Nfc;KVmV5v$ik;SI)OL1C{?Doc+;sgXrQsIjwstasx7VK z&S3o48f9A*M+Mm0=o&~dT7ePLpnW>_1C4yYTW_EKBSMZ*rSk`PzY^lqL>C%1=wJRC z-B^{JZzjO|KUG}?SXABC9;92Oq*YRokZur=l9KKalx~m)kyIFvknZm8Mx>=vy1Sd9 z{>{Cg-|sz-4};1K=j^@WUGIuL7FBtnmi)zn=0Dxoe;(XSg43Icrhw5=#bQ&y?aSA% zBFB->+&N%+UBu@v%Q`%Q4V~OSxg4)OHEWj%M)|7NP@wzcQN>Reumn5>4VbT-ow-$u zb)mFL&Oa=IKS($)cq5nCE{p%{0BvkoHERpREFT2LVi)Kq!8Yo!~jF>GGg&nPKz z$jB@QmZbZW1kkauu~m{|`CV8;$oN#Z9j`7fo^Wy!0Cd0x3IR(D+HB5eohDps?fCim zZC1K)d;D2F3X_peBNl*`S5JTHH{r9!vs+oHJ#~yIlb0#W`IM;>96%E95VR!CbKt4qbos5WJ zJ%h`iteYByEuM z*io(Z#T!Sj##OPa#qm2)jhwRlPg|W4Njie7=%yey&vT+(4^e2Ai<_Hhm(aUoR;6&I z6x1rwMdB2deAUJL;wF*u4}B2G_IM#%yfOG{^Ksm3wl|8gtqohqVx$gsw##r+4-(7M z)z+Q4O4&P6{IqtyI`to)va*&n1;NotT1_)t_EG(<#$m3C4`x|hboB}cUe5{6eHg)V zqU$XE&hWCl+OqfL(W9Z}kVhuja*036-uId%43N)O!wbKDjp**~elRGCz1S5-Ia%*i ztP^FPC!Z_`5L}opvrZjesK8l_==f`+ZXj7eA{b9;aEOS$0A&ks7%1}1G+>#0_P?gW zRvg~Ug{kTx+1XIKdaWHblD36ENaUXkUV!%L2Wq~Um6}cIb=F+?6cnL;=!E0lbz;=i z)EC#s17vj}fU+cMoU1U65S@^qk{}(JVez&q-urEyMxz?{aaor_%7JF@?>5rWA!O4G7&eoXk~OfD8dB5GMLpaq$mmeY3t_2%k|^{pwThUxrhK3QK~2e zqV)r0By2W^sWY;(ms`By)l2lf$9CDTZ*@H{-$Pn_QE^K?^brG*f5yOoj*LaxVm}~| zorB>3<+iFzkCOe{%~UR1@V=5g-#wF_{FN+3ai}J6sNqWY5Xbu+B(^a7DKFW@&NP1o z)0?)20}GTm1;}Auv=_fd(5=0vsEOn7$B81H)A8BzguFa@ZazLR_Vqyyxv@LA`HQRl zX6V{=uM=#ZH zeUQIee{(kdK6<3q-gt99T_Ut&Yb@V;3&BHD5(QLA%+4;^VRmMO1O~PMX)26rBfnRB z!0WV(jg6Vqg@$7DI_(8(SvTSXyV;V!V{asMcQPWs93e0G(rj#ddD#b46B=A!96Dd^ zR=+eGrQ4Zr22+Xr=Lfz$6+IY{7b2o=ZNH&*-O9~A*vw9jt0do>ET#PLE5^I5jCBUA zESgOszdY1>WJ|kAB;+zm~4EsOAKn;}a^qHdP{j8+JuG zt$D;4AuqvuO>jydVeF6CoFZqo;t7iXQ2e&>x>>0% z3>eTdY;~D<&ilXh^z~u7o$s{=6S2MMKVFNszHM&g3++wQoPpdnpa-QqVOscXp=R5P zI1@e!VPwmX{fEtj!mE7!JC{lUQ|%TQ^q>B3PQo0XNDoBKR2lHo~O4a186ll-0i zqbvA1+qGG}aW#*o^W^{@FwZT4XhC+LZJo57vMbqbk0*VxHU_9Pr{$Ed=M9W#C!%*X zFf^14W#II+nApO`Q2K}IlfBvLC;WuwvvnMv7mLW{>rbX_+5giA{}14LJ6l38T--gh z4ms#(z_&4-?zD*i%+!WMLJ}mTIIZq62fjX8x*K2kZ92a!X5ez+o;HX*Aa_N6b-rJ0 z*PO4UsYx95LgQJaR+Yt<30*hLoR}q@hAdamFVO)dF+NP7l}{1_;wd5`LbZ4u#i->A z0~R!Bok+ly9sJt?Y`gf)R%a*$bAkkaVnbsbuVY?DgZrhOudi>*$Ovw^@qoCgX>NCw zfZN$me@qgp)HBf2%VM)2ER)1f1QIYJjWRTC#>pNZ$|&l>HY7qwUpY9iXUQdg1(*U3 zQs=nspX_z3Q6mT1Rii-W9|&BkL@2p>{l~%;ZLMl64(_`o0k^>_ORZG*t$D`sM1f_xGUz%uw1^YZb_cfPH^P=Jhz15+oHlun

ZW_sul&dhgdI;~bF!)Fmype7ffGU=;eR(Mu86i{W4#{`_?<@LI;-*@~hp`RpKd(T7l~$Q3iB7TkW4<;V z;73}+6-Z&sn*pTNqDY+wZ6}5HK&Ji`h&_LS+;W!p?4LssF9L`bM=AKg`;A9eAdL}v zPl`8LAP|{{-g}Kv|1T!8fe2PP<-ak^oIRvBcIT<_+aCvi%Qcm>HME8QP3}%Ph!$Z| zYjnLhAnb)%6B{pI0ZQUknioH8_v4rY0|OlwK2Hm__kO>dFbP;`i;DJ4f=lH69aOWlFl(M)485AfzGdZV-;``h zN(!nsBLF?AQLZ=h!y@mMOA{qI`5Q#j-Jx+hzY}_q;ac6rUtvTEeoR2_%{q>FNa;m> zI}3k`VG!_kMIlH<49`H^sa{l+%b?~S@iU4QTwH8Qfau1zm>9Lnj;O0wXK*vuPVPLM z+y(IdxXZMZrCD>Kv+@||@$#z4tx~?SgD-{0Fl*eF+w@g`SD(XOO@IsQArlV|Zh^hO zJume)q3Dgn%RRZ$68oq8sg4#n0uiGvPhH5Zv5I-=-G8yz=L%J@@@lZ?x& zA@6q_itJ08urU{v_90sA|Dfoj)uMsUj?t1$g)y0U7KEO7C49`ddQ9Fvro#nKVlk-0n)Cr=D7f%GURm4Z$ma#ikqtFdj@G3dGae7z>e zb}?ih_2-U^S@9TJp}+09zn3JSR_JE@c_bmM$>ee(Q`wQB0nk1t^`-V_iks#+r)y+q zlUiv?cjh16aD zG(R6Bb@3epX+pbOHCa`U*T)Wjgk3*BJ-s{B5<&#snJnPsL{D?Mtq;Df`Ei!H(ld}L zeKOob0dgaNDaa7>atB=!Oau4Zvp`yv`wf9#D=zRlcCTHQWvz`@H-&qZSenY|}Udt(8;<2Lz@sbTElT8j(WH=PaL7MTf zFs!wUPxE)eHDEwPmA=$kZ~IZUW5cZiP1cDr!{pRdWVuD&^AIAU$BS^40`_y8v5z~( z;!;xP;VmGwV0!@c%EEefBeiEszZF2OPeLP;)8Vc;h7%-MQu<2ni;ZOFPv3vT=KNm) zAV1)Ev8rW2d{tQuBIX~zw$mfWTh@2~5zF``4)^5hj`StR!ZY`toxbI)H7SI=l1FtW&S-|QgW(;l~ z5Ga0rzCP>2+$b8G{;vq2?GD!l0uJ^&9dycAvgpKXnhy?o6k}+03KKH@FZLUE*QSNg zy&EHP0*;fs$G2R-W^{>yTs2*+U}9^DTIlHT(6HKlr6Nap#ChfcP-&R~`|@XR#K}OU zT7Xla&N%h{^LJOUj`+7fZ7fSrjZE9tz5{<$^`}IodrckrQWnj(KmwIz|C*6+j1VqT7~5tzr*?IzOc6u`TQC5Hd_AM zYD!hX-9UI4q^hcVoZK^YHZn1x`{?dWo!ipXPi-*MEC02mD?=&^~}x z_+sIToag3|58SEL2reqdp7rX5ELG}zYzx2SPTNQ6^Pcx-96A>x71~8PL6_RK&a-m? z=NEXSi`*0P2*jzo@9WpE&D6g%)Ol}>bJ+grA>ue! zrk}4t^^`6_WmS-#KXEr3h_@P(n40dq2t=->3Uq!w%^h95IIik7*NOBky9^mUw13p>p^HTCIf!Yli|V`$Fz?n1L+ znNoLX1cCOH4ZCAl<@(RK9{l&{_!rIDo$HLIQ^768oXq)2^RlhOMLj-6MottPG5}I- z`;~5<=2Hn~W@cg5u<(YH^=Au-x(d<$uZzZXRIv^pKlh@2y|S6fZ^C;Jl~$Hk*#^0b zzyu=Rj;Mx_8oyF1kWAmfF|5Cmv#mN{Yz zM{-qMQ2j#GQELO4Oj+FNVg?gky}h8Nlyxmldnf2f2AVtah=_dU5{2z>l9jWe5VB$I zL7er_?dgnJ_(#j24WniF?_$(L2ov zyleU)EBij@%_{{3XwRxj18lp_ZHpTO%oEeIwF)^=Ay>Xb*-~aXq^l{0a=8puSVne? z;no3y9_PuX{$ksecmjF@aL@1oSdh*TvEG8mZD+Lh&yD{X*rdUdKKSzW>*-n?GngWP zenuvE0BYl%>dPH*txkY!K2tMMZHx?Gj{SjUjs9oDRs%TiXxoP!MEJUA%8S7XDklRiA?TtrPBa2X0+g4MN_eF(9xc~BumC@Wyf}g(N0sxe?kMINqdY28GHLPK{s_d7}4( zJODd8vo%qcDHX8U>2qijv|W99ybTLdDmPGNBd6X;Pi(OSjS=Xvp4Y`Wt0yvcpf)Cf zZ;yIi0)2xvJ-D$H}J_o=b*z2Qa*fGr1W zs;!c`m^xLRCL1*iwCcYOb3Brv*KFPa?&KSnna%NP*|TUmNaHs_c&D(V`Wcw`BpyS1 z-Ure2q6VO$L5U%(#&!MITU1|)tei!LUo_Xvm~b--ZN<;DQzd>UV<5X9kE?A72`j!h zK>^Ud*tizIx6tOI_U&l#blc33~7*=1|G}-7Yl?rMp*V~gmxPP^5}DwJ8Pnrmbi^x$94Iq3OOH5_0|)&&n~QT zOgI-(&`pU*^{1=6>(oA)>DIST4G;gP{WbGcqaTP49}k6HCz)xq8>v#0-akCtnk@LY zfWw#0j|1jQy5fTj>-MrqrEimv-~;DK0YUh(byw8f3D|@f8yQ`+HTpQBH2GUUC; zun!;c0zoYkmDV8TeEn}M6UfV>!(P<&8#mn509zTGKtYGu>1u$Y3zA`WrRTdeveDlb zq6rkEDKu)iw?PS>;V{6TV#ctCif22q!ko^4act=x-{dE zS@K|NK1W2P98axbHi5fWHW#lJb-pzqP1T#pKudcuRy>73AQFSrP1t{EgaAnZaiY+V z*C>Ye<830?N}uBjoptYg7ou%E4X>bDpg`3g8XWmBHD@JS&4X*w?Mr!sGppx(AAMNR2X+1cZ|EFF(! zIWpF?*|qCg-OH``QjUC^B4dcDIBcs8KshV7lcTNc_odgDLwS{(3W|t}R$F8!3RlM_ z-MqI%I+rGe4QueqQjiu+;|f}98(=_>WCt~8$o&+4Fo)ZV{2Tu31Qpoclzk2Ih_S(w zOC0gMt}Tq+ds8U2FPX=b9m!SM#|pGaS-%H7;|8;EIXcaY$DEXCcD+mL;~f<{(k{f88F z33RG?OW$rB9uLTow%0Oz{DB2(zBm>pYZtcX4MelmT(q|TM1xHKri--MBx6TniPAXV z83)L~G5NNn>+)bM*t!yCzV^9A@%*Yx%1kr;2@ZQqNlEF29_;h^EQnUp9GjU5{izxK^kz7W8(%04K}k4Pj<9t zKTO|>AY#u{XY)MnINXo*wbz_~eq%=)a8%8^kN<;()LE_ykN*c=1+#wyh{(LkZG}z( z01bWjJ(%}F{)22Xm==BJG~wVwF@qaXFV-gN?z+>e&O#t#pSBL6DI!~LYZthm2I)gx z*GlA3pC7#gQ4dJ)o#UqHY)M~YDnC=inL_Z-#Leuscb*9R4PJO$145@q^DkV zQ&g2DUQXd!w}1Lc9af2v>1raoib=+_7FVTse-1?5ug(J;S9j!jwe@Q{l5dz{lCE6{?|C)|3Aq89fbe?=j8v3a{^FJ5HcwrdAM2Vd{tyj zOz9ue3(5Bai1YVvV(~vRezE5i8eSpsKY7Us0B@NU*@D~ubjklN?7hb~tYEL7chxT2 zk0ml~*t@63S^BkIV>|S%ni8^?2m3`@eZvXhs(TWziEcvXjAmLA*DZ7a&2lLopuMK%uBD7Q6KD3pY0p?zKh|2NS(FqiKhVO zb36~nYsu%e5o}B!N`Db;l96?7Y232=VzgAb^fieRz}GTfA^&6eCRW!-`BjRU_G_MmPaf&B7ItDyrPvG8PPrQ{8f1Lp zW`)KcI((wHslA#f_7ri{fGI^R&Bf7>%G_t$@=6f9fts@E{A?D+#I}<2T z^>Xm!)|p>%x}&00pf4;R!{3ASZLkBTfdmM(7JZ5uGiLTcL2^x^PI-los$kYSotGy+ z<=G}0k@XsktJEwecVyytmCWY}97bm^Qn!j|gf`N=Luzh;IHPz%H&__4XD`wC!k-VX z#5!Xbh~z?(IDZzb`nD7P8treSO8vd)N0>fBd9-VqaTWwtT*$u##==(5Zo;s8I z(U;q?=x9|KB$)k!z7<#iWOpAz4Yj8L>j!eG0g1Ch z@-c#n5`n01w;`_0Ad)NNq!GOX{pi)OrDd;H%ldkgC%)UN`!lVvh8tlmieGi7-yU3g z!18FzCv^Tnk=3>C_?|M@`p(DUT`muja5@*#?M&ot^=Vp0~j_VHHsKCxxF zueS&w!Fm75WT-o=mj6wVT2j4uS{&aa_A1L}Kl(GV*-t|o3CX2iq{KeG_bz)Xt}-rA zvOhZ57Sr-nUEBE_|JWpoX6)E{lQrK9A{ww!E;IpxZTfT&qja*~p_1iai9R3(ikZvvvUB3#^BL6295~76d zHL!NZx8Ix92y45F-2dj+nzA2U2YN{V<|5E+9|1!_7AmDNZ*^^;u z)g@xWVp#ia#$-YumplYSLiHZk5d_1Q{I_j17ckU(v+2%_i(Y*6%c>>*iM>)FDm%si z#LHV$BjTa%XJ6#}PK#R(<>ygnlb!;{^c`l>=4svsD%Z2S%#J3_bW&pUILUqO9Y8RZ z2n18@`N9rs6ATH9tY$JbE37>mBIREo)0}u4Orw^94IJ1whkY%Lu0ev6U$_zlQ!BG4 z`}}N}O=^4D^u2F5@U1SjW2!;7$E@>bqGm@e21+z1=@Aw6=iFAt5`&`TGw;B?XAl`o z*gt*CD)6^0`I&o5dvPS?0_U5a_USiB&2c)P3xkq5RZjA5|3AzQF4y#X2nqd4V05aF zEa1_i`C)AwdBh`B1}>>9PG`f`g;yZ?mj5P=AmV2nHg@_U@?}%`7Dz#JN;56ZRBtZp zq-CV`-m^*^BJf%h%r@v)`os9cz~Pr68`~s@dWLzePwdjI7BHY&2jiA;XA5pT3(g_% z9JENbS5zOn^UqYOdNZgwUx__AN>N7?}ZR0ZI)QIsd3v;zjH3sQ1g83snEc;2Z@F|#y~%S zjU15KWHbe<G6G$@l~gAE7frye&AX8bp=(kMSWpg{@Z5D`wL*Y2mpj zgHgV^fz$WL(3pe9DaV@3*RxC4u6lA^fy@y6TLWZp`lI0MchE0H;SR~O=_-O2x*I#L zp`X-PO%d-(C|_+~R3GL#UH(F;=$FH_xIJ`k14F%9a7Np6 zL}+H;+(4S#Lsyj5j$)#JpfiP>CqS?-t#u00!d@&_^6_NZ|Ep~ zjez4V1wfYG^{JOv&ZU@75%o@r-Ffl6AkwPV9r>L18~ptK7ytX;i!gnGF3VhmqPbUT zbG}b)#ShN|%cKiaqN#gZ`k%RbH~j1Mwk@yB40$AB7d{|FPT}fA2 zxgHVRTXrT^VB5~z^B^x4EN*Gg>%}?u;vn_4$=is%JuY_FeBFYNHEGi_#Jx2yvbBUE zG1E8suVil29MXbJY|@88f1emaB!Q0pax0v=koR6fyrW_yx_(^gmzNlat3p@f$WXs{ zek|jqKxS{}5D}5KG8n|D%c~eI;(ep_e?e~5h>B_S>o0dT^xX~50Y1n0PvaX!+?cQv zbzF3NAQtUL6Dp^H$n7v`OY4!1k=uMH*?x}le54Mc@EIY*Y+5zy^J1Xne8ZpVZ5ML zGMiO1Tdnb}Q(-ekHQens^K9?xnWN!V1|~p-_2hn1Hdx@mR_hK4(XK1`br7(BueLT% zQT-mG#HycrH8*NEdPu6;MU^I6Trlc;F2D>kD|9?9k{lwCQDElSRW#^QSaIwxJu#>9^HSQQoP(2Y1{GohaZ-D_jq+jPismb ziW_u#nbxv2w{p=py-Kk8Sk#c8nCtm9B3Md9{^>{Zs}N-b~$`HnE}@tBgrWo$axOsst9-UAA4%}H23$P6w6uQ4jN*oU76f{G8}iAMqQ{(j18H&mEy0Bo+z;CF>}7Sn7X*wu|{PwM?tZo zykA}IP$hX9c&pn?ISEzhiX=l-5#8wqoC$o~Qh=K95N{9_jF~y|rN;O?z?EW|JKibb zhR=*I1!TEaOl`Wl|2AWG*zg5mOe71&mV- zwtd@GICHhG`KGmVA9$!Gil6gh+fVeDn6)#ePbv-BA^t`pTu<_(776C_3lRbj!JK0Y z0cBe}b*@w~??%DD9ca#<%FZ8`@vilv(?d1XWjYoCe@lm2s;J51MgQx#Kt~?W7MWT- zzVRC|4*4hGrJjSF6yz+@%Z?6p)vuj%j;&W5m?9or;KvQdU*NK%&mOm(s5~L}AR7rH zsB(MUmr-M;s5QOUv4K==XikSgx|w6MXXX=uhQQ2wKETqgq-5>S*>z{ zqP4d@Zf_%^qt`B+FRu82#$)koByloZsVj#$#fSE{H?Kkd&HOXpv%c0dzfcb9j=D_J zsKtxmgmo;EDj66MR}{8;L!ydrlJ!L4y5p#>Z}~330&VCQ?%kd9-;toi2u1U*aw<%z z8-CpgT@grWH!YPs@t)-7+w;|d;e6gbcv=hOEDrW8LHGD$3l|W zW|7ZcCKDKxWy9mv|dbeT?*TFfk+4xv(KP^R0s%0AC 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

1z0H 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 diff --git a/test/functional/screenshots/baseline/tsvb_dashboard.png b/test/functional/screenshots/baseline/tsvb_dashboard.png index f118bf55040e5a0eb54c261317c6e82457e80792..8b33a0077efa23c82dcff6369306df238224dd23 100644 GIT binary patch literal 31060 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%0DD!ehlX44l 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 From 37d6545699b3dd68b7bf7bc40a1aa86af2a44bd6 Mon Sep 17 00:00:00 2001 From: "Christiane (Tina) Heiligers" Date: Tue, 3 Sep 2024 15:59:50 -0700 Subject: [PATCH 09/28] [docs] Document internal API restriction in 9.0 (#191943) fix: https://github.com/elastic/kibana/issues/191941 Adds note that access to internal APIs will be restricted as of 9.0: ![document-restricted-internal-API-access](https://github.com/user-attachments/assets/56b5c43d-ff6f-4b5b-8c18-2cbe1a1de7c3) - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials --------- Co-authored-by: Elastic Machine Co-authored-by: lcawl --- docs/user/api.asciidoc | 2 + oas_docs/kibana.info.yaml | 6 +- oas_docs/output/kibana.serverless.yaml | 23196 ++++++++++------------- oas_docs/output/kibana.yaml | 5748 +----- 4 files changed, 10629 insertions(+), 18323 deletions(-) diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index 03ad9763fb438..3c9b6deebe3c4 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -5,6 +5,8 @@ Some {kib} features are provided via a REST API, which is ideal for creating an integration with {kib}, or automating certain aspects of configuring and deploying {kib}. +NOTE: Access to internal {kib} API endpoints will be restricted in 9.0. Please move any integrations to publicly documented APIs. + NOTE: For the latest details, refer to {api-kibana}[{kib} API]. [float] diff --git a/oas_docs/kibana.info.yaml b/oas_docs/kibana.info.yaml index 40795333fcf44..534d88c6f23b5 100644 --- a/oas_docs/kibana.info.yaml +++ b/oas_docs/kibana.info.yaml @@ -24,6 +24,10 @@ info: ``` For more information about the console, refer to [Run API requests](https://www.elastic.co/guide/en/kibana/current/console-kibana.html). + + NOTE: Access to internal Kibana API endpoints will be restricted in Kibana version 9.0. Please move any integrations to publicly documented APIs. + + version: '1.0.2' license: name: Attribution-NonCommercial-NoDerivatives 4.0 International @@ -53,4 +57,4 @@ components: For example: `Authorization: ApiKey base64AccessApiKey` basicAuth: type: http - scheme: basic \ No newline at end of file + scheme: basic diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 95791618ee7e2..0b90ed3464d8a 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -64,10 +64,6 @@ servers: port: default: '5601' - url: 'http://localhost:5622' - - url: 'https://{kibanaUrl}' - variables: - kibanaUrl: - default: 'localhost:5601' - url: 'https://{kibana_url}' variables: kibana_url: @@ -231,6 +227,7 @@ paths: - $ref: '#/components/parameters/Fleet_page_size' - $ref: '#/components/parameters/Fleet_page_index' - $ref: '#/components/parameters/Fleet_kuery' + - $ref: '#/components/parameters/Fleet_format' - description: >- When set to true, retrieve the related package policies for each agent policy. @@ -302,7 +299,8 @@ paths: /agent_policies/_bulk_get: post: operationId: bulk-get-agent-policies - parameters: [] + parameters: + - $ref: '#/components/parameters/Fleet_format' requestBody: content: application/json; Elastic-Api-Version=2023-10-31: @@ -368,6 +366,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/Fleet_format' put: operationId: update-agent-policy parameters: @@ -401,6 +400,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/Fleet_format' post: operationId: agent-policy-copy parameters: @@ -1440,7 +1440,7 @@ paths: - agent2 rollout_duration_seconds: 3600 source_uri: 'https://artifacts.elastic.co/downloads/beats/elastic-agent' - start_time: '2022-08-03T14:00:00.000Z' + start_time: 2022-08-03T14:00:00.000Z version: 8.4.0 schema: $ref: '#/components/schemas/Fleet_bulk_upgrade_agents' @@ -1583,259 +1583,184 @@ paths: summary: List agent tags tags: - Elastic Agents - /api/actions/connector: + /api/actions: + get: + deprecated: true + operationId: '%2Fapi%2Factions#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + responses: {} + summary: Get all connectors + tags: + - connectors + /api/actions/action: post: - description: The connector identifier is randomly generated. - operationId: createConnector + deprecated: true + operationId: '%2Fapi%2Factions%2Faction#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: - examples: - createEmailConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_email_connector_request - createIndexConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_index_connector_request - createWebhookConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_webhook_connector_request - createXmattersConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_xmatters_connector_request schema: - $ref: '#/components/schemas/Connectors_create_connector_request' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createEmailConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_email_connector_response - createIndexConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_index_connector_response - createWebhookConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_webhook_connector_response - createXmattersConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_xmatters_connector_response - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - summary: Create a connector with a random ID - tags: - - connectors - /api/actions/connector_types: - get: - operationId: getConnectorTypes - parameters: - - description: >- - A filter to limit the retrieved connector types to those that - support a specific feature (such as alerting or cases). - in: query - name: feature_id - schema: - $ref: '#/components/schemas/Connectors_features' + additionalProperties: false + type: object + properties: + actionTypeId: + description: The connector type identifier. + type: string + config: + additionalProperties: {} + default: {} + type: object + name: + description: The display name for the connector. + type: string + secrets: + additionalProperties: {} + default: {} + type: object + required: + - name + - actionTypeId responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getConnectorTypesServerlessResponse: - $ref: >- - #/components/examples/Connectors_get_connector_types_generativeai_response - schema: - description: The properties vary for each connector type. - items: - type: object - properties: - enabled: - description: >- - Indicates whether the connector type is enabled in - Kibana. - example: true - type: boolean - enabled_in_config: - description: >- - Indicates whether the connector type is enabled in the - Kibana configuration file. - example: true - type: boolean - enabled_in_license: - description: >- - Indicates whether the connector is enabled in the - license. - example: true - type: boolean - id: - $ref: '#/components/schemas/Connectors_connector_types' - is_system_action_type: - example: false - type: boolean - minimum_license_required: - description: The license that is required to use the connector type. - example: basic - type: string - name: - description: The name of the connector type. - example: Index - type: string - supported_feature_ids: - description: The features that are supported by the connector type. - example: - - alerting - - cases - - siem - items: - $ref: '#/components/schemas/Connectors_features' - type: array - title: Get connector types response body properties - type: array description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - summary: Get all connector types + summary: Create a connector tags: - connectors - '/api/actions/connector/{connectorId}': + '/api/actions/action/{id}': delete: - operationId: deleteConnector + deprecated: true + description: 'WARNING: When you delete a connector, it cannot be recovered.' + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_connector_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string responses: '204': description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - '404': - $ref: '#/components/responses/Connectors_404' summary: Delete a connector tags: - connectors get: - operationId: getConnector - parameters: - - $ref: '#/components/parameters/Connectors_connector_id' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getConnectorResponse: - $ref: '#/components/examples/Connectors_get_connector_response' - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - '404': - $ref: '#/components/responses/Connectors_404' - summary: Get a connector information - tags: - - connectors - post: - operationId: createConnectorId + deprecated: true + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D#1' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - description: > - A UUID v1 or v4 identifier for the connector. If you omit this - parameter, an identifier is randomly generated. + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: An identifier for the connector. in: path - name: connectorId + name: id required: true schema: - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createIndexConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_index_connector_request - schema: - $ref: '#/components/schemas/Connectors_create_connector_request' - required: true responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createIndexConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_index_connector_response - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - summary: Create a connector + summary: Get connector information tags: - connectors put: - operationId: updateConnector + deprecated: true + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D#2' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_connector_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: - examples: - updateIndexConnectorRequest: - $ref: >- - #/components/examples/Connectors_update_index_connector_request schema: - $ref: '#/components/schemas/Connectors_update_connector_request' - required: true + additionalProperties: false + type: object + properties: + config: + additionalProperties: {} + default: {} + type: object + name: + type: string + secrets: + additionalProperties: {} + default: {} + type: object + required: + - name responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' description: Indicates a successful call. - '400': - $ref: '#/components/responses/Connectors_401' - '401': - $ref: '#/components/responses/Connectors_401' - '404': - $ref: '#/components/responses/Connectors_404' summary: Update a connector tags: - connectors - /api/actions/connectors: - get: - operationId: getConnectors - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getConnectorsResponse: - $ref: '#/components/examples/Connectors_get_connectors_response' - schema: - items: - $ref: >- - #/components/schemas/Connectors_connector_response_properties - type: array - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - summary: Get all connectors - tags: - - connectors - '/api/alerting/rule/{id}': - delete: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D#2' + '/api/actions/action/{id}/_execute': + post: + deprecated: true + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D%2F_execute#0' parameters: - description: The version of the API to use in: header @@ -1852,20 +1777,34 @@ paths: schema: example: 'true' type: string - - description: The identifier for the rule. + - description: An identifier for the connector. in: path name: id required: true schema: type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + params: + additionalProperties: {} + type: object + required: + - params responses: - '204': + '200': description: Indicates a successful call. - summary: Delete a rule + summary: Run a connector tags: - - alerting + - connectors + /api/actions/connector_types: get: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D#0' + description: You do not need any Kibana feature privileges to run this API. + operationId: '%2Fapi%2Factions%2Fconnector_types#0' parameters: - description: The version of the API to use in: header @@ -1875,12936 +1814,9920 @@ paths: enum: - '2023-10-31' type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - type: object - properties: - actions: - items: - additionalProperties: false - type: object - properties: - alerts_filter: - additionalProperties: false - description: >- - Defines a period that limits whether the action - runs. - type: object - properties: - query: - additionalProperties: false - type: object - properties: - dsl: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL). - type: string - filters: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL) as defined in - the `kbn-es-query` package. - items: - additionalProperties: false - type: object - properties: - $state: - additionalProperties: false - type: object - properties: - store: - description: >- - A filter can be either specific to an - application context or applied globally. - enum: - - appState - - globalState - type: string - required: - - store - meta: - additionalProperties: {} - type: object - query: - additionalProperties: {} - type: object - required: - - meta - type: array - kql: - description: >- - A filter written in Kibana Query Language - (KQL). - type: string - required: - - kql - - filters - timeframe: - additionalProperties: false - type: object - properties: - days: - description: >- - Defines the days of the week that the action - can run, represented as an array of numbers. - For example, `1` represents Monday. An empty - array is equivalent to specifying all the - days of the week. - items: - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - type: integer - type: array - hours: - additionalProperties: false - type: object - properties: - end: - description: >- - The end of the time frame in 24-hour - notation (`hh:mm`). - type: string - start: - description: >- - The start of the time frame in 24-hour - notation (`hh:mm`). - type: string - required: - - start - - end - timezone: - description: >- - The ISO time zone for the `hours` values. - Values such as `UTC` and `UTC+1` also work - but lack built-in daylight savings time - support and are not recommended. - type: string - required: - - days - - hours - - timezone - connector_type_id: - description: >- - The type of connector. This property appears in - responses but cannot be set in requests. - type: string - frequency: - additionalProperties: false - type: object - properties: - notify_when: - description: >- - Indicates how often alerts generate actions. - Valid values include: `onActionGroupChange`: - Actions run when the alert status changes; - `onActiveAlert`: Actions run when the alert - becomes active and at each check interval while - the rule conditions are met; - `onThrottleInterval`: Actions run when the alert - becomes active and at the interval specified in - the throttle property while the rule conditions - are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The - recommended method is to set it for each action. - If you set it at the rule level then update the - rule in Kibana, it is automatically changed to - use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - type: string - summary: - description: Indicates whether the action is a summary. - type: boolean - throttle: - description: >- - The throttle interval, which defines how often - an alert generates repeated actions. It is - specified in seconds, minutes, hours, or days - and is applicable only if 'notify_when' is set - to 'onThrottleInterval'. NOTE: You cannot - specify the throttle interval at both the rule - and action level. The recommended method is to - set it for each action. If you set it at the - rule level then update the rule in Kibana, it is - automatically changed to use action-specific - values. - nullable: true - type: string - required: - - summary - - notify_when - - throttle - group: - description: >- - The group name, which affects when the action runs - (for example, when the threshold is met or when the - alert is recovered). Each rule type has a list of - valid action group names. If you don't need to group - actions, set to `default`. - type: string - id: - description: The identifier for the connector saved object. - type: string - params: - additionalProperties: {} - description: >- - The parameters for the action, which are sent to the - connector. The `params` are handled as Mustache - templates and passed a default set of context. - type: object - use_alert_data_for_template: - description: Indicates whether to use alert data as a template. - type: boolean - uuid: - description: >- - A universally unique identifier (UUID) for the - action. - type: string - required: - - id - - connector_type_id - - params - type: array - active_snoozes: - items: - description: List of active snoozes for the rule. - type: string - type: array - alert_delay: - additionalProperties: false - description: >- - Indicates that an alert occurs only when the specified - number of consecutive runs met the rule conditions. - type: object - properties: - active: - description: >- - The number of consecutive runs that must meet the rule - conditions. - type: number - required: - - active - api_key_created_by_user: - description: >- - Indicates whether the API key that is associated with the - rule was created by the user. - nullable: true - type: boolean - api_key_owner: - description: >- - The owner of the API key that is associated with the rule - and used to run background tasks. - nullable: true - type: string - consumer: - description: >- - The name of the application or feature that owns the rule. - For example: `alerts`, `apm`, `discover`, - `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, - `securitySolution`, `siem`, `stackAlerts`, or `uptime`. - type: string - created_at: - description: The date and time that the rule was created. - type: string - created_by: - description: The identifier for the user that created the rule. - nullable: true - type: string - enabled: - description: >- - Indicates whether you want to run the rule on an interval - basis after it is created. - type: boolean - execution_status: - additionalProperties: false - type: object - properties: - error: - additionalProperties: false - type: object - properties: - message: - description: Error message. - type: string - reason: - description: Reason for error. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - type: string - required: - - reason - - message - last_duration: - description: Duration of last execution of the rule. - type: number - last_execution_date: - description: The date and time when rule was executed last. - type: string - status: - description: Status of rule execution. - enum: - - ok - - active - - error - - warning - - pending - - unknown - type: string - warning: - additionalProperties: false - type: object - properties: - message: - description: Warning message. - type: string - reason: - description: Reason for warning. - enum: - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - type: string - required: - - reason - - message - required: - - status - - last_execution_date - id: - description: The identifier for the rule. - type: string - is_snoozed_until: - description: The date when the rule will no longer be snoozed. - nullable: true - type: string - last_run: - additionalProperties: false - nullable: true - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: Number of ignored alerts during last run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: Number of recovered alerts during last run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value could be - succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: Outcome message generated during last rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - mapped_params: - additionalProperties: {} - type: object - monitoring: - additionalProperties: false - description: Monitoring details of the rule. - type: object - properties: - run: - additionalProperties: false - description: Rule run details. - type: object - properties: - calculated_metrics: - additionalProperties: false - description: >- - Calculation of different percentiles and success - ratio. - type: object - properties: - p50: - type: number - p95: - type: number - p99: - type: number - success_ratio: - type: number - required: - - success_ratio - history: - description: History of the rule run. - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule run. - type: number - outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - success: - description: >- - Indicates whether the rule run was - successful. - type: boolean - timestamp: - description: Time of rule run. - type: number - required: - - success - - timestamp - type: array - last_run: - additionalProperties: false - type: object - properties: - metrics: - additionalProperties: false - type: object - properties: - duration: - description: Duration of most recent rule run. - type: number - gap_duration_s: - description: Duration in seconds of rule run gap. - nullable: true - type: number - total_alerts_created: - description: >- - Total number of alerts created during last - rule run. - nullable: true - type: number - total_alerts_detected: - description: >- - Total number of alerts detected during - last rule run. - nullable: true - type: number - total_indexing_duration_ms: - description: >- - Total time spent indexing documents during - last rule run in milliseconds. - nullable: true - type: number - total_search_duration_ms: - description: >- - Total time spent performing Elasticsearch - searches as measured by Kibana; includes - network latency and time spent serializing - or deserializing the request and response. - nullable: true - type: number - timestamp: - description: Time of the most recent rule run. - type: string - required: - - timestamp - - metrics - required: - - history - - calculated_metrics - - last_run - required: - - run - mute_all: - description: Indicates whether all alerts are muted. - type: boolean - muted_alert_ids: - items: - description: 'List of identifiers of muted alerts. ' - type: string - type: array - name: - description: ' The name of the rule.' - type: string - next_run: - description: Date and time of the next run of the rule. - nullable: true - type: string - notify_when: - description: >- - Indicates how often alerts generate actions. Valid values - include: `onActionGroupChange`: Actions run when the alert - status changes; `onActiveAlert`: Actions run when the - alert becomes active and at each check interval while the - rule conditions are met; `onThrottleInterval`: Actions run - when the alert becomes active and at the interval - specified in the throttle property while the rule - conditions are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The recommended method - is to set it for each action. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - nullable: true - type: string - params: - additionalProperties: {} - description: The parameters for the rule. - type: object - revision: - description: The rule revision number. - type: number - rule_type_id: - description: The rule type identifier. - type: string - running: - description: Indicates whether the rule is running. - nullable: true - type: boolean - schedule: - additionalProperties: false - type: object - properties: - interval: - description: >- - The interval is specified in seconds, minutes, hours, - or days. - type: string - required: - - interval - scheduled_task_id: - description: Identifier of the scheduled task. - type: string - snooze_schedule: - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule snooze schedule. - type: number - id: - description: Identifier of the rule snooze schedule. - type: string - rRule: - additionalProperties: false - type: object - properties: - byhour: - items: - description: Indicates hours of the day to recur. - type: number - type: array - byminute: - items: - description: Indicates minutes of the hour to recur. - type: number - type: array - bymonth: - items: - description: >- - Indicates months of the year that this rule - should recur. - type: number - type: array - bymonthday: - items: - description: Indicates the days of the month to recur. - type: number - type: array - bysecond: - items: - description: Indicates seconds of the day to recur. - type: number - type: array - bysetpos: - items: - description: >- - A positive or negative integer affecting the - nth day of the month. For example, -2 combined - with `byweekday` of FR is 2nd to last Friday - of the month. It is recommended to not set - this manually and just use `byweekday`. - type: number - type: array - byweekday: - items: - anyOf: - - type: string - - type: number - description: >- - Indicates the days of the week to recur or - else nth-day-of-month strings. For example, - "+2TU" second Tuesday of month, "-1FR" last - Friday of the month, which are internally - converted to a `byweekday/bysetpos` - combination. - type: array - byweekno: - items: - description: Indicates number of the week hours to recur. - type: number - type: array - byyearday: - items: - description: >- - Indicates the days of the year that this rule - should recur. - type: number - type: array - count: - description: >- - Number of times the rule should recur until it - stops. - type: number - dtstart: - description: >- - Rule start date in Coordinated Universal Time - (UTC). - type: string - freq: - description: >- - Indicates frequency of the rule. Options are - YEARLY, MONTHLY, WEEKLY, DAILY. - enum: - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - type: integer - interval: - description: >- - Indicates the interval of frequency. For - example, 1 and YEARLY is every 1 year, 2 and - WEEKLY is every 2 weeks. - type: number - tzid: - description: Indicates timezone abbreviation. - type: string - until: - description: Recur the rule until this date. - type: string - wkst: - description: 'Indicates the start of week, defaults to Monday.' - enum: - - MO - - TU - - WE - - TH - - FR - - SA - - SU - type: string - required: - - dtstart - - tzid - skipRecurrences: - items: - description: Skips recurrence of rule on this date. - type: string - type: array - required: - - duration - - rRule - type: array - tags: - items: - description: The tags for the rule. - type: string - type: array - throttle: - deprecated: true - description: >- - Deprecated in 8.13.0. Use the `throttle` property in the - action `frequency` object instead. The throttle interval, - which defines how often an alert generates repeated - actions. NOTE: You cannot specify the throttle interval at - both the rule and action level. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - nullable: true - type: string - updated_at: - description: The date and time that the rule was updated most recently. - type: string - updated_by: - description: >- - The identifier for the user that updated this rule most - recently. - nullable: true - type: string - view_in_app_relative_url: - description: Relative URL to view rule in the app. - nullable: true - type: string - required: - - id - - enabled - - name - - tags - - rule_type_id - - consumer - - schedule - - actions - - params - - created_by - - updated_by - - created_at - - updated_at - - api_key_owner - - mute_all - - muted_alert_ids - - execution_status - - revision - description: Indicates a successful call. - summary: Get rule details - tags: - - alerting - post: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%3F%7D#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: >- - The identifier for the rule. If it is omitted, an ID is randomly - generated. - in: path - name: id - required: false - schema: - type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - type: object - properties: - actions: - default: [] - items: - additionalProperties: false - description: An action that runs under defined conditions. - type: object - properties: - alerts_filter: - additionalProperties: false - description: >- - Conditions that affect whether the action runs. If you - specify multiple conditions, all conditions must be - met for the action to run. For example, if an alert - occurs within the specified time frame and matches the - query, the action runs. - type: object - properties: - query: - additionalProperties: false - type: object - properties: - dsl: - description: >- - A filter written in Elasticsearch Query Domain - Specific Language (DSL). - type: string - filters: - description: >- - A filter written in Elasticsearch Query Domain - Specific Language (DSL) as defined in the - `kbn-es-query` package. - items: - additionalProperties: false - type: object - properties: - $state: - additionalProperties: false - type: object - properties: - store: - description: >- - A filter can be either specific to an - application context or applied globally. - enum: - - appState - - globalState - type: string - required: - - store - meta: - additionalProperties: {} - type: object - query: - additionalProperties: {} - type: object - required: - - meta - type: array - kql: - description: >- - A filter written in Kibana Query Language - (KQL). - type: string - required: - - kql - - filters - timeframe: - additionalProperties: false - description: >- - Defines a period that limits whether the action - runs. - type: object - properties: - days: - description: >- - Defines the days of the week that the action - can run, represented as an array of numbers. - For example, `1` represents Monday. An empty - array is equivalent to specifying all the days - of the week. - items: - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - type: integer - type: array - hours: - additionalProperties: false - description: >- - Defines the range of time in a day that the - action can run. If the `start` value is - `00:00` and the `end` value is `24:00`, - actions be generated all day. - type: object - properties: - end: - description: >- - The end of the time frame in 24-hour - notation (`hh:mm`). - type: string - start: - description: >- - The start of the time frame in 24-hour - notation (`hh:mm`). - type: string - required: - - start - - end - timezone: - description: >- - The ISO time zone for the `hours` values. - Values such as `UTC` and `UTC+1` also work but - lack built-in daylight savings time support - and are not recommended. - type: string - required: - - days - - hours - - timezone - frequency: - additionalProperties: false - type: object - properties: - notify_when: - description: >- - Indicates how often alerts generate actions. Valid - values include: `onActionGroupChange`: Actions run - when the alert status changes; `onActiveAlert`: - Actions run when the alert becomes active and at - each check interval while the rule conditions are - met; `onThrottleInterval`: Actions run when the - alert becomes active and at the interval specified - in the throttle property while the rule conditions - are met. NOTE: You cannot specify `notify_when` at - both the rule and action level. The recommended - method is to set it for each action. If you set it - at the rule level then update the rule in Kibana, - it is automatically changed to use action-specific - values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - type: string - summary: - description: Indicates whether the action is a summary. - type: boolean - throttle: - description: >- - The throttle interval, which defines how often an - alert generates repeated actions. It is specified - in seconds, minutes, hours, or days and is - applicable only if `notify_when` is set to - `onThrottleInterval`. NOTE: You cannot specify the - throttle interval at both the rule and action - level. The recommended method is to set it for - each action. If you set it at the rule level then - update the rule in Kibana, it is automatically - changed to use action-specific values. - nullable: true - type: string - required: - - summary - - notify_when - - throttle - group: - description: >- - The group name, which affects when the action runs - (for example, when the threshold is met or when the - alert is recovered). Each rule type has a list of - valid action group names. If you don't need to group - actions, set to `default`. - type: string - id: - description: The identifier for the connector saved object. - type: string - params: - additionalProperties: {} - default: {} - description: >- - The parameters for the action, which are sent to the - connector. The `params` are handled as Mustache - templates and passed a default set of context. - type: object - use_alert_data_for_template: - description: Indicates whether to use alert data as a template. - type: boolean - uuid: - description: A universally unique identifier (UUID) for the action. - type: string - required: - - id - type: array - alert_delay: - additionalProperties: false - description: >- - Indicates that an alert occurs only when the specified - number of consecutive runs met the rule conditions. - type: object - properties: - active: - description: >- - The number of consecutive runs that must meet the rule - conditions. - type: number - required: - - active - consumer: - description: >- - The name of the application or feature that owns the rule. - For example: `alerts`, `apm`, `discover`, `infrastructure`, - `logs`, `metrics`, `ml`, `monitoring`, `securitySolution`, - `siem`, `stackAlerts`, or `uptime`. - type: string - enabled: - default: true - description: >- - Indicates whether you want to run the rule on an interval - basis after it is created. - type: boolean - name: - description: >- - The name of the rule. While this name does not have to be - unique, a distinctive name can help you identify a rule. - type: string - notify_when: - description: >- - Indicates how often alerts generate actions. Valid values - include: `onActionGroupChange`: Actions run when the alert - status changes; `onActiveAlert`: Actions run when the alert - becomes active and at each check interval while the rule - conditions are met; `onThrottleInterval`: Actions run when - the alert becomes active and at the interval specified in - the throttle property while the rule conditions are met. - NOTE: You cannot specify `notify_when` at both the rule and - action level. The recommended method is to set it for each - action. If you set it at the rule level then update the rule - in Kibana, it is automatically changed to use - action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - nullable: true - type: string - params: - additionalProperties: {} - default: {} - description: The parameters for the rule. - type: object - rule_type_id: - description: The rule type identifier. - type: string - schedule: - additionalProperties: false - description: >- - The check interval, which specifies how frequently the rule - conditions are checked. - type: object - properties: - interval: - description: >- - The interval is specified in seconds, minutes, hours, or - days. - type: string - required: - - interval - tags: - default: [] - description: The tags for the rule. - items: - type: string - type: array - throttle: - description: >- - Use the `throttle` property in the action `frequency` object - instead. The throttle interval, which defines how often an - alert generates repeated actions. NOTE: You cannot specify - the throttle interval at both the rule and action level. If - you set it at the rule level then update the rule in Kibana, - it is automatically changed to use action-specific values. - nullable: true - type: string - required: - - name - - rule_type_id - - consumer - - schedule - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - type: object - properties: - actions: - items: - additionalProperties: false - type: object - properties: - alerts_filter: - additionalProperties: false - description: >- - Defines a period that limits whether the action - runs. - type: object - properties: - query: - additionalProperties: false - type: object - properties: - dsl: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL). - type: string - filters: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL) as defined in - the `kbn-es-query` package. - items: - additionalProperties: false - type: object - properties: - $state: - additionalProperties: false - type: object - properties: - store: - description: >- - A filter can be either specific to an - application context or applied globally. - enum: - - appState - - globalState - type: string - required: - - store - meta: - additionalProperties: {} - type: object - query: - additionalProperties: {} - type: object - required: - - meta - type: array - kql: - description: >- - A filter written in Kibana Query Language - (KQL). - type: string - required: - - kql - - filters - timeframe: - additionalProperties: false - type: object - properties: - days: - description: >- - Defines the days of the week that the action - can run, represented as an array of numbers. - For example, `1` represents Monday. An empty - array is equivalent to specifying all the - days of the week. - items: - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - type: integer - type: array - hours: - additionalProperties: false - type: object - properties: - end: - description: >- - The end of the time frame in 24-hour - notation (`hh:mm`). - type: string - start: - description: >- - The start of the time frame in 24-hour - notation (`hh:mm`). - type: string - required: - - start - - end - timezone: - description: >- - The ISO time zone for the `hours` values. - Values such as `UTC` and `UTC+1` also work - but lack built-in daylight savings time - support and are not recommended. - type: string - required: - - days - - hours - - timezone - connector_type_id: - description: >- - The type of connector. This property appears in - responses but cannot be set in requests. - type: string - frequency: - additionalProperties: false - type: object - properties: - notify_when: - description: >- - Indicates how often alerts generate actions. - Valid values include: `onActionGroupChange`: - Actions run when the alert status changes; - `onActiveAlert`: Actions run when the alert - becomes active and at each check interval while - the rule conditions are met; - `onThrottleInterval`: Actions run when the alert - becomes active and at the interval specified in - the throttle property while the rule conditions - are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The - recommended method is to set it for each action. - If you set it at the rule level then update the - rule in Kibana, it is automatically changed to - use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - type: string - summary: - description: Indicates whether the action is a summary. - type: boolean - throttle: - description: >- - The throttle interval, which defines how often - an alert generates repeated actions. It is - specified in seconds, minutes, hours, or days - and is applicable only if 'notify_when' is set - to 'onThrottleInterval'. NOTE: You cannot - specify the throttle interval at both the rule - and action level. The recommended method is to - set it for each action. If you set it at the - rule level then update the rule in Kibana, it is - automatically changed to use action-specific - values. - nullable: true - type: string - required: - - summary - - notify_when - - throttle - group: - description: >- - The group name, which affects when the action runs - (for example, when the threshold is met or when the - alert is recovered). Each rule type has a list of - valid action group names. If you don't need to group - actions, set to `default`. - type: string - id: - description: The identifier for the connector saved object. - type: string - params: - additionalProperties: {} - description: >- - The parameters for the action, which are sent to the - connector. The `params` are handled as Mustache - templates and passed a default set of context. - type: object - use_alert_data_for_template: - description: Indicates whether to use alert data as a template. - type: boolean - uuid: - description: >- - A universally unique identifier (UUID) for the - action. - type: string - required: - - id - - connector_type_id - - params - type: array - active_snoozes: - items: - description: List of active snoozes for the rule. - type: string - type: array - alert_delay: - additionalProperties: false - description: >- - Indicates that an alert occurs only when the specified - number of consecutive runs met the rule conditions. - type: object - properties: - active: - description: >- - The number of consecutive runs that must meet the rule - conditions. - type: number - required: - - active - api_key_created_by_user: - description: >- - Indicates whether the API key that is associated with the - rule was created by the user. - nullable: true - type: boolean - api_key_owner: - description: >- - The owner of the API key that is associated with the rule - and used to run background tasks. - nullable: true - type: string - consumer: - description: >- - The name of the application or feature that owns the rule. - For example: `alerts`, `apm`, `discover`, - `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, - `securitySolution`, `siem`, `stackAlerts`, or `uptime`. - type: string - created_at: - description: The date and time that the rule was created. - type: string - created_by: - description: The identifier for the user that created the rule. - nullable: true - type: string - enabled: - description: >- - Indicates whether you want to run the rule on an interval - basis after it is created. - type: boolean - execution_status: - additionalProperties: false - type: object - properties: - error: - additionalProperties: false - type: object - properties: - message: - description: Error message. - type: string - reason: - description: Reason for error. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - type: string - required: - - reason - - message - last_duration: - description: Duration of last execution of the rule. - type: number - last_execution_date: - description: The date and time when rule was executed last. - type: string - status: - description: Status of rule execution. - enum: - - ok - - active - - error - - warning - - pending - - unknown - type: string - warning: - additionalProperties: false - type: object - properties: - message: - description: Warning message. - type: string - reason: - description: Reason for warning. - enum: - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - type: string - required: - - reason - - message - required: - - status - - last_execution_date - id: - description: The identifier for the rule. - type: string - is_snoozed_until: - description: The date when the rule will no longer be snoozed. - nullable: true - type: string - last_run: - additionalProperties: false - nullable: true - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: Number of ignored alerts during last run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: Number of recovered alerts during last run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value could be - succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: Outcome message generated during last rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - mapped_params: - additionalProperties: {} - type: object - monitoring: - additionalProperties: false - description: Monitoring details of the rule. - type: object - properties: - run: - additionalProperties: false - description: Rule run details. - type: object - properties: - calculated_metrics: - additionalProperties: false - description: >- - Calculation of different percentiles and success - ratio. - type: object - properties: - p50: - type: number - p95: - type: number - p99: - type: number - success_ratio: - type: number - required: - - success_ratio - history: - description: History of the rule run. - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule run. - type: number - outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - success: - description: >- - Indicates whether the rule run was - successful. - type: boolean - timestamp: - description: Time of rule run. - type: number - required: - - success - - timestamp - type: array - last_run: - additionalProperties: false - type: object - properties: - metrics: - additionalProperties: false - type: object - properties: - duration: - description: Duration of most recent rule run. - type: number - gap_duration_s: - description: Duration in seconds of rule run gap. - nullable: true - type: number - total_alerts_created: - description: >- - Total number of alerts created during last - rule run. - nullable: true - type: number - total_alerts_detected: - description: >- - Total number of alerts detected during - last rule run. - nullable: true - type: number - total_indexing_duration_ms: - description: >- - Total time spent indexing documents during - last rule run in milliseconds. - nullable: true - type: number - total_search_duration_ms: - description: >- - Total time spent performing Elasticsearch - searches as measured by Kibana; includes - network latency and time spent serializing - or deserializing the request and response. - nullable: true - type: number - timestamp: - description: Time of the most recent rule run. - type: string - required: - - timestamp - - metrics - required: - - history - - calculated_metrics - - last_run - required: - - run - mute_all: - description: Indicates whether all alerts are muted. - type: boolean - muted_alert_ids: - items: - description: 'List of identifiers of muted alerts. ' - type: string - type: array - name: - description: ' The name of the rule.' - type: string - next_run: - description: Date and time of the next run of the rule. - nullable: true - type: string - notify_when: - description: >- - Indicates how often alerts generate actions. Valid values - include: `onActionGroupChange`: Actions run when the alert - status changes; `onActiveAlert`: Actions run when the - alert becomes active and at each check interval while the - rule conditions are met; `onThrottleInterval`: Actions run - when the alert becomes active and at the interval - specified in the throttle property while the rule - conditions are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The recommended method - is to set it for each action. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - nullable: true - type: string - params: - additionalProperties: {} - description: The parameters for the rule. - type: object - revision: - description: The rule revision number. - type: number - rule_type_id: - description: The rule type identifier. - type: string - running: - description: Indicates whether the rule is running. - nullable: true - type: boolean - schedule: - additionalProperties: false - type: object - properties: - interval: - description: >- - The interval is specified in seconds, minutes, hours, - or days. - type: string - required: - - interval - scheduled_task_id: - description: Identifier of the scheduled task. - type: string - snooze_schedule: - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule snooze schedule. - type: number - id: - description: Identifier of the rule snooze schedule. - type: string - rRule: - additionalProperties: false - type: object - properties: - byhour: - items: - description: Indicates hours of the day to recur. - type: number - type: array - byminute: - items: - description: Indicates minutes of the hour to recur. - type: number - type: array - bymonth: - items: - description: >- - Indicates months of the year that this rule - should recur. - type: number - type: array - bymonthday: - items: - description: Indicates the days of the month to recur. - type: number - type: array - bysecond: - items: - description: Indicates seconds of the day to recur. - type: number - type: array - bysetpos: - items: - description: >- - A positive or negative integer affecting the - nth day of the month. For example, -2 combined - with `byweekday` of FR is 2nd to last Friday - of the month. It is recommended to not set - this manually and just use `byweekday`. - type: number - type: array - byweekday: - items: - anyOf: - - type: string - - type: number - description: >- - Indicates the days of the week to recur or - else nth-day-of-month strings. For example, - "+2TU" second Tuesday of month, "-1FR" last - Friday of the month, which are internally - converted to a `byweekday/bysetpos` - combination. - type: array - byweekno: - items: - description: Indicates number of the week hours to recur. - type: number - type: array - byyearday: - items: - description: >- - Indicates the days of the year that this rule - should recur. - type: number - type: array - count: - description: >- - Number of times the rule should recur until it - stops. - type: number - dtstart: - description: >- - Rule start date in Coordinated Universal Time - (UTC). - type: string - freq: - description: >- - Indicates frequency of the rule. Options are - YEARLY, MONTHLY, WEEKLY, DAILY. - enum: - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - type: integer - interval: - description: >- - Indicates the interval of frequency. For - example, 1 and YEARLY is every 1 year, 2 and - WEEKLY is every 2 weeks. - type: number - tzid: - description: Indicates timezone abbreviation. - type: string - until: - description: Recur the rule until this date. - type: string - wkst: - description: 'Indicates the start of week, defaults to Monday.' - enum: - - MO - - TU - - WE - - TH - - FR - - SA - - SU - type: string - required: - - dtstart - - tzid - skipRecurrences: - items: - description: Skips recurrence of rule on this date. - type: string - type: array - required: - - duration - - rRule - type: array - tags: - items: - description: The tags for the rule. - type: string - type: array - throttle: - deprecated: true - description: >- - Deprecated in 8.13.0. Use the `throttle` property in the - action `frequency` object instead. The throttle interval, - which defines how often an alert generates repeated - actions. NOTE: You cannot specify the throttle interval at - both the rule and action level. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - nullable: true - type: string - updated_at: - description: The date and time that the rule was updated most recently. - type: string - updated_by: - description: >- - The identifier for the user that updated this rule most - recently. - nullable: true - type: string - view_in_app_relative_url: - description: Relative URL to view rule in the app. - nullable: true - type: string - required: - - id - - enabled - - name - - tags - - rule_type_id - - consumer - - schedule - - actions - - params - - created_by - - updated_by - - created_at - - updated_at - - api_key_owner - - mute_all - - muted_alert_ids - - execution_status - - revision - description: Indicates a successful call. - summary: Create a rule - tags: - - alerting - put: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D#1' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - type: object - properties: - actions: - default: [] - items: - additionalProperties: false - description: An action that runs under defined conditions. - type: object - properties: - alerts_filter: - additionalProperties: false - type: object - properties: - query: - additionalProperties: false - type: object - properties: - dsl: - description: >- - A filter written in Elasticsearch Query Domain - Specific Language (DSL). - type: string - filters: - description: >- - A filter written in Elasticsearch Query Domain - Specific Language (DSL) as defined in the - `kbn-es-query` package. - items: - additionalProperties: false - type: object - properties: - $state: - additionalProperties: false - type: object - properties: - store: - description: >- - A filter can be either specific to an - application context or applied globally. - enum: - - appState - - globalState - type: string - required: - - store - meta: - additionalProperties: {} - type: object - query: - additionalProperties: {} - type: object - required: - - meta - type: array - kql: - description: >- - A filter written in Kibana Query Language - (KQL). - type: string - required: - - kql - - filters - timeframe: - additionalProperties: false - description: >- - Defines a period that limits whether the action - runs. - type: object - properties: - days: - description: >- - Defines the days of the week that the action - can run, represented as an array of numbers. - For example, `1` represents Monday. An empty - array is equivalent to specifying all the days - of the week. - items: - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - type: integer - type: array - hours: - additionalProperties: false - description: >- - Defines the range of time in a day that the - action can run. If the `start` value is - `00:00` and the `end` value is `24:00`, - actions be generated all day. - type: object - properties: - end: - description: >- - The end of the time frame in 24-hour - notation (`hh:mm`). - type: string - start: - description: >- - The start of the time frame in 24-hour - notation (`hh:mm`). - type: string - required: - - start - - end - timezone: - description: >- - The ISO time zone for the `hours` values. - Values such as `UTC` and `UTC+1` also work but - lack built-in daylight savings time support - and are not recommended. - type: string - required: - - days - - hours - - timezone - frequency: - additionalProperties: false - type: object - properties: - notify_when: - description: >- - Indicates how often alerts generate actions. Valid - values include: `onActionGroupChange`: Actions run - when the alert status changes; `onActiveAlert`: - Actions run when the alert becomes active and at - each check interval while the rule conditions are - met; `onThrottleInterval`: Actions run when the - alert becomes active and at the interval specified - in the throttle property while the rule conditions - are met. NOTE: You cannot specify `notify_when` at - both the rule and action level. The recommended - method is to set it for each action. If you set it - at the rule level then update the rule in Kibana, - it is automatically changed to use action-specific - values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - type: string - summary: - description: Indicates whether the action is a summary. - type: boolean - throttle: - description: >- - The throttle interval, which defines how often an - alert generates repeated actions. It is specified - in seconds, minutes, hours, or days and is - applicable only if `notify_when` is set to - `onThrottleInterval`. NOTE: You cannot specify the - throttle interval at both the rule and action - level. The recommended method is to set it for - each action. If you set it at the rule level then - update the rule in Kibana, it is automatically - changed to use action-specific values. - nullable: true - type: string - required: - - summary - - notify_when - - throttle - group: - description: >- - The group name, which affects when the action runs - (for example, when the threshold is met or when the - alert is recovered). Each rule type has a list of - valid action group names. If you don't need to group - actions, set to `default`. - type: string - id: - description: The identifier for the connector saved object. - type: string - params: - additionalProperties: {} - default: {} - description: >- - The parameters for the action, which are sent to the - connector. The `params` are handled as Mustache - templates and passed a default set of context. - type: object - use_alert_data_for_template: - description: Indicates whether to use alert data as a template. - type: boolean - uuid: - description: A universally unique identifier (UUID) for the action. - type: string - required: - - id - type: array - alert_delay: - additionalProperties: false - description: >- - Indicates that an alert occurs only when the specified - number of consecutive runs met the rule conditions. - type: object - properties: - active: - description: >- - The number of consecutive runs that must meet the rule - conditions. - type: number - required: - - active - name: - description: >- - The name of the rule. While this name does not have to be - unique, a distinctive name can help you identify a rule. - type: string - notify_when: - description: >- - Indicates how often alerts generate actions. Valid values - include: `onActionGroupChange`: Actions run when the alert - status changes; `onActiveAlert`: Actions run when the alert - becomes active and at each check interval while the rule - conditions are met; `onThrottleInterval`: Actions run when - the alert becomes active and at the interval specified in - the throttle property while the rule conditions are met. - NOTE: You cannot specify `notify_when` at both the rule and - action level. The recommended method is to set it for each - action. If you set it at the rule level then update the rule - in Kibana, it is automatically changed to use - action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - nullable: true - type: string - params: - additionalProperties: {} - default: {} - description: The parameters for the rule. - type: object - schedule: - additionalProperties: false - type: object - properties: - interval: - description: >- - The interval is specified in seconds, minutes, hours, or - days. - type: string - required: - - interval - tags: - default: [] - items: - description: The tags for the rule. - type: string - type: array - throttle: - description: >- - Use the `throttle` property in the action `frequency` object - instead. The throttle interval, which defines how often an - alert generates repeated actions. NOTE: You cannot specify - the throttle interval at both the rule and action level. If - you set it at the rule level then update the rule in Kibana, - it is automatically changed to use action-specific values. - nullable: true - type: string - required: - - name - - schedule - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - type: object - properties: - actions: - items: - additionalProperties: false - type: object - properties: - alerts_filter: - additionalProperties: false - description: >- - Defines a period that limits whether the action - runs. - type: object - properties: - query: - additionalProperties: false - type: object - properties: - dsl: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL). - type: string - filters: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL) as defined in - the `kbn-es-query` package. - items: - additionalProperties: false - type: object - properties: - $state: - additionalProperties: false - type: object - properties: - store: - description: >- - A filter can be either specific to an - application context or applied globally. - enum: - - appState - - globalState - type: string - required: - - store - meta: - additionalProperties: {} - type: object - query: - additionalProperties: {} - type: object - required: - - meta - type: array - kql: - description: >- - A filter written in Kibana Query Language - (KQL). - type: string - required: - - kql - - filters - timeframe: - additionalProperties: false - type: object - properties: - days: - description: >- - Defines the days of the week that the action - can run, represented as an array of numbers. - For example, `1` represents Monday. An empty - array is equivalent to specifying all the - days of the week. - items: - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - type: integer - type: array - hours: - additionalProperties: false - type: object - properties: - end: - description: >- - The end of the time frame in 24-hour - notation (`hh:mm`). - type: string - start: - description: >- - The start of the time frame in 24-hour - notation (`hh:mm`). - type: string - required: - - start - - end - timezone: - description: >- - The ISO time zone for the `hours` values. - Values such as `UTC` and `UTC+1` also work - but lack built-in daylight savings time - support and are not recommended. - type: string - required: - - days - - hours - - timezone - connector_type_id: - description: >- - The type of connector. This property appears in - responses but cannot be set in requests. - type: string - frequency: - additionalProperties: false - type: object - properties: - notify_when: - description: >- - Indicates how often alerts generate actions. - Valid values include: `onActionGroupChange`: - Actions run when the alert status changes; - `onActiveAlert`: Actions run when the alert - becomes active and at each check interval while - the rule conditions are met; - `onThrottleInterval`: Actions run when the alert - becomes active and at the interval specified in - the throttle property while the rule conditions - are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The - recommended method is to set it for each action. - If you set it at the rule level then update the - rule in Kibana, it is automatically changed to - use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - type: string - summary: - description: Indicates whether the action is a summary. - type: boolean - throttle: - description: >- - The throttle interval, which defines how often - an alert generates repeated actions. It is - specified in seconds, minutes, hours, or days - and is applicable only if 'notify_when' is set - to 'onThrottleInterval'. NOTE: You cannot - specify the throttle interval at both the rule - and action level. The recommended method is to - set it for each action. If you set it at the - rule level then update the rule in Kibana, it is - automatically changed to use action-specific - values. - nullable: true - type: string - required: - - summary - - notify_when - - throttle - group: - description: >- - The group name, which affects when the action runs - (for example, when the threshold is met or when the - alert is recovered). Each rule type has a list of - valid action group names. If you don't need to group - actions, set to `default`. - type: string - id: - description: The identifier for the connector saved object. - type: string - params: - additionalProperties: {} - description: >- - The parameters for the action, which are sent to the - connector. The `params` are handled as Mustache - templates and passed a default set of context. - type: object - use_alert_data_for_template: - description: Indicates whether to use alert data as a template. - type: boolean - uuid: - description: >- - A universally unique identifier (UUID) for the - action. - type: string - required: - - id - - connector_type_id - - params - type: array - active_snoozes: - items: - description: List of active snoozes for the rule. - type: string - type: array - alert_delay: - additionalProperties: false - description: >- - Indicates that an alert occurs only when the specified - number of consecutive runs met the rule conditions. - type: object - properties: - active: - description: >- - The number of consecutive runs that must meet the rule - conditions. - type: number - required: - - active - api_key_created_by_user: - description: >- - Indicates whether the API key that is associated with the - rule was created by the user. - nullable: true - type: boolean - api_key_owner: - description: >- - The owner of the API key that is associated with the rule - and used to run background tasks. - nullable: true - type: string - consumer: - description: >- - The name of the application or feature that owns the rule. - For example: `alerts`, `apm`, `discover`, - `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, - `securitySolution`, `siem`, `stackAlerts`, or `uptime`. - type: string - created_at: - description: The date and time that the rule was created. - type: string - created_by: - description: The identifier for the user that created the rule. - nullable: true - type: string - enabled: - description: >- - Indicates whether you want to run the rule on an interval - basis after it is created. - type: boolean - execution_status: - additionalProperties: false - type: object - properties: - error: - additionalProperties: false - type: object - properties: - message: - description: Error message. - type: string - reason: - description: Reason for error. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - type: string - required: - - reason - - message - last_duration: - description: Duration of last execution of the rule. - type: number - last_execution_date: - description: The date and time when rule was executed last. - type: string - status: - description: Status of rule execution. - enum: - - ok - - active - - error - - warning - - pending - - unknown - type: string - warning: - additionalProperties: false - type: object - properties: - message: - description: Warning message. - type: string - reason: - description: Reason for warning. - enum: - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - type: string - required: - - reason - - message - required: - - status - - last_execution_date - id: - description: The identifier for the rule. - type: string - is_snoozed_until: - description: The date when the rule will no longer be snoozed. - nullable: true - type: string - last_run: - additionalProperties: false - nullable: true - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: Number of ignored alerts during last run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: Number of recovered alerts during last run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value could be - succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: Outcome message generated during last rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - mapped_params: - additionalProperties: {} - type: object - monitoring: - additionalProperties: false - description: Monitoring details of the rule. - type: object - properties: - run: - additionalProperties: false - description: Rule run details. - type: object - properties: - calculated_metrics: - additionalProperties: false - description: >- - Calculation of different percentiles and success - ratio. - type: object - properties: - p50: - type: number - p95: - type: number - p99: - type: number - success_ratio: - type: number - required: - - success_ratio - history: - description: History of the rule run. - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule run. - type: number - outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - success: - description: >- - Indicates whether the rule run was - successful. - type: boolean - timestamp: - description: Time of rule run. - type: number - required: - - success - - timestamp - type: array - last_run: - additionalProperties: false - type: object - properties: - metrics: - additionalProperties: false - type: object - properties: - duration: - description: Duration of most recent rule run. - type: number - gap_duration_s: - description: Duration in seconds of rule run gap. - nullable: true - type: number - total_alerts_created: - description: >- - Total number of alerts created during last - rule run. - nullable: true - type: number - total_alerts_detected: - description: >- - Total number of alerts detected during - last rule run. - nullable: true - type: number - total_indexing_duration_ms: - description: >- - Total time spent indexing documents during - last rule run in milliseconds. - nullable: true - type: number - total_search_duration_ms: - description: >- - Total time spent performing Elasticsearch - searches as measured by Kibana; includes - network latency and time spent serializing - or deserializing the request and response. - nullable: true - type: number - timestamp: - description: Time of the most recent rule run. - type: string - required: - - timestamp - - metrics - required: - - history - - calculated_metrics - - last_run - required: - - run - mute_all: - description: Indicates whether all alerts are muted. - type: boolean - muted_alert_ids: - items: - description: 'List of identifiers of muted alerts. ' - type: string - type: array - name: - description: ' The name of the rule.' - type: string - next_run: - description: Date and time of the next run of the rule. - nullable: true - type: string - notify_when: - description: >- - Indicates how often alerts generate actions. Valid values - include: `onActionGroupChange`: Actions run when the alert - status changes; `onActiveAlert`: Actions run when the - alert becomes active and at each check interval while the - rule conditions are met; `onThrottleInterval`: Actions run - when the alert becomes active and at the interval - specified in the throttle property while the rule - conditions are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The recommended method - is to set it for each action. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - nullable: true - type: string - params: - additionalProperties: {} - description: The parameters for the rule. - type: object - revision: - description: The rule revision number. - type: number - rule_type_id: - description: The rule type identifier. - type: string - running: - description: Indicates whether the rule is running. - nullable: true - type: boolean - schedule: - additionalProperties: false - type: object - properties: - interval: - description: >- - The interval is specified in seconds, minutes, hours, - or days. - type: string - required: - - interval - scheduled_task_id: - description: Identifier of the scheduled task. - type: string - snooze_schedule: - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule snooze schedule. - type: number - id: - description: Identifier of the rule snooze schedule. - type: string - rRule: - additionalProperties: false - type: object - properties: - byhour: - items: - description: Indicates hours of the day to recur. - type: number - type: array - byminute: - items: - description: Indicates minutes of the hour to recur. - type: number - type: array - bymonth: - items: - description: >- - Indicates months of the year that this rule - should recur. - type: number - type: array - bymonthday: - items: - description: Indicates the days of the month to recur. - type: number - type: array - bysecond: - items: - description: Indicates seconds of the day to recur. - type: number - type: array - bysetpos: - items: - description: >- - A positive or negative integer affecting the - nth day of the month. For example, -2 combined - with `byweekday` of FR is 2nd to last Friday - of the month. It is recommended to not set - this manually and just use `byweekday`. - type: number - type: array - byweekday: - items: - anyOf: - - type: string - - type: number - description: >- - Indicates the days of the week to recur or - else nth-day-of-month strings. For example, - "+2TU" second Tuesday of month, "-1FR" last - Friday of the month, which are internally - converted to a `byweekday/bysetpos` - combination. - type: array - byweekno: - items: - description: Indicates number of the week hours to recur. - type: number - type: array - byyearday: - items: - description: >- - Indicates the days of the year that this rule - should recur. - type: number - type: array - count: - description: >- - Number of times the rule should recur until it - stops. - type: number - dtstart: - description: >- - Rule start date in Coordinated Universal Time - (UTC). - type: string - freq: - description: >- - Indicates frequency of the rule. Options are - YEARLY, MONTHLY, WEEKLY, DAILY. - enum: - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - type: integer - interval: - description: >- - Indicates the interval of frequency. For - example, 1 and YEARLY is every 1 year, 2 and - WEEKLY is every 2 weeks. - type: number - tzid: - description: Indicates timezone abbreviation. - type: string - until: - description: Recur the rule until this date. - type: string - wkst: - description: 'Indicates the start of week, defaults to Monday.' - enum: - - MO - - TU - - WE - - TH - - FR - - SA - - SU - type: string - required: - - dtstart - - tzid - skipRecurrences: - items: - description: Skips recurrence of rule on this date. - type: string - type: array - required: - - duration - - rRule - type: array - tags: - items: - description: The tags for the rule. - type: string - type: array - throttle: - deprecated: true - description: >- - Deprecated in 8.13.0. Use the `throttle` property in the - action `frequency` object instead. The throttle interval, - which defines how often an alert generates repeated - actions. NOTE: You cannot specify the throttle interval at - both the rule and action level. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - nullable: true - type: string - updated_at: - description: The date and time that the rule was updated most recently. - type: string - updated_by: - description: >- - The identifier for the user that updated this rule most - recently. - nullable: true - type: string - view_in_app_relative_url: - description: Relative URL to view rule in the app. - nullable: true - type: string - required: - - id - - enabled - - name - - tags - - rule_type_id - - consumer - - schedule - - actions - - params - - created_by - - updated_by - - created_at - - updated_at - - api_key_owner - - mute_all - - muted_alert_ids - - execution_status - - revision - description: Indicates a successful call. - summary: Update a rule - tags: - - alerting - '/api/alerting/rule/{id}/_disable': - post: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_disable#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - nullable: true - type: object - properties: - untrack: - description: Defines whether this rule's alerts should be untracked. - type: boolean - x-oas-optional: true - responses: - '204': - description: Indicates a successful call. - summary: Disable a rule - tags: - - alerting - '/api/alerting/rule/{id}/_enable': - post: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_enable#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - responses: - '204': - description: Indicates a successful call. - summary: Enable a rule - tags: - - alerting - '/api/alerting/rule/{id}/_mute_all': - post: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_mute_all#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - responses: - '204': - description: Indicates a successful call. - summary: Mute all alerts - tags: - - alerting - '/api/alerting/rule/{id}/_unmute_all': - post: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_unmute_all#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - responses: - '204': - description: Indicates a successful call. - summary: Unmute all alerts - tags: - - alerting - '/api/alerting/rule/{id}/_update_api_key': - post: - operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_update_api_key#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: id - required: true - schema: - type: string - responses: - '204': - description: Indicates a successful call. - summary: Update the API key for a rule - tags: - - alerting - '/api/alerting/rule/{rule_id}/alert/{alert_id}/_mute': - post: - operationId: >- - %2Fapi%2Falerting%2Frule%2F%7Brule_id%7D%2Falert%2F%7Balert_id%7D%2F_mute#0 - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: rule_id - required: true - schema: - type: string - - description: The identifier for the alert. - in: path - name: alert_id - required: true - schema: - type: string - responses: - '204': - description: Indicates a successful call. - summary: Mute an alert - tags: - - alerting - '/api/alerting/rule/{rule_id}/alert/{alert_id}/_unmute': - post: - operationId: >- - %2Fapi%2Falerting%2Frule%2F%7Brule_id%7D%2Falert%2F%7Balert_id%7D%2F_unmute#0 - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: A required header to protect against CSRF attacks - in: header - name: kbn-xsrf - required: true - schema: - example: 'true' - type: string - - description: The identifier for the rule. - in: path - name: rule_id - required: true - schema: - type: string - - description: The identifier for the alert. - in: path - name: alert_id - required: true - schema: - type: string - responses: - '204': - description: Indicates a successful call. - summary: Unmute an alert - tags: - - alerting - /api/alerting/rules/_find: - get: - operationId: '%2Fapi%2Falerting%2Frules%2F_find#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: The number of rules to return per page. - in: query - name: per_page - required: false - schema: - default: 10 - minimum: 0 - type: number - - description: The page number to return. - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - type: number - - description: >- - An Elasticsearch simple_query_string query that filters the objects - in the response. - in: query - name: search - required: false - schema: - type: string - - description: The default operator to use for the simple_query_string. - in: query - name: default_search_operator - required: false - schema: - default: OR - enum: - - OR - - AND - type: string - - description: The fields to perform the simple_query_string parsed query against. - in: query - name: search_fields - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: string - - description: >- - Determines which field is used to sort the results. The field must - exist in the `attributes` key of the response. - in: query - name: sort_field - required: false - schema: - type: string - - description: Determines the sort order. - in: query - name: sort_order - required: false - schema: - enum: - - asc - - desc - type: string - - description: >- - Filters the rules that have a relation with the reference objects - with a specific type and identifier. - in: query - name: has_reference - required: false - schema: - additionalProperties: false - nullable: true - type: object - properties: - id: - type: string - type: - type: string - required: - - type - - id - - in: query - name: fields - required: false - schema: - items: - description: The fields to return in the `attributes` key of the response. - type: string - type: array - - description: >- - A KQL string that you filter with an attribute from your saved - object. It should look like `savedObjectType.attributes.title: - "myTitle"`. However, if you used a direct attribute of a saved - object, such as `updatedAt`, you must define your filter, for - example, `savedObjectType.updatedAt > 2018-12-22`. - in: query - name: filter - required: false - schema: - type: string - - in: query - name: filter_consumers - required: false - schema: - items: - description: List of consumers to filter. - type: string - type: array - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - additionalProperties: false - type: object - properties: - actions: - items: - additionalProperties: false - type: object - properties: - alerts_filter: - additionalProperties: false - description: >- - Defines a period that limits whether the action - runs. - type: object - properties: - query: - additionalProperties: false - type: object - properties: - dsl: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL). - type: string - filters: - description: >- - A filter written in Elasticsearch Query - Domain Specific Language (DSL) as defined in - the `kbn-es-query` package. - items: - additionalProperties: false - type: object - properties: - $state: - additionalProperties: false - type: object - properties: - store: - description: >- - A filter can be either specific to an - application context or applied globally. - enum: - - appState - - globalState - type: string - required: - - store - meta: - additionalProperties: {} - type: object - query: - additionalProperties: {} - type: object - required: - - meta - type: array - kql: - description: >- - A filter written in Kibana Query Language - (KQL). - type: string - required: - - kql - - filters - timeframe: - additionalProperties: false - type: object - properties: - days: - description: >- - Defines the days of the week that the action - can run, represented as an array of numbers. - For example, `1` represents Monday. An empty - array is equivalent to specifying all the - days of the week. - items: - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - type: integer - type: array - hours: - additionalProperties: false - type: object - properties: - end: - description: >- - The end of the time frame in 24-hour - notation (`hh:mm`). - type: string - start: - description: >- - The start of the time frame in 24-hour - notation (`hh:mm`). - type: string - required: - - start - - end - timezone: - description: >- - The ISO time zone for the `hours` values. - Values such as `UTC` and `UTC+1` also work - but lack built-in daylight savings time - support and are not recommended. - type: string - required: - - days - - hours - - timezone - connector_type_id: - description: >- - The type of connector. This property appears in - responses but cannot be set in requests. - type: string - frequency: - additionalProperties: false - type: object - properties: - notify_when: - description: >- - Indicates how often alerts generate actions. - Valid values include: `onActionGroupChange`: - Actions run when the alert status changes; - `onActiveAlert`: Actions run when the alert - becomes active and at each check interval while - the rule conditions are met; - `onThrottleInterval`: Actions run when the alert - becomes active and at the interval specified in - the throttle property while the rule conditions - are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The - recommended method is to set it for each action. - If you set it at the rule level then update the - rule in Kibana, it is automatically changed to - use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - type: string - summary: - description: Indicates whether the action is a summary. - type: boolean - throttle: - description: >- - The throttle interval, which defines how often - an alert generates repeated actions. It is - specified in seconds, minutes, hours, or days - and is applicable only if 'notify_when' is set - to 'onThrottleInterval'. NOTE: You cannot - specify the throttle interval at both the rule - and action level. The recommended method is to - set it for each action. If you set it at the - rule level then update the rule in Kibana, it is - automatically changed to use action-specific - values. - nullable: true - type: string - required: - - summary - - notify_when - - throttle - group: - description: >- - The group name, which affects when the action runs - (for example, when the threshold is met or when the - alert is recovered). Each rule type has a list of - valid action group names. If you don't need to group - actions, set to `default`. - type: string - id: - description: The identifier for the connector saved object. - type: string - params: - additionalProperties: {} - description: >- - The parameters for the action, which are sent to the - connector. The `params` are handled as Mustache - templates and passed a default set of context. - type: object - use_alert_data_for_template: - description: Indicates whether to use alert data as a template. - type: boolean - uuid: - description: >- - A universally unique identifier (UUID) for the - action. - type: string - required: - - id - - connector_type_id - - params - type: array - active_snoozes: - items: - description: List of active snoozes for the rule. - type: string - type: array - alert_delay: - additionalProperties: false - description: >- - Indicates that an alert occurs only when the specified - number of consecutive runs met the rule conditions. - type: object - properties: - active: - description: >- - The number of consecutive runs that must meet the rule - conditions. - type: number - required: - - active - api_key_created_by_user: - description: >- - Indicates whether the API key that is associated with the - rule was created by the user. - nullable: true - type: boolean - api_key_owner: - description: >- - The owner of the API key that is associated with the rule - and used to run background tasks. - nullable: true - type: string - consumer: - description: >- - The name of the application or feature that owns the rule. - For example: `alerts`, `apm`, `discover`, - `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, - `securitySolution`, `siem`, `stackAlerts`, or `uptime`. - type: string - created_at: - description: The date and time that the rule was created. - type: string - created_by: - description: The identifier for the user that created the rule. - nullable: true - type: string - enabled: - description: >- - Indicates whether you want to run the rule on an interval - basis after it is created. - type: boolean - execution_status: - additionalProperties: false - type: object - properties: - error: - additionalProperties: false - type: object - properties: - message: - description: Error message. - type: string - reason: - description: Reason for error. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - type: string - required: - - reason - - message - last_duration: - description: Duration of last execution of the rule. - type: number - last_execution_date: - description: The date and time when rule was executed last. - type: string - status: - description: Status of rule execution. - enum: - - ok - - active - - error - - warning - - pending - - unknown - type: string - warning: - additionalProperties: false - type: object - properties: - message: - description: Warning message. - type: string - reason: - description: Reason for warning. - enum: - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - type: string - required: - - reason - - message - required: - - status - - last_execution_date - id: - description: The identifier for the rule. - type: string - is_snoozed_until: - description: The date when the rule will no longer be snoozed. - nullable: true - type: string - last_run: - additionalProperties: false - nullable: true - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: Number of ignored alerts during last run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: Number of recovered alerts during last run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value could be - succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: Outcome message generated during last rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - mapped_params: - additionalProperties: {} - type: object - monitoring: - additionalProperties: false - description: Monitoring details of the rule. - type: object - properties: - run: - additionalProperties: false - description: Rule run details. - type: object - properties: - calculated_metrics: - additionalProperties: false - description: >- - Calculation of different percentiles and success - ratio. - type: object - properties: - p50: - type: number - p95: - type: number - p99: - type: number - success_ratio: - type: number - required: - - success_ratio - history: - description: History of the rule run. - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule run. - type: number - outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count - success: - description: >- - Indicates whether the rule run was - successful. - type: boolean - timestamp: - description: Time of rule run. - type: number - required: - - success - - timestamp - type: array - last_run: - additionalProperties: false - type: object - properties: - metrics: - additionalProperties: false - type: object - properties: - duration: - description: Duration of most recent rule run. - type: number - gap_duration_s: - description: Duration in seconds of rule run gap. - nullable: true - type: number - total_alerts_created: - description: >- - Total number of alerts created during last - rule run. - nullable: true - type: number - total_alerts_detected: - description: >- - Total number of alerts detected during - last rule run. - nullable: true - type: number - total_indexing_duration_ms: - description: >- - Total time spent indexing documents during - last rule run in milliseconds. - nullable: true - type: number - total_search_duration_ms: - description: >- - Total time spent performing Elasticsearch - searches as measured by Kibana; includes - network latency and time spent serializing - or deserializing the request and response. - nullable: true - type: number - timestamp: - description: Time of the most recent rule run. - type: string - required: - - timestamp - - metrics - required: - - history - - calculated_metrics - - last_run - required: - - run - mute_all: - description: Indicates whether all alerts are muted. - type: boolean - muted_alert_ids: - items: - description: 'List of identifiers of muted alerts. ' - type: string - type: array - name: - description: ' The name of the rule.' - type: string - next_run: - description: Date and time of the next run of the rule. - nullable: true - type: string - notify_when: - description: >- - Indicates how often alerts generate actions. Valid values - include: `onActionGroupChange`: Actions run when the alert - status changes; `onActiveAlert`: Actions run when the - alert becomes active and at each check interval while the - rule conditions are met; `onThrottleInterval`: Actions run - when the alert becomes active and at the interval - specified in the throttle property while the rule - conditions are met. NOTE: You cannot specify `notify_when` - at both the rule and action level. The recommended method - is to set it for each action. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - enum: - - onActionGroupChange - - onActiveAlert - - onThrottleInterval - nullable: true - type: string - params: - additionalProperties: {} - description: The parameters for the rule. - type: object - revision: - description: The rule revision number. - type: number - rule_type_id: - description: The rule type identifier. - type: string - running: - description: Indicates whether the rule is running. - nullable: true - type: boolean - schedule: - additionalProperties: false - type: object - properties: - interval: - description: >- - The interval is specified in seconds, minutes, hours, - or days. - type: string - required: - - interval - scheduled_task_id: - description: Identifier of the scheduled task. - type: string - snooze_schedule: - items: - additionalProperties: false - type: object - properties: - duration: - description: Duration of the rule snooze schedule. - type: number - id: - description: Identifier of the rule snooze schedule. - type: string - rRule: - additionalProperties: false - type: object - properties: - byhour: - items: - description: Indicates hours of the day to recur. - type: number - type: array - byminute: - items: - description: Indicates minutes of the hour to recur. - type: number - type: array - bymonth: - items: - description: >- - Indicates months of the year that this rule - should recur. - type: number - type: array - bymonthday: - items: - description: Indicates the days of the month to recur. - type: number - type: array - bysecond: - items: - description: Indicates seconds of the day to recur. - type: number - type: array - bysetpos: - items: - description: >- - A positive or negative integer affecting the - nth day of the month. For example, -2 combined - with `byweekday` of FR is 2nd to last Friday - of the month. It is recommended to not set - this manually and just use `byweekday`. - type: number - type: array - byweekday: - items: - anyOf: - - type: string - - type: number - description: >- - Indicates the days of the week to recur or - else nth-day-of-month strings. For example, - "+2TU" second Tuesday of month, "-1FR" last - Friday of the month, which are internally - converted to a `byweekday/bysetpos` - combination. - type: array - byweekno: - items: - description: Indicates number of the week hours to recur. - type: number - type: array - byyearday: - items: - description: >- - Indicates the days of the year that this rule - should recur. - type: number - type: array - count: - description: >- - Number of times the rule should recur until it - stops. - type: number - dtstart: - description: >- - Rule start date in Coordinated Universal Time - (UTC). - type: string - freq: - description: >- - Indicates frequency of the rule. Options are - YEARLY, MONTHLY, WEEKLY, DAILY. - enum: - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - type: integer - interval: - description: >- - Indicates the interval of frequency. For - example, 1 and YEARLY is every 1 year, 2 and - WEEKLY is every 2 weeks. - type: number - tzid: - description: Indicates timezone abbreviation. - type: string - until: - description: Recur the rule until this date. - type: string - wkst: - description: 'Indicates the start of week, defaults to Monday.' - enum: - - MO - - TU - - WE - - TH - - FR - - SA - - SU - type: string - required: - - dtstart - - tzid - skipRecurrences: - items: - description: Skips recurrence of rule on this date. - type: string - type: array - required: - - duration - - rRule - type: array - tags: - items: - description: The tags for the rule. - type: string - type: array - throttle: - deprecated: true - description: >- - Deprecated in 8.13.0. Use the `throttle` property in the - action `frequency` object instead. The throttle interval, - which defines how often an alert generates repeated - actions. NOTE: You cannot specify the throttle interval at - both the rule and action level. If you set it at the rule - level then update the rule in Kibana, it is automatically - changed to use action-specific values. - nullable: true - type: string - updated_at: - description: The date and time that the rule was updated most recently. - type: string - updated_by: - description: >- - The identifier for the user that updated this rule most - recently. - nullable: true - type: string - view_in_app_relative_url: - description: Relative URL to view rule in the app. - nullable: true - type: string - required: - - id - - enabled - - name - - tags - - rule_type_id - - consumer - - schedule - - actions - - params - - created_by - - updated_by - - created_at - - updated_at - - api_key_owner - - mute_all - - muted_alert_ids - - execution_status - - revision - description: Indicates a successful call. - summary: Get information about rules - tags: - - alerting - /api/apm/agent_keys: - post: - description: Create a new agent key for APM. - operationId: createAgentKey - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - name: - type: string - privileges: - items: - enum: - - 'event:write' - - 'config_agent:read' - type: string - type: array - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - api_key: - type: string - encoded: - type: string - expiration: - format: int64 - type: integer - id: - type: string - name: - type: string - description: Agent key created successfully - summary: Create an APM agent key - tags: - - APM agent keys - '/api/apm/services/{serviceName}/annotation': - post: - description: Create a new annotation for a specific service. - operationId: createAnnotation - parameters: - - description: The name of the service - in: path - name: serviceName - required: true - schema: - type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - '@timestamp': - type: string - message: - type: string - service: - type: object - properties: - environment: - type: string - version: - type: string - tags: - items: - type: string - type: array - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - _id: - type: string - _index: - type: string - _source: - type: object - properties: - '@timestamp': - type: string - annotation: - type: string - event: - type: object - properties: - created: - type: string - message: - type: string - service: - type: object - properties: - environment: - type: string - name: - type: string - version: - type: string - tags: - items: - type: string - type: array - description: Annotation created successfully - summary: Create a service annotation - tags: - - APM annotations - '/api/apm/services/{serviceName}/annotation/search': - get: - description: Search for annotations related to a specific service. - operationId: getAnnotation - parameters: - - description: The name of the service - in: path - name: serviceName - required: true - schema: - type: string - - description: The environment to filter annotations by - in: query - name: environment - required: false - schema: - type: string - - description: The start date for the search - in: query - name: start - required: false - schema: - type: string - - description: The end date for the search - in: query - name: end - required: false - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - annotations: - items: - type: object - properties: - '@timestamp': - type: number - id: - type: string - text: - type: string - type: - enum: - - version - type: string - type: array - description: Successful response - summary: Search for annotations - tags: - - APM annotations - /api/data_views: - get: - operationId: getAllDataViewsDefault - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getAllDataViewsResponse: - $ref: '#/components/examples/Data_views_get_data_views_response' - schema: - type: object - properties: - data_view: - items: - type: object - properties: - id: - type: string - name: - type: string - namespaces: - items: - type: string - type: array - title: - type: string - typeMeta: - type: object - type: array - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Get all data views - tags: - - data views - /api/data_views/data_view: - post: - operationId: createDataViewDefaultw - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createDataViewRequest: - $ref: '#/components/examples/Data_views_create_data_view_request' - schema: - $ref: '#/components/schemas/Data_views_create_data_view_request_object' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_data_view_response_object' - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Create a data view - tags: - - data views - '/api/data_views/data_view/{viewId}': - delete: - description: | - WARNING: When you delete a data view, it cannot be recovered. - operationId: deleteDataViewDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - - $ref: '#/components/parameters/Data_views_view_id' - responses: - '204': - description: Indicates a successful call. - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_404_response' - description: Object is not found. - summary: Delete a data view - tags: - - data views - get: - operationId: getDataViewDefault - parameters: - - $ref: '#/components/parameters/Data_views_view_id' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getDataViewResponse: - $ref: '#/components/examples/Data_views_get_data_view_response' - schema: - $ref: '#/components/schemas/Data_views_data_view_response_object' - description: Indicates a successful call. - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_404_response' - description: Object is not found. - summary: Get a data view - tags: - - data views - post: - operationId: updateDataViewDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - - $ref: '#/components/parameters/Data_views_view_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - updateDataViewRequest: - $ref: '#/components/examples/Data_views_update_data_view_request' - schema: - $ref: '#/components/schemas/Data_views_update_data_view_request_object' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_data_view_response_object' - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Update a data view - tags: - - data views - '/api/data_views/data_view/{viewId}/fields': - post: - description: > - Update fields presentation metadata such as count, customLabel, - customDescription, and format. - operationId: updateFieldsMetadataDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - - $ref: '#/components/parameters/Data_views_view_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - updateFieldsMetadataRequest: - $ref: '#/components/examples/Data_views_update_field_metadata_request' - schema: - type: object - properties: - fields: - description: The field object. - type: object - required: - - fields - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - acknowledged: - type: boolean - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Update data view fields metadata - tags: - - data views - '/api/data_views/data_view/{viewId}/runtime_field': - post: - operationId: createRuntimeFieldDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - - $ref: '#/components/parameters/Data_views_view_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createRuntimeFieldRequest: - $ref: '#/components/examples/Data_views_create_runtime_field_request' - schema: - type: object - properties: - name: - description: | - The name for a runtime field. - type: string - runtimeField: - description: | - The runtime field definition object. - type: object - required: - - name - - runtimeField - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - description: Indicates a successful call. - summary: Create a runtime field - tags: - - data views - put: - operationId: createUpdateRuntimeFieldDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - - description: | - The ID of the data view fields you want to update. - in: path - name: viewId - required: true - schema: - type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - updateRuntimeFieldRequest: - $ref: '#/components/examples/Data_views_create_runtime_field_request' - schema: - type: object - properties: - name: - description: | - The name for a runtime field. - type: string - runtimeField: - description: | - The runtime field definition object. - type: object - required: - - name - - runtimeField - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - data_view: - type: object - fields: - items: - type: object - type: array - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Create or update a runtime field - tags: - - data views - '/api/data_views/data_view/{viewId}/runtime_field/{fieldName}': - delete: - operationId: deleteRuntimeFieldDefault - parameters: - - $ref: '#/components/parameters/Data_views_field_name' - - $ref: '#/components/parameters/Data_views_view_id' - responses: - '200': - description: Indicates a successful call. - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_404_response' - description: Object is not found. - summary: Delete a runtime field from a data view - tags: - - data views - get: - operationId: getRuntimeFieldDefault - parameters: - - $ref: '#/components/parameters/Data_views_field_name' - - $ref: '#/components/parameters/Data_views_view_id' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getRuntimeFieldResponse: - $ref: '#/components/examples/Data_views_get_runtime_field_response' - schema: - type: object - properties: - data_view: - type: object - fields: - items: - type: object - type: array - description: Indicates a successful call. - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_404_response' - description: Object is not found. - summary: Get a runtime field - tags: - - data views - post: - operationId: updateRuntimeFieldDefault - parameters: - - $ref: '#/components/parameters/Data_views_field_name' - - $ref: '#/components/parameters/Data_views_view_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - updateRuntimeFieldRequest: - $ref: '#/components/examples/Data_views_update_runtime_field_request' - schema: - type: object - properties: - runtimeField: - description: | - The runtime field definition object. - - You can update following fields: - - - `type` - - `script` - type: object - required: - - runtimeField - required: true - responses: - '200': - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Update a runtime field - tags: - - data views - /api/data_views/default: - get: - operationId: getDefaultDataViewDefault - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getDefaultDataViewResponse: - $ref: >- - #/components/examples/Data_views_get_default_data_view_response - schema: - type: object - properties: - data_view_id: - type: string - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Get the default data view - tags: - - data views - post: - operationId: setDefaultDatailViewDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - setDefaultDataViewRequest: - $ref: '#/components/examples/Data_views_set_default_data_view_request' - schema: - type: object - properties: - data_view_id: - description: > - The data view identifier. NOTE: The API does not validate - whether it is a valid identifier. Use `null` to unset the - default data view. - nullable: true - type: string - force: - default: false - description: Update an existing default data view identifier. - type: boolean - required: - - data_view_id - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - acknowledged: - type: boolean - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Data_views_400_response' - description: Bad request - summary: Set the default data view - tags: - - data views - /api/data_views/swap_references: - post: - description: > - Changes saved object references from one data view identifier to - another. WARNING: Misuse can break large numbers of saved objects! - Practicing with a backup is recommended. - operationId: swapDataViewsDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - swapDataViewRequest: - $ref: '#/components/examples/Data_views_swap_data_view_request' - schema: - $ref: '#/components/schemas/Data_views_swap_data_view_request_object' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - deleteStatus: - type: object - properties: - deletePerformed: - type: boolean - remainingRefs: - type: integer - result: - items: - type: object - properties: - id: - description: A saved object identifier. - type: string - type: - description: The saved object type. - type: string - type: array - description: Indicates a successful call. - summary: Swap saved object references - tags: - - data views - /api/data_views/swap_references/_preview: - post: - description: > - Preview the impact of swapping saved object references from one data - view identifier to another. - operationId: previewSwapDataViewsDefault - parameters: - - $ref: '#/components/parameters/Data_views_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - previewSwapDataViewRequest: - $ref: >- - #/components/examples/Data_views_preview_swap_data_view_request - schema: - $ref: '#/components/schemas/Data_views_swap_data_view_request_object' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - result: - items: - type: object - properties: - id: - description: A saved object identifier. - type: string - type: - description: The saved object type. - type: string - type: array - description: Indicates a successful call. - summary: Preview a saved object reference swap - tags: - - data views - /api/ml/saved_objects/sync: - get: - description: > - Synchronizes Kibana saved objects for machine learning jobs and trained - models. This API runs automatically when you start Kibana and - periodically thereafter. - operationId: mlSync - parameters: - - $ref: '#/components/parameters/Machine_learning_APIs_simulateParam' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - syncExample: - $ref: '#/components/examples/Machine_learning_APIs_mlSyncExample' - schema: - $ref: '#/components/schemas/Machine_learning_APIs_mlSync200Response' - description: Indicates a successful call - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Machine_learning_APIs_mlSync4xxResponse' - description: Authorization information is missing or invalid. - summary: Sync machine learning saved objects - tags: - - ml - /api/saved_objects/_export: - post: - description: > - Retrieve sets of saved objects that you want to import into Kibana. - - You must include `type` or `objects` in the request body. - - - Exported saved objects are not backwards compatible and cannot be - imported into an older version of Kibana. - - - NOTE: The `savedObjects.maxImportExportSize` configuration setting - limits the number of saved objects which may be exported. - - - This functionality is in technical preview and may be changed or removed - in a future release. Elastic will work to fix any issues, but features - in technical preview are not subject to the support SLA of official GA - features. - operationId: exportSavedObjectsDefault - parameters: - - $ref: '#/components/parameters/Serverless_saved_objects_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - exportSavedObjectsRequest: - $ref: >- - #/components/examples/Serverless_saved_objects_export_objects_request - schema: - type: object - properties: - excludeExportDetails: - default: false - description: Do not add export details entry at the end of the stream. - type: boolean - includeReferencesDeep: - description: >- - Includes all of the referenced objects in the exported - objects. - type: boolean - objects: - description: A list of objects to export. - items: - type: object - type: array - type: - description: >- - The saved object types to include in the export. Use `*` to - export all the types. - oneOf: - - type: string - - items: - type: string - type: array - required: true - responses: - '200': - content: - application/x-ndjson; Elastic-Api-Version=2023-10-31: - examples: - exportSavedObjectsResponse: - $ref: >- - #/components/examples/Serverless_saved_objects_export_objects_response - schema: - additionalProperties: true - type: object - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Serverless_saved_objects_400_response' - description: Bad request. - summary: Export saved objects - tags: - - saved objects - /api/saved_objects/_import: - post: - description: > - Create sets of Kibana saved objects from a file created by the export - API. - - Saved objects can be imported only into the same version, a newer minor - on the same major, or the next major. Exported saved objects are not - backwards compatible and cannot be imported into an older version of - Kibana. - - - This functionality is in technical preview and may be changed or removed - in a future release. Elastic will work to fix any issues, but features - in technical preview are not subject to the support SLA of official GA - features. - operationId: importSavedObjectsDefault - parameters: - - $ref: '#/components/parameters/Serverless_saved_objects_kbn_xsrf' - - description: > - Creates copies of saved objects, regenerates each object ID, and - resets the origin. When used, potential conflict errors are avoided. - NOTE: This option cannot be used with the `overwrite` and - `compatibilityMode` options. - in: query - name: createNewCopies - required: false - schema: - type: boolean - - description: > - Overwrites saved objects when they already exist. When used, - potential conflict errors are automatically resolved by overwriting - the destination object. NOTE: This option cannot be used with the - `createNewCopies` option. - in: query - name: overwrite - required: false - schema: - type: boolean - - description: > - Applies various adjustments to the saved objects that are being - imported to maintain compatibility between different Kibana - versions. Use this option only if you encounter issues with imported - saved objects. NOTE: This option cannot be used with the - `createNewCopies` option. - in: query - name: compatibilityMode - required: false - schema: - type: boolean - requestBody: - content: - multipart/form-data; Elastic-Api-Version=2023-10-31: - examples: - importObjectsRequest: - $ref: >- - #/components/examples/Serverless_saved_objects_import_objects_request - schema: - type: object - properties: - file: - description: > - A file exported using the export API. NOTE: The - `savedObjects.maxImportExportSize` configuration setting - limits the number of saved objects which may be included in - this file. Similarly, the - `savedObjects.maxImportPayloadBytes` setting limits the - overall size of the file that can be imported. - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - importObjectsResponse: - $ref: >- - #/components/examples/Serverless_saved_objects_import_objects_response - schema: - type: object - properties: - errors: - description: > - Indicates the import was unsuccessful and specifies the - objects that failed to import. - - - NOTE: One object may result in multiple errors, which - requires separate steps to resolve. For instance, a - `missing_references` error and conflict error. - items: - type: object - type: array - success: - description: > - Indicates when the import was successfully completed. When - set to false, some objects may not have been created. For - additional information, refer to the `errors` and - `successResults` properties. - type: boolean - successCount: - description: Indicates the number of successfully imported records. - type: integer - successResults: - description: > - Indicates the objects that are successfully imported, with - any metadata if applicable. - - - NOTE: Objects are created only when all resolvable errors - are addressed, including conflicts and missing references. - If objects are created as new copies, each entry in the - `successResults` array includes a `destinationId` - attribute. - items: - type: object - type: array - description: Indicates a successful call. - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Serverless_saved_objects_400_response' - description: Bad request. - summary: Import saved objects - tags: - - saved objects - /api/status: - get: - operationId: '%2Fapi%2Fstatus#0' - parameters: - - description: The version of the API to use - in: header - name: elastic-api-version - schema: - default: '2023-10-31' - enum: - - '2023-10-31' - type: string - - description: Set to "true" to get the response in v7 format. - in: query - name: v7format - required: false - schema: - type: boolean - - description: Set to "true" to get the response in v8 format. - in: query - name: v8format - required: false - schema: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - anyOf: - - $ref: '#/components/schemas/Kibana_HTTP_APIs_core_status_response' - - $ref: >- - #/components/schemas/Kibana_HTTP_APIs_core_status_redactedResponse - description: >- - Kibana's operational status. A minimal response is sent for - unauthorized users. - description: Overall status is OK and Kibana should be functioning normally. - '503': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - anyOf: - - $ref: '#/components/schemas/Kibana_HTTP_APIs_core_status_response' - - $ref: >- - #/components/schemas/Kibana_HTTP_APIs_core_status_redactedResponse - description: >- - Kibana's operational status. A minimal response is sent for - unauthorized users. - description: >- - Kibana or some of it's essential services are unavailable. Kibana - may be degraded or unavailable. - summary: Get Kibana's current status - tags: - - system - /data_streams: - get: - operationId: data-streams-list - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - data_streams: - items: - $ref: '#/components/schemas/Fleet_data_stream' - type: array - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List data streams - tags: - - Data streams - parameters: [] - /enrollment_api_keys: - get: - operationId: get-enrollment-api-keys - parameters: [] - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - type: array - list: - deprecated: true - items: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - type: array - page: - type: number - perPage: - type: number - total: - type: number - required: - - items - - page - - perPage - - total - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List enrollment API keys - tags: - - Fleet enrollment API keys - post: - operationId: create-enrollment-api-keys - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - action: - enum: - - created - type: string - item: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create enrollment API key - tags: - - Fleet enrollment API keys - '/enrollment_api_keys/{keyId}': - delete: - operationId: delete-enrollment-api-key - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - action: - enum: - - deleted - type: string - required: - - action - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete enrollment API key by ID - tags: - - Fleet enrollment API keys - get: - operationId: get-enrollment-api-key - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get enrollment API key by ID - tags: - - Fleet enrollment API keys - parameters: - - in: path - name: keyId - required: true - schema: - type: string - /enrollment-api-keys: - get: - deprecated: true - operationId: get-enrollment-api-keys-deprecated - parameters: [] - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - type: array - list: - deprecated: true - items: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - type: array - page: - type: number - perPage: - type: number - total: - type: number - required: - - items - - page - - perPage - - total - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List enrollment API keys - tags: - - Fleet enrollment API keys - post: - deprecated: true - operationId: create-enrollment-api-keys-deprecated - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - action: - enum: - - created - type: string - item: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create enrollment API key - tags: - - Fleet enrollment API keys - '/enrollment-api-keys/{keyId}': - delete: - deprecated: true - operationId: delete-enrollment-api-key-deprecated - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - action: - enum: - - deleted - type: string - required: - - action - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete enrollment API key by ID - tags: - - Fleet enrollment API keys - get: - deprecated: true - operationId: get-enrollment-api-key-deprecated - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_enrollment_api_key' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get enrollment API key by ID - tags: - - Fleet enrollment API keys - parameters: - - in: path - name: keyId - required: true - schema: - type: string - /epm/bulk_assets: - post: - operationId: bulk-get-assets - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - assetIds: - description: list of items necessary to fetch assets - items: - type: object - properties: - id: - type: string - type: - type: string - type: array - required: - - assetIds - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_get_bulk_assets_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Bulk get assets - tags: - - Elastic Package Manager (EPM) - /epm/categories: - get: - operationId: get-package-categories - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_get_categories_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List package categories - tags: - - Elastic Package Manager (EPM) - parameters: - - description: >- - Whether to include prerelease packages in categories count (e.g. beta, - rc, preview) - in: query - name: prerelease - schema: - default: false - type: boolean - - deprecated: true - in: query - name: experimental - schema: - default: false - type: boolean - - in: query - name: include_policy_templates - schema: - default: false - type: boolean - /epm/packages: - get: - operationId: list-all-packages - parameters: - - description: >- - Whether to exclude the install status of each package. Enabling this - option will opt in to caching for the response via `cache-control` - headers. If you don't need up-to-date installation info for a - package, and are querying for a list of available packages, - providing this flag can improve performance substantially. - in: query - name: excludeInstallStatus - schema: - default: false - type: boolean - - description: >- - Whether to return prerelease versions of packages (e.g. beta, rc, - preview) - in: query - name: prerelease - schema: - default: false - type: boolean - - deprecated: true - in: query - name: experimental - schema: - default: false - type: boolean - - in: query - name: category - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_get_packages_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List packages - tags: - - Elastic Package Manager (EPM) - post: - description: '' - operationId: install-package-by-upload - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - description: avoid erroring out on unexpected mapping update errors - in: query - name: ignoreMappingUpdateErrors - schema: - default: false - type: boolean - - description: >- - Skip data stream rollover during index template mapping or settings - update - in: query - name: skipDataStreamRollover - schema: - default: false - type: boolean - requestBody: - content: - application/gzip; Elastic-Api-Version=2023-10-31: - schema: - format: binary - type: string - application/zip; Elastic-Api-Version=2023-10-31: - schema: - format: binary - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - _meta: - type: object - properties: - install_source: - enum: - - upload - - registry - - bundled - type: string - items: - items: - type: object - properties: - id: - type: string - type: - oneOf: - - $ref: >- - #/components/schemas/Fleet_kibana_saved_object_type - - $ref: >- - #/components/schemas/Fleet_elasticsearch_asset_type - required: - - id - - type - type: array - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - '429': - $ref: '#/components/responses/Fleet_error' - summary: Install by package by direct upload - tags: - - Elastic Package Manager (EPM) - /epm/packages/_bulk: - post: - operationId: bulk-install-packages - parameters: - - description: >- - Whether to return prerelease versions of packages (e.g. beta, rc, - preview) - in: query - name: prerelease - schema: - default: false - type: boolean - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - force: - description: force install to ignore package verification errors - type: boolean - packages: - description: list of packages to install - items: - oneOf: - - description: package name - type: string - - type: object - properties: - name: - description: package name - type: string - version: - description: package version - type: string - type: array - required: - - packages - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_bulk_install_packages_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Bulk install packages - tags: - - Elastic Package Manager (EPM) - '/epm/packages/{pkgkey}': - delete: - deprecated: true - operationId: delete-package-deprecated - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - in: path - name: pkgkey - required: true - schema: - type: string - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - force: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - response: - items: - type: object - properties: - id: - type: string - type: - oneOf: - - $ref: >- - #/components/schemas/Fleet_kibana_saved_object_type - - $ref: >- - #/components/schemas/Fleet_elasticsearch_asset_type - required: - - id - - type - type: array - required: - - response - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete ackage - tags: - - Elastic Package Manager (EPM) - get: - deprecated: true - operationId: get-package-deprecated - parameters: - - in: path - name: pkgkey - required: true - schema: - type: string - - description: >- - Whether to return prerelease versions of packages (e.g. beta, rc, - preview) - in: query - name: prerelease - schema: - default: false - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - allOf: - - properties: - response: - $ref: '#/components/schemas/Fleet_package_info' - - properties: - savedObject: - type: string - status: - enum: - - installed - - installing - - install_failed - - not_installed - type: string - required: - - status - - savedObject - type: object - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get package - tags: - - Elastic Package Manager (EPM) - post: - deprecated: true - description: '' - operationId: install-package-deprecated - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - in: path - name: pkgkey - required: true - schema: - type: string - - description: avoid erroring out on unexpected mapping update errors - in: query - name: ignoreMappingUpdateErrors - schema: - default: false - type: boolean - - description: >- - Skip data stream rollover during index template mapping or settings - update - in: query - name: skipDataStreamRollover - schema: - default: false - type: boolean - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - force: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - response: - items: - type: object - properties: - id: - type: string - type: - oneOf: - - $ref: >- - #/components/schemas/Fleet_kibana_saved_object_type - - $ref: >- - #/components/schemas/Fleet_elasticsearch_asset_type - required: - - id - - type - type: array - required: - - response - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Install package - tags: - - Elastic Package Manager (EPM) - '/epm/packages/{pkgName}/{pkgVersion}': - delete: - operationId: delete-package - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - description: delete package even if policies used by agents - in: query - name: force - schema: - type: boolean - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - deprecated: true - type: object - properties: - force: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - type: object - properties: - id: - type: string - type: - oneOf: - - $ref: >- - #/components/schemas/Fleet_kibana_saved_object_type - - $ref: >- - #/components/schemas/Fleet_elasticsearch_asset_type - required: - - id - - type - type: array - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete package - tags: - - Elastic Package Manager (EPM) - get: - operationId: get-package - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - allOf: - - properties: - item: - $ref: '#/components/schemas/Fleet_package_info' - - properties: - keepPoliciesUpToDate: - type: boolean - latestVersion: - type: string - licensePath: - type: string - notice: - type: string - savedObject: - deprecated: true - type: object - status: - enum: - - installed - - installing - - install_failed - - not_installed - type: string - required: - - status - - savedObject - type: object - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get package - tags: - - Elastic Package Manager (EPM) - parameters: - - in: path - name: pkgName - required: true - schema: - type: string - - in: path - name: pkgVersion - required: true - schema: - type: string - - description: Ignore if the package is fails signature verification - in: query - name: ignoreUnverified - schema: - type: boolean - - description: >- - Return all fields from the package manifest, not just those supported - by the Elastic Package Registry - in: query - name: full - schema: - type: boolean - - description: >- - Whether to return prerelease versions of packages (e.g. beta, rc, - preview) - in: query - name: prerelease - schema: - default: false - type: boolean - post: - description: '' - operationId: install-package - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - description: avoid erroring out on unexpected mapping update errors - in: query - name: ignoreMappingUpdateErrors - schema: - default: false - type: boolean - - description: >- - Skip data stream rollover during index template mapping or settings - update - in: query - name: skipDataStreamRollover - schema: - default: false - type: boolean - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - force: - type: boolean - ignore_constraints: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - _meta: - type: object - properties: - install_source: - enum: - - registry - - upload - - bundled - type: string - items: - items: - type: object - properties: - id: - type: string - type: - oneOf: - - $ref: >- - #/components/schemas/Fleet_kibana_saved_object_type - - $ref: >- - #/components/schemas/Fleet_elasticsearch_asset_type - required: - - id - - type - type: array - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Install package - tags: - - Elastic Package Manager (EPM) - put: - description: '' - operationId: update-package - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - keepPoliciesUpToDate: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - type: object - properties: - id: - type: string - type: - oneOf: - - $ref: >- - #/components/schemas/Fleet_kibana_saved_object_type - - $ref: >- - #/components/schemas/Fleet_elasticsearch_asset_type - required: - - id - - type - type: array - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Update package settings - tags: - - Elastic Package Manager (EPM) - '/epm/packages/{pkgName}/{pkgVersion}/{filePath}': - get: - operationId: packages-get-file - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - body: - type: object - headers: - type: object - statusCode: - type: number - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get package file - tags: - - Elastic Package Manager (EPM) - parameters: - - in: path - name: pkgName - required: true - schema: - type: string - - in: path - name: pkgVersion - required: true - schema: - type: string - - in: path - name: filePath - required: true - schema: - type: string - '/epm/packages/{pkgName}/{pkgVersion}/transforms/authorize': - post: - description: '' - operationId: reauthorize-transforms - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - in: path - name: pkgName - required: true - schema: - type: string - - in: path - name: pkgVersion - required: true - schema: - type: string - - description: >- - Whether to include prerelease packages in categories count (e.g. - beta, rc, preview) - in: query - name: prerelease - schema: - default: false - type: boolean - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - transforms: - items: - type: object - properties: - transformId: - type: string - type: array - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - type: object - properties: - error: - type: string - success: - type: boolean - transformId: - type: string - required: - - transformId - - error - type: array - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Authorize transforms - tags: - - Elastic Package Manager (EPM) - '/epm/packages/{pkgName}/stats': - get: - operationId: get-package-stats - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - response: - $ref: '#/components/schemas/Fleet_package_usage_stats' - required: - - response - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get package stats - tags: - - Elastic Package Manager (EPM) - parameters: - - in: path - name: pkgName - required: true - schema: - type: string - /epm/packages/limited: - get: - operationId: list-limited-packages - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - type: string - type: array - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get limited package list - tags: - - Elastic Package Manager (EPM) - parameters: [] - '/epm/templates/{pkgName}/{pkgVersion}/inputs': - get: - operationId: get-inputs-template - responses: - '200': - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get inputs template - tags: - - Elastic Package Manager (EPM) - parameters: - - in: path - name: pkgName - required: true - schema: - type: string - - in: path - name: pkgVersion - required: true - schema: - type: string - - description: Format of response - json or yaml - in: query - name: format - schema: - enum: - - json - - yaml - - yml - type: string - - description: Specify if version is prerelease - in: query - name: prerelease - schema: - type: boolean - - description: Ignore if the package is fails signature verification - in: query - name: ignoreUnverified - schema: - type: boolean - /epm/verification_key_id: - get: - operationId: packages-get-verification-key-id - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - body: - type: object - properties: - id: - description: >- - the key ID of the GPG key used to verify package - signatures - nullable: true - type: string - headers: - type: object - statusCode: - type: number - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get package signature verification key ID - tags: - - Elastic Package Manager (EPM) - parameters: [] - /fleet_server_hosts: - get: - operationId: get-fleet-server-hosts - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_fleet_server_host' - type: array - page: - type: integer - perPage: - type: integer - total: - type: integer - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List Fleet Server hosts - tags: - - Fleet Server hosts - post: - operationId: post-fleet-server-hosts - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - host_urls: - items: - type: string - type: array - id: - type: string - is_default: - type: boolean - is_internal: - type: boolean - name: - type: string - proxy_id: - description: >- - The ID of the proxy to use for this fleet server host. See - the proxies API for more information. - type: string - required: - - name - - host_urls - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_fleet_server_host' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create Fleet Server host - tags: - - Fleet Server hosts - '/fleet_server_hosts/{itemId}': - delete: - operationId: delete-fleet-server-hosts - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - id: - type: string - required: - - id - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete Fleet Server host by ID - tags: - - Fleet Server hosts - get: - operationId: get-one-fleet-server-hosts - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_fleet_server_host' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get Fleet Server host by ID - tags: - - Fleet Server hosts - parameters: - - in: path - name: itemId - required: true - schema: - type: string - put: - operationId: update-fleet-server-hosts - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - host_urls: - items: - type: string - type: array - is_default: - type: boolean - is_internal: - type: boolean - name: - type: string - proxy_id: - description: >- - The ID of the proxy to use for this fleet server host. See - the proxies API for more information. - nullable: true - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_fleet_server_host' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Update Fleet Server host by ID - tags: - - Fleet Server hosts - /health_check: - post: - operationId: fleet-server-health-check - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - host: - deprecated: true - type: string - id: - type: string - required: - - id - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - host: - deprecated: true - type: string - id: - description: Fleet Server host id - type: string - status: - type: string - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Fleet Server health check - tags: - - Fleet internals - /kubernetes: - get: - operationId: get-full-k8s-manifest - parameters: - - in: query - name: download - required: false - schema: - type: boolean - - in: query - name: fleetServer - required: false - schema: - type: string - - in: query - name: enrolToken - required: false - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - type: string - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get full K8s agent manifest - tags: - - Fleet Kubernetes - /logstash_api_keys: - post: - operationId: generate-logstash-api-key - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - api_key: - type: string - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Generate Logstash API key - tags: - - Fleet outputs - /outputs: - get: - operationId: get-outputs - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_output_create_request' - type: array - page: - type: integer - perPage: - type: integer - total: - type: integer - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List outputs - tags: - - Fleet outputs - post: - operationId: post-outputs - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_output_create_request' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_output_create_request' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create output - tags: - - Fleet outputs - '/outputs/{outputId}': - delete: - operationId: delete-output - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - id: - type: string - required: - - id - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete output by ID - tags: - - Fleet outputs - get: - operationId: get-output - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_output_create_request' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get output by ID - tags: - - Fleet outputs - parameters: - - in: path - name: outputId - required: true - schema: - type: string - put: - operationId: update-output - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_output_update_request' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_output_update_request' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Update output by ID - tags: - - Fleet outputs - '/outputs/{outputId}/health': - get: - operationId: get-output-health - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - message: - description: long message if unhealthy - type: string - state: - description: 'state of output, HEALTHY or DEGRADED' - type: string - timestamp: - description: timestamp of reported state - type: string - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get latest output health - tags: - - Fleet outputs - parameters: - - in: path - name: outputId - required: true - schema: - type: string - /package_policies: - get: - operationId: get-package-policies - parameters: - - $ref: '#/components/parameters/Fleet_page_size' - - $ref: '#/components/parameters/Fleet_page_index' - - $ref: '#/components/parameters/Fleet_kuery' - - $ref: '#/components/parameters/Fleet_format' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_package_policy' - type: array - page: - type: number - perPage: - type: number - total: - type: number - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List package policies - tags: - - Fleet package policies - parameters: [] - post: - operationId: create-package-policy - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - $ref: '#/components/parameters/Fleet_format' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_package_policy_request' - description: >- - You should use inputs as an object and not use the deprecated inputs - array. - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_package_policy' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - '409': - $ref: '#/components/responses/Fleet_error' - summary: Create package policy - tags: - - Fleet package policies - /package_policies/_bulk_get: - post: - operationId: bulk-get-package-policies - parameters: - - $ref: '#/components/parameters/Fleet_format' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - ids: - description: list of package policy ids - items: - type: string - type: array - ignoreMissing: - type: boolean - required: - - ids - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_package_policy' - type: array - required: - - items - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Bulk get package policies - tags: - - Fleet package policies - '/package_policies/{packagePolicyId}': - delete: - operationId: delete-package-policy - parameters: - - in: query - name: force - schema: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - id: - type: string - required: - - id - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete package policy by ID - tags: - - Fleet package policies - get: - operationId: get-package-policy - parameters: - - $ref: '#/components/parameters/Fleet_format' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_package_policy' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get package policy by ID - tags: - - Fleet package policies - parameters: - - in: path - name: packagePolicyId - required: true - schema: - type: string - put: - operationId: update-package-policy - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - - $ref: '#/components/parameters/Fleet_format' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_package_policy_request' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_package_policy' - sucess: - type: boolean - required: - - item - - sucess - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Update package policy by ID - tags: - - Fleet package policies - /package_policies/delete: - post: - operationId: post-delete-package-policy - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - force: - type: boolean - packagePolicyIds: - items: - type: string - type: array - required: - - packagePolicyIds - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - items: - type: object - properties: - id: - type: string - name: - type: string - success: - type: boolean - required: - - id - - success - type: array - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete package policy - tags: - - Fleet package policies - /package_policies/upgrade: - post: - operationId: upgrade-package-policy - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - packagePolicyIds: - items: - type: string - type: array - required: - - packagePolicyIds - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - items: - type: object - properties: - id: - type: string - name: - type: string - success: - type: boolean - required: - - id - - success - type: array - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - '409': - $ref: '#/components/responses/Fleet_error' - summary: Upgrade package policy to a newer package version - tags: - - Fleet package policies - /package_policies/upgrade/dryrun: - post: - operationId: upgrade-package-policy-dry-run - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - packagePolicyIds: - items: - type: string - type: array - packageVersion: - type: string - required: - - packagePolicyIds - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - items: - type: object - properties: - agent_diff: - $ref: '#/components/schemas/Fleet_upgrade_agent_diff' - diff: - $ref: '#/components/schemas/Fleet_upgrade_diff' - hasErrors: - type: boolean - required: - - hasErrors - type: array - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Dry run package policy upgrade - tags: - - Fleet package policies - /proxies: - get: - operationId: get-fleet-proxies - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - $ref: '#/components/schemas/Fleet_proxies' - type: array - page: - type: integer - perPage: - type: integer - total: - type: integer - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List proxies - tags: - - Fleet proxies - post: - operationId: post-fleet-proxies - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - certificate: - type: string - certificate_authorities: - type: string - certificate_key: - type: string - id: - type: string - name: - type: string - proxy_headers: - type: object - url: - type: string - required: - - name - - url - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_proxies' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create proxy - tags: - - Fleet proxies - '/proxies/{itemId}': - delete: - operationId: delete-fleet-proxies - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - id: - type: string - required: - - id - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Delete proxy by ID - tags: - - Fleet proxies - get: - operationId: get-one-fleet-proxies - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_proxies' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get proxy by ID - tags: - - Fleet proxies - parameters: - - in: path - name: itemId - required: true - schema: - type: string - put: - operationId: update-fleet-proxies - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - certificate: - type: string - certificate_authorities: - type: string - certificate_key: - type: string - name: - type: string - proxy_headers: - type: object - url: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - $ref: '#/components/schemas/Fleet_proxies' - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Update proxy by ID - tags: - - Fleet proxies - '/s/{spaceId}/api/observability/slos': - get: - description: > - You must have the `read` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: findSlosOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - description: A valid kql query to filter the SLO with - example: 'slo.name:latency* and slo.tags : "prod"' - in: query - name: kqlQuery - schema: - type: string - - description: 'The page to use for pagination, must be greater or equal than 1' - example: 1 - in: query - name: page - schema: - default: 1 - type: integer - - description: Number of SLOs returned by page - example: 25 - in: query - name: perPage - schema: - default: 25 - maximum: 5000 - type: integer - - description: Sort by field - example: status - in: query - name: sortBy - schema: - default: status - enum: - - sli_value - - status - - error_budget_consumed - - error_budget_remaining - type: string - - description: Sort order - example: asc - in: query - name: sortDirection - schema: - default: asc - enum: - - asc - - desc - type: string - - description: >- - Hide stale SLOs from the list as defined by stale SLO threshold in - SLO settings - in: query - name: hideStale - schema: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_find_slo_response' - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Get a paginated list of SLOs - tags: - - slo - post: - description: > - You must have `all` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: createSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_create_slo_request' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_create_slo_response' - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '409': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_409_response' - description: Conflict - The SLO id already exists - servers: - - url: 'https://localhost:5601' - summary: Create an SLO - tags: - - slo - '/s/{spaceId}/api/observability/slos/_delete_instances': - post: - description: > - The deletion occurs for the specified list of `sloId` and `instanceId`. - You must have `all` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: deleteSloInstancesOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_delete_slo_instances_request' - required: true - responses: - '204': - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - servers: - - url: 'https://localhost:5601' - summary: Batch delete rollup and summary data - tags: - - slo - '/s/{spaceId}/api/observability/slos/{sloId}': - delete: - description: > - You must have the `write` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: deleteSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - $ref: '#/components/parameters/SLOs_slo_id' - responses: - '204': - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Delete an SLO - tags: - - slo - get: - description: > - You must have the `read` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: getSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - $ref: '#/components/parameters/SLOs_slo_id' - - description: the specific instanceId used by the summary calculation - example: host-abcde - in: query - name: instanceId - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_slo_with_summary_response' - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Get an SLO - tags: - - slo - put: - description: > - You must have the `write` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: updateSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - $ref: '#/components/parameters/SLOs_slo_id' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_update_slo_request' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_slo_definition_response' - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Update an SLO - tags: - - slo - '/s/{spaceId}/api/observability/slos/{sloId}/_reset': - post: - description: > - You must have the `write` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: resetSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - $ref: '#/components/parameters/SLOs_slo_id' - responses: - '204': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_slo_definition_response' - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Reset an SLO - tags: - - slo - '/s/{spaceId}/api/observability/slos/{sloId}/disable': - post: - description: > - You must have the `write` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: disableSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - $ref: '#/components/parameters/SLOs_slo_id' - responses: - '200': - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Disable an SLO - tags: - - slo - '/s/{spaceId}/api/observability/slos/{sloId}/enable': - post: - description: > - You must have the `write` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - operationId: enableSloOp - parameters: - - $ref: '#/components/parameters/SLOs_kbn_xsrf' - - $ref: '#/components/parameters/SLOs_space_id' - - $ref: '#/components/parameters/SLOs_slo_id' - responses: - '204': - description: Successful request - '400': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_400_response' - description: Bad request - '401': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_401_response' - description: Unauthorized response - '403': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_403_response' - description: Unauthorized response - '404': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/SLOs_404_response' - description: Not found response - summary: Enable an SLO - tags: - - slo - /service_tokens: - post: - operationId: generate-service-token - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - name: - type: string - value: - type: string - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create service token - tags: - - Fleet service tokens - /service-tokens: - post: - deprecated: true - operationId: generate-service-token-deprecated - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - name: - type: string - value: - type: string - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Create service token - tags: - - Fleet service tokens - /settings: - get: - operationId: get-settings - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_fleet_settings_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get settings - tags: - - Fleet internals - put: - operationId: update-settings - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - additional_yaml_config: - type: string - fleet_server_hosts: - description: Protocol and path must be the same for each URL - items: - type: string - type: array - has_seen_add_data_notice: - type: boolean - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_fleet_settings_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Update settings - tags: - - Fleet internals - /settings/enrollment: - get: - operationId: get-enrollment-settings - parameters: - - description: >- - An agent policy ID to scope the enrollment settings to. For example, - that policy's Fleet Server host, its proxy, download location, etc. - If not provided, the default Fleet Server policy is used (if any). - in: query - name: agentPolicyId - required: false - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_fleet_settings_enrollment_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get enrollment settings - tags: - - Fleet internals - servers: - - description: Used for Fleet internals and not supported - url: 'http://KIBANA_HOST:5601/internal/fleet' - /setup: - post: - operationId: setup - parameters: - - $ref: '#/components/parameters/Fleet_kbn_xsrf' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Fleet_fleet_setup_response' - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - '500': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - message: - type: string - description: Internal Server Error - summary: Initiate Fleet setup - tags: - - Fleet internals - /uninstall_tokens: - get: - operationId: get-uninstall-tokens - parameters: - - description: The number of items to return - in: query - name: perPage - required: false - schema: - default: 20 - minimum: 5 - type: integer - - $ref: '#/components/parameters/Fleet_page_index' - - description: Partial match filtering for policy IDs - in: query - name: policyId - required: false - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - items: - items: - type: object - properties: - created_at: - type: string - id: - type: string - policy_id: - type: string - required: - - id - - policy_id - - created_at - type: array - page: - type: number - perPage: - type: number - total: - type: number - required: - - items - - total - - page - - perPage - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: List metadata for latest uninstall tokens per agent policy - tags: - - Fleet uninstall tokens - '/uninstall_tokens/{uninstallTokenId}': - get: - operationId: get-uninstall-token - parameters: - - in: path - name: uninstallTokenId - required: true - schema: - type: string - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - item: - type: object - properties: - created_at: - type: string - id: - type: string - policy_id: - type: string - token: - type: string - required: - - id - - token - - policy_id - - created_at - required: - - item - description: OK - '400': - $ref: '#/components/responses/Fleet_error' - summary: Get one decrypted uninstall token by its ID - tags: - - Fleet uninstall tokens -components: - examples: - Connectors_create_email_connector_request: - summary: Create an email connector. - value: - config: - from: tester@example.com - hasAuth: true - host: 'https://example.com' - port: 1025 - secure: false - service: other - connector_type_id: .email - name: email-connector-1 - secrets: - password: password - user: username - Connectors_create_email_connector_response: - summary: A new email connector. - value: - config: - clientId: null - from: tester@example.com - hasAuth: true - host: 'https://example.com' - oauthTokenUrl: null - port: 1025 - secure: false - service: other - tenantId: null - connector_type_id: .email - id: 90a82c60-478f-11ee-a343-f98a117c727f - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: email-connector-1 - Connectors_create_index_connector_request: - summary: Create an index connector. - value: - config: - index: test-index - connector_type_id: .index - name: my-connector - Connectors_create_index_connector_response: - summary: A new index connector. - value: - config: - executionTimeField: null - index: test-index - refresh: false - connector_type_id: .index - id: c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-connector - Connectors_create_webhook_connector_request: - summary: Create a webhook connector with SSL authentication. - value: - config: - authType: webhook-authentication-ssl - certType: ssl-crt-key - method: post - url: 'https://example.com' - connector_type_id: .webhook - name: my-webhook-connector - secrets: - crt: QmFnIEF0dH... - key: LS0tLS1CRUdJ... - password: my-passphrase - Connectors_create_webhook_connector_response: - summary: A new webhook connector. - value: - config: - authType: webhook-authentication-ssl - certType: ssl-crt-key - hasAuth: true - headers: null - method: post - url: 'https://example.com' - verificationMode: full - connector_type_id: .webhook - id: 900eb010-3b9d-11ee-a642-8ffbb94e38bd - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-webhook-connector - Connectors_create_xmatters_connector_request: - summary: Create an xMatters connector with URL authentication. - value: - config: - usesBasic: false - connector_type_id: .xmatters - name: my-xmatters-connector - secrets: - secretsUrl: 'https://example.com?apiKey=xxxxx' - Connectors_create_xmatters_connector_response: - summary: A new xMatters connector. - value: - config: - configUrl: null - usesBasic: false - connector_type_id: .xmatters - id: 4d2d8da0-4d1f-11ee-9367-577408be4681 - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-xmatters-connector - Connectors_get_connector_response: - summary: Get connector details. - value: - config: {} - connector_type_id: .server-log - id: df770e30-8b8b-11ed-a780-3b746c987a81 - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my_server_log_connector - Connectors_get_connector_types_generativeai_response: - summary: A list of connector types for the `generativeAI` feature. - value: - - enabled: true - enabled_in_config: true - enabled_in_license: true - id: .gen-ai - is_system_action_type: false - minimum_license_required: enterprise - name: OpenAI - supported_feature_ids: - - generativeAIForSecurity - - generativeAIForObservability - - generativeAIForSearchPlayground - - enabled: true - enabled_in_config: true - enabled_in_license: true - id: .bedrock - is_system_action_type: false - minimum_license_required: enterprise - name: AWS Bedrock - supported_feature_ids: - - generativeAIForSecurity - - generativeAIForObservability - - generativeAIForSearchPlayground - - enabled: true - enabled_in_config: true - enabled_in_license: true - id: .gemini - is_system_action_type: false - minimum_license_required: enterprise - name: Google Gemini - supported_feature_ids: - - generativeAIForSecurity - Connectors_get_connectors_response: - summary: A list of connectors - value: - - connector_type_id: .email - id: preconfigured-email-connector - is_deprecated: false - is_preconfigured: true - is_system_action: false - name: my-preconfigured-email-notification - referenced_by_count: 0 - - config: - executionTimeField: null - index: test-index - refresh: false - connector_type_id: .index - id: e07d0c80-8b8b-11ed-a780-3b746c987a81 - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-index-connector - referenced_by_count: 2 - Connectors_update_index_connector_request: - summary: Update an index connector. - value: - config: - index: updated-index - name: updated-connector - Data_views_create_data_view_request: - summary: Create a data view with runtime fields. - value: - data_view: - name: My Logstash data view - runtimeFieldMap: - runtime_shape_name: - script: - source: 'emit(doc[''shape_name''].value)' - type: keyword - title: logstash-* - Data_views_create_runtime_field_request: - summary: Create a runtime field. - value: - name: runtimeFoo - runtimeField: - script: - source: 'emit(doc["foo"].value)' - type: long - Data_views_get_data_view_response: - summary: >- - The get data view API returns a JSON object that contains information - about the data view. - value: - data_view: - allowNoIndex: false - fieldAttrs: - products.manufacturer: - count: 1 - products.price: - count: 1 - products.product_name: - count: 1 - total_quantity: - count: 1 - fieldFormats: - products.base_price: - id: number - params: - pattern: '$0,0.00' - products.base_unit_price: - id: number - params: - pattern: '$0,0.00' - products.min_price: - id: number - params: - pattern: '$0,0.00' - products.price: - id: number - params: - pattern: '$0,0.00' - products.taxful_price: - id: number - params: - pattern: '$0,0.00' - products.taxless_price: - id: number - params: - pattern: '$0,0.00' - taxful_total_price: - id: number - params: - pattern: '$0,0.[00]' - taxless_total_price: - id: number - params: - pattern: '$0,0.00' - fields: - _id: - aggregatable: false - count: 0 - esTypes: - - _id - format: - id: string - isMapped: true - name: _id - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - _index: - aggregatable: true - count: 0 - esTypes: - - _index - format: - id: string - isMapped: true - name: _index - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - _score: - aggregatable: false - count: 0 - format: - id: number - isMapped: true - name: _score - readFromDocValues: false - scripted: false - searchable: false - shortDotsEnable: false - type: number - _source: - aggregatable: false - count: 0 - esTypes: - - _source - format: - id: _source - isMapped: true - name: _source - readFromDocValues: false - scripted: false - searchable: false - shortDotsEnable: false - type: _source - category: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: category - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - category.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: category.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: category - type: string - currency: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: currency - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - customer_birth_date: - aggregatable: true - count: 0 - esTypes: - - date - format: - id: date - isMapped: true - name: customer_birth_date - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: date - customer_first_name: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: customer_first_name - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - customer_first_name.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: customer_first_name.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: customer_first_name - type: string - customer_full_name: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: customer_full_name - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - customer_full_name.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: customer_full_name.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: customer_full_name - type: string - customer_gender: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: customer_gender - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - customer_id: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: customer_id - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - customer_last_name: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: customer_last_name - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - customer_last_name.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: customer_last_name.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: customer_last_name - type: string - customer_phone: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: customer_phone - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - day_of_week: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: day_of_week - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - day_of_week_i: - aggregatable: true - count: 0 - esTypes: - - integer - format: - id: number - isMapped: true - name: day_of_week_i - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - email: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: email - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - event.dataset: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: event.dataset - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - geoip.city_name: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: geoip.city_name - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - geoip.continent_name: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: geoip.continent_name - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - geoip.country_iso_code: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: geoip.country_iso_code - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - geoip.location: - aggregatable: true - count: 0 - esTypes: - - geo_point - format: - id: geo_point - params: - transform: wkt - isMapped: true - name: geoip.location - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: geo_point - geoip.region_name: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: geoip.region_name - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - manufacturer: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: manufacturer - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - manufacturer.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: manufacturer.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: manufacturer - type: string - order_date: - aggregatable: true - count: 0 - esTypes: - - date - format: - id: date - isMapped: true - name: order_date - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: date - order_id: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: order_id - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - products._id: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: products._id - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - products._id.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: products._id.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: products._id - type: string - products.base_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: products.base_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.base_unit_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: products.base_unit_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.category: - aggregatable: false - count: 0 - esTypes: - - text - format: - id: string - isMapped: true - name: products.category - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - products.category.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: products.category.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: products.category - type: string - products.created_on: - aggregatable: true - count: 0 - esTypes: - - date - format: - id: date - isMapped: true - name: products.created_on - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: date - products.discount_amount: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - isMapped: true - name: products.discount_amount - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.discount_percentage: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - isMapped: true - name: products.discount_percentage - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.manufacturer: - aggregatable: false - count: 1 - esTypes: - - text - format: - id: string - isMapped: true - name: products.manufacturer - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - products.manufacturer.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: products.manufacturer.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: products.manufacturer - type: string - products.min_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: products.min_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.price: - aggregatable: true - count: 1 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: products.price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.product_id: - aggregatable: true - count: 0 - esTypes: - - long - format: - id: number - isMapped: true - name: products.product_id - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.product_name: - aggregatable: false - count: 1 - esTypes: - - text - format: - id: string - isMapped: true - name: products.product_name - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - products.product_name.keyword: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: products.product_name.keyword - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - subType: - multi: - parent: products.product_name - type: string - products.quantity: - aggregatable: true - count: 0 - esTypes: - - integer - format: - id: number - isMapped: true - name: products.quantity - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.sku: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: products.sku - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - products.tax_amount: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - isMapped: true - name: products.tax_amount - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.taxful_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: products.taxful_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.taxless_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: products.taxless_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - products.unit_discount_amount: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - isMapped: true - name: products.unit_discount_amount - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - sku: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: sku - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - taxful_total_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.[00]' - isMapped: true - name: taxful_total_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - taxless_total_price: - aggregatable: true - count: 0 - esTypes: - - half_float - format: - id: number - params: - pattern: '$0,0.00' - isMapped: true - name: taxless_total_price - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - total_quantity: - aggregatable: true - count: 1 - esTypes: - - integer - format: - id: number - isMapped: true - name: total_quantity - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - total_unique_products: - aggregatable: true - count: 0 - esTypes: - - integer - format: - id: number - isMapped: true - name: total_unique_products - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - type: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: type - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - user: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: user - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - id: ff959d40-b880-11e8-a6d9-e546fe2bba5f - name: Kibana Sample Data eCommerce - namespaces: - - default - runtimeFieldMap: {} - sourceFilters: [] - timeFieldName: order_date - title: kibana_sample_data_ecommerce - typeMeta: {} - version: WzUsMV0= - Data_views_get_data_views_response: - summary: The get all data views API returns a list of data views. - value: - data_view: - - id: ff959d40-b880-11e8-a6d9-e546fe2bba5f - name: Kibana Sample Data eCommerce - namespaces: - - default - title: kibana_sample_data_ecommerce - typeMeta: {} - - id: d3d7af60-4c81-11e8-b3d7-01146121b73d - name: Kibana Sample Data Flights - namespaces: - - default - title: kibana_sample_data_flights - - id: 90943e30-9a47-11e8-b64d-95841ca0b247 - name: Kibana Sample Data Logs - namespaces: - - default - title: kibana_sample_data_logs - Data_views_get_default_data_view_response: - summary: The get default data view API returns the default data view identifier. - value: - data_view_id: ff959d40-b880-11e8-a6d9-e546fe2bba5f - Data_views_get_runtime_field_response: - summary: >- - The get runtime field API returns a JSON object that contains - information about the runtime field (`hour_of_day`) and the data view - (`d3d7af60-4c81-11e8-b3d7-01146121b73d`). - value: - data_view: - allowNoIndex: false - fieldAttrs: {} - fieldFormats: - AvgTicketPrice: - id: number - params: - pattern: '$0,0.[00]' - hour_of_day: - id: number - params: - pattern: '00' - fields: - _id: - aggregatable: false - count: 0 - esTypes: - - _id - format: - id: string - isMapped: true - name: _id - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - _index: - aggregatable: true - count: 0 - esTypes: - - _index - format: - id: string - isMapped: true - name: _index - readFromDocValues: false - scripted: false - searchable: true - shortDotsEnable: false - type: string - _score: - aggregatable: false - count: 0 - format: - id: number - isMapped: true - name: _score - readFromDocValues: false - scripted: false - searchable: false - shortDotsEnable: false - type: number - _source: - aggregatable: false - count: 0 - esTypes: - - _source - format: - id: _source - isMapped: true - name: _source - readFromDocValues: false - scripted: false - searchable: false - shortDotsEnable: false - type: _source - AvgTicketPrice: - aggregatable: true - count: 0 - esTypes: - - float - format: - id: number - params: - pattern: '$0,0.[00]' - isMapped: true - name: AvgTicketPrice - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - Cancelled: - aggregatable: true - count: 0 - esTypes: - - boolean - format: - id: boolean - isMapped: true - name: Cancelled - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: boolean - Carrier: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: Carrier - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - dayOfWeek: - aggregatable: true - count: 0 - esTypes: - - integer - format: - id: number - isMapped: true - name: dayOfWeek - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - Dest: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: Dest - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - DestAirportID: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: DestAirportID - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - DestCityName: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: DestCityName - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - DestCountry: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: DestCountry - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - DestLocation: - aggregatable: true - count: 0 - esTypes: - - geo_point - format: - id: geo_point - params: - transform: wkt - isMapped: true - name: DestLocation - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: geo_point - DestRegion: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: DestRegion - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - DestWeather: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: DestWeather - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - DistanceKilometers: - aggregatable: true - count: 0 - esTypes: - - float - format: - id: number - isMapped: true - name: DistanceKilometers - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - DistanceMiles: - aggregatable: true - count: 0 - esTypes: - - float - format: - id: number - isMapped: true - name: DistanceMiles - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - FlightDelay: - aggregatable: true - count: 0 - esTypes: - - boolean - format: - id: boolean - isMapped: true - name: FlightDelay - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: boolean - FlightDelayMin: - aggregatable: true - count: 0 - esTypes: - - integer - format: - id: number - isMapped: true - name: FlightDelayMin - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - FlightDelayType: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: FlightDelayType - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - FlightNum: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: FlightNum - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - FlightTimeHour: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: FlightTimeHour - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - FlightTimeMin: - aggregatable: true - count: 0 - esTypes: - - float - format: - id: number - isMapped: true - name: FlightTimeMin - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: number - hour_of_day: - aggregatable: true - count: 0 - esTypes: - - long - format: - id: number - params: - pattern: '00' - name: hour_of_day - readFromDocValues: false - runtimeField: - script: - source: 'emit(doc[''timestamp''].value.getHour());' - type: long - scripted: false - searchable: true - shortDotsEnable: false - type: number - Origin: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: Origin - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - OriginAirportID: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: OriginAirportID - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - OriginCityName: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: OriginCityName - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - OriginCountry: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: OriginCountry - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - OriginLocation: - aggregatable: true - count: 0 - esTypes: - - geo_point - format: - id: geo_point - params: - transform: wkt - isMapped: true - name: OriginLocation - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: geo_point - OriginRegion: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: OriginRegion - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - OriginWeather: - aggregatable: true - count: 0 - esTypes: - - keyword - format: - id: string - isMapped: true - name: OriginWeather - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: string - timestamp: - aggregatable: true - count: 0 - esTypes: - - date - format: - id: date - isMapped: true - name: timestamp - readFromDocValues: true - scripted: false - searchable: true - shortDotsEnable: false - type: date - id: d3d7af60-4c81-11e8-b3d7-01146121b73d - name: Kibana Sample Data Flights - runtimeFieldMap: - hour_of_day: - script: - source: 'emit(doc[''timestamp''].value.getHour());' - type: long - sourceFilters: [] - timeFieldName: timestamp - title: kibana_sample_data_flights - version: WzM2LDJd - fields: - - aggregatable: true - count: 0 - esTypes: - - long - name: hour_of_day - readFromDocValues: false - runtimeField: - script: - source: 'emit(doc[''timestamp''].value.getHour());' - type: long - scripted: false - searchable: true - shortDotsEnable: false - type: number - Data_views_preview_swap_data_view_request: - summary: Preview swapping references from data view ID "abcd-efg" to "xyz-123". - value: - fromId: abcd-efg - toId: xyz-123 - Data_views_set_default_data_view_request: - summary: Set the default data view identifier. - value: - data_view_id: ff959d40-b880-11e8-a6d9-e546fe2bba5f - force: true - Data_views_swap_data_view_request: - summary: >- - Swap references from data view ID "abcd-efg" to "xyz-123" and remove the - data view that is no longer referenced. - value: - delete: true - fromId: abcd-efg - toId: xyz-123 - Data_views_update_data_view_request: - summary: Update some properties for a data view. - value: - data_view: - allowNoIndex: false - name: Kibana Sample Data eCommerce - timeFieldName: order_date - title: kibana_sample_data_ecommerce - refresh_fields: true - Data_views_update_field_metadata_request: - summary: Update metadata for multiple fields. - value: - fields: - field1: - count: 123 - customLabel: Field 1 label - field2: - customDescription: Field 2 description - customLabel: Field 2 label - Data_views_update_runtime_field_request: - summary: Update an existing runtime field on a data view. - value: - runtimeField: - script: - source: 'emit(doc["bar"].value)' - Machine_learning_APIs_mlSyncExample: - summary: Two anomaly detection jobs required synchronization in this example. - value: - datafeedsAdded: {} - datafeedsRemoved: {} - savedObjectsCreated: - anomaly-detector: - myjob1: - success: true - myjob2: - success: true - savedObjectsDeleted: {} - Serverless_saved_objects_export_objects_request: - summary: Export a specific saved object. - value: - excludeExportDetails: true - includeReferencesDeep: false - objects: - - id: de71f4f0-1902-11e9-919b-ffe5949a18d2 - type: map - Serverless_saved_objects_export_objects_response: - summary: >- - The export objects API response contains a JSON record for each exported - object. - value: - attributes: - description: '' - layerListJSON: >- - [{"id":"0hmz5","alpha":1,"sourceDescriptor":{"type":"EMS_TMS","isAutoSelect":true,"lightModeDefault":"road_map_desaturated"},"visible":true,"style":{},"type":"EMS_VECTOR_TILE","minZoom":0,"maxZoom":24},{"id":"edh66","label":"Total - Requests by - Destination","minZoom":0,"maxZoom":24,"alpha":0.5,"sourceDescriptor":{"type":"EMS_FILE","id":"world_countries","tooltipProperties":["name","iso2"]},"visible":true,"style":{"type":"VECTOR","properties":{"fillColor":{"type":"DYNAMIC","options":{"field":{"name":"__kbnjoin__count__673ff994-fc75-4c67-909b-69fcb0e1060e","origin":"join"},"color":"Greys","fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"lineColor":{"type":"STATIC","options":{"color":"#FFFFFF"}},"lineWidth":{"type":"STATIC","options":{"size":1}},"iconSize":{"type":"STATIC","options":{"size":10}},"symbolizeAs":{"options":{"value":"circle"}},"icon":{"type":"STATIC","options":{"value":"marker"}}}},"type":"GEOJSON_VECTOR","joins":[{"leftField":"iso2","right":{"type":"ES_TERM_SOURCE","id":"673ff994-fc75-4c67-909b-69fcb0e1060e","indexPatternTitle":"kibana_sample_data_logs","term":"geo.dest","indexPatternRefName":"layer_1_join_0_index_pattern","metrics":[{"type":"count","label":"web - logs - count"}],"applyGlobalQuery":true}}]},{"id":"gaxya","label":"Actual - Requests","minZoom":9,"maxZoom":24,"alpha":1,"sourceDescriptor":{"id":"b7486535-171b-4d3b-bb2e-33c1a0a2854c","type":"ES_SEARCH","geoField":"geo.coordinates","limit":2048,"filterByMapBounds":true,"tooltipProperties":["clientip","timestamp","host","request","response","machine.os","agent","bytes"],"indexPatternRefName":"layer_2_source_index_pattern","applyGlobalQuery":true,"scalingType":"LIMIT"},"visible":true,"style":{"type":"VECTOR","properties":{"fillColor":{"type":"STATIC","options":{"color":"#2200ff"}},"lineColor":{"type":"STATIC","options":{"color":"#FFFFFF"}},"lineWidth":{"type":"STATIC","options":{"size":2}},"iconSize":{"type":"DYNAMIC","options":{"field":{"name":"bytes","origin":"source"},"minSize":1,"maxSize":23,"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"symbolizeAs":{"options":{"value":"circle"}},"icon":{"type":"STATIC","options":{"value":"marker"}}}},"type":"GEOJSON_VECTOR"},{"id":"tfi3f","label":"Total - Requests and - Bytes","minZoom":0,"maxZoom":9,"alpha":1,"sourceDescriptor":{"type":"ES_GEO_GRID","resolution":"COARSE","id":"8aaa65b5-a4e9-448b-9560-c98cb1c5ac5b","geoField":"geo.coordinates","requestType":"point","metrics":[{"type":"count","label":"web - logs - count"},{"type":"sum","field":"bytes"}],"indexPatternRefName":"layer_3_source_index_pattern","applyGlobalQuery":true},"visible":true,"style":{"type":"VECTOR","properties":{"fillColor":{"type":"DYNAMIC","options":{"field":{"name":"doc_count","origin":"source"},"color":"Blues","fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"lineColor":{"type":"STATIC","options":{"color":"#cccccc"}},"lineWidth":{"type":"STATIC","options":{"size":1}},"iconSize":{"type":"DYNAMIC","options":{"field":{"name":"sum_of_bytes","origin":"source"},"minSize":7,"maxSize":25,"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"labelText":{"type":"DYNAMIC","options":{"field":{"name":"doc_count","origin":"source"},"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"labelSize":{"type":"DYNAMIC","options":{"field":{"name":"doc_count","origin":"source"},"minSize":12,"maxSize":24,"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"symbolizeAs":{"options":{"value":"circle"}},"icon":{"type":"STATIC","options":{"value":"marker"}}}},"type":"GEOJSON_VECTOR"}] - mapStateJSON: >- - {"zoom":3.64,"center":{"lon":-88.92107,"lat":42.16337},"timeFilters":{"from":"now-7d","to":"now"},"refreshConfig":{"isPaused":true,"interval":0},"query":{"language":"kuery","query":""},"settings":{"autoFitToDataBounds":false}} - title: '[Logs] Total Requests and Bytes' - uiStateJSON: '{"isDarkMode":false}' - coreMigrationVersion: 8.8.0 - created_at: '2023-08-23T20:03:32.204Z' - id: de71f4f0-1902-11e9-919b-ffe5949a18d2 - managed: false - references: - - id: 90943e30-9a47-11e8-b64d-95841ca0b247 - name: layer_1_join_0_index_pattern - type: index-pattern - - id: 90943e30-9a47-11e8-b64d-95841ca0b247 - name: layer_2_source_index_pattern - type: index-pattern - - id: 90943e30-9a47-11e8-b64d-95841ca0b247 - name: layer_3_source_index_pattern - type: index-pattern - type: map - typeMigrationVersion: 8.4.0 - updated_at: '2023-08-23T20:03:32.204Z' - version: WzEzLDFd - Serverless_saved_objects_import_objects_request: - value: - file: file.ndjson - Serverless_saved_objects_import_objects_response: - summary: >- - The import objects API response indicates a successful import and the - objects are created. Since these objects are created as new copies, each - entry in the successResults array includes a destinationId attribute. - value: - success: true - successCount: 1 - successResults: - - destinationId: 82d2760c-468f-49cf-83aa-b9a35b6a8943 - id: 90943e30-9a47-11e8-b64d-95841ca0b247 - managed: false - meta: - icon: indexPatternApp - title: Kibana Sample Data Logs - type: index-pattern - parameters: - Connectors_connector_id: - description: An identifier for the connector. - in: path - name: connectorId - required: true - schema: - example: df770e30-8b8b-11ed-a780-3b746c987a81 - type: string - Connectors_kbn_xsrf: - description: Cross-site request forgery protection - in: header - name: kbn-xsrf - required: true - schema: - type: string - Data_views_field_name: - description: The name of the runtime field. - in: path - name: fieldName - required: true - schema: - example: hour_of_day - type: string - Data_views_kbn_xsrf: - description: Cross-site request forgery protection - in: header - name: kbn-xsrf - required: true - schema: - type: string - Data_views_view_id: - description: An identifier for the data view. - in: path - name: viewId - required: true - schema: - example: ff959d40-b880-11e8-a6d9-e546fe2bba5f - type: string - Fleet_format: - description: Simplified or legacy format for package inputs - in: query - name: format - required: false - schema: - enum: - - simplified - - legacy - type: string - Fleet_kbn_xsrf: - description: Kibana's anti Cross-Site Request Forgery token. Can be any string value. - in: header - name: kbn-xsrf - required: true - schema: - type: string - Fleet_kuery: - in: query - name: kuery - required: false - schema: - type: string - Fleet_page_index: - in: query - name: page - required: false - schema: - default: 1 - type: integer - Fleet_page_size: - description: The number of items to return - in: query - name: perPage - required: false - schema: - default: 20 - type: integer - Fleet_show_inactive: - in: query - name: showInactive - required: false - schema: - type: boolean - Fleet_show_upgradeable: - in: query - name: showUpgradeable - required: false - schema: - type: boolean - Fleet_sort_field: - in: query - name: sortField - required: false - schema: - deprecated: true - type: string - Fleet_sort_order: - in: query - name: sortOrder - required: false - schema: - enum: - - asc - - desc - type: string - Fleet_with_metrics: - description: 'Return agent metrics, false by default' - in: query - name: withMetrics - required: false - schema: - type: boolean - Machine_learning_APIs_simulateParam: - description: >- - When true, simulates the synchronization by returning only the list of - actions that would be performed. - example: 'true' - in: query - name: simulate - required: false - schema: - type: boolean - Serverless_saved_objects_kbn_xsrf: - description: Cross-site request forgery protection - in: header - name: kbn-xsrf - required: true - schema: - type: string - SLOs_kbn_xsrf: - description: Cross-site request forgery protection - in: header - name: kbn-xsrf - required: true - schema: - type: string - SLOs_slo_id: - description: An identifier for the slo. - in: path - name: sloId - required: true - schema: - example: 9c235211-6834-11ea-a78c-6feb38a34414 - type: string - SLOs_space_id: - description: >- - An identifier for the space. If `/s/` and the identifier are omitted - from the path, the default space is used. - in: path - name: spaceId - required: true - schema: - example: default - type: string - responses: - Connectors_401: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - properties: - error: - enum: - - Unauthorized - example: Unauthorized - type: string - message: - type: string - statusCode: - enum: - - 401 - example: 401 - type: integer - title: Unauthorized response - type: object - description: Authorization information is missing or invalid. - Connectors_404: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - properties: - error: - enum: - - Not Found - example: Not Found - type: string - message: - example: >- - Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not - found - type: string - statusCode: - enum: - - 404 - example: 404 - type: integer - title: Not found response - type: object - description: Object is not found. - Fleet_error: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - error: - type: string - message: - type: string - statusCode: - type: number - description: Generic Error - schemas: - Connectors_auth_type: - description: | - The type of authentication to use: basic, SSL, or none. - enum: - - webhook-authentication-basic - - webhook-authentication-ssl - nullable: true - title: Authentication type - type: string - Connectors_ca: - description: > - A base64 encoded version of the certificate authority file that the - connector can trust to sign and validate certificates. This option is - available for all authentication types. - title: Certificate authority - type: string - Connectors_cert_type: - description: > - If the `authType` is `webhook-authentication-ssl`, specifies whether the - certificate authentication data is in a CRT and key file format or a PFX - file format. - enum: - - ssl-crt-key - - ssl-pfx - title: Certificate type - type: string - Connectors_config_properties_bedrock: - description: Defines properties for connectors when type is `.bedrock`. - properties: - apiUrl: - description: The Amazon Bedrock request URL. - type: string - defaultModel: - default: 'anthropic.claude-3-5-sonnet-20240620-v1:0' - description: > - The generative artificial intelligence model for Amazon Bedrock to - use. Current support is for the Anthropic Claude models. - type: string - required: - - apiUrl - title: Connector request properties for an Amazon Bedrock connector - type: object - Connectors_config_properties_cases_webhook: - description: Defines properties for connectors when type is `.cases-webhook`. - type: object - properties: - authType: - $ref: '#/components/schemas/Connectors_auth_type' - ca: - $ref: '#/components/schemas/Connectors_ca' - certType: - $ref: '#/components/schemas/Connectors_cert_type' - createCommentJson: - description: > - A JSON payload sent to the create comment URL to create a case - comment. You can use variables to add Kibana Cases data to the - payload. The required variable is `case.comment`. Due to Mustache - template variables (the text enclosed in triple braces, for example, - `{{{case.title}}}`), the JSON is not validated when you create the - connector. The JSON is validated once the Mustache variables have - been placed when the REST method runs. Manually ensure that the JSON - is valid, disregarding the Mustache variables, so the later - validation will pass. - example: '{"body": {{{case.comment}}}}' - type: string - createCommentMethod: - default: put - description: > - The REST API HTTP request method to create a case comment in the - third-party system. Valid values are `patch`, `post`, and `put`. - enum: - - patch - - post - - put - type: string - createCommentUrl: - description: > - The REST API URL to create a case comment by ID in the third-party - system. You can use a variable to add the external system ID to the - URL. If you are using the `xpack.actions.allowedHosts setting`, add - the hostname to the allowed hosts. - example: 'https://example.com/issue/{{{external.system.id}}}/comment' - type: string - createIncidentJson: - description: > - A JSON payload sent to the create case URL to create a case. You can - use variables to add case data to the payload. Required variables - are `case.title` and `case.description`. Due to Mustache template - variables (which is the text enclosed in triple braces, for example, - `{{{case.title}}}`), the JSON is not validated when you create the - connector. The JSON is validated after the Mustache variables have - been placed when REST method runs. Manually ensure that the JSON is - valid to avoid future validation errors; disregard Mustache - variables during your review. - example: >- - {"fields": {"summary": {{{case.title}}},"description": - {{{case.description}}},"labels": {{{case.tags}}}}} - type: string - createIncidentMethod: - default: post - description: > - The REST API HTTP request method to create a case in the third-party - system. Valid values are `patch`, `post`, and `put`. - enum: - - patch - - post - - put - type: string - createIncidentResponseKey: - description: >- - The JSON key in the create external case response that contains the - case ID. - type: string - createIncidentUrl: - description: > - The REST API URL to create a case in the third-party system. If you - are using the `xpack.actions.allowedHosts` setting, add the hostname - to the allowed hosts. - type: string - getIncidentResponseExternalTitleKey: - description: >- - The JSON key in get external case response that contains the case - title. - type: string - getIncidentUrl: - description: > - The REST API URL to get the case by ID from the third-party system. - If you are using the `xpack.actions.allowedHosts` setting, add the - hostname to the allowed hosts. You can use a variable to add the - external system ID to the URL. Due to Mustache template variables - (the text enclosed in triple braces, for example, - `{{{case.title}}}`), the JSON is not validated when you create the - connector. The JSON is validated after the Mustache variables have - been placed when REST method runs. Manually ensure that the JSON is - valid, disregarding the Mustache variables, so the later validation - will pass. - example: 'https://example.com/issue/{{{external.system.id}}}' - type: string - hasAuth: - $ref: '#/components/schemas/Connectors_has_auth' - headers: - description: > - A set of key-value pairs sent as headers with the request URLs for - the create case, update case, get case, and create comment methods. - type: string - updateIncidentJson: - description: > - The JSON payload sent to the update case URL to update the case. You - can use variables to add Kibana Cases data to the payload. Required - variables are `case.title` and `case.description`. Due to Mustache - template variables (which is the text enclosed in triple braces, for - example, `{{{case.title}}}`), the JSON is not validated when you - create the connector. The JSON is validated after the Mustache - variables have been placed when REST method runs. Manually ensure - that the JSON is valid to avoid future validation errors; disregard - Mustache variables during your review. - example: >- - {"fields": {"summary": {{{case.title}}},"description": - {{{case.description}}},"labels": {{{case.tags}}}}} - type: string - updateIncidentMethod: - default: put - description: > - The REST API HTTP request method to update the case in the - third-party system. Valid values are `patch`, `post`, and `put`. - enum: - - patch - - post - - put - type: string - updateIncidentUrl: - description: > - The REST API URL to update the case by ID in the third-party system. - You can use a variable to add the external system ID to the URL. If - you are using the `xpack.actions.allowedHosts` setting, add the - hostname to the allowed hosts. - example: 'https://example.com/issue/{{{external.system.ID}}}' - type: string - verificationMode: - $ref: '#/components/schemas/Connectors_verification_mode' - viewIncidentUrl: - description: > - The URL to view the case in the external system. You can use - variables to add the external system ID or external system title to - the URL. - example: >- - https://testing-jira.atlassian.net/browse/{{{external.system.title}}} - type: string - required: - - createIncidentJson - - createIncidentResponseKey - - createIncidentUrl - - getIncidentResponseExternalTitleKey - - getIncidentUrl - - updateIncidentJson - - updateIncidentUrl - - viewIncidentUrl - title: Connector request properties for Webhook - Case Management connector - Connectors_config_properties_d3security: - description: Defines properties for connectors when type is `.d3security`. - properties: - url: - description: > - The D3 Security API request URL. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - url - title: Connector request properties for a D3 Security connector - type: object - Connectors_config_properties_email: - description: Defines properties for connectors when type is `.email`. - type: object - properties: - clientId: - description: > - The client identifier, which is a part of OAuth 2.0 client - credentials authentication, in GUID format. If `service` is - `exchange_server`, this property is required. - nullable: true - type: string - from: - description: > - The from address for all emails sent by the connector. It must be - specified in `user@host-name` format. - type: string - hasAuth: - default: true - description: > - Specifies whether a user and password are required inside the - secrets configuration. - type: boolean - host: - description: > - The host name of the service provider. If the `service` is - `elastic_cloud` (for Elastic Cloud notifications) or one of - Nodemailer's well-known email service providers, this property is - ignored. If `service` is `other`, this property must be defined. - type: string - oauthTokenUrl: - nullable: true - type: string - port: - description: > - The port to connect to on the service provider. If the `service` is - `elastic_cloud` (for Elastic Cloud notifications) or one of - Nodemailer's well-known email service providers, this property is - ignored. If `service` is `other`, this property must be defined. - type: integer - secure: - description: > - Specifies whether the connection to the service provider will use - TLS. If the `service` is `elastic_cloud` (for Elastic Cloud - notifications) or one of Nodemailer's well-known email service - providers, this property is ignored. - type: boolean - service: - description: | - The name of the email service. - enum: - - elastic_cloud - - exchange_server - - gmail - - other - - outlook365 - - ses - type: string - tenantId: - description: > - The tenant identifier, which is part of OAuth 2.0 client credentials - authentication, in GUID format. If `service` is `exchange_server`, - this property is required. - nullable: true - type: string - required: - - from - title: Connector request properties for an email connector - Connectors_config_properties_gemini: - description: Defines properties for connectors when type is `.gemini`. - properties: - apiUrl: - description: The Google Gemini request URL. - type: string - defaultModel: - default: gemini-1.5-pro-001 - description: >- - The generative artificial intelligence model for Google Gemini to - use. - type: string - gcpProjectID: - description: The Google ProjectID that has Vertex AI endpoint enabled. - type: string - gcpRegion: - description: The GCP region where the Vertex AI endpoint enabled. - type: string - required: - - apiUrl - - gcpRegion - - gcpProjectID - title: Connector request properties for an Google Gemini connector - type: object - Connectors_config_properties_genai: - description: Defines properties for connectors when type is `.gen-ai`. - discriminator: - mapping: - Azure OpenAI: '#/components/schemas/Connectors_config_properties_genai_azure' - OpenAI: '#/components/schemas/Connectors_config_properties_genai_openai' - propertyName: apiProvider - oneOf: - - $ref: '#/components/schemas/Connectors_config_properties_genai_azure' - - $ref: '#/components/schemas/Connectors_config_properties_genai_openai' - title: Connector request properties for an OpenAI connector - Connectors_config_properties_genai_azure: - description: > - Defines properties for connectors when type is `.gen-ai` and the API - provider is `Azure OpenAI'. - properties: - apiProvider: - description: The OpenAI API provider. - enum: - - Azure OpenAI - type: string - apiUrl: - description: The OpenAI API endpoint. - type: string - required: - - apiProvider - - apiUrl - title: >- - Connector request properties for an OpenAI connector that uses Azure - OpenAI - type: object - Connectors_config_properties_genai_openai: - description: > - Defines properties for connectors when type is `.gen-ai` and the API - provider is `OpenAI'. - properties: - apiProvider: - description: The OpenAI API provider. - enum: - - OpenAI - type: string - apiUrl: - description: The OpenAI API endpoint. - type: string - defaultModel: - description: The default model to use for requests. - type: string - required: - - apiProvider - - apiUrl - title: Connector request properties for an OpenAI connector - type: object - Connectors_config_properties_index: - description: Defines properties for connectors when type is `.index`. - type: object - properties: - executionTimeField: - default: null - description: A field that indicates when the document was indexed. - nullable: true - type: string - index: - description: The Elasticsearch index to be written to. - type: string - refresh: - default: false - description: > - The refresh policy for the write request, which affects when changes - are made visible to search. Refer to the refresh setting for - Elasticsearch document APIs. - type: boolean - required: - - index - title: Connector request properties for an index connector - Connectors_config_properties_jira: - description: Defines properties for connectors when type is `.jira`. - type: object - properties: - apiUrl: - description: The Jira instance URL. - type: string - projectKey: - description: The Jira project key. - type: string - required: - - apiUrl - - projectKey - title: Connector request properties for a Jira connector - Connectors_config_properties_opsgenie: - description: Defines properties for connectors when type is `.opsgenie`. - type: object - properties: - apiUrl: - description: > - The Opsgenie URL. For example, `https://api.opsgenie.com` or - `https://api.eu.opsgenie.com`. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - apiUrl - title: Connector request properties for an Opsgenie connector - Connectors_config_properties_pagerduty: - description: Defines properties for connectors when type is `.pagerduty`. - properties: - apiUrl: - description: The PagerDuty event URL. - example: 'https://events.pagerduty.com/v2/enqueue' - nullable: true - type: string - title: Connector request properties for a PagerDuty connector - type: object - Connectors_config_properties_resilient: - description: Defines properties for connectors when type is `.resilient`. - type: object - properties: - apiUrl: - description: The IBM Resilient instance URL. - type: string - orgId: - description: The IBM Resilient organization ID. - type: string - required: - - apiUrl - - orgId - title: Connector request properties for a IBM Resilient connector - Connectors_config_properties_sentinelone: - description: Defines properties for connectors when type is `.sentinelone`. - type: object - properties: - url: - description: > - The SentinelOne tenant URL. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - url - title: Connector request properties for a SentinelOne connector - Connectors_config_properties_servicenow: - description: Defines properties for connectors when type is `.servicenow`. - type: object - properties: - apiUrl: - description: The ServiceNow instance URL. - type: string - clientId: - description: > - The client ID assigned to your OAuth application. This property is - required when `isOAuth` is `true`. - type: string - isOAuth: - default: false - description: > - The type of authentication to use. The default value is false, which - means basic authentication is used instead of open authorization - (OAuth). - type: boolean - jwtKeyId: - description: > - The key identifier assigned to the JWT verifier map of your OAuth - application. This property is required when `isOAuth` is `true`. - type: string - userIdentifierValue: - description: > - The identifier to use for OAuth authentication. This identifier - should be the user field you selected when you created an OAuth JWT - API endpoint for external clients in your ServiceNow instance. For - example, if the selected user field is `Email`, the user identifier - should be the user's email address. This property is required when - `isOAuth` is `true`. - type: string - usesTableApi: - default: true - description: > - Determines whether the connector uses the Table API or the Import - Set API. This property is supported only for ServiceNow ITSM and - ServiceNow SecOps connectors. NOTE: If this property is set to - `false`, the Elastic application should be installed in ServiceNow. - type: boolean - required: - - apiUrl - title: Connector request properties for a ServiceNow ITSM connector - Connectors_config_properties_servicenow_itom: - description: Defines properties for connectors when type is `.servicenow`. - type: object - properties: - apiUrl: - description: The ServiceNow instance URL. - type: string - clientId: - description: > - The client ID assigned to your OAuth application. This property is - required when `isOAuth` is `true`. - type: string - isOAuth: - default: false - description: > - The type of authentication to use. The default value is false, which - means basic authentication is used instead of open authorization - (OAuth). - type: boolean - jwtKeyId: - description: > - The key identifier assigned to the JWT verifier map of your OAuth - application. This property is required when `isOAuth` is `true`. - type: string - userIdentifierValue: - description: > - The identifier to use for OAuth authentication. This identifier - should be the user field you selected when you created an OAuth JWT - API endpoint for external clients in your ServiceNow instance. For - example, if the selected user field is `Email`, the user identifier - should be the user's email address. This property is required when - `isOAuth` is `true`. - type: string - required: - - apiUrl - title: Connector request properties for a ServiceNow ITSM connector - Connectors_config_properties_slack_api: - description: Defines properties for connectors when type is `.slack_api`. - properties: - allowedChannels: - description: A list of valid Slack channels. - items: - maxItems: 25 - type: object - properties: - id: - description: The Slack channel ID. - example: C123ABC456 - minLength: 1 - type: string - name: - description: The Slack channel name. - minLength: 1 - type: string - required: - - id - - name - type: array - title: Connector request properties for a Slack connector - type: object - Connectors_config_properties_swimlane: - description: Defines properties for connectors when type is `.swimlane`. - type: object - properties: - apiUrl: - description: The Swimlane instance URL. - type: string - appId: - description: The Swimlane application ID. - type: string - connectorType: - description: >- - The type of connector. Valid values are `all`, `alerts`, and - `cases`. - enum: - - all - - alerts - - cases - type: string - mappings: - description: The field mapping. - properties: - alertIdConfig: - description: Mapping for the alert ID. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Alert identifier mapping - type: object - caseIdConfig: - description: Mapping for the case ID. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case identifier mapping - type: object - caseNameConfig: - description: Mapping for the case name. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case name mapping - type: object - commentsConfig: - description: Mapping for the case comments. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case comment mapping - type: object - descriptionConfig: - description: Mapping for the case description. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case description mapping - type: object - ruleNameConfig: - description: Mapping for the name of the alert's rule. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Rule name mapping - type: object - severityConfig: - description: Mapping for the severity. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Severity mapping - type: object - title: Connector mappings properties for a Swimlane connector - type: object - required: - - apiUrl - - appId - - connectorType - title: Connector request properties for a Swimlane connector - Connectors_config_properties_tines: - description: Defines properties for connectors when type is `.tines`. - properties: - url: - description: > - The Tines tenant URL. If you are using the - `xpack.actions.allowedHosts` setting, make sure this hostname is - added to the allowed hosts. - type: string - required: - - url - title: Connector request properties for a Tines connector - type: object - Connectors_config_properties_torq: - description: Defines properties for connectors when type is `.torq`. - properties: - webhookIntegrationUrl: - description: The endpoint URL of the Elastic Security integration in Torq. - type: string - required: - - webhookIntegrationUrl - title: Connector request properties for a Torq connector - type: object - Connectors_config_properties_webhook: - description: Defines properties for connectors when type is `.webhook`. - properties: - authType: - $ref: '#/components/schemas/Connectors_auth_type' - ca: - $ref: '#/components/schemas/Connectors_ca' - certType: - $ref: '#/components/schemas/Connectors_cert_type' - hasAuth: - $ref: '#/components/schemas/Connectors_has_auth' - headers: - description: A set of key-value pairs sent as headers with the request. - nullable: true - type: object - method: - default: post - description: | - The HTTP request method, either `post` or `put`. - enum: - - post - - put - type: string - url: - description: > - The request URL. If you are using the `xpack.actions.allowedHosts` - setting, add the hostname to the allowed hosts. - type: string - verificationMode: - $ref: '#/components/schemas/Connectors_verification_mode' - title: Connector request properties for a Webhook connector - type: object - Connectors_config_properties_xmatters: - description: Defines properties for connectors when type is `.xmatters`. - properties: - configUrl: - description: > - The request URL for the Elastic Alerts trigger in xMatters. It is - applicable only when `usesBasic` is `true`. - nullable: true - type: string - usesBasic: - default: true - description: >- - Specifies whether the connector uses HTTP basic authentication - (`true`) or URL authentication (`false`). - type: boolean - title: Connector request properties for an xMatters connector - type: object - Connectors_connector_response_properties: - description: The properties vary depending on the connector type. - discriminator: - mapping: - .bedrock: >- - #/components/schemas/Connectors_connector_response_properties_bedrock - .cases-webhook: >- - #/components/schemas/Connectors_connector_response_properties_cases_webhook - .d3security: >- - #/components/schemas/Connectors_connector_response_properties_d3security - .email: '#/components/schemas/Connectors_connector_response_properties_email' - .gemini: '#/components/schemas/Connectors_connector_response_properties_gemini' - .gen-ai: '#/components/schemas/Connectors_connector_response_properties_genai' - .index: '#/components/schemas/Connectors_connector_response_properties_index' - .jira: '#/components/schemas/Connectors_connector_response_properties_jira' - .opsgenie: >- - #/components/schemas/Connectors_connector_response_properties_opsgenie - .pagerduty: >- - #/components/schemas/Connectors_connector_response_properties_pagerduty - .resilient: >- - #/components/schemas/Connectors_connector_response_properties_resilient - .sentinelone: >- - #/components/schemas/Connectors_connector_response_properties_sentinelone - .server-log: >- - #/components/schemas/Connectors_connector_response_properties_serverlog - .servicenow: >- - #/components/schemas/Connectors_connector_response_properties_servicenow - .servicenow-itom: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_itom - .servicenow-sir: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_sir - .slack: >- - #/components/schemas/Connectors_connector_response_properties_slack_webhook - .slack_api: >- - #/components/schemas/Connectors_connector_response_properties_slack_api - .swimlane: >- - #/components/schemas/Connectors_connector_response_properties_swimlane - .teams: '#/components/schemas/Connectors_connector_response_properties_teams' - .tines: '#/components/schemas/Connectors_connector_response_properties_tines' - .torq: '#/components/schemas/Connectors_connector_response_properties_torq' - .webhook: >- - #/components/schemas/Connectors_connector_response_properties_webhook - .xmatters: >- - #/components/schemas/Connectors_connector_response_properties_xmatters - propertyName: connector_type_id - oneOf: - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_bedrock - - $ref: '#/components/schemas/Connectors_connector_response_properties_gemini' - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_cases_webhook - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_d3security - - $ref: '#/components/schemas/Connectors_connector_response_properties_email' - - $ref: '#/components/schemas/Connectors_connector_response_properties_genai' - - $ref: '#/components/schemas/Connectors_connector_response_properties_index' - - $ref: '#/components/schemas/Connectors_connector_response_properties_jira' - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_opsgenie - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_pagerduty - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_resilient - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_sentinelone - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_serverlog - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_servicenow - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_itom - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_sir - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_slack_api - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_slack_webhook - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_swimlane - - $ref: '#/components/schemas/Connectors_connector_response_properties_teams' - - $ref: '#/components/schemas/Connectors_connector_response_properties_tines' - - $ref: '#/components/schemas/Connectors_connector_response_properties_torq' - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_webhook - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_xmatters - title: Connector response properties - Connectors_connector_response_properties_bedrock: - title: Connector response properties for an Amazon Bedrock connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_bedrock' - connector_type_id: - description: The type of connector. - enum: - - .bedrock - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - required: - - config - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_cases_webhook: - title: Connector request properties for a Webhook - Case Management connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_cases_webhook' - connector_type_id: - description: The type of connector. - enum: - - .cases-webhook - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_d3security: - title: Connector response properties for a D3 Security connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_d3security' - connector_type_id: - description: The type of connector. - enum: - - .d3security - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_email: - title: Connector response properties for an email connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_email' - connector_type_id: - description: The type of connector. - enum: - - .email - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_gemini: - title: Connector response properties for a Google Gemini connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_gemini' - connector_type_id: - description: The type of connector. - enum: - - .gemini - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_genai: - title: Connector response properties for an OpenAI connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_genai' - connector_type_id: - description: The type of connector. - enum: - - .gen-ai - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_index: - title: Connector response properties for an index connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_index' - connector_type_id: - description: The type of connector. - enum: - - .index - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_jira: - title: Connector response properties for a Jira connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_jira' - connector_type_id: - description: The type of connector. - enum: - - .jira - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_opsgenie: - title: Connector response properties for an Opsgenie connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_opsgenie' - connector_type_id: - description: The type of connector. - enum: - - .opsgenie - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_pagerduty: - title: Connector response properties for a PagerDuty connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_pagerduty' - connector_type_id: - description: The type of connector. - enum: - - .pagerduty - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_resilient: - title: Connector response properties for a IBM Resilient connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_resilient' - connector_type_id: - description: The type of connector. - enum: - - .resilient - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_sentinelone: - title: Connector response properties for a SentinelOne connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_sentinelone' - connector_type_id: - description: The type of connector. - enum: - - .sentinelone - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_serverlog: - title: Connector response properties for a server log connector - type: object - properties: - config: - nullable: true - type: object - connector_type_id: - description: The type of connector. - enum: - - .server-log - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_servicenow: - title: Connector response properties for a ServiceNow ITSM connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_servicenow_itom: - title: Connector response properties for a ServiceNow ITOM connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow_itom' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-itom - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_servicenow_sir: - title: Connector response properties for a ServiceNow SecOps connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-sir - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_slack_api: - title: Connector response properties for a Slack connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_slack_api' - connector_type_id: - description: The type of connector. - enum: - - .slack_api - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_slack_webhook: - title: Connector response properties for a Slack connector - type: object - properties: - connector_type_id: - description: The type of connector. - enum: - - .slack - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_swimlane: - title: Connector response properties for a Swimlane connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_swimlane' - connector_type_id: - description: The type of connector. - enum: - - .swimlane - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_teams: - title: Connector response properties for a Microsoft Teams connector - type: object - properties: - config: - type: object - connector_type_id: - description: The type of connector. - enum: - - .teams - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_tines: - title: Connector response properties for a Tines connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_tines' - connector_type_id: - description: The type of connector. - enum: - - .tines - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_torq: - title: Connector response properties for a Torq connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_torq' - connector_type_id: - description: The type of connector. - enum: - - .torq - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_webhook: - title: Connector response properties for a Webhook connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_webhook' - connector_type_id: - description: The type of connector. - enum: - - .webhook - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_xmatters: - title: Connector response properties for an xMatters connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_xmatters' - connector_type_id: - description: The type of connector. - enum: - - .xmatters - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_types: - description: >- - The type of connector. For example, `.email`, `.index`, `.jira`, - `.opsgenie`, or `.server-log`. - enum: - - .bedrock - - .gemini - - .cases-webhook - - .d3security - - .email - - .gen-ai - - .index - - .jira - - .opsgenie - - .pagerduty - - .resilient - - .sentinelone - - .servicenow - - .servicenow-itom - - .servicenow-sir - - .server-log - - .slack - - .slack_api - - .swimlane - - .teams - - .tines - - .torq - - .webhook - - .xmatters - example: .server-log - title: Connector types - type: string - Connectors_create_connector_request: - description: The properties vary depending on the connector type. - discriminator: - mapping: - .bedrock: '#/components/schemas/Connectors_create_connector_request_bedrock' - .cases-webhook: >- - #/components/schemas/Connectors_create_connector_request_cases_webhook - .d3security: '#/components/schemas/Connectors_create_connector_request_d3security' - .email: '#/components/schemas/Connectors_create_connector_request_email' - .gemini: '#/components/schemas/Connectors_create_connector_request_gemini' - .gen-ai: '#/components/schemas/Connectors_create_connector_request_genai' - .index: '#/components/schemas/Connectors_create_connector_request_index' - .jira: '#/components/schemas/Connectors_create_connector_request_jira' - .opsgenie: '#/components/schemas/Connectors_create_connector_request_opsgenie' - .pagerduty: '#/components/schemas/Connectors_create_connector_request_pagerduty' - .resilient: '#/components/schemas/Connectors_create_connector_request_resilient' - .sentinelone: '#/components/schemas/Connectors_create_connector_request_sentinelone' - .server-log: '#/components/schemas/Connectors_create_connector_request_serverlog' - .servicenow: '#/components/schemas/Connectors_create_connector_request_servicenow' - .servicenow-itom: >- - #/components/schemas/Connectors_create_connector_request_servicenow_itom - .servicenow-sir: >- - #/components/schemas/Connectors_create_connector_request_servicenow_sir - .slack: >- - #/components/schemas/Connectors_create_connector_request_slack_webhook - .slack_api: '#/components/schemas/Connectors_create_connector_request_slack_api' - .swimlane: '#/components/schemas/Connectors_create_connector_request_swimlane' - .teams: '#/components/schemas/Connectors_create_connector_request_teams' - .tines: '#/components/schemas/Connectors_create_connector_request_tines' - .torq: '#/components/schemas/Connectors_create_connector_request_torq' - .webhook: '#/components/schemas/Connectors_create_connector_request_webhook' - .xmatters: '#/components/schemas/Connectors_create_connector_request_xmatters' - propertyName: connector_type_id - oneOf: - - $ref: '#/components/schemas/Connectors_create_connector_request_bedrock' - - $ref: '#/components/schemas/Connectors_create_connector_request_gemini' - - $ref: >- - #/components/schemas/Connectors_create_connector_request_cases_webhook - - $ref: '#/components/schemas/Connectors_create_connector_request_d3security' - - $ref: '#/components/schemas/Connectors_create_connector_request_email' - - $ref: '#/components/schemas/Connectors_create_connector_request_genai' - - $ref: '#/components/schemas/Connectors_create_connector_request_index' - - $ref: '#/components/schemas/Connectors_create_connector_request_jira' - - $ref: '#/components/schemas/Connectors_create_connector_request_opsgenie' - - $ref: '#/components/schemas/Connectors_create_connector_request_pagerduty' - - $ref: '#/components/schemas/Connectors_create_connector_request_resilient' - - $ref: '#/components/schemas/Connectors_create_connector_request_sentinelone' - - $ref: '#/components/schemas/Connectors_create_connector_request_serverlog' - - $ref: '#/components/schemas/Connectors_create_connector_request_servicenow' - - $ref: >- - #/components/schemas/Connectors_create_connector_request_servicenow_itom - - $ref: >- - #/components/schemas/Connectors_create_connector_request_servicenow_sir - - $ref: '#/components/schemas/Connectors_create_connector_request_slack_api' - - $ref: >- - #/components/schemas/Connectors_create_connector_request_slack_webhook - - $ref: '#/components/schemas/Connectors_create_connector_request_swimlane' - - $ref: '#/components/schemas/Connectors_create_connector_request_teams' - - $ref: '#/components/schemas/Connectors_create_connector_request_tines' - - $ref: '#/components/schemas/Connectors_create_connector_request_torq' - - $ref: '#/components/schemas/Connectors_create_connector_request_webhook' - - $ref: '#/components/schemas/Connectors_create_connector_request_xmatters' - title: Create connector request body properties - Connectors_create_connector_request_bedrock: - description: >- - The Amazon Bedrock connector uses axios to send a POST request to Amazon - Bedrock. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_bedrock' - connector_type_id: - description: The type of connector. - enum: - - .bedrock - example: .bedrock - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_bedrock' - required: - - config - - connector_type_id - - name - - secrets - title: Create Amazon Bedrock connector request - type: object - Connectors_create_connector_request_cases_webhook: - description: > - The Webhook - Case Management connector uses axios to send POST, PUT, - and GET requests to a case management RESTful API web service. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_cases_webhook' - connector_type_id: - description: The type of connector. - enum: - - .cases-webhook - example: .cases-webhook - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_cases_webhook' - required: - - config - - connector_type_id - - name - title: Create Webhook - Case Managment connector request - type: object - Connectors_create_connector_request_d3security: - description: > - The connector uses axios to send a POST request to a D3 Security - endpoint. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_d3security' - connector_type_id: - description: The type of connector. - enum: - - .d3security - example: .d3security - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_d3security' - required: - - config - - connector_type_id - - name - - secrets - title: Create D3 Security connector request - type: object - Connectors_create_connector_request_email: - description: > - The email connector uses the SMTP protocol to send mail messages, using - an integration of Nodemailer. An exception is Microsoft Exchange, which - uses HTTP protocol for sending emails, Send mail. Email message text is - sent as both plain text and html text. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_email' - connector_type_id: - description: The type of connector. - enum: - - .email - example: .email - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_email' - required: - - config - - connector_type_id - - name - - secrets - title: Create email connector request - type: object - Connectors_create_connector_request_gemini: - description: >- - The Google Gemini connector uses axios to send a POST request to Google - Gemini. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_gemini' - connector_type_id: - description: The type of connector. - enum: - - .gemini - example: .gemini - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_gemini' - required: - - config - - connector_type_id - - name - - secrets - title: Create Google Gemini connector request - type: object - Connectors_create_connector_request_genai: - description: > - The OpenAI connector uses axios to send a POST request to either OpenAI - or Azure OpenAPI. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_genai' - connector_type_id: - description: The type of connector. - enum: - - .gen-ai - example: .gen-ai - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_genai' - required: - - config - - connector_type_id - - name - - secrets - title: Create OpenAI connector request - type: object - Connectors_create_connector_request_index: - description: The index connector indexes a document into Elasticsearch. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_index' - connector_type_id: - description: The type of connector. - enum: - - .index - example: .index - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - required: - - config - - connector_type_id - - name - title: Create index connector request - type: object - Connectors_create_connector_request_jira: - description: The Jira connector uses the REST API v2 to create Jira issues. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_jira' - connector_type_id: - description: The type of connector. - enum: - - .jira - example: .jira - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_jira' - required: - - config - - connector_type_id - - name - - secrets - title: Create Jira connector request - type: object - Connectors_create_connector_request_opsgenie: - description: The Opsgenie connector uses the Opsgenie alert API. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_opsgenie' - connector_type_id: - description: The type of connector. - enum: - - .opsgenie - example: .opsgenie - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_opsgenie' - required: - - config - - connector_type_id - - name - - secrets - title: Create Opsgenie connector request - type: object - Connectors_create_connector_request_pagerduty: - description: > - The PagerDuty connector uses the v2 Events API to trigger, acknowledge, - and resolve PagerDuty alerts. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_pagerduty' - connector_type_id: - description: The type of connector. - enum: - - .pagerduty - example: .pagerduty - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_pagerduty' - required: - - config - - connector_type_id - - name - - secrets - title: Create PagerDuty connector request - type: object - Connectors_create_connector_request_resilient: - description: >- - The IBM Resilient connector uses the RESILIENT REST v2 to create IBM - Resilient incidents. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_resilient' - connector_type_id: - description: The type of connector. - enum: - - .resilient - example: .resilient - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_resilient' - required: - - config - - connector_type_id - - name - - secrets - title: Create IBM Resilient connector request - type: object - Connectors_create_connector_request_sentinelone: - description: > - The SentinelOne connector communicates with SentinelOne Management - Console via REST API. This functionality is in technical preview and may - be changed or removed in a future release. Elastic will work to fix any - issues, but features in technical preview are not subject to the support - SLA of official GA features. - title: Create SentinelOne connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_sentinelone' - connector_type_id: - description: The type of connector. - enum: - - .sentinelone - example: .sentinelone - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_sentinelone' - required: - - config - - connector_type_id - - name - - secrets - x-technical-preview: true - Connectors_create_connector_request_serverlog: - description: This connector writes an entry to the Kibana server log. - properties: - connector_type_id: - description: The type of connector. - enum: - - .server-log - example: .server-log - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - required: - - connector_type_id - - name - title: Create server log connector request - type: object - Connectors_create_connector_request_servicenow: - description: > - The ServiceNow ITSM connector uses the import set API to create - ServiceNow incidents. You can use the connector for rule actions and - cases. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow - example: .servicenow - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - connector_type_id - - name - - secrets - title: Create ServiceNow ITSM connector request - type: object - Connectors_create_connector_request_servicenow_itom: - description: > - The ServiceNow ITOM connector uses the event API to create ServiceNow - events. You can use the connector for rule actions. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow_itom' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-itom - example: .servicenow-itom - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - connector_type_id - - name - - secrets - title: Create ServiceNow ITOM connector request - type: object - Connectors_create_connector_request_servicenow_sir: - description: > - The ServiceNow SecOps connector uses the import set API to create - ServiceNow security incidents. You can use the connector for rule - actions and cases. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-sir - example: .servicenow-sir - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - connector_type_id - - name - - secrets - title: Create ServiceNow SecOps connector request - type: object - Connectors_create_connector_request_slack_api: - description: The Slack connector uses an API method to send Slack messages. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_slack_api' - connector_type_id: - description: The type of connector. - enum: - - .slack_api - example: .slack_api - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_api' - required: - - connector_type_id - - name - - secrets - title: Create Slack connector request - type: object - Connectors_create_connector_request_slack_webhook: - description: The Slack connector uses Slack Incoming Webhooks. - properties: - connector_type_id: - description: The type of connector. - enum: - - .slack - example: .slack - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_webhook' - required: - - connector_type_id - - name - - secrets - title: Create Slack connector request - type: object - Connectors_create_connector_request_swimlane: + - description: >- + A filter to limit the retrieved connector types to those that + support a specific feature (such as alerting or cases). + in: query + name: feature_id + required: false + schema: + type: string + responses: {} + summary: Get connector types + tags: + - connectors + '/api/actions/connector/{id}': + delete: + description: 'WARNING: When you delete a connector, it cannot be recovered.' + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Delete a connector + tags: + - connectors + get: + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D#1' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string + responses: + '200': + description: Indicates a successful call. + summary: Get connector information + tags: + - connectors + post: + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%3F%7D#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - in: path + name: id + required: false + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + config: + additionalProperties: {} + default: {} + type: object + connector_type_id: + description: The type of connector. + type: string + name: + description: The display name for the connector. + type: string + secrets: + additionalProperties: {} + default: {} + type: object + required: + - name + - connector_type_id + responses: + '200': + description: Indicates a successful call. + summary: Create a connector + tags: + - connectors + put: + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D#2' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + config: + additionalProperties: {} + default: {} + type: object + name: + description: The display name for the connector. + type: string + secrets: + additionalProperties: {} + default: {} + type: object + required: + - name + responses: + '200': + description: Indicates a successful call. + summary: Update a connector + tags: + - connectors + '/api/actions/connector/{id}/_execute': + post: description: >- - The Swimlane connector uses the Swimlane REST API to create Swimlane - records. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_swimlane' - connector_type_id: - description: The type of connector. - enum: - - .swimlane - example: .swimlane - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_swimlane' - required: - - config - - connector_type_id - - name - - secrets - title: Create Swimlane connector request - type: object - Connectors_create_connector_request_teams: - description: The Microsoft Teams connector uses Incoming Webhooks. - properties: - connector_type_id: - description: The type of connector. - enum: - - .teams - example: .teams - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_teams' - required: - - connector_type_id - - name - - secrets - title: Create Microsoft Teams connector request - type: object - Connectors_create_connector_request_tines: + You can use this API to test an action that involves interaction with + Kibana services or integrations with third-party systems. + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D%2F_execute#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + params: + additionalProperties: {} + type: object + required: + - params + responses: + '200': + description: Indicates a successful call. + summary: Run a connector + tags: + - connectors + /api/actions/connectors: + get: + operationId: '%2Fapi%2Factions%2Fconnectors#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + responses: {} + summary: Get all connectors + tags: + - connectors + /api/actions/list_action_types: + get: + deprecated: true + operationId: '%2Fapi%2Factions%2Flist_action_types#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + responses: {} + summary: Get connector types + tags: + - connectors + '/api/alerting/rule/{id}': + delete: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D#2' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Delete a rule + tags: + - alerting + get: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + actions: + items: + additionalProperties: false + type: object + properties: + alerts_filter: + additionalProperties: false + description: >- + Defines a period that limits whether the action + runs. + type: object + properties: + query: + additionalProperties: false + type: object + properties: + dsl: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL). + type: string + filters: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL) as defined in + the `kbn-es-query` package. + items: + additionalProperties: false + type: object + properties: + $state: + additionalProperties: false + type: object + properties: + store: + description: >- + A filter can be either specific to an + application context or applied globally. + enum: + - appState + - globalState + type: string + required: + - store + meta: + additionalProperties: {} + type: object + query: + additionalProperties: {} + type: object + required: + - meta + type: array + kql: + description: >- + A filter written in Kibana Query Language + (KQL). + type: string + required: + - kql + - filters + timeframe: + additionalProperties: false + type: object + properties: + days: + description: >- + Defines the days of the week that the action + can run, represented as an array of numbers. + For example, `1` represents Monday. An empty + array is equivalent to specifying all the + days of the week. + items: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + type: integer + type: array + hours: + additionalProperties: false + type: object + properties: + end: + description: >- + The end of the time frame in 24-hour + notation (`hh:mm`). + type: string + start: + description: >- + The start of the time frame in 24-hour + notation (`hh:mm`). + type: string + required: + - start + - end + timezone: + description: >- + The ISO time zone for the `hours` values. + Values such as `UTC` and `UTC+1` also work + but lack built-in daylight savings time + support and are not recommended. + type: string + required: + - days + - hours + - timezone + connector_type_id: + description: >- + The type of connector. This property appears in + responses but cannot be set in requests. + type: string + frequency: + additionalProperties: false + type: object + properties: + notify_when: + description: >- + Indicates how often alerts generate actions. + Valid values include: `onActionGroupChange`: + Actions run when the alert status changes; + `onActiveAlert`: Actions run when the alert + becomes active and at each check interval while + the rule conditions are met; + `onThrottleInterval`: Actions run when the alert + becomes active and at the interval specified in + the throttle property while the rule conditions + are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The + recommended method is to set it for each action. + If you set it at the rule level then update the + rule in Kibana, it is automatically changed to + use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + type: string + summary: + description: Indicates whether the action is a summary. + type: boolean + throttle: + description: >- + The throttle interval, which defines how often + an alert generates repeated actions. It is + specified in seconds, minutes, hours, or days + and is applicable only if 'notify_when' is set + to 'onThrottleInterval'. NOTE: You cannot + specify the throttle interval at both the rule + and action level. The recommended method is to + set it for each action. If you set it at the + rule level then update the rule in Kibana, it is + automatically changed to use action-specific + values. + nullable: true + type: string + required: + - summary + - notify_when + - throttle + group: + description: >- + The group name, which affects when the action runs + (for example, when the threshold is met or when the + alert is recovered). Each rule type has a list of + valid action group names. If you don't need to group + actions, set to `default`. + type: string + id: + description: The identifier for the connector saved object. + type: string + params: + additionalProperties: {} + description: >- + The parameters for the action, which are sent to the + connector. The `params` are handled as Mustache + templates and passed a default set of context. + type: object + use_alert_data_for_template: + description: Indicates whether to use alert data as a template. + type: boolean + uuid: + description: >- + A universally unique identifier (UUID) for the + action. + type: string + required: + - id + - connector_type_id + - params + type: array + active_snoozes: + items: + description: List of active snoozes for the rule. + type: string + type: array + alert_delay: + additionalProperties: false + description: >- + Indicates that an alert occurs only when the specified + number of consecutive runs met the rule conditions. + type: object + properties: + active: + description: >- + The number of consecutive runs that must meet the rule + conditions. + type: number + required: + - active + api_key_created_by_user: + description: >- + Indicates whether the API key that is associated with the + rule was created by the user. + nullable: true + type: boolean + api_key_owner: + description: >- + The owner of the API key that is associated with the rule + and used to run background tasks. + nullable: true + type: string + consumer: + description: >- + The name of the application or feature that owns the rule. + For example: `alerts`, `apm`, `discover`, + `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, + `securitySolution`, `siem`, `stackAlerts`, or `uptime`. + type: string + created_at: + description: The date and time that the rule was created. + type: string + created_by: + description: The identifier for the user that created the rule. + nullable: true + type: string + enabled: + description: >- + Indicates whether you want to run the rule on an interval + basis after it is created. + type: boolean + execution_status: + additionalProperties: false + type: object + properties: + error: + additionalProperties: false + type: object + properties: + message: + description: Error message. + type: string + reason: + description: Reason for error. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + type: string + required: + - reason + - message + last_duration: + description: Duration of last execution of the rule. + type: number + last_execution_date: + description: The date and time when rule was executed last. + type: string + status: + description: Status of rule execution. + enum: + - ok + - active + - error + - warning + - pending + - unknown + type: string + warning: + additionalProperties: false + type: object + properties: + message: + description: Warning message. + type: string + reason: + description: Reason for warning. + enum: + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + type: string + required: + - reason + - message + required: + - status + - last_execution_date + id: + description: The identifier for the rule. + type: string + is_snoozed_until: + description: The date when the rule will no longer be snoozed. + nullable: true + type: string + last_run: + additionalProperties: false + nullable: true + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: Number of ignored alerts during last run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: Number of recovered alerts during last run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value could be + succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: Outcome message generated during last rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + mapped_params: + additionalProperties: {} + type: object + monitoring: + additionalProperties: false + description: Monitoring details of the rule. + type: object + properties: + run: + additionalProperties: false + description: Rule run details. + type: object + properties: + calculated_metrics: + additionalProperties: false + description: >- + Calculation of different percentiles and success + ratio. + type: object + properties: + p50: + type: number + p95: + type: number + p99: + type: number + success_ratio: + type: number + required: + - success_ratio + history: + description: History of the rule run. + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule run. + type: number + outcome: + additionalProperties: false + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: >- + Number of ignored alerts during last + run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: >- + Number of recovered alerts during last + run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value + could be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: >- + Outcome message generated during last + rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + success: + description: >- + Indicates whether the rule run was + successful. + type: boolean + timestamp: + description: Time of rule run. + type: number + required: + - success + - timestamp + type: array + last_run: + additionalProperties: false + type: object + properties: + metrics: + additionalProperties: false + type: object + properties: + duration: + description: Duration of most recent rule run. + type: number + gap_duration_s: + description: Duration in seconds of rule run gap. + nullable: true + type: number + total_alerts_created: + description: >- + Total number of alerts created during last + rule run. + nullable: true + type: number + total_alerts_detected: + description: >- + Total number of alerts detected during + last rule run. + nullable: true + type: number + total_indexing_duration_ms: + description: >- + Total time spent indexing documents during + last rule run in milliseconds. + nullable: true + type: number + total_search_duration_ms: + description: >- + Total time spent performing Elasticsearch + searches as measured by Kibana; includes + network latency and time spent serializing + or deserializing the request and response. + nullable: true + type: number + timestamp: + description: Time of the most recent rule run. + type: string + required: + - timestamp + - metrics + required: + - history + - calculated_metrics + - last_run + required: + - run + mute_all: + description: Indicates whether all alerts are muted. + type: boolean + muted_alert_ids: + items: + description: 'List of identifiers of muted alerts. ' + type: string + type: array + name: + description: ' The name of the rule.' + type: string + next_run: + description: Date and time of the next run of the rule. + nullable: true + type: string + notify_when: + description: >- + Indicates how often alerts generate actions. Valid values + include: `onActionGroupChange`: Actions run when the alert + status changes; `onActiveAlert`: Actions run when the + alert becomes active and at each check interval while the + rule conditions are met; `onThrottleInterval`: Actions run + when the alert becomes active and at the interval + specified in the throttle property while the rule + conditions are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The recommended method + is to set it for each action. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + nullable: true + type: string + params: + additionalProperties: {} + description: The parameters for the rule. + type: object + revision: + description: The rule revision number. + type: number + rule_type_id: + description: The rule type identifier. + type: string + running: + description: Indicates whether the rule is running. + nullable: true + type: boolean + schedule: + additionalProperties: false + type: object + properties: + interval: + description: >- + The interval is specified in seconds, minutes, hours, + or days. + type: string + required: + - interval + scheduled_task_id: + description: Identifier of the scheduled task. + type: string + snooze_schedule: + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule snooze schedule. + type: number + id: + description: Identifier of the rule snooze schedule. + type: string + rRule: + additionalProperties: false + type: object + properties: + byhour: + items: + description: Indicates hours of the day to recur. + type: number + type: array + byminute: + items: + description: Indicates minutes of the hour to recur. + type: number + type: array + bymonth: + items: + description: >- + Indicates months of the year that this rule + should recur. + type: number + type: array + bymonthday: + items: + description: Indicates the days of the month to recur. + type: number + type: array + bysecond: + items: + description: Indicates seconds of the day to recur. + type: number + type: array + bysetpos: + items: + description: >- + A positive or negative integer affecting the + nth day of the month. For example, -2 combined + with `byweekday` of FR is 2nd to last Friday + of the month. It is recommended to not set + this manually and just use `byweekday`. + type: number + type: array + byweekday: + items: + anyOf: + - type: string + - type: number + description: >- + Indicates the days of the week to recur or + else nth-day-of-month strings. For example, + "+2TU" second Tuesday of month, "-1FR" last + Friday of the month, which are internally + converted to a `byweekday/bysetpos` + combination. + type: array + byweekno: + items: + description: Indicates number of the week hours to recur. + type: number + type: array + byyearday: + items: + description: >- + Indicates the days of the year that this rule + should recur. + type: number + type: array + count: + description: >- + Number of times the rule should recur until it + stops. + type: number + dtstart: + description: >- + Rule start date in Coordinated Universal Time + (UTC). + type: string + freq: + description: >- + Indicates frequency of the rule. Options are + YEARLY, MONTHLY, WEEKLY, DAILY. + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + type: integer + interval: + description: >- + Indicates the interval of frequency. For + example, 1 and YEARLY is every 1 year, 2 and + WEEKLY is every 2 weeks. + type: number + tzid: + description: Indicates timezone abbreviation. + type: string + until: + description: Recur the rule until this date. + type: string + wkst: + description: 'Indicates the start of week, defaults to Monday.' + enum: + - MO + - TU + - WE + - TH + - FR + - SA + - SU + type: string + required: + - dtstart + - tzid + skipRecurrences: + items: + description: Skips recurrence of rule on this date. + type: string + type: array + required: + - duration + - rRule + type: array + tags: + items: + description: The tags for the rule. + type: string + type: array + throttle: + deprecated: true + description: >- + Deprecated in 8.13.0. Use the `throttle` property in the + action `frequency` object instead. The throttle interval, + which defines how often an alert generates repeated + actions. NOTE: You cannot specify the throttle interval at + both the rule and action level. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + nullable: true + type: string + updated_at: + description: The date and time that the rule was updated most recently. + type: string + updated_by: + description: >- + The identifier for the user that updated this rule most + recently. + nullable: true + type: string + view_in_app_relative_url: + description: Relative URL to view rule in the app. + nullable: true + type: string + required: + - id + - enabled + - name + - tags + - rule_type_id + - consumer + - schedule + - actions + - params + - created_by + - updated_by + - created_at + - updated_at + - api_key_owner + - mute_all + - muted_alert_ids + - execution_status + - revision + description: Indicates a successful call. + summary: Get rule details + tags: + - alerting + post: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%3F%7D#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: >- + The identifier for the rule. If it is omitted, an ID is randomly + generated. + in: path + name: id + required: false + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + actions: + default: [] + items: + additionalProperties: false + description: An action that runs under defined conditions. + type: object + properties: + alerts_filter: + additionalProperties: false + description: >- + Conditions that affect whether the action runs. If you + specify multiple conditions, all conditions must be + met for the action to run. For example, if an alert + occurs within the specified time frame and matches the + query, the action runs. + type: object + properties: + query: + additionalProperties: false + type: object + properties: + dsl: + description: >- + A filter written in Elasticsearch Query Domain + Specific Language (DSL). + type: string + filters: + description: >- + A filter written in Elasticsearch Query Domain + Specific Language (DSL) as defined in the + `kbn-es-query` package. + items: + additionalProperties: false + type: object + properties: + $state: + additionalProperties: false + type: object + properties: + store: + description: >- + A filter can be either specific to an + application context or applied globally. + enum: + - appState + - globalState + type: string + required: + - store + meta: + additionalProperties: {} + type: object + query: + additionalProperties: {} + type: object + required: + - meta + type: array + kql: + description: >- + A filter written in Kibana Query Language + (KQL). + type: string + required: + - kql + - filters + timeframe: + additionalProperties: false + description: >- + Defines a period that limits whether the action + runs. + type: object + properties: + days: + description: >- + Defines the days of the week that the action + can run, represented as an array of numbers. + For example, `1` represents Monday. An empty + array is equivalent to specifying all the days + of the week. + items: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + type: integer + type: array + hours: + additionalProperties: false + description: >- + Defines the range of time in a day that the + action can run. If the `start` value is + `00:00` and the `end` value is `24:00`, + actions be generated all day. + type: object + properties: + end: + description: >- + The end of the time frame in 24-hour + notation (`hh:mm`). + type: string + start: + description: >- + The start of the time frame in 24-hour + notation (`hh:mm`). + type: string + required: + - start + - end + timezone: + description: >- + The ISO time zone for the `hours` values. + Values such as `UTC` and `UTC+1` also work but + lack built-in daylight savings time support + and are not recommended. + type: string + required: + - days + - hours + - timezone + frequency: + additionalProperties: false + type: object + properties: + notify_when: + description: >- + Indicates how often alerts generate actions. Valid + values include: `onActionGroupChange`: Actions run + when the alert status changes; `onActiveAlert`: + Actions run when the alert becomes active and at + each check interval while the rule conditions are + met; `onThrottleInterval`: Actions run when the + alert becomes active and at the interval specified + in the throttle property while the rule conditions + are met. NOTE: You cannot specify `notify_when` at + both the rule and action level. The recommended + method is to set it for each action. If you set it + at the rule level then update the rule in Kibana, + it is automatically changed to use action-specific + values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + type: string + summary: + description: Indicates whether the action is a summary. + type: boolean + throttle: + description: >- + The throttle interval, which defines how often an + alert generates repeated actions. It is specified + in seconds, minutes, hours, or days and is + applicable only if `notify_when` is set to + `onThrottleInterval`. NOTE: You cannot specify the + throttle interval at both the rule and action + level. The recommended method is to set it for + each action. If you set it at the rule level then + update the rule in Kibana, it is automatically + changed to use action-specific values. + nullable: true + type: string + required: + - summary + - notify_when + - throttle + group: + description: >- + The group name, which affects when the action runs + (for example, when the threshold is met or when the + alert is recovered). Each rule type has a list of + valid action group names. If you don't need to group + actions, set to `default`. + type: string + id: + description: The identifier for the connector saved object. + type: string + params: + additionalProperties: {} + default: {} + description: >- + The parameters for the action, which are sent to the + connector. The `params` are handled as Mustache + templates and passed a default set of context. + type: object + use_alert_data_for_template: + description: Indicates whether to use alert data as a template. + type: boolean + uuid: + description: A universally unique identifier (UUID) for the action. + type: string + required: + - id + type: array + alert_delay: + additionalProperties: false + description: >- + Indicates that an alert occurs only when the specified + number of consecutive runs met the rule conditions. + type: object + properties: + active: + description: >- + The number of consecutive runs that must meet the rule + conditions. + type: number + required: + - active + consumer: + description: >- + The name of the application or feature that owns the rule. + For example: `alerts`, `apm`, `discover`, `infrastructure`, + `logs`, `metrics`, `ml`, `monitoring`, `securitySolution`, + `siem`, `stackAlerts`, or `uptime`. + type: string + enabled: + default: true + description: >- + Indicates whether you want to run the rule on an interval + basis after it is created. + type: boolean + name: + description: >- + The name of the rule. While this name does not have to be + unique, a distinctive name can help you identify a rule. + type: string + notify_when: + description: >- + Indicates how often alerts generate actions. Valid values + include: `onActionGroupChange`: Actions run when the alert + status changes; `onActiveAlert`: Actions run when the alert + becomes active and at each check interval while the rule + conditions are met; `onThrottleInterval`: Actions run when + the alert becomes active and at the interval specified in + the throttle property while the rule conditions are met. + NOTE: You cannot specify `notify_when` at both the rule and + action level. The recommended method is to set it for each + action. If you set it at the rule level then update the rule + in Kibana, it is automatically changed to use + action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + nullable: true + type: string + params: + additionalProperties: {} + default: {} + description: The parameters for the rule. + type: object + rule_type_id: + description: The rule type identifier. + type: string + schedule: + additionalProperties: false + description: >- + The check interval, which specifies how frequently the rule + conditions are checked. + type: object + properties: + interval: + description: >- + The interval is specified in seconds, minutes, hours, or + days. + type: string + required: + - interval + tags: + default: [] + description: The tags for the rule. + items: + type: string + type: array + throttle: + description: >- + Use the `throttle` property in the action `frequency` object + instead. The throttle interval, which defines how often an + alert generates repeated actions. NOTE: You cannot specify + the throttle interval at both the rule and action level. If + you set it at the rule level then update the rule in Kibana, + it is automatically changed to use action-specific values. + nullable: true + type: string + required: + - name + - rule_type_id + - consumer + - schedule + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + actions: + items: + additionalProperties: false + type: object + properties: + alerts_filter: + additionalProperties: false + description: >- + Defines a period that limits whether the action + runs. + type: object + properties: + query: + additionalProperties: false + type: object + properties: + dsl: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL). + type: string + filters: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL) as defined in + the `kbn-es-query` package. + items: + additionalProperties: false + type: object + properties: + $state: + additionalProperties: false + type: object + properties: + store: + description: >- + A filter can be either specific to an + application context or applied globally. + enum: + - appState + - globalState + type: string + required: + - store + meta: + additionalProperties: {} + type: object + query: + additionalProperties: {} + type: object + required: + - meta + type: array + kql: + description: >- + A filter written in Kibana Query Language + (KQL). + type: string + required: + - kql + - filters + timeframe: + additionalProperties: false + type: object + properties: + days: + description: >- + Defines the days of the week that the action + can run, represented as an array of numbers. + For example, `1` represents Monday. An empty + array is equivalent to specifying all the + days of the week. + items: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + type: integer + type: array + hours: + additionalProperties: false + type: object + properties: + end: + description: >- + The end of the time frame in 24-hour + notation (`hh:mm`). + type: string + start: + description: >- + The start of the time frame in 24-hour + notation (`hh:mm`). + type: string + required: + - start + - end + timezone: + description: >- + The ISO time zone for the `hours` values. + Values such as `UTC` and `UTC+1` also work + but lack built-in daylight savings time + support and are not recommended. + type: string + required: + - days + - hours + - timezone + connector_type_id: + description: >- + The type of connector. This property appears in + responses but cannot be set in requests. + type: string + frequency: + additionalProperties: false + type: object + properties: + notify_when: + description: >- + Indicates how often alerts generate actions. + Valid values include: `onActionGroupChange`: + Actions run when the alert status changes; + `onActiveAlert`: Actions run when the alert + becomes active and at each check interval while + the rule conditions are met; + `onThrottleInterval`: Actions run when the alert + becomes active and at the interval specified in + the throttle property while the rule conditions + are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The + recommended method is to set it for each action. + If you set it at the rule level then update the + rule in Kibana, it is automatically changed to + use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + type: string + summary: + description: Indicates whether the action is a summary. + type: boolean + throttle: + description: >- + The throttle interval, which defines how often + an alert generates repeated actions. It is + specified in seconds, minutes, hours, or days + and is applicable only if 'notify_when' is set + to 'onThrottleInterval'. NOTE: You cannot + specify the throttle interval at both the rule + and action level. The recommended method is to + set it for each action. If you set it at the + rule level then update the rule in Kibana, it is + automatically changed to use action-specific + values. + nullable: true + type: string + required: + - summary + - notify_when + - throttle + group: + description: >- + The group name, which affects when the action runs + (for example, when the threshold is met or when the + alert is recovered). Each rule type has a list of + valid action group names. If you don't need to group + actions, set to `default`. + type: string + id: + description: The identifier for the connector saved object. + type: string + params: + additionalProperties: {} + description: >- + The parameters for the action, which are sent to the + connector. The `params` are handled as Mustache + templates and passed a default set of context. + type: object + use_alert_data_for_template: + description: Indicates whether to use alert data as a template. + type: boolean + uuid: + description: >- + A universally unique identifier (UUID) for the + action. + type: string + required: + - id + - connector_type_id + - params + type: array + active_snoozes: + items: + description: List of active snoozes for the rule. + type: string + type: array + alert_delay: + additionalProperties: false + description: >- + Indicates that an alert occurs only when the specified + number of consecutive runs met the rule conditions. + type: object + properties: + active: + description: >- + The number of consecutive runs that must meet the rule + conditions. + type: number + required: + - active + api_key_created_by_user: + description: >- + Indicates whether the API key that is associated with the + rule was created by the user. + nullable: true + type: boolean + api_key_owner: + description: >- + The owner of the API key that is associated with the rule + and used to run background tasks. + nullable: true + type: string + consumer: + description: >- + The name of the application or feature that owns the rule. + For example: `alerts`, `apm`, `discover`, + `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, + `securitySolution`, `siem`, `stackAlerts`, or `uptime`. + type: string + created_at: + description: The date and time that the rule was created. + type: string + created_by: + description: The identifier for the user that created the rule. + nullable: true + type: string + enabled: + description: >- + Indicates whether you want to run the rule on an interval + basis after it is created. + type: boolean + execution_status: + additionalProperties: false + type: object + properties: + error: + additionalProperties: false + type: object + properties: + message: + description: Error message. + type: string + reason: + description: Reason for error. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + type: string + required: + - reason + - message + last_duration: + description: Duration of last execution of the rule. + type: number + last_execution_date: + description: The date and time when rule was executed last. + type: string + status: + description: Status of rule execution. + enum: + - ok + - active + - error + - warning + - pending + - unknown + type: string + warning: + additionalProperties: false + type: object + properties: + message: + description: Warning message. + type: string + reason: + description: Reason for warning. + enum: + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + type: string + required: + - reason + - message + required: + - status + - last_execution_date + id: + description: The identifier for the rule. + type: string + is_snoozed_until: + description: The date when the rule will no longer be snoozed. + nullable: true + type: string + last_run: + additionalProperties: false + nullable: true + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: Number of ignored alerts during last run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: Number of recovered alerts during last run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value could be + succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: Outcome message generated during last rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + mapped_params: + additionalProperties: {} + type: object + monitoring: + additionalProperties: false + description: Monitoring details of the rule. + type: object + properties: + run: + additionalProperties: false + description: Rule run details. + type: object + properties: + calculated_metrics: + additionalProperties: false + description: >- + Calculation of different percentiles and success + ratio. + type: object + properties: + p50: + type: number + p95: + type: number + p99: + type: number + success_ratio: + type: number + required: + - success_ratio + history: + description: History of the rule run. + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule run. + type: number + outcome: + additionalProperties: false + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: >- + Number of ignored alerts during last + run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: >- + Number of recovered alerts during last + run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value + could be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: >- + Outcome message generated during last + rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + success: + description: >- + Indicates whether the rule run was + successful. + type: boolean + timestamp: + description: Time of rule run. + type: number + required: + - success + - timestamp + type: array + last_run: + additionalProperties: false + type: object + properties: + metrics: + additionalProperties: false + type: object + properties: + duration: + description: Duration of most recent rule run. + type: number + gap_duration_s: + description: Duration in seconds of rule run gap. + nullable: true + type: number + total_alerts_created: + description: >- + Total number of alerts created during last + rule run. + nullable: true + type: number + total_alerts_detected: + description: >- + Total number of alerts detected during + last rule run. + nullable: true + type: number + total_indexing_duration_ms: + description: >- + Total time spent indexing documents during + last rule run in milliseconds. + nullable: true + type: number + total_search_duration_ms: + description: >- + Total time spent performing Elasticsearch + searches as measured by Kibana; includes + network latency and time spent serializing + or deserializing the request and response. + nullable: true + type: number + timestamp: + description: Time of the most recent rule run. + type: string + required: + - timestamp + - metrics + required: + - history + - calculated_metrics + - last_run + required: + - run + mute_all: + description: Indicates whether all alerts are muted. + type: boolean + muted_alert_ids: + items: + description: 'List of identifiers of muted alerts. ' + type: string + type: array + name: + description: ' The name of the rule.' + type: string + next_run: + description: Date and time of the next run of the rule. + nullable: true + type: string + notify_when: + description: >- + Indicates how often alerts generate actions. Valid values + include: `onActionGroupChange`: Actions run when the alert + status changes; `onActiveAlert`: Actions run when the + alert becomes active and at each check interval while the + rule conditions are met; `onThrottleInterval`: Actions run + when the alert becomes active and at the interval + specified in the throttle property while the rule + conditions are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The recommended method + is to set it for each action. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + nullable: true + type: string + params: + additionalProperties: {} + description: The parameters for the rule. + type: object + revision: + description: The rule revision number. + type: number + rule_type_id: + description: The rule type identifier. + type: string + running: + description: Indicates whether the rule is running. + nullable: true + type: boolean + schedule: + additionalProperties: false + type: object + properties: + interval: + description: >- + The interval is specified in seconds, minutes, hours, + or days. + type: string + required: + - interval + scheduled_task_id: + description: Identifier of the scheduled task. + type: string + snooze_schedule: + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule snooze schedule. + type: number + id: + description: Identifier of the rule snooze schedule. + type: string + rRule: + additionalProperties: false + type: object + properties: + byhour: + items: + description: Indicates hours of the day to recur. + type: number + type: array + byminute: + items: + description: Indicates minutes of the hour to recur. + type: number + type: array + bymonth: + items: + description: >- + Indicates months of the year that this rule + should recur. + type: number + type: array + bymonthday: + items: + description: Indicates the days of the month to recur. + type: number + type: array + bysecond: + items: + description: Indicates seconds of the day to recur. + type: number + type: array + bysetpos: + items: + description: >- + A positive or negative integer affecting the + nth day of the month. For example, -2 combined + with `byweekday` of FR is 2nd to last Friday + of the month. It is recommended to not set + this manually and just use `byweekday`. + type: number + type: array + byweekday: + items: + anyOf: + - type: string + - type: number + description: >- + Indicates the days of the week to recur or + else nth-day-of-month strings. For example, + "+2TU" second Tuesday of month, "-1FR" last + Friday of the month, which are internally + converted to a `byweekday/bysetpos` + combination. + type: array + byweekno: + items: + description: Indicates number of the week hours to recur. + type: number + type: array + byyearday: + items: + description: >- + Indicates the days of the year that this rule + should recur. + type: number + type: array + count: + description: >- + Number of times the rule should recur until it + stops. + type: number + dtstart: + description: >- + Rule start date in Coordinated Universal Time + (UTC). + type: string + freq: + description: >- + Indicates frequency of the rule. Options are + YEARLY, MONTHLY, WEEKLY, DAILY. + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + type: integer + interval: + description: >- + Indicates the interval of frequency. For + example, 1 and YEARLY is every 1 year, 2 and + WEEKLY is every 2 weeks. + type: number + tzid: + description: Indicates timezone abbreviation. + type: string + until: + description: Recur the rule until this date. + type: string + wkst: + description: 'Indicates the start of week, defaults to Monday.' + enum: + - MO + - TU + - WE + - TH + - FR + - SA + - SU + type: string + required: + - dtstart + - tzid + skipRecurrences: + items: + description: Skips recurrence of rule on this date. + type: string + type: array + required: + - duration + - rRule + type: array + tags: + items: + description: The tags for the rule. + type: string + type: array + throttle: + deprecated: true + description: >- + Deprecated in 8.13.0. Use the `throttle` property in the + action `frequency` object instead. The throttle interval, + which defines how often an alert generates repeated + actions. NOTE: You cannot specify the throttle interval at + both the rule and action level. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + nullable: true + type: string + updated_at: + description: The date and time that the rule was updated most recently. + type: string + updated_by: + description: >- + The identifier for the user that updated this rule most + recently. + nullable: true + type: string + view_in_app_relative_url: + description: Relative URL to view rule in the app. + nullable: true + type: string + required: + - id + - enabled + - name + - tags + - rule_type_id + - consumer + - schedule + - actions + - params + - created_by + - updated_by + - created_at + - updated_at + - api_key_owner + - mute_all + - muted_alert_ids + - execution_status + - revision + description: Indicates a successful call. + summary: Create a rule + tags: + - alerting + put: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D#1' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + actions: + default: [] + items: + additionalProperties: false + description: An action that runs under defined conditions. + type: object + properties: + alerts_filter: + additionalProperties: false + type: object + properties: + query: + additionalProperties: false + type: object + properties: + dsl: + description: >- + A filter written in Elasticsearch Query Domain + Specific Language (DSL). + type: string + filters: + description: >- + A filter written in Elasticsearch Query Domain + Specific Language (DSL) as defined in the + `kbn-es-query` package. + items: + additionalProperties: false + type: object + properties: + $state: + additionalProperties: false + type: object + properties: + store: + description: >- + A filter can be either specific to an + application context or applied globally. + enum: + - appState + - globalState + type: string + required: + - store + meta: + additionalProperties: {} + type: object + query: + additionalProperties: {} + type: object + required: + - meta + type: array + kql: + description: >- + A filter written in Kibana Query Language + (KQL). + type: string + required: + - kql + - filters + timeframe: + additionalProperties: false + description: >- + Defines a period that limits whether the action + runs. + type: object + properties: + days: + description: >- + Defines the days of the week that the action + can run, represented as an array of numbers. + For example, `1` represents Monday. An empty + array is equivalent to specifying all the days + of the week. + items: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + type: integer + type: array + hours: + additionalProperties: false + description: >- + Defines the range of time in a day that the + action can run. If the `start` value is + `00:00` and the `end` value is `24:00`, + actions be generated all day. + type: object + properties: + end: + description: >- + The end of the time frame in 24-hour + notation (`hh:mm`). + type: string + start: + description: >- + The start of the time frame in 24-hour + notation (`hh:mm`). + type: string + required: + - start + - end + timezone: + description: >- + The ISO time zone for the `hours` values. + Values such as `UTC` and `UTC+1` also work but + lack built-in daylight savings time support + and are not recommended. + type: string + required: + - days + - hours + - timezone + frequency: + additionalProperties: false + type: object + properties: + notify_when: + description: >- + Indicates how often alerts generate actions. Valid + values include: `onActionGroupChange`: Actions run + when the alert status changes; `onActiveAlert`: + Actions run when the alert becomes active and at + each check interval while the rule conditions are + met; `onThrottleInterval`: Actions run when the + alert becomes active and at the interval specified + in the throttle property while the rule conditions + are met. NOTE: You cannot specify `notify_when` at + both the rule and action level. The recommended + method is to set it for each action. If you set it + at the rule level then update the rule in Kibana, + it is automatically changed to use action-specific + values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + type: string + summary: + description: Indicates whether the action is a summary. + type: boolean + throttle: + description: >- + The throttle interval, which defines how often an + alert generates repeated actions. It is specified + in seconds, minutes, hours, or days and is + applicable only if `notify_when` is set to + `onThrottleInterval`. NOTE: You cannot specify the + throttle interval at both the rule and action + level. The recommended method is to set it for + each action. If you set it at the rule level then + update the rule in Kibana, it is automatically + changed to use action-specific values. + nullable: true + type: string + required: + - summary + - notify_when + - throttle + group: + description: >- + The group name, which affects when the action runs + (for example, when the threshold is met or when the + alert is recovered). Each rule type has a list of + valid action group names. If you don't need to group + actions, set to `default`. + type: string + id: + description: The identifier for the connector saved object. + type: string + params: + additionalProperties: {} + default: {} + description: >- + The parameters for the action, which are sent to the + connector. The `params` are handled as Mustache + templates and passed a default set of context. + type: object + use_alert_data_for_template: + description: Indicates whether to use alert data as a template. + type: boolean + uuid: + description: A universally unique identifier (UUID) for the action. + type: string + required: + - id + type: array + alert_delay: + additionalProperties: false + description: >- + Indicates that an alert occurs only when the specified + number of consecutive runs met the rule conditions. + type: object + properties: + active: + description: >- + The number of consecutive runs that must meet the rule + conditions. + type: number + required: + - active + name: + description: >- + The name of the rule. While this name does not have to be + unique, a distinctive name can help you identify a rule. + type: string + notify_when: + description: >- + Indicates how often alerts generate actions. Valid values + include: `onActionGroupChange`: Actions run when the alert + status changes; `onActiveAlert`: Actions run when the alert + becomes active and at each check interval while the rule + conditions are met; `onThrottleInterval`: Actions run when + the alert becomes active and at the interval specified in + the throttle property while the rule conditions are met. + NOTE: You cannot specify `notify_when` at both the rule and + action level. The recommended method is to set it for each + action. If you set it at the rule level then update the rule + in Kibana, it is automatically changed to use + action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + nullable: true + type: string + params: + additionalProperties: {} + default: {} + description: The parameters for the rule. + type: object + schedule: + additionalProperties: false + type: object + properties: + interval: + description: >- + The interval is specified in seconds, minutes, hours, or + days. + type: string + required: + - interval + tags: + default: [] + items: + description: The tags for the rule. + type: string + type: array + throttle: + description: >- + Use the `throttle` property in the action `frequency` object + instead. The throttle interval, which defines how often an + alert generates repeated actions. NOTE: You cannot specify + the throttle interval at both the rule and action level. If + you set it at the rule level then update the rule in Kibana, + it is automatically changed to use action-specific values. + nullable: true + type: string + required: + - name + - schedule + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + actions: + items: + additionalProperties: false + type: object + properties: + alerts_filter: + additionalProperties: false + description: >- + Defines a period that limits whether the action + runs. + type: object + properties: + query: + additionalProperties: false + type: object + properties: + dsl: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL). + type: string + filters: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL) as defined in + the `kbn-es-query` package. + items: + additionalProperties: false + type: object + properties: + $state: + additionalProperties: false + type: object + properties: + store: + description: >- + A filter can be either specific to an + application context or applied globally. + enum: + - appState + - globalState + type: string + required: + - store + meta: + additionalProperties: {} + type: object + query: + additionalProperties: {} + type: object + required: + - meta + type: array + kql: + description: >- + A filter written in Kibana Query Language + (KQL). + type: string + required: + - kql + - filters + timeframe: + additionalProperties: false + type: object + properties: + days: + description: >- + Defines the days of the week that the action + can run, represented as an array of numbers. + For example, `1` represents Monday. An empty + array is equivalent to specifying all the + days of the week. + items: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + type: integer + type: array + hours: + additionalProperties: false + type: object + properties: + end: + description: >- + The end of the time frame in 24-hour + notation (`hh:mm`). + type: string + start: + description: >- + The start of the time frame in 24-hour + notation (`hh:mm`). + type: string + required: + - start + - end + timezone: + description: >- + The ISO time zone for the `hours` values. + Values such as `UTC` and `UTC+1` also work + but lack built-in daylight savings time + support and are not recommended. + type: string + required: + - days + - hours + - timezone + connector_type_id: + description: >- + The type of connector. This property appears in + responses but cannot be set in requests. + type: string + frequency: + additionalProperties: false + type: object + properties: + notify_when: + description: >- + Indicates how often alerts generate actions. + Valid values include: `onActionGroupChange`: + Actions run when the alert status changes; + `onActiveAlert`: Actions run when the alert + becomes active and at each check interval while + the rule conditions are met; + `onThrottleInterval`: Actions run when the alert + becomes active and at the interval specified in + the throttle property while the rule conditions + are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The + recommended method is to set it for each action. + If you set it at the rule level then update the + rule in Kibana, it is automatically changed to + use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + type: string + summary: + description: Indicates whether the action is a summary. + type: boolean + throttle: + description: >- + The throttle interval, which defines how often + an alert generates repeated actions. It is + specified in seconds, minutes, hours, or days + and is applicable only if 'notify_when' is set + to 'onThrottleInterval'. NOTE: You cannot + specify the throttle interval at both the rule + and action level. The recommended method is to + set it for each action. If you set it at the + rule level then update the rule in Kibana, it is + automatically changed to use action-specific + values. + nullable: true + type: string + required: + - summary + - notify_when + - throttle + group: + description: >- + The group name, which affects when the action runs + (for example, when the threshold is met or when the + alert is recovered). Each rule type has a list of + valid action group names. If you don't need to group + actions, set to `default`. + type: string + id: + description: The identifier for the connector saved object. + type: string + params: + additionalProperties: {} + description: >- + The parameters for the action, which are sent to the + connector. The `params` are handled as Mustache + templates and passed a default set of context. + type: object + use_alert_data_for_template: + description: Indicates whether to use alert data as a template. + type: boolean + uuid: + description: >- + A universally unique identifier (UUID) for the + action. + type: string + required: + - id + - connector_type_id + - params + type: array + active_snoozes: + items: + description: List of active snoozes for the rule. + type: string + type: array + alert_delay: + additionalProperties: false + description: >- + Indicates that an alert occurs only when the specified + number of consecutive runs met the rule conditions. + type: object + properties: + active: + description: >- + The number of consecutive runs that must meet the rule + conditions. + type: number + required: + - active + api_key_created_by_user: + description: >- + Indicates whether the API key that is associated with the + rule was created by the user. + nullable: true + type: boolean + api_key_owner: + description: >- + The owner of the API key that is associated with the rule + and used to run background tasks. + nullable: true + type: string + consumer: + description: >- + The name of the application or feature that owns the rule. + For example: `alerts`, `apm`, `discover`, + `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, + `securitySolution`, `siem`, `stackAlerts`, or `uptime`. + type: string + created_at: + description: The date and time that the rule was created. + type: string + created_by: + description: The identifier for the user that created the rule. + nullable: true + type: string + enabled: + description: >- + Indicates whether you want to run the rule on an interval + basis after it is created. + type: boolean + execution_status: + additionalProperties: false + type: object + properties: + error: + additionalProperties: false + type: object + properties: + message: + description: Error message. + type: string + reason: + description: Reason for error. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + type: string + required: + - reason + - message + last_duration: + description: Duration of last execution of the rule. + type: number + last_execution_date: + description: The date and time when rule was executed last. + type: string + status: + description: Status of rule execution. + enum: + - ok + - active + - error + - warning + - pending + - unknown + type: string + warning: + additionalProperties: false + type: object + properties: + message: + description: Warning message. + type: string + reason: + description: Reason for warning. + enum: + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + type: string + required: + - reason + - message + required: + - status + - last_execution_date + id: + description: The identifier for the rule. + type: string + is_snoozed_until: + description: The date when the rule will no longer be snoozed. + nullable: true + type: string + last_run: + additionalProperties: false + nullable: true + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: Number of ignored alerts during last run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: Number of recovered alerts during last run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value could be + succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: Outcome message generated during last rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + mapped_params: + additionalProperties: {} + type: object + monitoring: + additionalProperties: false + description: Monitoring details of the rule. + type: object + properties: + run: + additionalProperties: false + description: Rule run details. + type: object + properties: + calculated_metrics: + additionalProperties: false + description: >- + Calculation of different percentiles and success + ratio. + type: object + properties: + p50: + type: number + p95: + type: number + p99: + type: number + success_ratio: + type: number + required: + - success_ratio + history: + description: History of the rule run. + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule run. + type: number + outcome: + additionalProperties: false + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: >- + Number of ignored alerts during last + run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: >- + Number of recovered alerts during last + run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value + could be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: >- + Outcome message generated during last + rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + success: + description: >- + Indicates whether the rule run was + successful. + type: boolean + timestamp: + description: Time of rule run. + type: number + required: + - success + - timestamp + type: array + last_run: + additionalProperties: false + type: object + properties: + metrics: + additionalProperties: false + type: object + properties: + duration: + description: Duration of most recent rule run. + type: number + gap_duration_s: + description: Duration in seconds of rule run gap. + nullable: true + type: number + total_alerts_created: + description: >- + Total number of alerts created during last + rule run. + nullable: true + type: number + total_alerts_detected: + description: >- + Total number of alerts detected during + last rule run. + nullable: true + type: number + total_indexing_duration_ms: + description: >- + Total time spent indexing documents during + last rule run in milliseconds. + nullable: true + type: number + total_search_duration_ms: + description: >- + Total time spent performing Elasticsearch + searches as measured by Kibana; includes + network latency and time spent serializing + or deserializing the request and response. + nullable: true + type: number + timestamp: + description: Time of the most recent rule run. + type: string + required: + - timestamp + - metrics + required: + - history + - calculated_metrics + - last_run + required: + - run + mute_all: + description: Indicates whether all alerts are muted. + type: boolean + muted_alert_ids: + items: + description: 'List of identifiers of muted alerts. ' + type: string + type: array + name: + description: ' The name of the rule.' + type: string + next_run: + description: Date and time of the next run of the rule. + nullable: true + type: string + notify_when: + description: >- + Indicates how often alerts generate actions. Valid values + include: `onActionGroupChange`: Actions run when the alert + status changes; `onActiveAlert`: Actions run when the + alert becomes active and at each check interval while the + rule conditions are met; `onThrottleInterval`: Actions run + when the alert becomes active and at the interval + specified in the throttle property while the rule + conditions are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The recommended method + is to set it for each action. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + nullable: true + type: string + params: + additionalProperties: {} + description: The parameters for the rule. + type: object + revision: + description: The rule revision number. + type: number + rule_type_id: + description: The rule type identifier. + type: string + running: + description: Indicates whether the rule is running. + nullable: true + type: boolean + schedule: + additionalProperties: false + type: object + properties: + interval: + description: >- + The interval is specified in seconds, minutes, hours, + or days. + type: string + required: + - interval + scheduled_task_id: + description: Identifier of the scheduled task. + type: string + snooze_schedule: + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule snooze schedule. + type: number + id: + description: Identifier of the rule snooze schedule. + type: string + rRule: + additionalProperties: false + type: object + properties: + byhour: + items: + description: Indicates hours of the day to recur. + type: number + type: array + byminute: + items: + description: Indicates minutes of the hour to recur. + type: number + type: array + bymonth: + items: + description: >- + Indicates months of the year that this rule + should recur. + type: number + type: array + bymonthday: + items: + description: Indicates the days of the month to recur. + type: number + type: array + bysecond: + items: + description: Indicates seconds of the day to recur. + type: number + type: array + bysetpos: + items: + description: >- + A positive or negative integer affecting the + nth day of the month. For example, -2 combined + with `byweekday` of FR is 2nd to last Friday + of the month. It is recommended to not set + this manually and just use `byweekday`. + type: number + type: array + byweekday: + items: + anyOf: + - type: string + - type: number + description: >- + Indicates the days of the week to recur or + else nth-day-of-month strings. For example, + "+2TU" second Tuesday of month, "-1FR" last + Friday of the month, which are internally + converted to a `byweekday/bysetpos` + combination. + type: array + byweekno: + items: + description: Indicates number of the week hours to recur. + type: number + type: array + byyearday: + items: + description: >- + Indicates the days of the year that this rule + should recur. + type: number + type: array + count: + description: >- + Number of times the rule should recur until it + stops. + type: number + dtstart: + description: >- + Rule start date in Coordinated Universal Time + (UTC). + type: string + freq: + description: >- + Indicates frequency of the rule. Options are + YEARLY, MONTHLY, WEEKLY, DAILY. + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + type: integer + interval: + description: >- + Indicates the interval of frequency. For + example, 1 and YEARLY is every 1 year, 2 and + WEEKLY is every 2 weeks. + type: number + tzid: + description: Indicates timezone abbreviation. + type: string + until: + description: Recur the rule until this date. + type: string + wkst: + description: 'Indicates the start of week, defaults to Monday.' + enum: + - MO + - TU + - WE + - TH + - FR + - SA + - SU + type: string + required: + - dtstart + - tzid + skipRecurrences: + items: + description: Skips recurrence of rule on this date. + type: string + type: array + required: + - duration + - rRule + type: array + tags: + items: + description: The tags for the rule. + type: string + type: array + throttle: + deprecated: true + description: >- + Deprecated in 8.13.0. Use the `throttle` property in the + action `frequency` object instead. The throttle interval, + which defines how often an alert generates repeated + actions. NOTE: You cannot specify the throttle interval at + both the rule and action level. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + nullable: true + type: string + updated_at: + description: The date and time that the rule was updated most recently. + type: string + updated_by: + description: >- + The identifier for the user that updated this rule most + recently. + nullable: true + type: string + view_in_app_relative_url: + description: Relative URL to view rule in the app. + nullable: true + type: string + required: + - id + - enabled + - name + - tags + - rule_type_id + - consumer + - schedule + - actions + - params + - created_by + - updated_by + - created_at + - updated_at + - api_key_owner + - mute_all + - muted_alert_ids + - execution_status + - revision + description: Indicates a successful call. + summary: Update a rule + tags: + - alerting + '/api/alerting/rule/{id}/_disable': + post: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_disable#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + nullable: true + type: object + properties: + untrack: + description: Defines whether this rule's alerts should be untracked. + type: boolean + x-oas-optional: true + responses: + '204': + description: Indicates a successful call. + summary: Disable a rule + tags: + - alerting + '/api/alerting/rule/{id}/_enable': + post: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_enable#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Enable a rule + tags: + - alerting + '/api/alerting/rule/{id}/_mute_all': + post: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_mute_all#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Mute all alerts + tags: + - alerting + '/api/alerting/rule/{id}/_unmute_all': + post: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_unmute_all#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Unmute all alerts + tags: + - alerting + '/api/alerting/rule/{id}/_update_api_key': + post: + operationId: '%2Fapi%2Falerting%2Frule%2F%7Bid%7D%2F_update_api_key#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Update the API key for a rule + tags: + - alerting + '/api/alerting/rule/{rule_id}/alert/{alert_id}/_mute': + post: + operationId: >- + %2Fapi%2Falerting%2Frule%2F%7Brule_id%7D%2Falert%2F%7Balert_id%7D%2F_mute#0 + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: rule_id + required: true + schema: + type: string + - description: The identifier for the alert. + in: path + name: alert_id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Mute an alert + tags: + - alerting + '/api/alerting/rule/{rule_id}/alert/{alert_id}/_unmute': + post: + operationId: >- + %2Fapi%2Falerting%2Frule%2F%7Brule_id%7D%2Falert%2F%7Balert_id%7D%2F_unmute#0 + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: The identifier for the rule. + in: path + name: rule_id + required: true + schema: + type: string + - description: The identifier for the alert. + in: path + name: alert_id + required: true + schema: + type: string + responses: + '204': + description: Indicates a successful call. + summary: Unmute an alert + tags: + - alerting + /api/alerting/rules/_find: + get: + operationId: '%2Fapi%2Falerting%2Frules%2F_find#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: The number of rules to return per page. + in: query + name: per_page + required: false + schema: + default: 10 + minimum: 0 + type: number + - description: The page number to return. + in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + type: number + - description: >- + An Elasticsearch simple_query_string query that filters the objects + in the response. + in: query + name: search + required: false + schema: + type: string + - description: The default operator to use for the simple_query_string. + in: query + name: default_search_operator + required: false + schema: + default: OR + enum: + - OR + - AND + type: string + - description: The fields to perform the simple_query_string parsed query against. + in: query + name: search_fields + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: string + - description: >- + Determines which field is used to sort the results. The field must + exist in the `attributes` key of the response. + in: query + name: sort_field + required: false + schema: + type: string + - description: Determines the sort order. + in: query + name: sort_order + required: false + schema: + enum: + - asc + - desc + type: string + - description: >- + Filters the rules that have a relation with the reference objects + with a specific type and identifier. + in: query + name: has_reference + required: false + schema: + additionalProperties: false + nullable: true + type: object + properties: + id: + type: string + type: + type: string + required: + - type + - id + - in: query + name: fields + required: false + schema: + items: + description: The fields to return in the `attributes` key of the response. + type: string + type: array + - description: >- + A KQL string that you filter with an attribute from your saved + object. It should look like `savedObjectType.attributes.title: + "myTitle"`. However, if you used a direct attribute of a saved + object, such as `updatedAt`, you must define your filter, for + example, `savedObjectType.updatedAt > 2018-12-22`. + in: query + name: filter + required: false + schema: + type: string + - in: query + name: filter_consumers + required: false + schema: + items: + description: List of consumers to filter. + type: string + type: array + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + actions: + items: + additionalProperties: false + type: object + properties: + alerts_filter: + additionalProperties: false + description: >- + Defines a period that limits whether the action + runs. + type: object + properties: + query: + additionalProperties: false + type: object + properties: + dsl: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL). + type: string + filters: + description: >- + A filter written in Elasticsearch Query + Domain Specific Language (DSL) as defined in + the `kbn-es-query` package. + items: + additionalProperties: false + type: object + properties: + $state: + additionalProperties: false + type: object + properties: + store: + description: >- + A filter can be either specific to an + application context or applied globally. + enum: + - appState + - globalState + type: string + required: + - store + meta: + additionalProperties: {} + type: object + query: + additionalProperties: {} + type: object + required: + - meta + type: array + kql: + description: >- + A filter written in Kibana Query Language + (KQL). + type: string + required: + - kql + - filters + timeframe: + additionalProperties: false + type: object + properties: + days: + description: >- + Defines the days of the week that the action + can run, represented as an array of numbers. + For example, `1` represents Monday. An empty + array is equivalent to specifying all the + days of the week. + items: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + type: integer + type: array + hours: + additionalProperties: false + type: object + properties: + end: + description: >- + The end of the time frame in 24-hour + notation (`hh:mm`). + type: string + start: + description: >- + The start of the time frame in 24-hour + notation (`hh:mm`). + type: string + required: + - start + - end + timezone: + description: >- + The ISO time zone for the `hours` values. + Values such as `UTC` and `UTC+1` also work + but lack built-in daylight savings time + support and are not recommended. + type: string + required: + - days + - hours + - timezone + connector_type_id: + description: >- + The type of connector. This property appears in + responses but cannot be set in requests. + type: string + frequency: + additionalProperties: false + type: object + properties: + notify_when: + description: >- + Indicates how often alerts generate actions. + Valid values include: `onActionGroupChange`: + Actions run when the alert status changes; + `onActiveAlert`: Actions run when the alert + becomes active and at each check interval while + the rule conditions are met; + `onThrottleInterval`: Actions run when the alert + becomes active and at the interval specified in + the throttle property while the rule conditions + are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The + recommended method is to set it for each action. + If you set it at the rule level then update the + rule in Kibana, it is automatically changed to + use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + type: string + summary: + description: Indicates whether the action is a summary. + type: boolean + throttle: + description: >- + The throttle interval, which defines how often + an alert generates repeated actions. It is + specified in seconds, minutes, hours, or days + and is applicable only if 'notify_when' is set + to 'onThrottleInterval'. NOTE: You cannot + specify the throttle interval at both the rule + and action level. The recommended method is to + set it for each action. If you set it at the + rule level then update the rule in Kibana, it is + automatically changed to use action-specific + values. + nullable: true + type: string + required: + - summary + - notify_when + - throttle + group: + description: >- + The group name, which affects when the action runs + (for example, when the threshold is met or when the + alert is recovered). Each rule type has a list of + valid action group names. If you don't need to group + actions, set to `default`. + type: string + id: + description: The identifier for the connector saved object. + type: string + params: + additionalProperties: {} + description: >- + The parameters for the action, which are sent to the + connector. The `params` are handled as Mustache + templates and passed a default set of context. + type: object + use_alert_data_for_template: + description: Indicates whether to use alert data as a template. + type: boolean + uuid: + description: >- + A universally unique identifier (UUID) for the + action. + type: string + required: + - id + - connector_type_id + - params + type: array + active_snoozes: + items: + description: List of active snoozes for the rule. + type: string + type: array + alert_delay: + additionalProperties: false + description: >- + Indicates that an alert occurs only when the specified + number of consecutive runs met the rule conditions. + type: object + properties: + active: + description: >- + The number of consecutive runs that must meet the rule + conditions. + type: number + required: + - active + api_key_created_by_user: + description: >- + Indicates whether the API key that is associated with the + rule was created by the user. + nullable: true + type: boolean + api_key_owner: + description: >- + The owner of the API key that is associated with the rule + and used to run background tasks. + nullable: true + type: string + consumer: + description: >- + The name of the application or feature that owns the rule. + For example: `alerts`, `apm`, `discover`, + `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, + `securitySolution`, `siem`, `stackAlerts`, or `uptime`. + type: string + created_at: + description: The date and time that the rule was created. + type: string + created_by: + description: The identifier for the user that created the rule. + nullable: true + type: string + enabled: + description: >- + Indicates whether you want to run the rule on an interval + basis after it is created. + type: boolean + execution_status: + additionalProperties: false + type: object + properties: + error: + additionalProperties: false + type: object + properties: + message: + description: Error message. + type: string + reason: + description: Reason for error. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + type: string + required: + - reason + - message + last_duration: + description: Duration of last execution of the rule. + type: number + last_execution_date: + description: The date and time when rule was executed last. + type: string + status: + description: Status of rule execution. + enum: + - ok + - active + - error + - warning + - pending + - unknown + type: string + warning: + additionalProperties: false + type: object + properties: + message: + description: Warning message. + type: string + reason: + description: Reason for warning. + enum: + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + type: string + required: + - reason + - message + required: + - status + - last_execution_date + id: + description: The identifier for the rule. + type: string + is_snoozed_until: + description: The date when the rule will no longer be snoozed. + nullable: true + type: string + last_run: + additionalProperties: false + nullable: true + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: Number of ignored alerts during last run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: Number of recovered alerts during last run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value could be + succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: Outcome message generated during last rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + mapped_params: + additionalProperties: {} + type: object + monitoring: + additionalProperties: false + description: Monitoring details of the rule. + type: object + properties: + run: + additionalProperties: false + description: Rule run details. + type: object + properties: + calculated_metrics: + additionalProperties: false + description: >- + Calculation of different percentiles and success + ratio. + type: object + properties: + p50: + type: number + p95: + type: number + p99: + type: number + success_ratio: + type: number + required: + - success_ratio + history: + description: History of the rule run. + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule run. + type: number + outcome: + additionalProperties: false + type: object + properties: + alerts_count: + additionalProperties: false + type: object + properties: + active: + description: Number of active alerts during last run. + nullable: true + type: number + ignored: + description: >- + Number of ignored alerts during last + run. + nullable: true + type: number + new: + description: Number of new alerts during last run. + nullable: true + type: number + recovered: + description: >- + Number of recovered alerts during last + run. + nullable: true + type: number + outcome: + description: >- + Outcome of last run of the rule. Value + could be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string + outcome_msg: + items: + description: >- + Outcome message generated during last + rule run. + type: string + nullable: true + type: array + outcome_order: + description: Order of the outcome. + type: number + warning: + description: Warning of last rule execution. + enum: + - read + - decrypt + - execute + - unknown + - license + - timeout + - disabled + - validate + - maxExecutableActions + - maxAlerts + - maxQueuedActions + - ruleExecution + nullable: true + type: string + required: + - outcome + - alerts_count + success: + description: >- + Indicates whether the rule run was + successful. + type: boolean + timestamp: + description: Time of rule run. + type: number + required: + - success + - timestamp + type: array + last_run: + additionalProperties: false + type: object + properties: + metrics: + additionalProperties: false + type: object + properties: + duration: + description: Duration of most recent rule run. + type: number + gap_duration_s: + description: Duration in seconds of rule run gap. + nullable: true + type: number + total_alerts_created: + description: >- + Total number of alerts created during last + rule run. + nullable: true + type: number + total_alerts_detected: + description: >- + Total number of alerts detected during + last rule run. + nullable: true + type: number + total_indexing_duration_ms: + description: >- + Total time spent indexing documents during + last rule run in milliseconds. + nullable: true + type: number + total_search_duration_ms: + description: >- + Total time spent performing Elasticsearch + searches as measured by Kibana; includes + network latency and time spent serializing + or deserializing the request and response. + nullable: true + type: number + timestamp: + description: Time of the most recent rule run. + type: string + required: + - timestamp + - metrics + required: + - history + - calculated_metrics + - last_run + required: + - run + mute_all: + description: Indicates whether all alerts are muted. + type: boolean + muted_alert_ids: + items: + description: 'List of identifiers of muted alerts. ' + type: string + type: array + name: + description: ' The name of the rule.' + type: string + next_run: + description: Date and time of the next run of the rule. + nullable: true + type: string + notify_when: + description: >- + Indicates how often alerts generate actions. Valid values + include: `onActionGroupChange`: Actions run when the alert + status changes; `onActiveAlert`: Actions run when the + alert becomes active and at each check interval while the + rule conditions are met; `onThrottleInterval`: Actions run + when the alert becomes active and at the interval + specified in the throttle property while the rule + conditions are met. NOTE: You cannot specify `notify_when` + at both the rule and action level. The recommended method + is to set it for each action. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + enum: + - onActionGroupChange + - onActiveAlert + - onThrottleInterval + nullable: true + type: string + params: + additionalProperties: {} + description: The parameters for the rule. + type: object + revision: + description: The rule revision number. + type: number + rule_type_id: + description: The rule type identifier. + type: string + running: + description: Indicates whether the rule is running. + nullable: true + type: boolean + schedule: + additionalProperties: false + type: object + properties: + interval: + description: >- + The interval is specified in seconds, minutes, hours, + or days. + type: string + required: + - interval + scheduled_task_id: + description: Identifier of the scheduled task. + type: string + snooze_schedule: + items: + additionalProperties: false + type: object + properties: + duration: + description: Duration of the rule snooze schedule. + type: number + id: + description: Identifier of the rule snooze schedule. + type: string + rRule: + additionalProperties: false + type: object + properties: + byhour: + items: + description: Indicates hours of the day to recur. + type: number + type: array + byminute: + items: + description: Indicates minutes of the hour to recur. + type: number + type: array + bymonth: + items: + description: >- + Indicates months of the year that this rule + should recur. + type: number + type: array + bymonthday: + items: + description: Indicates the days of the month to recur. + type: number + type: array + bysecond: + items: + description: Indicates seconds of the day to recur. + type: number + type: array + bysetpos: + items: + description: >- + A positive or negative integer affecting the + nth day of the month. For example, -2 combined + with `byweekday` of FR is 2nd to last Friday + of the month. It is recommended to not set + this manually and just use `byweekday`. + type: number + type: array + byweekday: + items: + anyOf: + - type: string + - type: number + description: >- + Indicates the days of the week to recur or + else nth-day-of-month strings. For example, + "+2TU" second Tuesday of month, "-1FR" last + Friday of the month, which are internally + converted to a `byweekday/bysetpos` + combination. + type: array + byweekno: + items: + description: Indicates number of the week hours to recur. + type: number + type: array + byyearday: + items: + description: >- + Indicates the days of the year that this rule + should recur. + type: number + type: array + count: + description: >- + Number of times the rule should recur until it + stops. + type: number + dtstart: + description: >- + Rule start date in Coordinated Universal Time + (UTC). + type: string + freq: + description: >- + Indicates frequency of the rule. Options are + YEARLY, MONTHLY, WEEKLY, DAILY. + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + type: integer + interval: + description: >- + Indicates the interval of frequency. For + example, 1 and YEARLY is every 1 year, 2 and + WEEKLY is every 2 weeks. + type: number + tzid: + description: Indicates timezone abbreviation. + type: string + until: + description: Recur the rule until this date. + type: string + wkst: + description: 'Indicates the start of week, defaults to Monday.' + enum: + - MO + - TU + - WE + - TH + - FR + - SA + - SU + type: string + required: + - dtstart + - tzid + skipRecurrences: + items: + description: Skips recurrence of rule on this date. + type: string + type: array + required: + - duration + - rRule + type: array + tags: + items: + description: The tags for the rule. + type: string + type: array + throttle: + deprecated: true + description: >- + Deprecated in 8.13.0. Use the `throttle` property in the + action `frequency` object instead. The throttle interval, + which defines how often an alert generates repeated + actions. NOTE: You cannot specify the throttle interval at + both the rule and action level. If you set it at the rule + level then update the rule in Kibana, it is automatically + changed to use action-specific values. + nullable: true + type: string + updated_at: + description: The date and time that the rule was updated most recently. + type: string + updated_by: + description: >- + The identifier for the user that updated this rule most + recently. + nullable: true + type: string + view_in_app_relative_url: + description: Relative URL to view rule in the app. + nullable: true + type: string + required: + - id + - enabled + - name + - tags + - rule_type_id + - consumer + - schedule + - actions + - params + - created_by + - updated_by + - created_at + - updated_at + - api_key_owner + - mute_all + - muted_alert_ids + - execution_status + - revision + description: Indicates a successful call. + summary: Get information about rules + tags: + - alerting + /api/apm/agent_keys: + post: + description: Create a new agent key for APM. + operationId: createAgentKey + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + name: + type: string + privileges: + items: + enum: + - 'event:write' + - 'config_agent:read' + type: string + type: array + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + api_key: + type: string + encoded: + type: string + expiration: + format: int64 + type: integer + id: + type: string + name: + type: string + description: Agent key created successfully + summary: Create an APM agent key + tags: + - APM agent keys + '/api/apm/services/{serviceName}/annotation': + post: + description: Create a new annotation for a specific service. + operationId: createAnnotation + parameters: + - description: The name of the service + in: path + name: serviceName + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + '@timestamp': + type: string + message: + type: string + service: + type: object + properties: + environment: + type: string + version: + type: string + tags: + items: + type: string + type: array + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + _id: + type: string + _index: + type: string + _source: + type: object + properties: + '@timestamp': + type: string + annotation: + type: string + event: + type: object + properties: + created: + type: string + message: + type: string + service: + type: object + properties: + environment: + type: string + name: + type: string + version: + type: string + tags: + items: + type: string + type: array + description: Annotation created successfully + summary: Create a service annotation + tags: + - APM annotations + '/api/apm/services/{serviceName}/annotation/search': + get: + description: Search for annotations related to a specific service. + operationId: getAnnotation + parameters: + - description: The name of the service + in: path + name: serviceName + required: true + schema: + type: string + - description: The environment to filter annotations by + in: query + name: environment + required: false + schema: + type: string + - description: The start date for the search + in: query + name: start + required: false + schema: + type: string + - description: The end date for the search + in: query + name: end + required: false + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + annotations: + items: + type: object + properties: + '@timestamp': + type: number + id: + type: string + text: + type: string + type: + enum: + - version + type: string + type: array + description: Successful response + summary: Search for annotations + tags: + - APM annotations + /api/data_views: + get: + operationId: getAllDataViewsDefault + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + getAllDataViewsResponse: + $ref: '#/components/examples/Data_views_get_data_views_response' + schema: + type: object + properties: + data_view: + items: + type: object + properties: + id: + type: string + name: + type: string + namespaces: + items: + type: string + type: array + title: + type: string + typeMeta: + type: object + type: array + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Get all data views + tags: + - data views + /api/data_views/data_view: + post: + operationId: createDataViewDefaultw + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + createDataViewRequest: + $ref: '#/components/examples/Data_views_create_data_view_request' + schema: + $ref: '#/components/schemas/Data_views_create_data_view_request_object' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_data_view_response_object' + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Create a data view + tags: + - data views + '/api/data_views/data_view/{viewId}': + delete: + description: | + WARNING: When you delete a data view, it cannot be recovered. + operationId: deleteDataViewDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + - $ref: '#/components/parameters/Data_views_view_id' + responses: + '204': + description: Indicates a successful call. + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_404_response' + description: Object is not found. + summary: Delete a data view + tags: + - data views + get: + operationId: getDataViewDefault + parameters: + - $ref: '#/components/parameters/Data_views_view_id' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + getDataViewResponse: + $ref: '#/components/examples/Data_views_get_data_view_response' + schema: + $ref: '#/components/schemas/Data_views_data_view_response_object' + description: Indicates a successful call. + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_404_response' + description: Object is not found. + summary: Get a data view + tags: + - data views + post: + operationId: updateDataViewDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + - $ref: '#/components/parameters/Data_views_view_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + updateDataViewRequest: + $ref: '#/components/examples/Data_views_update_data_view_request' + schema: + $ref: '#/components/schemas/Data_views_update_data_view_request_object' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_data_view_response_object' + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Update a data view + tags: + - data views + '/api/data_views/data_view/{viewId}/fields': + post: description: > - The Tines connector uses Tines Webhook actions to send events via POST - request. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_tines' - connector_type_id: - description: The type of connector. - enum: - - .tines - example: .tines - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_tines' - required: - - config - - connector_type_id - - name - - secrets - title: Create Tines connector request - type: object - Connectors_create_connector_request_torq: + Update fields presentation metadata such as count, customLabel, + customDescription, and format. + operationId: updateFieldsMetadataDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + - $ref: '#/components/parameters/Data_views_view_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + updateFieldsMetadataRequest: + $ref: '#/components/examples/Data_views_update_field_metadata_request' + schema: + type: object + properties: + fields: + description: The field object. + type: object + required: + - fields + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + acknowledged: + type: boolean + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Update data view fields metadata + tags: + - data views + '/api/data_views/data_view/{viewId}/runtime_field': + post: + operationId: createRuntimeFieldDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + - $ref: '#/components/parameters/Data_views_view_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + createRuntimeFieldRequest: + $ref: '#/components/examples/Data_views_create_runtime_field_request' + schema: + type: object + properties: + name: + description: | + The name for a runtime field. + type: string + runtimeField: + description: | + The runtime field definition object. + type: object + required: + - name + - runtimeField + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + description: Indicates a successful call. + summary: Create a runtime field + tags: + - data views + put: + operationId: createUpdateRuntimeFieldDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + - description: | + The ID of the data view fields you want to update. + in: path + name: viewId + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + updateRuntimeFieldRequest: + $ref: '#/components/examples/Data_views_create_runtime_field_request' + schema: + type: object + properties: + name: + description: | + The name for a runtime field. + type: string + runtimeField: + description: | + The runtime field definition object. + type: object + required: + - name + - runtimeField + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + data_view: + type: object + fields: + items: + type: object + type: array + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Create or update a runtime field + tags: + - data views + '/api/data_views/data_view/{viewId}/runtime_field/{fieldName}': + delete: + operationId: deleteRuntimeFieldDefault + parameters: + - $ref: '#/components/parameters/Data_views_field_name' + - $ref: '#/components/parameters/Data_views_view_id' + responses: + '200': + description: Indicates a successful call. + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_404_response' + description: Object is not found. + summary: Delete a runtime field from a data view + tags: + - data views + get: + operationId: getRuntimeFieldDefault + parameters: + - $ref: '#/components/parameters/Data_views_field_name' + - $ref: '#/components/parameters/Data_views_view_id' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + getRuntimeFieldResponse: + $ref: '#/components/examples/Data_views_get_runtime_field_response' + schema: + type: object + properties: + data_view: + type: object + fields: + items: + type: object + type: array + description: Indicates a successful call. + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_404_response' + description: Object is not found. + summary: Get a runtime field + tags: + - data views + post: + operationId: updateRuntimeFieldDefault + parameters: + - $ref: '#/components/parameters/Data_views_field_name' + - $ref: '#/components/parameters/Data_views_view_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + updateRuntimeFieldRequest: + $ref: '#/components/examples/Data_views_update_runtime_field_request' + schema: + type: object + properties: + runtimeField: + description: | + The runtime field definition object. + + You can update following fields: + + - `type` + - `script` + type: object + required: + - runtimeField + required: true + responses: + '200': + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Update a runtime field + tags: + - data views + /api/data_views/default: + get: + operationId: getDefaultDataViewDefault + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + getDefaultDataViewResponse: + $ref: >- + #/components/examples/Data_views_get_default_data_view_response + schema: + type: object + properties: + data_view_id: + type: string + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Get the default data view + tags: + - data views + post: + operationId: setDefaultDatailViewDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + setDefaultDataViewRequest: + $ref: '#/components/examples/Data_views_set_default_data_view_request' + schema: + type: object + properties: + data_view_id: + description: > + The data view identifier. NOTE: The API does not validate + whether it is a valid identifier. Use `null` to unset the + default data view. + nullable: true + type: string + force: + default: false + description: Update an existing default data view identifier. + type: boolean + required: + - data_view_id + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + acknowledged: + type: boolean + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Data_views_400_response' + description: Bad request + summary: Set the default data view + tags: + - data views + /api/data_views/swap_references: + post: description: > - The Torq connector uses a Torq webhook to trigger workflows with Kibana - actions. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_torq' - connector_type_id: - description: The type of connector. - enum: - - .torq - example: .torq - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_torq' - required: - - config - - connector_type_id - - name - - secrets - title: Create Torq connector request - type: object - Connectors_create_connector_request_webhook: + Changes saved object references from one data view identifier to + another. WARNING: Misuse can break large numbers of saved objects! + Practicing with a backup is recommended. + operationId: swapDataViewsDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + swapDataViewRequest: + $ref: '#/components/examples/Data_views_swap_data_view_request' + schema: + $ref: '#/components/schemas/Data_views_swap_data_view_request_object' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + deleteStatus: + type: object + properties: + deletePerformed: + type: boolean + remainingRefs: + type: integer + result: + items: + type: object + properties: + id: + description: A saved object identifier. + type: string + type: + description: The saved object type. + type: string + type: array + description: Indicates a successful call. + summary: Swap saved object references + tags: + - data views + /api/data_views/swap_references/_preview: + post: description: > - The Webhook connector uses axios to send a POST or PUT request to a web - service. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_webhook' - connector_type_id: - description: The type of connector. - enum: - - .webhook - example: .webhook - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_webhook' - required: - - config - - connector_type_id - - name - - secrets - title: Create Webhook connector request - type: object - Connectors_create_connector_request_xmatters: + Preview the impact of swapping saved object references from one data + view identifier to another. + operationId: previewSwapDataViewsDefault + parameters: + - $ref: '#/components/parameters/Data_views_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + previewSwapDataViewRequest: + $ref: >- + #/components/examples/Data_views_preview_swap_data_view_request + schema: + $ref: '#/components/schemas/Data_views_swap_data_view_request_object' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + result: + items: + type: object + properties: + id: + description: A saved object identifier. + type: string + type: + description: The saved object type. + type: string + type: array + description: Indicates a successful call. + summary: Preview a saved object reference swap + tags: + - data views + /api/ml/saved_objects/sync: + get: description: > - The xMatters connector uses the xMatters Workflow for Elastic to send - actionable alerts to on-call xMatters resources. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_xmatters' - connector_type_id: - description: The type of connector. - enum: - - .xmatters - example: .xmatters - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_xmatters' - required: - - config - - connector_type_id - - name - - secrets - title: Create xMatters connector request - type: object - Connectors_crt: - description: >- - If `authType` is `webhook-authentication-ssl` and `certType` is - `ssl-crt-key`, it is a base64 encoded version of the CRT or CERT file. - title: Certificate - type: string - Connectors_features: - description: | - The feature that uses the connector. - enum: - - alerting - - cases - - generativeAIForSecurity - - generativeAIForObservability - - generativeAIForSearchPlayground - - siem - - uptime - type: string - Connectors_has_auth: - default: true - description: >- - If true, a username and password for login type authentication must be - provided. - title: Has authentication - type: boolean - Connectors_is_deprecated: - description: Indicates whether the connector type is deprecated. - example: false - type: boolean - Connectors_is_missing_secrets: - description: >- - Indicates whether secrets are missing for the connector. Secrets - configuration properties vary depending on the connector type. - example: false - type: boolean - Connectors_is_preconfigured: + Synchronizes Kibana saved objects for machine learning jobs and trained + models. This API runs automatically when you start Kibana and + periodically thereafter. + operationId: mlSync + parameters: + - $ref: '#/components/parameters/Machine_learning_APIs_simulateParam' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + syncExample: + $ref: '#/components/examples/Machine_learning_APIs_mlSyncExample' + schema: + $ref: '#/components/schemas/Machine_learning_APIs_mlSync200Response' + description: Indicates a successful call + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Machine_learning_APIs_mlSync4xxResponse' + description: Authorization information is missing or invalid. + summary: Sync machine learning saved objects + tags: + - ml + /api/saved_objects/_export: + post: description: > - Indicates whether it is a preconfigured connector. If true, the `config` - and `is_missing_secrets` properties are omitted from the response. - example: false - type: boolean - Connectors_is_system_action: - description: Indicates whether the connector is used for system actions. - example: false - type: boolean - Connectors_key: - description: >- - If `authType` is `webhook-authentication-ssl` and `certType` is - `ssl-crt-key`, it is a base64 encoded version of the KEY file. - title: Certificate key - type: string - Connectors_pfx: - description: >- - If `authType` is `webhook-authentication-ssl` and `certType` is - `ssl-pfx`, it is a base64 encoded version of the PFX or P12 file. - title: Personal information exchange - type: string - Connectors_referenced_by_count: + Retrieve sets of saved objects that you want to import into Kibana. + + You must include `type` or `objects` in the request body. + + + Exported saved objects are not backwards compatible and cannot be + imported into an older version of Kibana. + + + NOTE: The `savedObjects.maxImportExportSize` configuration setting + limits the number of saved objects which may be exported. + + + This functionality is in technical preview and may be changed or removed + in a future release. Elastic will work to fix any issues, but features + in technical preview are not subject to the support SLA of official GA + features. + operationId: exportSavedObjectsDefault + parameters: + - $ref: '#/components/parameters/Serverless_saved_objects_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + exportSavedObjectsRequest: + $ref: >- + #/components/examples/Serverless_saved_objects_export_objects_request + schema: + type: object + properties: + excludeExportDetails: + default: false + description: Do not add export details entry at the end of the stream. + type: boolean + includeReferencesDeep: + description: >- + Includes all of the referenced objects in the exported + objects. + type: boolean + objects: + description: A list of objects to export. + items: + type: object + type: array + type: + description: >- + The saved object types to include in the export. Use `*` to + export all the types. + oneOf: + - type: string + - items: + type: string + type: array + required: true + responses: + '200': + content: + application/x-ndjson; Elastic-Api-Version=2023-10-31: + examples: + exportSavedObjectsResponse: + $ref: >- + #/components/examples/Serverless_saved_objects_export_objects_response + schema: + additionalProperties: true + type: object + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Serverless_saved_objects_400_response' + description: Bad request. + summary: Export saved objects + tags: + - saved objects + /api/saved_objects/_import: + post: description: > - Indicates the number of saved objects that reference the connector. If - `is_preconfigured` is true, this value is not calculated. This property - is returned only by the get all connectors API. - example: 2 - type: integer - Connectors_secrets_properties_bedrock: - description: Defines secrets for connectors when type is `.bedrock`. - properties: - accessKey: - description: The AWS access key for authentication. - type: string - secret: - description: The AWS secret for authentication. - type: string - required: - - accessKey - - secret - title: Connector secrets properties for an Amazon Bedrock connector - type: object - Connectors_secrets_properties_cases_webhook: - title: Connector secrets properties for Webhook - Case Management connector - type: object - properties: - crt: - $ref: '#/components/schemas/Connectors_crt' - key: - $ref: '#/components/schemas/Connectors_key' - password: - description: > - The password for HTTP basic authentication. If `hasAuth` is set to - `true` and and `authType` is `webhook-authentication-basic`, this - property is required. - type: string - pfx: - $ref: '#/components/schemas/Connectors_pfx' - user: - description: > - The username for HTTP basic authentication. If `hasAuth` is set to - `true` and `authType` is `webhook-authentication-basic`, this - property is required. - type: string - Connectors_secrets_properties_d3security: - description: Defines secrets for connectors when type is `.d3security`. - type: object - properties: - token: - description: The D3 Security token. - type: string - required: - - token - title: Connector secrets properties for a D3 Security connector - Connectors_secrets_properties_email: - description: Defines secrets for connectors when type is `.email`. - properties: - clientSecret: - description: > - The Microsoft Exchange Client secret for OAuth 2.0 client - credentials authentication. It must be URL-encoded. If `service` is - `exchange_server`, this property is required. - type: string - password: - description: > - The password for HTTP basic authentication. If `hasAuth` is set to - `true`, this property is required. - type: string - user: - description: > - The username for HTTP basic authentication. If `hasAuth` is set to - `true`, this property is required. - type: string - title: Connector secrets properties for an email connector - type: object - Connectors_secrets_properties_gemini: - description: Defines secrets for connectors when type is `.gemini`. - properties: - credentialsJSON: - description: >- - The service account credentials JSON file. The service account - should have Vertex AI user IAM role assigned to it. - type: string - required: - - credentialsJSON - title: Connector secrets properties for a Google Gemini connector - type: object - Connectors_secrets_properties_genai: - description: Defines secrets for connectors when type is `.gen-ai`. - properties: - apiKey: - description: The OpenAI API key. - type: string - title: Connector secrets properties for an OpenAI connector - type: object - Connectors_secrets_properties_jira: - description: Defines secrets for connectors when type is `.jira`. - type: object - properties: - apiToken: - description: The Jira API authentication token for HTTP basic authentication. - type: string - email: - description: The account email for HTTP Basic authentication. - type: string - required: - - apiToken - - email - title: Connector secrets properties for a Jira connector - Connectors_secrets_properties_opsgenie: - description: Defines secrets for connectors when type is `.opsgenie`. - type: object - properties: - apiKey: - description: The Opsgenie API authentication key for HTTP Basic authentication. - type: string - required: - - apiKey - title: Connector secrets properties for an Opsgenie connector - Connectors_secrets_properties_pagerduty: - description: Defines secrets for connectors when type is `.pagerduty`. - properties: - routingKey: - description: > - A 32 character PagerDuty Integration Key for an integration on a - service. - type: string - required: - - routingKey - title: Connector secrets properties for a PagerDuty connector - type: object - Connectors_secrets_properties_resilient: - description: Defines secrets for connectors when type is `.resilient`. - type: object - properties: - apiKeyId: - description: The authentication key ID for HTTP Basic authentication. - type: string - apiKeySecret: - description: The authentication key secret for HTTP Basic authentication. - type: string - required: - - apiKeyId - - apiKeySecret - title: Connector secrets properties for IBM Resilient connector - Connectors_secrets_properties_sentinelone: - description: Defines secrets for connectors when type is `.sentinelone`. - properties: - token: - description: The A SentinelOne API token. - type: string - required: - - token - title: Connector secrets properties for a SentinelOne connector - type: object - Connectors_secrets_properties_servicenow: - description: >- - Defines secrets for connectors when type is `.servicenow`, - `.servicenow-sir`, or `.servicenow-itom`. - properties: - clientSecret: - description: >- - The client secret assigned to your OAuth application. This property - is required when `isOAuth` is `true`. - type: string - password: - description: >- - The password for HTTP basic authentication. This property is - required when `isOAuth` is `false`. - type: string - privateKey: - description: >- - The RSA private key that you created for use in ServiceNow. This - property is required when `isOAuth` is `true`. - type: string - privateKeyPassword: - description: >- - The password for the RSA private key. This property is required when - `isOAuth` is `true` and you set a password on your private key. - type: string - username: - description: >- - The username for HTTP basic authentication. This property is - required when `isOAuth` is `false`. - type: string - title: >- - Connector secrets properties for ServiceNow ITOM, ServiceNow ITSM, and - ServiceNow SecOps connectors - type: object - Connectors_secrets_properties_slack_api: - description: Defines secrets for connectors when type is `.slack`. - type: object - properties: - token: - description: Slack bot user OAuth token. - type: string - required: - - token - title: Connector secrets properties for a Web API Slack connector - Connectors_secrets_properties_slack_webhook: - description: Defines secrets for connectors when type is `.slack`. - type: object - properties: - webhookUrl: - description: Slack webhook url. - type: string - required: - - webhookUrl - title: Connector secrets properties for a Webhook Slack connector - Connectors_secrets_properties_swimlane: - description: Defines secrets for connectors when type is `.swimlane`. - properties: - apiToken: - description: Swimlane API authentication token. - type: string - title: Connector secrets properties for a Swimlane connector - type: object - Connectors_secrets_properties_teams: - description: Defines secrets for connectors when type is `.teams`. - properties: - webhookUrl: - description: > - The URL of the incoming webhook. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - webhookUrl - title: Connector secrets properties for a Microsoft Teams connector - type: object - Connectors_secrets_properties_tines: - description: Defines secrets for connectors when type is `.tines`. - properties: - email: - description: The email used to sign in to Tines. - type: string - token: - description: The Tines API token. - type: string - required: - - email - - token - title: Connector secrets properties for a Tines connector - type: object - Connectors_secrets_properties_torq: - description: Defines secrets for connectors when type is `.torq`. - properties: - token: - description: The secret of the webhook authentication header. - type: string - required: - - token - title: Connector secrets properties for a Torq connector - type: object - Connectors_secrets_properties_webhook: - description: Defines secrets for connectors when type is `.webhook`. - properties: - crt: - $ref: '#/components/schemas/Connectors_crt' - key: - $ref: '#/components/schemas/Connectors_key' - password: - description: > - The password for HTTP basic authentication or the passphrase for the - SSL certificate files. If `hasAuth` is set to `true` and `authType` - is `webhook-authentication-basic`, this property is required. - type: string - pfx: - $ref: '#/components/schemas/Connectors_pfx' - user: - description: > - The username for HTTP basic authentication. If `hasAuth` is set to - `true` and `authType` is `webhook-authentication-basic`, this - property is required. - type: string - title: Connector secrets properties for a Webhook connector - type: object - Connectors_secrets_properties_xmatters: - description: Defines secrets for connectors when type is `.xmatters`. - properties: - password: - description: > - A user name for HTTP basic authentication. It is applicable only - when `usesBasic` is `true`. - type: string - secretsUrl: - description: > - The request URL for the Elastic Alerts trigger in xMatters with the - API key included in the URL. It is applicable only when `usesBasic` - is `false`. - type: string - user: - description: > - A password for HTTP basic authentication. It is applicable only when - `usesBasic` is `true`. - type: string - title: Connector secrets properties for an xMatters connector - type: object - Connectors_update_connector_request: - description: The properties vary depending on the connector type. - oneOf: - - $ref: '#/components/schemas/Connectors_update_connector_request_bedrock' - - $ref: '#/components/schemas/Connectors_update_connector_request_gemini' - - $ref: >- - #/components/schemas/Connectors_update_connector_request_cases_webhook - - $ref: '#/components/schemas/Connectors_update_connector_request_d3security' - - $ref: '#/components/schemas/Connectors_update_connector_request_email' - - $ref: '#/components/schemas/Connectors_create_connector_request_genai' - - $ref: '#/components/schemas/Connectors_update_connector_request_index' - - $ref: '#/components/schemas/Connectors_update_connector_request_jira' - - $ref: '#/components/schemas/Connectors_update_connector_request_opsgenie' - - $ref: '#/components/schemas/Connectors_update_connector_request_pagerduty' - - $ref: '#/components/schemas/Connectors_update_connector_request_resilient' - - $ref: '#/components/schemas/Connectors_update_connector_request_sentinelone' - - $ref: '#/components/schemas/Connectors_update_connector_request_serverlog' - - $ref: '#/components/schemas/Connectors_update_connector_request_servicenow' - - $ref: >- - #/components/schemas/Connectors_update_connector_request_servicenow_itom - - $ref: '#/components/schemas/Connectors_update_connector_request_slack_api' - - $ref: >- - #/components/schemas/Connectors_update_connector_request_slack_webhook - - $ref: '#/components/schemas/Connectors_update_connector_request_swimlane' - - $ref: '#/components/schemas/Connectors_update_connector_request_teams' - - $ref: '#/components/schemas/Connectors_update_connector_request_tines' - - $ref: '#/components/schemas/Connectors_update_connector_request_torq' - - $ref: '#/components/schemas/Connectors_update_connector_request_webhook' - - $ref: '#/components/schemas/Connectors_update_connector_request_xmatters' - title: Update connector request body properties - Connectors_update_connector_request_bedrock: - title: Update Amazon Bedrock connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_bedrock' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_bedrock' - required: - - config - - name - Connectors_update_connector_request_cases_webhook: - title: Update Webhook - Case Managment connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_cases_webhook' - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_cases_webhook' - required: - - config - - name - Connectors_update_connector_request_d3security: - title: Update D3 Security connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_d3security' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_d3security' - required: - - config - - name - - secrets - Connectors_update_connector_request_email: - title: Update email connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_email' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_email' - required: - - config - - name - Connectors_update_connector_request_gemini: - title: Update Google Gemini connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_gemini' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_gemini' - required: - - config - - name - Connectors_update_connector_request_index: - title: Update index connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_index' - name: - description: The display name for the connector. - type: string - required: - - config - - name - Connectors_update_connector_request_jira: - title: Update Jira connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_jira' - name: - description: The display name for the connector. + Create sets of Kibana saved objects from a file created by the export + API. + + Saved objects can be imported only into the same version, a newer minor + on the same major, or the next major. Exported saved objects are not + backwards compatible and cannot be imported into an older version of + Kibana. + + + This functionality is in technical preview and may be changed or removed + in a future release. Elastic will work to fix any issues, but features + in technical preview are not subject to the support SLA of official GA + features. + operationId: importSavedObjectsDefault + parameters: + - $ref: '#/components/parameters/Serverless_saved_objects_kbn_xsrf' + - description: > + Creates copies of saved objects, regenerates each object ID, and + resets the origin. When used, potential conflict errors are avoided. + NOTE: This option cannot be used with the `overwrite` and + `compatibilityMode` options. + in: query + name: createNewCopies + required: false + schema: + type: boolean + - description: > + Overwrites saved objects when they already exist. When used, + potential conflict errors are automatically resolved by overwriting + the destination object. NOTE: This option cannot be used with the + `createNewCopies` option. + in: query + name: overwrite + required: false + schema: + type: boolean + - description: > + Applies various adjustments to the saved objects that are being + imported to maintain compatibility between different Kibana + versions. Use this option only if you encounter issues with imported + saved objects. NOTE: This option cannot be used with the + `createNewCopies` option. + in: query + name: compatibilityMode + required: false + schema: + type: boolean + requestBody: + content: + multipart/form-data; Elastic-Api-Version=2023-10-31: + examples: + importObjectsRequest: + $ref: >- + #/components/examples/Serverless_saved_objects_import_objects_request + schema: + type: object + properties: + file: + description: > + A file exported using the export API. NOTE: The + `savedObjects.maxImportExportSize` configuration setting + limits the number of saved objects which may be included in + this file. Similarly, the + `savedObjects.maxImportPayloadBytes` setting limits the + overall size of the file that can be imported. + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + importObjectsResponse: + $ref: >- + #/components/examples/Serverless_saved_objects_import_objects_response + schema: + type: object + properties: + errors: + description: > + Indicates the import was unsuccessful and specifies the + objects that failed to import. + + + NOTE: One object may result in multiple errors, which + requires separate steps to resolve. For instance, a + `missing_references` error and conflict error. + items: + type: object + type: array + success: + description: > + Indicates when the import was successfully completed. When + set to false, some objects may not have been created. For + additional information, refer to the `errors` and + `successResults` properties. + type: boolean + successCount: + description: Indicates the number of successfully imported records. + type: integer + successResults: + description: > + Indicates the objects that are successfully imported, with + any metadata if applicable. + + + NOTE: Objects are created only when all resolvable errors + are addressed, including conflicts and missing references. + If objects are created as new copies, each entry in the + `successResults` array includes a `destinationId` + attribute. + items: + type: object + type: array + description: Indicates a successful call. + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Serverless_saved_objects_400_response' + description: Bad request. + summary: Import saved objects + tags: + - saved objects + /api/status: + get: + operationId: '%2Fapi%2Fstatus#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: Set to "true" to get the response in v7 format. + in: query + name: v7format + required: false + schema: + type: boolean + - description: Set to "true" to get the response in v8 format. + in: query + name: v8format + required: false + schema: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + anyOf: + - $ref: '#/components/schemas/Kibana_HTTP_APIs_core_status_response' + - $ref: >- + #/components/schemas/Kibana_HTTP_APIs_core_status_redactedResponse + description: >- + Kibana's operational status. A minimal response is sent for + unauthorized users. + description: Overall status is OK and Kibana should be functioning normally. + '503': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + anyOf: + - $ref: '#/components/schemas/Kibana_HTTP_APIs_core_status_response' + - $ref: >- + #/components/schemas/Kibana_HTTP_APIs_core_status_redactedResponse + description: >- + Kibana's operational status. A minimal response is sent for + unauthorized users. + description: >- + Kibana or some of it's essential services are unavailable. Kibana + may be degraded or unavailable. + summary: Get Kibana's current status + tags: + - system + /data_streams: + get: + operationId: data-streams-list + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + data_streams: + items: + $ref: '#/components/schemas/Fleet_data_stream' + type: array + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List data streams + tags: + - Data streams + parameters: [] + /enrollment_api_keys: + get: + operationId: get-enrollment-api-keys + parameters: + - $ref: '#/components/parameters/Fleet_page_size' + - $ref: '#/components/parameters/Fleet_page_index' + - $ref: '#/components/parameters/Fleet_kuery' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + type: array + list: + deprecated: true + items: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + type: array + page: + type: number + perPage: + type: number + total: + type: number + required: + - items + - page + - perPage + - total + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List enrollment API keys + tags: + - Fleet enrollment API keys + post: + operationId: create-enrollment-api-keys + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + name: + description: The name of the enrollment API key. Must be unique. + type: string + policy_id: + description: >- + The ID of the agent policy the Elastic Agent will be + enrolled in. + type: string + required: + - policy_id + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + action: + enum: + - created + type: string + item: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create enrollment API key + tags: + - Fleet enrollment API keys + '/enrollment_api_keys/{keyId}': + delete: + operationId: delete-enrollment-api-key + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + action: + enum: + - deleted + type: string + required: + - action + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Revoke enrollment API key by ID by marking it as inactive + tags: + - Fleet enrollment API keys + get: + operationId: get-enrollment-api-key + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get enrollment API key by ID + tags: + - Fleet enrollment API keys + parameters: + - in: path + name: keyId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_jira' - required: - - config - - name - - secrets - Connectors_update_connector_request_opsgenie: - title: Update Opsgenie connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_opsgenie' - name: - description: The display name for the connector. + /enrollment-api-keys: + get: + deprecated: true + operationId: get-enrollment-api-keys-deprecated + parameters: [] + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + type: array + list: + deprecated: true + items: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + type: array + page: + type: number + perPage: + type: number + total: + type: number + required: + - items + - page + - perPage + - total + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List enrollment API keys + tags: + - Fleet enrollment API keys + post: + deprecated: true + operationId: create-enrollment-api-keys-deprecated + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + action: + enum: + - created + type: string + item: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create enrollment API key + tags: + - Fleet enrollment API keys + '/enrollment-api-keys/{keyId}': + delete: + deprecated: true + operationId: delete-enrollment-api-key-deprecated + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + action: + enum: + - deleted + type: string + required: + - action + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete enrollment API key by ID + tags: + - Fleet enrollment API keys + get: + deprecated: true + operationId: get-enrollment-api-key-deprecated + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_enrollment_api_key' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get enrollment API key by ID + tags: + - Fleet enrollment API keys + parameters: + - in: path + name: keyId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_opsgenie' - required: - - config - - name - - secrets - Connectors_update_connector_request_pagerduty: - title: Update PagerDuty connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_pagerduty' - name: - description: The display name for the connector. + /epm/bulk_assets: + post: + operationId: bulk-get-assets + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + assetIds: + description: list of items necessary to fetch assets + items: + type: object + properties: + id: + type: string + type: + type: string + type: array + required: + - assetIds + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_get_bulk_assets_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Bulk get assets + tags: + - Elastic Package Manager (EPM) + /epm/categories: + get: + operationId: get-package-categories + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_get_categories_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List package categories + tags: + - Elastic Package Manager (EPM) + parameters: + - description: >- + Whether to include prerelease packages in categories count (e.g. beta, + rc, preview) + in: query + name: prerelease + schema: + default: false + type: boolean + - deprecated: true + in: query + name: experimental + schema: + default: false + type: boolean + - in: query + name: include_policy_templates + schema: + default: false + type: boolean + /epm/packages: + get: + operationId: list-all-packages + parameters: + - description: >- + Whether to exclude the install status of each package. Enabling this + option will opt in to caching for the response via `cache-control` + headers. If you don't need up-to-date installation info for a + package, and are querying for a list of available packages, + providing this flag can improve performance substantially. + in: query + name: excludeInstallStatus + schema: + default: false + type: boolean + - description: >- + Whether to return prerelease versions of packages (e.g. beta, rc, + preview) + in: query + name: prerelease + schema: + default: false + type: boolean + - deprecated: true + in: query + name: experimental + schema: + default: false + type: boolean + - in: query + name: category + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_get_packages_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List packages + tags: + - Elastic Package Manager (EPM) + post: + description: '' + operationId: install-package-by-upload + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - description: avoid erroring out on unexpected mapping update errors + in: query + name: ignoreMappingUpdateErrors + schema: + default: false + type: boolean + - description: >- + Skip data stream rollover during index template mapping or settings + update + in: query + name: skipDataStreamRollover + schema: + default: false + type: boolean + requestBody: + content: + application/gzip; Elastic-Api-Version=2023-10-31: + schema: + format: binary + type: string + application/zip; Elastic-Api-Version=2023-10-31: + schema: + format: binary + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + _meta: + type: object + properties: + install_source: + enum: + - upload + - registry + - bundled + type: string + items: + items: + type: object + properties: + id: + type: string + type: + oneOf: + - $ref: >- + #/components/schemas/Fleet_kibana_saved_object_type + - $ref: >- + #/components/schemas/Fleet_elasticsearch_asset_type + required: + - id + - type + type: array + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + '429': + $ref: '#/components/responses/Fleet_error' + summary: Install by package by direct upload + tags: + - Elastic Package Manager (EPM) + /epm/packages/_bulk: + post: + operationId: bulk-install-packages + parameters: + - description: >- + Whether to return prerelease versions of packages (e.g. beta, rc, + preview) + in: query + name: prerelease + schema: + default: false + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + force: + description: force install to ignore package verification errors + type: boolean + packages: + description: list of packages to install + items: + oneOf: + - description: package name + type: string + - type: object + properties: + name: + description: package name + type: string + version: + description: package version + type: string + type: array + required: + - packages + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_bulk_install_packages_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Bulk install packages + tags: + - Elastic Package Manager (EPM) + '/epm/packages/{pkgkey}': + delete: + deprecated: true + operationId: delete-package-deprecated + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - in: path + name: pkgkey + required: true + schema: + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + force: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + response: + items: + type: object + properties: + id: + type: string + type: + oneOf: + - $ref: >- + #/components/schemas/Fleet_kibana_saved_object_type + - $ref: >- + #/components/schemas/Fleet_elasticsearch_asset_type + required: + - id + - type + type: array + required: + - response + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete ackage + tags: + - Elastic Package Manager (EPM) + get: + deprecated: true + operationId: get-package-deprecated + parameters: + - in: path + name: pkgkey + required: true + schema: + type: string + - description: >- + Whether to return prerelease versions of packages (e.g. beta, rc, + preview) + in: query + name: prerelease + schema: + default: false + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + allOf: + - properties: + response: + $ref: '#/components/schemas/Fleet_package_info' + - properties: + savedObject: + type: string + status: + enum: + - installed + - installing + - install_failed + - not_installed + type: string + required: + - status + - savedObject + type: object + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get package + tags: + - Elastic Package Manager (EPM) + post: + deprecated: true + description: '' + operationId: install-package-deprecated + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - in: path + name: pkgkey + required: true + schema: + type: string + - description: avoid erroring out on unexpected mapping update errors + in: query + name: ignoreMappingUpdateErrors + schema: + default: false + type: boolean + - description: >- + Skip data stream rollover during index template mapping or settings + update + in: query + name: skipDataStreamRollover + schema: + default: false + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + force: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + response: + items: + type: object + properties: + id: + type: string + type: + oneOf: + - $ref: >- + #/components/schemas/Fleet_kibana_saved_object_type + - $ref: >- + #/components/schemas/Fleet_elasticsearch_asset_type + required: + - id + - type + type: array + required: + - response + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Install package + tags: + - Elastic Package Manager (EPM) + '/epm/packages/{pkgName}/{pkgVersion}': + delete: + operationId: delete-package + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - description: delete package even if policies used by agents + in: query + name: force + schema: + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + deprecated: true + type: object + properties: + force: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + type: object + properties: + id: + type: string + type: + oneOf: + - $ref: >- + #/components/schemas/Fleet_kibana_saved_object_type + - $ref: >- + #/components/schemas/Fleet_elasticsearch_asset_type + required: + - id + - type + type: array + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete package + tags: + - Elastic Package Manager (EPM) + get: + operationId: get-package + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + allOf: + - properties: + item: + $ref: '#/components/schemas/Fleet_package_info' + - properties: + keepPoliciesUpToDate: + type: boolean + latestVersion: + type: string + licensePath: + type: string + notice: + type: string + savedObject: + deprecated: true + type: object + status: + enum: + - installed + - installing + - install_failed + - not_installed + type: string + required: + - status + - savedObject + type: object + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get package + tags: + - Elastic Package Manager (EPM) + parameters: + - in: path + name: pkgName + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_pagerduty' - required: - - config - - name - - secrets - Connectors_update_connector_request_resilient: - title: Update IBM Resilient connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_resilient' - name: - description: The display name for the connector. + - in: path + name: pkgVersion + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_resilient' - required: - - config - - name - - secrets - Connectors_update_connector_request_sentinelone: - title: Update SentinelOne connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_sentinelone' - name: - description: The display name for the connector. + - description: Ignore if the package is fails signature verification + in: query + name: ignoreUnverified + schema: + type: boolean + - description: >- + Return all fields from the package manifest, not just those supported + by the Elastic Package Registry + in: query + name: full + schema: + type: boolean + - description: >- + Whether to return prerelease versions of packages (e.g. beta, rc, + preview) + in: query + name: prerelease + schema: + default: false + type: boolean + post: + description: '' + operationId: install-package + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - description: avoid erroring out on unexpected mapping update errors + in: query + name: ignoreMappingUpdateErrors + schema: + default: false + type: boolean + - description: >- + Skip data stream rollover during index template mapping or settings + update + in: query + name: skipDataStreamRollover + schema: + default: false + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + force: + type: boolean + ignore_constraints: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + _meta: + type: object + properties: + install_source: + enum: + - registry + - upload + - bundled + type: string + items: + items: + type: object + properties: + id: + type: string + type: + oneOf: + - $ref: >- + #/components/schemas/Fleet_kibana_saved_object_type + - $ref: >- + #/components/schemas/Fleet_elasticsearch_asset_type + required: + - id + - type + type: array + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Install package + tags: + - Elastic Package Manager (EPM) + put: + description: '' + operationId: update-package + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + keepPoliciesUpToDate: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + type: object + properties: + id: + type: string + type: + oneOf: + - $ref: >- + #/components/schemas/Fleet_kibana_saved_object_type + - $ref: >- + #/components/schemas/Fleet_elasticsearch_asset_type + required: + - id + - type + type: array + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Update package settings + tags: + - Elastic Package Manager (EPM) + '/epm/packages/{pkgName}/{pkgVersion}/{filePath}': + get: + operationId: packages-get-file + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + body: + type: object + headers: + type: object + statusCode: + type: number + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get package file + tags: + - Elastic Package Manager (EPM) + parameters: + - in: path + name: pkgName + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_sentinelone' - required: - - config - - name - - secrets - Connectors_update_connector_request_serverlog: - title: Update server log connector request - type: object - properties: - name: - description: The display name for the connector. + - in: path + name: pkgVersion + required: true + schema: type: string - required: - - name - Connectors_update_connector_request_servicenow: - title: Update ServiceNow ITSM connector or ServiceNow SecOps request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - name: - description: The display name for the connector. + - in: path + name: filePath + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - name - - secrets - Connectors_update_connector_request_servicenow_itom: - title: Create ServiceNow ITOM connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow_itom' - name: - description: The display name for the connector. + '/epm/packages/{pkgName}/{pkgVersion}/transforms/authorize': + post: + description: '' + operationId: reauthorize-transforms + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - in: path + name: pkgName + required: true + schema: + type: string + - in: path + name: pkgVersion + required: true + schema: + type: string + - description: >- + Whether to include prerelease packages in categories count (e.g. + beta, rc, preview) + in: query + name: prerelease + schema: + default: false + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + transforms: + items: + type: object + properties: + transformId: + type: string + type: array + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + type: object + properties: + error: + type: string + success: + type: boolean + transformId: + type: string + required: + - transformId + - error + type: array + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Authorize transforms + tags: + - Elastic Package Manager (EPM) + '/epm/packages/{pkgName}/stats': + get: + operationId: get-package-stats + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + response: + $ref: '#/components/schemas/Fleet_package_usage_stats' + required: + - response + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get package stats + tags: + - Elastic Package Manager (EPM) + parameters: + - in: path + name: pkgName + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - name - - secrets - Connectors_update_connector_request_slack_api: - title: Update Slack connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_slack_api' - name: - description: The display name for the connector. + /epm/packages/limited: + get: + operationId: list-limited-packages + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + type: string + type: array + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get limited package list + tags: + - Elastic Package Manager (EPM) + parameters: [] + '/epm/templates/{pkgName}/{pkgVersion}/inputs': + get: + operationId: get-inputs-template + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get inputs template + tags: + - Elastic Package Manager (EPM) + parameters: + - in: path + name: pkgName + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_api' - required: - - name - - secrets - Connectors_update_connector_request_slack_webhook: - title: Update Slack connector request - type: object - properties: - name: - description: The display name for the connector. + - in: path + name: pkgVersion + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_webhook' - required: - - name - - secrets - Connectors_update_connector_request_swimlane: - title: Update Swimlane connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_swimlane' - name: - description: The display name for the connector. - example: my-connector + - description: Format of response - json or yaml + in: query + name: format + schema: + enum: + - json + - yaml + - yml type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_swimlane' - required: - - config - - name - - secrets - Connectors_update_connector_request_teams: - title: Update Microsoft Teams connector request - type: object - properties: - name: - description: The display name for the connector. + - description: Specify if version is prerelease + in: query + name: prerelease + schema: + type: boolean + - description: Ignore if the package is fails signature verification + in: query + name: ignoreUnverified + schema: + type: boolean + /epm/verification_key_id: + get: + operationId: packages-get-verification-key-id + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + body: + type: object + properties: + id: + description: >- + the key ID of the GPG key used to verify package + signatures + nullable: true + type: string + headers: + type: object + statusCode: + type: number + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get package signature verification key ID + tags: + - Elastic Package Manager (EPM) + parameters: [] + /fleet_server_hosts: + get: + operationId: get-fleet-server-hosts + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_fleet_server_host' + type: array + page: + type: integer + perPage: + type: integer + total: + type: integer + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List Fleet Server hosts + tags: + - Fleet Server hosts + post: + operationId: post-fleet-server-hosts + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + host_urls: + items: + type: string + type: array + id: + type: string + is_default: + type: boolean + is_internal: + type: boolean + name: + type: string + proxy_id: + description: >- + The ID of the proxy to use for this fleet server host. See + the proxies API for more information. + type: string + required: + - name + - host_urls + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_fleet_server_host' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create Fleet Server host + tags: + - Fleet Server hosts + '/fleet_server_hosts/{itemId}': + delete: + operationId: delete-fleet-server-hosts + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + id: + type: string + required: + - id + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete Fleet Server host by ID + tags: + - Fleet Server hosts + get: + operationId: get-one-fleet-server-hosts + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_fleet_server_host' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get Fleet Server host by ID + tags: + - Fleet Server hosts + parameters: + - in: path + name: itemId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_teams' - required: - - name - - secrets - Connectors_update_connector_request_tines: - title: Update Tines connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_tines' - name: - description: The display name for the connector. + put: + operationId: update-fleet-server-hosts + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + host_urls: + items: + type: string + type: array + is_default: + type: boolean + is_internal: + type: boolean + name: + type: string + proxy_id: + description: >- + The ID of the proxy to use for this fleet server host. See + the proxies API for more information. + nullable: true + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_fleet_server_host' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Update Fleet Server host by ID + tags: + - Fleet Server hosts + /health_check: + post: + operationId: fleet-server-health-check + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + host: + deprecated: true + type: string + id: + type: string + required: + - id + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + host: + deprecated: true + type: string + id: + description: Fleet Server host id + type: string + status: + type: string + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Fleet Server health check + tags: + - Fleet internals + /kubernetes: + get: + operationId: get-full-k8s-manifest + parameters: + - in: query + name: download + required: false + schema: + type: boolean + - in: query + name: fleetServer + required: false + schema: + type: string + - in: query + name: enrolToken + required: false + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + type: string + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get full K8s agent manifest + tags: + - Fleet Kubernetes + /logstash_api_keys: + post: + operationId: generate-logstash-api-key + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + api_key: + type: string + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Generate Logstash API key + tags: + - Fleet outputs + /outputs: + get: + operationId: get-outputs + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_output_create_request' + type: array + page: + type: integer + perPage: + type: integer + total: + type: integer + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List outputs + tags: + - Fleet outputs + post: + operationId: post-outputs + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_output_create_request' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_output_create_request' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create output + tags: + - Fleet outputs + '/outputs/{outputId}': + delete: + operationId: delete-output + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + id: + type: string + required: + - id + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete output by ID + tags: + - Fleet outputs + get: + operationId: get-output + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_output_create_request' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get output by ID + tags: + - Fleet outputs + parameters: + - in: path + name: outputId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_tines' - required: - - config - - name - - secrets - Connectors_update_connector_request_torq: - title: Update Torq connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_torq' - name: - description: The display name for the connector. + put: + operationId: update-output + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_output_update_request' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_output_update_request' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Update output by ID + tags: + - Fleet outputs + '/outputs/{outputId}/health': + get: + operationId: get-output-health + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + message: + description: long message if unhealthy + type: string + state: + description: 'state of output, HEALTHY or DEGRADED' + type: string + timestamp: + description: timestamp of reported state + type: string + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get latest output health + tags: + - Fleet outputs + parameters: + - in: path + name: outputId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_torq' - required: - - config - - name - - secrets - Connectors_update_connector_request_webhook: - title: Update Webhook connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_webhook' - name: - description: The display name for the connector. + /package_policies: + get: + operationId: get-package-policies + parameters: + - $ref: '#/components/parameters/Fleet_page_size' + - $ref: '#/components/parameters/Fleet_page_index' + - $ref: '#/components/parameters/Fleet_kuery' + - $ref: '#/components/parameters/Fleet_format' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_package_policy' + type: array + page: + type: number + perPage: + type: number + total: + type: number + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List package policies + tags: + - Fleet package policies + parameters: [] + post: + operationId: create-package-policy + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - $ref: '#/components/parameters/Fleet_format' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_package_policy_request' + description: >- + You should use inputs as an object and not use the deprecated inputs + array. + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_package_policy' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + '409': + $ref: '#/components/responses/Fleet_error' + summary: Create package policy + tags: + - Fleet package policies + /package_policies/_bulk_get: + post: + operationId: bulk-get-package-policies + parameters: + - $ref: '#/components/parameters/Fleet_format' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + ids: + description: list of package policy ids + items: + type: string + type: array + ignoreMissing: + type: boolean + required: + - ids + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_package_policy' + type: array + required: + - items + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Bulk get package policies + tags: + - Fleet package policies + '/package_policies/{packagePolicyId}': + delete: + operationId: delete-package-policy + parameters: + - in: query + name: force + schema: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + id: + type: string + required: + - id + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete package policy by ID + tags: + - Fleet package policies + get: + operationId: get-package-policy + parameters: + - $ref: '#/components/parameters/Fleet_format' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_package_policy' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get package policy by ID + tags: + - Fleet package policies + parameters: + - in: path + name: packagePolicyId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_webhook' - required: - - config - - name - - secrets - Connectors_update_connector_request_xmatters: - title: Update xMatters connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_xmatters' - name: - description: The display name for the connector. + put: + operationId: update-package-policy + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + - $ref: '#/components/parameters/Fleet_format' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_package_policy_request' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_package_policy' + sucess: + type: boolean + required: + - item + - sucess + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Update package policy by ID + tags: + - Fleet package policies + /package_policies/delete: + post: + operationId: post-delete-package-policy + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + force: + type: boolean + packagePolicyIds: + items: + type: string + type: array + required: + - packagePolicyIds + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + items: + type: object + properties: + id: + type: string + name: + type: string + success: + type: boolean + required: + - id + - success + type: array + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete package policy + tags: + - Fleet package policies + /package_policies/upgrade: + post: + operationId: upgrade-package-policy + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + packagePolicyIds: + items: + type: string + type: array + required: + - packagePolicyIds + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + items: + type: object + properties: + id: + type: string + name: + type: string + success: + type: boolean + required: + - id + - success + type: array + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + '409': + $ref: '#/components/responses/Fleet_error' + summary: Upgrade package policy to a newer package version + tags: + - Fleet package policies + /package_policies/upgrade/dryrun: + post: + operationId: upgrade-package-policy-dry-run + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + packagePolicyIds: + items: + type: string + type: array + packageVersion: + type: string + required: + - packagePolicyIds + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + items: + type: object + properties: + agent_diff: + $ref: '#/components/schemas/Fleet_upgrade_agent_diff' + diff: + $ref: '#/components/schemas/Fleet_upgrade_diff' + hasErrors: + type: boolean + required: + - hasErrors + type: array + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Dry run package policy upgrade + tags: + - Fleet package policies + /proxies: + get: + operationId: get-fleet-proxies + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + $ref: '#/components/schemas/Fleet_proxies' + type: array + page: + type: integer + perPage: + type: integer + total: + type: integer + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List proxies + tags: + - Fleet proxies + post: + operationId: post-fleet-proxies + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + certificate: + type: string + certificate_authorities: + type: string + certificate_key: + type: string + id: + type: string + name: + type: string + proxy_headers: + type: object + url: + type: string + required: + - name + - url + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_proxies' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create proxy + tags: + - Fleet proxies + '/proxies/{itemId}': + delete: + operationId: delete-fleet-proxies + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + id: + type: string + required: + - id + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Delete proxy by ID + tags: + - Fleet proxies + get: + operationId: get-one-fleet-proxies + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_proxies' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get proxy by ID + tags: + - Fleet proxies + parameters: + - in: path + name: itemId + required: true + schema: type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_xmatters' - required: - - config - - name - - secrets - Connectors_verification_mode: - default: full + put: + operationId: update-fleet-proxies + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + certificate: + type: string + certificate_authorities: + type: string + certificate_key: + type: string + name: + type: string + proxy_headers: + type: object + url: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/Fleet_proxies' + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Update proxy by ID + tags: + - Fleet proxies + '/s/{spaceId}/api/observability/slos': + get: + description: > + You must have the `read` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: findSlosOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - description: A valid kql query to filter the SLO with + example: 'slo.name:latency* and slo.tags : "prod"' + in: query + name: kqlQuery + schema: + type: string + - description: 'The page to use for pagination, must be greater or equal than 1' + example: 1 + in: query + name: page + schema: + default: 1 + type: integer + - description: Number of SLOs returned by page + example: 25 + in: query + name: perPage + schema: + default: 25 + maximum: 5000 + type: integer + - description: Sort by field + example: status + in: query + name: sortBy + schema: + default: status + enum: + - sli_value + - status + - error_budget_consumed + - error_budget_remaining + type: string + - description: Sort order + example: asc + in: query + name: sortDirection + schema: + default: asc + enum: + - asc + - desc + type: string + - description: >- + Hide stale SLOs from the list as defined by stale SLO threshold in + SLO settings + in: query + name: hideStale + schema: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_find_slo_response' + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Get a paginated list of SLOs + tags: + - slo + post: + description: > + You must have `all` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: createSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_create_slo_request' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_create_slo_response' + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '409': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_409_response' + description: Conflict - The SLO id already exists + servers: + - url: 'https://localhost:5601' + summary: Create an SLO + tags: + - slo + '/s/{spaceId}/api/observability/slos/_delete_instances': + post: + description: > + The deletion occurs for the specified list of `sloId` and `instanceId`. + You must have `all` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: deleteSloInstancesOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_delete_slo_instances_request' + required: true + responses: + '204': + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + servers: + - url: 'https://localhost:5601' + summary: Batch delete rollup and summary data + tags: + - slo + '/s/{spaceId}/api/observability/slos/{sloId}': + delete: + description: > + You must have the `write` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: deleteSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - $ref: '#/components/parameters/SLOs_slo_id' + responses: + '204': + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Delete an SLO + tags: + - slo + get: + description: > + You must have the `read` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: getSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - $ref: '#/components/parameters/SLOs_slo_id' + - description: the specific instanceId used by the summary calculation + example: host-abcde + in: query + name: instanceId + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_slo_with_summary_response' + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Get an SLO + tags: + - slo + put: + description: > + You must have the `write` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: updateSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - $ref: '#/components/parameters/SLOs_slo_id' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_update_slo_request' + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_slo_definition_response' + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Update an SLO + tags: + - slo + '/s/{spaceId}/api/observability/slos/{sloId}/_reset': + post: + description: > + You must have the `write` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: resetSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - $ref: '#/components/parameters/SLOs_slo_id' + responses: + '204': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_slo_definition_response' + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Reset an SLO + tags: + - slo + '/s/{spaceId}/api/observability/slos/{sloId}/disable': + post: + description: > + You must have the `write` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: disableSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - $ref: '#/components/parameters/SLOs_slo_id' + responses: + '200': + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Disable an SLO + tags: + - slo + '/s/{spaceId}/api/observability/slos/{sloId}/enable': + post: description: > - Controls the verification of certificates. Use `full` to validate that - the certificate has an issue date within the `not_before` and - `not_after` dates, chains to a trusted certificate authority (CA), and - has a hostname or IP address that matches the names within the - certificate. Use `certificate` to validate the certificate and verify - that it is signed by a trusted authority; this option does not check the - certificate hostname. Use `none` to skip certificate validation. - enum: - - certificate - - full - - none - title: Verification mode - type: string + You must have the `write` privileges for the **SLOs** feature in the + **Observability** section of the Kibana feature privileges. + operationId: enableSloOp + parameters: + - $ref: '#/components/parameters/SLOs_kbn_xsrf' + - $ref: '#/components/parameters/SLOs_space_id' + - $ref: '#/components/parameters/SLOs_slo_id' + responses: + '204': + description: Successful request + '400': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_400_response' + description: Bad request + '401': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_401_response' + description: Unauthorized response + '403': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_403_response' + description: Unauthorized response + '404': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/SLOs_404_response' + description: Not found response + summary: Enable an SLO + tags: + - slo + /service_tokens: + post: + operationId: generate-service-token + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + name: + type: string + value: + type: string + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create service token + tags: + - Fleet service tokens + /service-tokens: + post: + deprecated: true + operationId: generate-service-token-deprecated + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + name: + type: string + value: + type: string + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Create service token + tags: + - Fleet service tokens + /settings: + get: + operationId: get-settings + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_fleet_settings_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get settings + tags: + - Fleet internals + put: + operationId: update-settings + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + additional_yaml_config: + type: string + fleet_server_hosts: + description: Protocol and path must be the same for each URL + items: + type: string + type: array + has_seen_add_data_notice: + type: boolean + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_fleet_settings_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Update settings + tags: + - Fleet internals + /settings/enrollment: + get: + operationId: get-enrollment-settings + parameters: + - description: >- + An agent policy ID to scope the enrollment settings to. For example, + that policy's Fleet Server host, its proxy, download location, etc. + If not provided, the default Fleet Server policy is used (if any). + in: query + name: agentPolicyId + required: false + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_fleet_settings_enrollment_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get enrollment settings + tags: + - Fleet internals + servers: + - description: Used for Fleet internals and not supported + url: 'http://KIBANA_HOST:5601/internal/fleet' + /setup: + post: + operationId: setup + parameters: + - $ref: '#/components/parameters/Fleet_kbn_xsrf' + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: '#/components/schemas/Fleet_fleet_setup_response' + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + '500': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + message: + type: string + description: Internal Server Error + summary: Initiate Fleet setup + tags: + - Fleet internals + /uninstall_tokens: + get: + operationId: get-uninstall-tokens + parameters: + - description: The number of items to return + in: query + name: perPage + required: false + schema: + default: 20 + minimum: 5 + type: integer + - $ref: '#/components/parameters/Fleet_page_index' + - description: Partial match filtering for policy IDs + in: query + name: policyId + required: false + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + items: + items: + type: object + properties: + created_at: + type: string + id: + type: string + policy_id: + type: string + required: + - id + - policy_id + - created_at + type: array + page: + type: number + perPage: + type: number + total: + type: number + required: + - items + - total + - page + - perPage + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: List metadata for latest uninstall tokens per agent policy + tags: + - Fleet uninstall tokens + '/uninstall_tokens/{uninstallTokenId}': + get: + operationId: get-uninstall-token + parameters: + - in: path + name: uninstallTokenId + required: true + schema: + type: string + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + item: + type: object + properties: + created_at: + type: string + id: + type: string + policy_id: + type: string + token: + type: string + required: + - id + - token + - policy_id + - created_at + required: + - item + description: OK + '400': + $ref: '#/components/responses/Fleet_error' + summary: Get one decrypted uninstall token by its ID + tags: + - Fleet uninstall tokens +components: + examples: + Data_views_create_data_view_request: + summary: Create a data view with runtime fields. + value: + data_view: + name: My Logstash data view + runtimeFieldMap: + runtime_shape_name: + script: + source: 'emit(doc[''shape_name''].value)' + type: keyword + title: logstash-* + Data_views_create_runtime_field_request: + summary: Create a runtime field. + value: + name: runtimeFoo + runtimeField: + script: + source: 'emit(doc["foo"].value)' + type: long + Data_views_get_data_view_response: + summary: >- + The get data view API returns a JSON object that contains information + about the data view. + value: + data_view: + allowNoIndex: false + fieldAttrs: + products.manufacturer: + count: 1 + products.price: + count: 1 + products.product_name: + count: 1 + total_quantity: + count: 1 + fieldFormats: + products.base_price: + id: number + params: + pattern: '$0,0.00' + products.base_unit_price: + id: number + params: + pattern: '$0,0.00' + products.min_price: + id: number + params: + pattern: '$0,0.00' + products.price: + id: number + params: + pattern: '$0,0.00' + products.taxful_price: + id: number + params: + pattern: '$0,0.00' + products.taxless_price: + id: number + params: + pattern: '$0,0.00' + taxful_total_price: + id: number + params: + pattern: '$0,0.[00]' + taxless_total_price: + id: number + params: + pattern: '$0,0.00' + fields: + _id: + aggregatable: false + count: 0 + esTypes: + - _id + format: + id: string + isMapped: true + name: _id + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + _index: + aggregatable: true + count: 0 + esTypes: + - _index + format: + id: string + isMapped: true + name: _index + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + _score: + aggregatable: false + count: 0 + format: + id: number + isMapped: true + name: _score + readFromDocValues: false + scripted: false + searchable: false + shortDotsEnable: false + type: number + _source: + aggregatable: false + count: 0 + esTypes: + - _source + format: + id: _source + isMapped: true + name: _source + readFromDocValues: false + scripted: false + searchable: false + shortDotsEnable: false + type: _source + category: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: category + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + category.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: category.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: category + type: string + currency: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: currency + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + customer_birth_date: + aggregatable: true + count: 0 + esTypes: + - date + format: + id: date + isMapped: true + name: customer_birth_date + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: date + customer_first_name: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: customer_first_name + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + customer_first_name.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: customer_first_name.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: customer_first_name + type: string + customer_full_name: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: customer_full_name + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + customer_full_name.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: customer_full_name.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: customer_full_name + type: string + customer_gender: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: customer_gender + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + customer_id: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: customer_id + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + customer_last_name: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: customer_last_name + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + customer_last_name.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: customer_last_name.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: customer_last_name + type: string + customer_phone: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: customer_phone + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + day_of_week: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: day_of_week + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + day_of_week_i: + aggregatable: true + count: 0 + esTypes: + - integer + format: + id: number + isMapped: true + name: day_of_week_i + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + email: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: email + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + event.dataset: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: event.dataset + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + geoip.city_name: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: geoip.city_name + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + geoip.continent_name: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: geoip.continent_name + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + geoip.country_iso_code: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: geoip.country_iso_code + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + geoip.location: + aggregatable: true + count: 0 + esTypes: + - geo_point + format: + id: geo_point + params: + transform: wkt + isMapped: true + name: geoip.location + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: geo_point + geoip.region_name: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: geoip.region_name + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + manufacturer: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: manufacturer + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + manufacturer.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: manufacturer.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: manufacturer + type: string + order_date: + aggregatable: true + count: 0 + esTypes: + - date + format: + id: date + isMapped: true + name: order_date + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: date + order_id: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: order_id + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + products._id: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: products._id + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + products._id.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: products._id.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: products._id + type: string + products.base_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: products.base_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.base_unit_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: products.base_unit_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.category: + aggregatable: false + count: 0 + esTypes: + - text + format: + id: string + isMapped: true + name: products.category + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + products.category.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: products.category.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: products.category + type: string + products.created_on: + aggregatable: true + count: 0 + esTypes: + - date + format: + id: date + isMapped: true + name: products.created_on + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: date + products.discount_amount: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + isMapped: true + name: products.discount_amount + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.discount_percentage: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + isMapped: true + name: products.discount_percentage + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.manufacturer: + aggregatable: false + count: 1 + esTypes: + - text + format: + id: string + isMapped: true + name: products.manufacturer + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + products.manufacturer.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: products.manufacturer.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: products.manufacturer + type: string + products.min_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: products.min_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.price: + aggregatable: true + count: 1 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: products.price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.product_id: + aggregatable: true + count: 0 + esTypes: + - long + format: + id: number + isMapped: true + name: products.product_id + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.product_name: + aggregatable: false + count: 1 + esTypes: + - text + format: + id: string + isMapped: true + name: products.product_name + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + products.product_name.keyword: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: products.product_name.keyword + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + subType: + multi: + parent: products.product_name + type: string + products.quantity: + aggregatable: true + count: 0 + esTypes: + - integer + format: + id: number + isMapped: true + name: products.quantity + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.sku: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: products.sku + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + products.tax_amount: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + isMapped: true + name: products.tax_amount + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.taxful_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: products.taxful_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.taxless_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: products.taxless_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + products.unit_discount_amount: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + isMapped: true + name: products.unit_discount_amount + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + sku: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: sku + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + taxful_total_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.[00]' + isMapped: true + name: taxful_total_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + taxless_total_price: + aggregatable: true + count: 0 + esTypes: + - half_float + format: + id: number + params: + pattern: '$0,0.00' + isMapped: true + name: taxless_total_price + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + total_quantity: + aggregatable: true + count: 1 + esTypes: + - integer + format: + id: number + isMapped: true + name: total_quantity + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + total_unique_products: + aggregatable: true + count: 0 + esTypes: + - integer + format: + id: number + isMapped: true + name: total_unique_products + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + type: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: type + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + user: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: user + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + id: ff959d40-b880-11e8-a6d9-e546fe2bba5f + name: Kibana Sample Data eCommerce + namespaces: + - default + runtimeFieldMap: {} + sourceFilters: [] + timeFieldName: order_date + title: kibana_sample_data_ecommerce + typeMeta: {} + version: WzUsMV0= + Data_views_get_data_views_response: + summary: The get all data views API returns a list of data views. + value: + data_view: + - id: ff959d40-b880-11e8-a6d9-e546fe2bba5f + name: Kibana Sample Data eCommerce + namespaces: + - default + title: kibana_sample_data_ecommerce + typeMeta: {} + - id: d3d7af60-4c81-11e8-b3d7-01146121b73d + name: Kibana Sample Data Flights + namespaces: + - default + title: kibana_sample_data_flights + - id: 90943e30-9a47-11e8-b64d-95841ca0b247 + name: Kibana Sample Data Logs + namespaces: + - default + title: kibana_sample_data_logs + Data_views_get_default_data_view_response: + summary: The get default data view API returns the default data view identifier. + value: + data_view_id: ff959d40-b880-11e8-a6d9-e546fe2bba5f + Data_views_get_runtime_field_response: + summary: >- + The get runtime field API returns a JSON object that contains + information about the runtime field (`hour_of_day`) and the data view + (`d3d7af60-4c81-11e8-b3d7-01146121b73d`). + value: + data_view: + allowNoIndex: false + fieldAttrs: {} + fieldFormats: + AvgTicketPrice: + id: number + params: + pattern: '$0,0.[00]' + hour_of_day: + id: number + params: + pattern: '00' + fields: + _id: + aggregatable: false + count: 0 + esTypes: + - _id + format: + id: string + isMapped: true + name: _id + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + _index: + aggregatable: true + count: 0 + esTypes: + - _index + format: + id: string + isMapped: true + name: _index + readFromDocValues: false + scripted: false + searchable: true + shortDotsEnable: false + type: string + _score: + aggregatable: false + count: 0 + format: + id: number + isMapped: true + name: _score + readFromDocValues: false + scripted: false + searchable: false + shortDotsEnable: false + type: number + _source: + aggregatable: false + count: 0 + esTypes: + - _source + format: + id: _source + isMapped: true + name: _source + readFromDocValues: false + scripted: false + searchable: false + shortDotsEnable: false + type: _source + AvgTicketPrice: + aggregatable: true + count: 0 + esTypes: + - float + format: + id: number + params: + pattern: '$0,0.[00]' + isMapped: true + name: AvgTicketPrice + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + Cancelled: + aggregatable: true + count: 0 + esTypes: + - boolean + format: + id: boolean + isMapped: true + name: Cancelled + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: boolean + Carrier: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: Carrier + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + dayOfWeek: + aggregatable: true + count: 0 + esTypes: + - integer + format: + id: number + isMapped: true + name: dayOfWeek + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + Dest: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: Dest + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + DestAirportID: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: DestAirportID + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + DestCityName: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: DestCityName + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + DestCountry: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: DestCountry + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + DestLocation: + aggregatable: true + count: 0 + esTypes: + - geo_point + format: + id: geo_point + params: + transform: wkt + isMapped: true + name: DestLocation + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: geo_point + DestRegion: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: DestRegion + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + DestWeather: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: DestWeather + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + DistanceKilometers: + aggregatable: true + count: 0 + esTypes: + - float + format: + id: number + isMapped: true + name: DistanceKilometers + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + DistanceMiles: + aggregatable: true + count: 0 + esTypes: + - float + format: + id: number + isMapped: true + name: DistanceMiles + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + FlightDelay: + aggregatable: true + count: 0 + esTypes: + - boolean + format: + id: boolean + isMapped: true + name: FlightDelay + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: boolean + FlightDelayMin: + aggregatable: true + count: 0 + esTypes: + - integer + format: + id: number + isMapped: true + name: FlightDelayMin + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + FlightDelayType: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: FlightDelayType + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + FlightNum: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: FlightNum + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + FlightTimeHour: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: FlightTimeHour + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + FlightTimeMin: + aggregatable: true + count: 0 + esTypes: + - float + format: + id: number + isMapped: true + name: FlightTimeMin + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: number + hour_of_day: + aggregatable: true + count: 0 + esTypes: + - long + format: + id: number + params: + pattern: '00' + name: hour_of_day + readFromDocValues: false + runtimeField: + script: + source: 'emit(doc[''timestamp''].value.getHour());' + type: long + scripted: false + searchable: true + shortDotsEnable: false + type: number + Origin: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: Origin + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + OriginAirportID: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: OriginAirportID + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + OriginCityName: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: OriginCityName + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + OriginCountry: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: OriginCountry + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + OriginLocation: + aggregatable: true + count: 0 + esTypes: + - geo_point + format: + id: geo_point + params: + transform: wkt + isMapped: true + name: OriginLocation + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: geo_point + OriginRegion: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: OriginRegion + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + OriginWeather: + aggregatable: true + count: 0 + esTypes: + - keyword + format: + id: string + isMapped: true + name: OriginWeather + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: string + timestamp: + aggregatable: true + count: 0 + esTypes: + - date + format: + id: date + isMapped: true + name: timestamp + readFromDocValues: true + scripted: false + searchable: true + shortDotsEnable: false + type: date + id: d3d7af60-4c81-11e8-b3d7-01146121b73d + name: Kibana Sample Data Flights + runtimeFieldMap: + hour_of_day: + script: + source: 'emit(doc[''timestamp''].value.getHour());' + type: long + sourceFilters: [] + timeFieldName: timestamp + title: kibana_sample_data_flights + version: WzM2LDJd + fields: + - aggregatable: true + count: 0 + esTypes: + - long + name: hour_of_day + readFromDocValues: false + runtimeField: + script: + source: 'emit(doc[''timestamp''].value.getHour());' + type: long + scripted: false + searchable: true + shortDotsEnable: false + type: number + Data_views_preview_swap_data_view_request: + summary: Preview swapping references from data view ID "abcd-efg" to "xyz-123". + value: + fromId: abcd-efg + toId: xyz-123 + Data_views_set_default_data_view_request: + summary: Set the default data view identifier. + value: + data_view_id: ff959d40-b880-11e8-a6d9-e546fe2bba5f + force: true + Data_views_swap_data_view_request: + summary: >- + Swap references from data view ID "abcd-efg" to "xyz-123" and remove the + data view that is no longer referenced. + value: + delete: true + fromId: abcd-efg + toId: xyz-123 + Data_views_update_data_view_request: + summary: Update some properties for a data view. + value: + data_view: + allowNoIndex: false + name: Kibana Sample Data eCommerce + timeFieldName: order_date + title: kibana_sample_data_ecommerce + refresh_fields: true + Data_views_update_field_metadata_request: + summary: Update metadata for multiple fields. + value: + fields: + field1: + count: 123 + customLabel: Field 1 label + field2: + customDescription: Field 2 description + customLabel: Field 2 label + Data_views_update_runtime_field_request: + summary: Update an existing runtime field on a data view. + value: + runtimeField: + script: + source: 'emit(doc["bar"].value)' + Machine_learning_APIs_mlSyncExample: + summary: Two anomaly detection jobs required synchronization in this example. + value: + datafeedsAdded: {} + datafeedsRemoved: {} + savedObjectsCreated: + anomaly-detector: + myjob1: + success: true + myjob2: + success: true + savedObjectsDeleted: {} + Serverless_saved_objects_export_objects_request: + summary: Export a specific saved object. + value: + excludeExportDetails: true + includeReferencesDeep: false + objects: + - id: de71f4f0-1902-11e9-919b-ffe5949a18d2 + type: map + Serverless_saved_objects_export_objects_response: + summary: >- + The export objects API response contains a JSON record for each exported + object. + value: + attributes: + description: '' + layerListJSON: >- + [{"id":"0hmz5","alpha":1,"sourceDescriptor":{"type":"EMS_TMS","isAutoSelect":true,"lightModeDefault":"road_map_desaturated"},"visible":true,"style":{},"type":"EMS_VECTOR_TILE","minZoom":0,"maxZoom":24},{"id":"edh66","label":"Total + Requests by + Destination","minZoom":0,"maxZoom":24,"alpha":0.5,"sourceDescriptor":{"type":"EMS_FILE","id":"world_countries","tooltipProperties":["name","iso2"]},"visible":true,"style":{"type":"VECTOR","properties":{"fillColor":{"type":"DYNAMIC","options":{"field":{"name":"__kbnjoin__count__673ff994-fc75-4c67-909b-69fcb0e1060e","origin":"join"},"color":"Greys","fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"lineColor":{"type":"STATIC","options":{"color":"#FFFFFF"}},"lineWidth":{"type":"STATIC","options":{"size":1}},"iconSize":{"type":"STATIC","options":{"size":10}},"symbolizeAs":{"options":{"value":"circle"}},"icon":{"type":"STATIC","options":{"value":"marker"}}}},"type":"GEOJSON_VECTOR","joins":[{"leftField":"iso2","right":{"type":"ES_TERM_SOURCE","id":"673ff994-fc75-4c67-909b-69fcb0e1060e","indexPatternTitle":"kibana_sample_data_logs","term":"geo.dest","indexPatternRefName":"layer_1_join_0_index_pattern","metrics":[{"type":"count","label":"web + logs + count"}],"applyGlobalQuery":true}}]},{"id":"gaxya","label":"Actual + Requests","minZoom":9,"maxZoom":24,"alpha":1,"sourceDescriptor":{"id":"b7486535-171b-4d3b-bb2e-33c1a0a2854c","type":"ES_SEARCH","geoField":"geo.coordinates","limit":2048,"filterByMapBounds":true,"tooltipProperties":["clientip","timestamp","host","request","response","machine.os","agent","bytes"],"indexPatternRefName":"layer_2_source_index_pattern","applyGlobalQuery":true,"scalingType":"LIMIT"},"visible":true,"style":{"type":"VECTOR","properties":{"fillColor":{"type":"STATIC","options":{"color":"#2200ff"}},"lineColor":{"type":"STATIC","options":{"color":"#FFFFFF"}},"lineWidth":{"type":"STATIC","options":{"size":2}},"iconSize":{"type":"DYNAMIC","options":{"field":{"name":"bytes","origin":"source"},"minSize":1,"maxSize":23,"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"symbolizeAs":{"options":{"value":"circle"}},"icon":{"type":"STATIC","options":{"value":"marker"}}}},"type":"GEOJSON_VECTOR"},{"id":"tfi3f","label":"Total + Requests and + Bytes","minZoom":0,"maxZoom":9,"alpha":1,"sourceDescriptor":{"type":"ES_GEO_GRID","resolution":"COARSE","id":"8aaa65b5-a4e9-448b-9560-c98cb1c5ac5b","geoField":"geo.coordinates","requestType":"point","metrics":[{"type":"count","label":"web + logs + count"},{"type":"sum","field":"bytes"}],"indexPatternRefName":"layer_3_source_index_pattern","applyGlobalQuery":true},"visible":true,"style":{"type":"VECTOR","properties":{"fillColor":{"type":"DYNAMIC","options":{"field":{"name":"doc_count","origin":"source"},"color":"Blues","fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"lineColor":{"type":"STATIC","options":{"color":"#cccccc"}},"lineWidth":{"type":"STATIC","options":{"size":1}},"iconSize":{"type":"DYNAMIC","options":{"field":{"name":"sum_of_bytes","origin":"source"},"minSize":7,"maxSize":25,"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"labelText":{"type":"DYNAMIC","options":{"field":{"name":"doc_count","origin":"source"},"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"labelSize":{"type":"DYNAMIC","options":{"field":{"name":"doc_count","origin":"source"},"minSize":12,"maxSize":24,"fieldMetaOptions":{"isEnabled":false,"sigma":3}}},"symbolizeAs":{"options":{"value":"circle"}},"icon":{"type":"STATIC","options":{"value":"marker"}}}},"type":"GEOJSON_VECTOR"}] + mapStateJSON: >- + {"zoom":3.64,"center":{"lon":-88.92107,"lat":42.16337},"timeFilters":{"from":"now-7d","to":"now"},"refreshConfig":{"isPaused":true,"interval":0},"query":{"language":"kuery","query":""},"settings":{"autoFitToDataBounds":false}} + title: '[Logs] Total Requests and Bytes' + uiStateJSON: '{"isDarkMode":false}' + coreMigrationVersion: 8.8.0 + created_at: '2023-08-23T20:03:32.204Z' + id: de71f4f0-1902-11e9-919b-ffe5949a18d2 + managed: false + references: + - id: 90943e30-9a47-11e8-b64d-95841ca0b247 + name: layer_1_join_0_index_pattern + type: index-pattern + - id: 90943e30-9a47-11e8-b64d-95841ca0b247 + name: layer_2_source_index_pattern + type: index-pattern + - id: 90943e30-9a47-11e8-b64d-95841ca0b247 + name: layer_3_source_index_pattern + type: index-pattern + type: map + typeMigrationVersion: 8.4.0 + updated_at: '2023-08-23T20:03:32.204Z' + version: WzEzLDFd + Serverless_saved_objects_import_objects_request: + value: + file: file.ndjson + Serverless_saved_objects_import_objects_response: + summary: >- + The import objects API response indicates a successful import and the + objects are created. Since these objects are created as new copies, each + entry in the successResults array includes a destinationId attribute. + value: + success: true + successCount: 1 + successResults: + - destinationId: 82d2760c-468f-49cf-83aa-b9a35b6a8943 + id: 90943e30-9a47-11e8-b64d-95841ca0b247 + managed: false + meta: + icon: indexPatternApp + title: Kibana Sample Data Logs + type: index-pattern + parameters: + Data_views_field_name: + description: The name of the runtime field. + in: path + name: fieldName + required: true + schema: + example: hour_of_day + type: string + Data_views_kbn_xsrf: + description: Cross-site request forgery protection + in: header + name: kbn-xsrf + required: true + schema: + type: string + Data_views_view_id: + description: An identifier for the data view. + in: path + name: viewId + required: true + schema: + example: ff959d40-b880-11e8-a6d9-e546fe2bba5f + type: string + Fleet_format: + description: Simplified or legacy format for package inputs + in: query + name: format + required: false + schema: + enum: + - simplified + - legacy + type: string + Fleet_kbn_xsrf: + description: Kibana's anti Cross-Site Request Forgery token. Can be any string value. + in: header + name: kbn-xsrf + required: true + schema: + type: string + Fleet_kuery: + in: query + name: kuery + required: false + schema: + type: string + Fleet_page_index: + in: query + name: page + required: false + schema: + default: 1 + type: integer + Fleet_page_size: + description: The number of items to return + in: query + name: perPage + required: false + schema: + default: 20 + type: integer + Fleet_show_inactive: + in: query + name: showInactive + required: false + schema: + type: boolean + Fleet_show_upgradeable: + in: query + name: showUpgradeable + required: false + schema: + type: boolean + Fleet_sort_field: + in: query + name: sortField + required: false + schema: + deprecated: true + type: string + Fleet_sort_order: + in: query + name: sortOrder + required: false + schema: + enum: + - asc + - desc + type: string + Fleet_with_metrics: + description: 'Return agent metrics, false by default' + in: query + name: withMetrics + required: false + schema: + type: boolean + Machine_learning_APIs_simulateParam: + description: >- + When true, simulates the synchronization by returning only the list of + actions that would be performed. + example: 'true' + in: query + name: simulate + required: false + schema: + type: boolean + Serverless_saved_objects_kbn_xsrf: + description: Cross-site request forgery protection + in: header + name: kbn-xsrf + required: true + schema: + type: string + SLOs_kbn_xsrf: + description: Cross-site request forgery protection + in: header + name: kbn-xsrf + required: true + schema: + type: string + SLOs_slo_id: + description: An identifier for the slo. + in: path + name: sloId + required: true + schema: + example: 9c235211-6834-11ea-a78c-6feb38a34414 + type: string + SLOs_space_id: + description: >- + An identifier for the space. If `/s/` and the identifier are omitted + from the path, the default space is used. + in: path + name: spaceId + required: true + schema: + example: default + type: string + responses: + Fleet_error: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + error: + type: string + message: + type: string + statusCode: + type: number + description: Generic Error + schemas: Data_views_400_response: title: Bad request type: object @@ -15646,18 +12569,25 @@ components: type: object properties: active: + description: >- + When false, the enrollment API key is revoked and cannot be used for + enrolling Elastic Agents. type: boolean api_key: + description: The enrollment API key (token) used for enrolling Elastic Agents. type: string api_key_id: + description: The ID of the API key in the Security API. type: string created_at: type: string id: type: string name: + description: The name of the enrollment API key. type: string policy_id: + description: The ID of the agent policy the Elastic Agent will be enrolled in. type: string required: - id @@ -16314,6 +13244,7 @@ components: - version policy_id: deprecated: true + nullable: true type: string policy_ids: items: @@ -17198,6 +14129,11 @@ components: policy's namespace. example: customnamespace type: string + output_id: + description: Output ID to send package data to + example: output-id + nullable: true + type: string overrides: description: >- Override settings that are defined in the package policy. The @@ -17226,6 +14162,7 @@ components: deprecated: true description: Agent policy ID where that package policy will be added example: agent-policy-id + nullable: true type: string policy_ids: description: Agent policy IDs where that package policy will be added @@ -19042,8 +15979,7 @@ tags: Annotations enable you to easily see how events are impacting the performance of your applications. name: APM annotations - - description: Connector APIs enable you to create and manage connectors. - name: connectors + - name: connectors - name: Data streams - description: >- Data view APIs enable you to manage data views, formerly known as Kibana diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 08c1c14fa6160..402904c65bf2e 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -46,6 +46,10 @@ info: For more information about the console, refer to [Run API requests](https://www.elastic.co/guide/en/kibana/current/console-kibana.html). + + + NOTE: Access to internal Kibana API endpoints will be restricted in Kibana + version 9.0. Please move any integrations to publicly documented APIs. license: name: Attribution-NonCommercial-NoDerivatives 4.0 International url: 'https://creativecommons.org/licenses/by-nc-nd/4.0/' @@ -214,6 +218,7 @@ paths: - $ref: '#/components/parameters/Fleet_page_size' - $ref: '#/components/parameters/Fleet_page_index' - $ref: '#/components/parameters/Fleet_kuery' + - $ref: '#/components/parameters/Fleet_format' - description: >- When set to true, retrieve the related package policies for each agent policy. @@ -285,7 +290,8 @@ paths: /agent_policies/_bulk_get: post: operationId: bulk-get-agent-policies - parameters: [] + parameters: + - $ref: '#/components/parameters/Fleet_format' requestBody: content: application/json; Elastic-Api-Version=2023-10-31: @@ -351,6 +357,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/Fleet_format' put: operationId: update-agent-policy parameters: @@ -384,6 +391,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/Fleet_format' post: operationId: agent-policy-copy parameters: @@ -1423,7 +1431,7 @@ paths: - agent2 rollout_duration_seconds: 3600 source_uri: 'https://artifacts.elastic.co/downloads/beats/elastic-agent' - start_time: '2022-08-03T14:00:00.000Z' + start_time: 2022-08-03T14:00:00.000Z version: 8.4.0 schema: $ref: '#/components/schemas/Fleet_bulk_upgrade_agents' @@ -1569,581 +1577,480 @@ paths: /api/actions: get: deprecated: true - description: Deprecated in 7.13.0. Use the get all connectors API instead. - operationId: legacyGetConnectors - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - items: - $ref: '#/components/schemas/Connectors_action_response_properties' - type: array - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' + operationId: '%2Fapi%2Factions#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + responses: {} summary: Get all connectors tags: - connectors + /api/actions/action: post: deprecated: true - description: Deprecated in 7.13.0. Use the create connector API instead. - operationId: legacyCreateConnector + operationId: '%2Fapi%2Factions%2Faction#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: schema: - title: Legacy create connector request properties + additionalProperties: false type: object properties: actionTypeId: description: The connector type identifier. type: string config: - description: >- - The configuration for the connector. Configuration - properties vary depending on the connector type. + additionalProperties: {} + default: {} type: object name: description: The display name for the connector. type: string secrets: - description: > - The secrets configuration for the connector. Secrets - configuration properties vary depending on the connector - type. NOTE: Remember these values. You must provide them - each time you update the connector. + additionalProperties: {} + default: {} type: object - required: true + required: + - name + - actionTypeId responses: '200': - $ref: '#/components/responses/Connectors_200_actions' - '401': - $ref: '#/components/responses/Connectors_401' + description: Indicates a successful call. summary: Create a connector tags: - connectors - '/api/actions/action/{actionId}': + '/api/actions/action/{id}': delete: deprecated: true - description: > - Deprecated in 7.13.0. Use the delete connector API instead. WARNING: - When you delete a connector, it cannot be recovered. - operationId: legacyDeleteConnector + description: 'WARNING: When you delete a connector, it cannot be recovered.' + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_action_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string responses: '204': description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' summary: Delete a connector tags: - connectors get: deprecated: true - description: Deprecated in 7.13.0. Use the get connector API instead. - operationId: legacyGetConnector + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D#1' parameters: - - $ref: '#/components/parameters/Connectors_action_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string responses: '200': - $ref: '#/components/responses/Connectors_200_actions' - '401': - $ref: '#/components/responses/Connectors_401' + description: Indicates a successful call. summary: Get connector information tags: - connectors put: deprecated: true - description: Deprecated in 7.13.0. Use the update connector API instead. - operationId: legacyUpdateConnector + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D#2' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_action_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: schema: - description: The properties vary depending on the connector type. + additionalProperties: false + type: object properties: config: - description: >- - The new connector configuration. Configuration properties - vary depending on the connector type. + additionalProperties: {} + default: {} type: object name: - description: The new name for the connector. type: string secrets: - description: >- - The updated secrets configuration for the connector. Secrets - properties vary depending on the connector type. + additionalProperties: {} + default: {} type: object - title: Legacy update connector request body properties - type: object - required: true + required: + - name responses: '200': - $ref: '#/components/responses/Connectors_200_actions' - '404': - $ref: '#/components/responses/Connectors_404' + description: Indicates a successful call. summary: Update a connector tags: - connectors - '/api/actions/action/{actionId}/_execute': + '/api/actions/action/{id}/_execute': post: deprecated: true - description: Deprecated in 7.13.0. Use the run connector API instead. - operationId: legacyRunConnector + operationId: '%2Fapi%2Factions%2Faction%2F%7Bid%7D%2F_execute#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_action_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: schema: - description: The properties vary depending on the connector type. + additionalProperties: false + type: object properties: params: - description: >- - The parameters of the connector. Parameter properties vary - depending on the connector type. + additionalProperties: {} type: object required: - params - title: Legacy run connector request body properties - type: object - required: true responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - actionId: - type: string - data: - oneOf: - - additionalProperties: true - description: Information returned from the action. - type: object - - description: An array of information returned from the action. - items: - type: object - type: array - status: - description: The status of the action. - type: string description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' summary: Run a connector tags: - connectors - /api/actions/connector: - post: - description: The connector identifier is randomly generated. - operationId: createConnector - parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - requestBody: - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createEmailConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_email_connector_request - createIndexConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_index_connector_request - createWebhookConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_webhook_connector_request - createXmattersConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_xmatters_connector_request - schema: - $ref: '#/components/schemas/Connectors_create_connector_request' - required: true - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createEmailConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_email_connector_response - createIndexConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_index_connector_response - createWebhookConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_webhook_connector_response - createXmattersConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_xmatters_connector_response - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - summary: Create a connector with a random ID - tags: - - connectors /api/actions/connector_types: get: - operationId: getConnectorTypes + description: You do not need any Kibana feature privileges to run this API. + operationId: '%2Fapi%2Factions%2Fconnector_types#0' parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string - description: >- A filter to limit the retrieved connector types to those that support a specific feature (such as alerting or cases). in: query name: feature_id + required: false schema: - $ref: '#/components/schemas/Connectors_features' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getConnectorTypesServerlessResponse: - $ref: >- - #/components/examples/Connectors_get_connector_types_generativeai_response - schema: - description: The properties vary for each connector type. - items: - type: object - properties: - enabled: - description: >- - Indicates whether the connector type is enabled in - Kibana. - example: true - type: boolean - enabled_in_config: - description: >- - Indicates whether the connector type is enabled in the - Kibana configuration file. - example: true - type: boolean - enabled_in_license: - description: >- - Indicates whether the connector is enabled in the - license. - example: true - type: boolean - id: - $ref: '#/components/schemas/Connectors_connector_types' - is_system_action_type: - example: false - type: boolean - minimum_license_required: - description: The license that is required to use the connector type. - example: basic - type: string - name: - description: The name of the connector type. - example: Index - type: string - supported_feature_ids: - description: The features that are supported by the connector type. - example: - - alerting - - cases - - siem - items: - $ref: '#/components/schemas/Connectors_features' - type: array - title: Get connector types response body properties - type: array - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - summary: Get all connector types + type: string + responses: {} + summary: Get connector types tags: - connectors - '/api/actions/connector/{connectorId}': + '/api/actions/connector/{id}': delete: - operationId: deleteConnector + description: 'WARNING: When you delete a connector, it cannot be recovered.' + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_connector_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string responses: '204': description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - '404': - $ref: '#/components/responses/Connectors_404' summary: Delete a connector tags: - connectors get: - operationId: getConnector + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D#1' parameters: - - $ref: '#/components/parameters/Connectors_connector_id' - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getConnectorResponse: - $ref: '#/components/examples/Connectors_get_connector_response' - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string + responses: + '200': description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' - '404': - $ref: '#/components/responses/Connectors_404' - summary: Get a connector information + summary: Get connector information tags: - connectors post: - operationId: createConnectorId + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%3F%7D#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - description: > - A UUID v1 or v4 identifier for the connector. If you omit this - parameter, an identifier is randomly generated. - in: path - name: connectorId + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf required: true schema: - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + example: 'true' + type: string + - in: path + name: id + required: false + schema: type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: - examples: - createIndexConnectorRequest: - $ref: >- - #/components/examples/Connectors_create_index_connector_request schema: - $ref: '#/components/schemas/Connectors_create_connector_request' - required: true + additionalProperties: false + type: object + properties: + config: + additionalProperties: {} + default: {} + type: object + connector_type_id: + description: The type of connector. + type: string + name: + description: The display name for the connector. + type: string + secrets: + additionalProperties: {} + default: {} + type: object + required: + - name + - connector_type_id responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - createIndexConnectorResponse: - $ref: >- - #/components/examples/Connectors_create_index_connector_response - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' summary: Create a connector tags: - connectors put: - operationId: updateConnector + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D#2' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_connector_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: - examples: - updateIndexConnectorRequest: - $ref: >- - #/components/examples/Connectors_update_index_connector_request schema: - $ref: '#/components/schemas/Connectors_update_connector_request' - required: true + additionalProperties: false + type: object + properties: + config: + additionalProperties: {} + default: {} + type: object + name: + description: The display name for the connector. + type: string + secrets: + additionalProperties: {} + default: {} + type: object + required: + - name responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Connectors_connector_response_properties' description: Indicates a successful call. - '400': - $ref: '#/components/responses/Connectors_401' - '401': - $ref: '#/components/responses/Connectors_401' - '404': - $ref: '#/components/responses/Connectors_404' summary: Update a connector tags: - connectors - '/api/actions/connector/{connectorId}/_execute': + '/api/actions/connector/{id}/_execute': post: - description: > + description: >- You can use this API to test an action that involves interaction with - Kibana services or integrations with third-party systems. You must have - `read` privileges for the **Actions and Connectors** feature in the - **Management** section of the Kibana feature privileges. If you use an - index connector, you must also have `all`, `create`, `index`, or `write` - indices privileges. - operationId: runConnector + Kibana services or integrations with third-party systems. + operationId: '%2Fapi%2Factions%2Fconnector%2F%7Bid%7D%2F_execute#0' parameters: - - $ref: '#/components/parameters/Connectors_kbn_xsrf' - - $ref: '#/components/parameters/Connectors_connector_id' + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - description: An identifier for the connector. + in: path + name: id + required: true + schema: + type: string requestBody: content: application/json; Elastic-Api-Version=2023-10-31: - examples: - runCasesWebhookConnectorRequest: - $ref: >- - #/components/examples/Connectors_run_cases_webhook_connector_request - runEmailConnectorRequest: - $ref: '#/components/examples/Connectors_run_email_connector_request' - runIndexConnectorRequest: - $ref: '#/components/examples/Connectors_run_index_connector_request' - runJiraConnectorRequest: - $ref: '#/components/examples/Connectors_run_jira_connector_request' - runPagerDutyConnectorRequest: - $ref: >- - #/components/examples/Connectors_run_pagerduty_connector_request - runServerLogConnectorRequest: - $ref: >- - #/components/examples/Connectors_run_server_log_connector_request - runServiceNowITOMConnectorRequest: - $ref: >- - #/components/examples/Connectors_run_servicenow_itom_connector_request - runSlackConnectorRequest: - $ref: >- - #/components/examples/Connectors_run_slack_api_connector_request - runSwimlaneConnectorRequest: - $ref: >- - #/components/examples/Connectors_run_swimlane_connector_request schema: - $ref: '#/components/schemas/Connectors_run_connector_request' - required: true + additionalProperties: false + type: object + properties: + params: + additionalProperties: {} + type: object + required: + - params responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - runCasesWebhookConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_cases_webhook_connector_response - runEmailConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_email_connector_response - runIndexConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_index_connector_response - runJiraConnectorResponse: - $ref: '#/components/examples/Connectors_run_jira_connector_response' - runPagerDutyConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_pagerduty_connector_response - runServerLogConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_server_log_connector_response - runServiceNowITOMConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_servicenow_itom_connector_response - runSlackConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_slack_api_connector_response - runSwimlaneConnectorResponse: - $ref: >- - #/components/examples/Connectors_run_swimlane_connector_response - schema: - type: object - properties: - connector_id: - description: The identifier for the connector. - type: string - data: - oneOf: - - additionalProperties: true - description: Information returned from the action. - type: object - - description: An array of information returned from the action. - items: - type: object - type: array - status: - description: The status of the action. - enum: - - error - - ok - type: string - required: - - connector_id - - status description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' summary: Run a connector tags: - connectors /api/actions/connectors: get: - operationId: getConnectors - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - examples: - getConnectorsResponse: - $ref: '#/components/examples/Connectors_get_connectors_response' - schema: - items: - $ref: >- - #/components/schemas/Connectors_connector_response_properties - type: array - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' + operationId: '%2Fapi%2Factions%2Fconnectors#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + responses: {} summary: Get all connectors tags: - connectors /api/actions/list_action_types: get: deprecated: true - description: Deprecated in 7.13.0. Use the get all connector types API instead. - operationId: legacyGetConnectorTypes - responses: - '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - description: The properties vary for each connector type. - items: - type: object - properties: - enabled: - description: >- - Indicates whether the connector type is enabled in - Kibana. - type: boolean - enabledInConfig: - description: >- - Indicates whether the connector type is enabled in the - Kibana `.yml` file. - type: boolean - enabledInLicense: - description: >- - Indicates whether the connector is enabled in the - license. - example: true - type: boolean - id: - description: The unique identifier for the connector type. - type: string - minimumLicenseRequired: - description: The license that is required to use the connector type. - type: string - name: - description: The name of the connector type. - type: string - title: Legacy get connector types response body properties - type: array - description: Indicates a successful call. - '401': - $ref: '#/components/responses/Connectors_401' + operationId: '%2Fapi%2Factions%2Flist_action_types#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + responses: {} summary: Get connector types tags: - connectors @@ -10701,7 +10608,10 @@ paths: /enrollment_api_keys: get: operationId: get-enrollment-api-keys - parameters: [] + parameters: + - $ref: '#/components/parameters/Fleet_page_size' + - $ref: '#/components/parameters/Fleet_page_index' + - $ref: '#/components/parameters/Fleet_kuery' responses: '200': content: @@ -10739,6 +10649,22 @@ paths: operationId: create-enrollment-api-keys parameters: - $ref: '#/components/parameters/Fleet_kbn_xsrf' + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + name: + description: The name of the enrollment API key. Must be unique. + type: string + policy_id: + description: >- + The ID of the agent policy the Elastic Agent will be + enrolled in. + type: string + required: + - policy_id responses: '200': content: @@ -10779,7 +10705,7 @@ paths: description: OK '400': $ref: '#/components/responses/Fleet_error' - summary: Delete enrollment API key by ID + summary: Revoke enrollment API key by ID by marking it as inactive tags: - Fleet enrollment API keys get: @@ -14444,469 +14370,8 @@ components: profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 username: elastic version: WzIwNjM2LDFd - Connectors_create_email_connector_request: - summary: Create an email connector. - value: - config: - from: tester@example.com - hasAuth: true - host: 'https://example.com' - port: 1025 - secure: false - service: other - connector_type_id: .email - name: email-connector-1 - secrets: - password: password - user: username - Connectors_create_email_connector_response: - summary: A new email connector. - value: - config: - clientId: null - from: tester@example.com - hasAuth: true - host: 'https://example.com' - oauthTokenUrl: null - port: 1025 - secure: false - service: other - tenantId: null - connector_type_id: .email - id: 90a82c60-478f-11ee-a343-f98a117c727f - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: email-connector-1 - Connectors_create_index_connector_request: - summary: Create an index connector. - value: - config: - index: test-index - connector_type_id: .index - name: my-connector - Connectors_create_index_connector_response: - summary: A new index connector. - value: - config: - executionTimeField: null - index: test-index - refresh: false - connector_type_id: .index - id: c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-connector - Connectors_create_webhook_connector_request: - summary: Create a webhook connector with SSL authentication. - value: - config: - authType: webhook-authentication-ssl - certType: ssl-crt-key - method: post - url: 'https://example.com' - connector_type_id: .webhook - name: my-webhook-connector - secrets: - crt: QmFnIEF0dH... - key: LS0tLS1CRUdJ... - password: my-passphrase - Connectors_create_webhook_connector_response: - summary: A new webhook connector. - value: - config: - authType: webhook-authentication-ssl - certType: ssl-crt-key - hasAuth: true - headers: null - method: post - url: 'https://example.com' - verificationMode: full - connector_type_id: .webhook - id: 900eb010-3b9d-11ee-a642-8ffbb94e38bd - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-webhook-connector - Connectors_create_xmatters_connector_request: - summary: Create an xMatters connector with URL authentication. - value: - config: - usesBasic: false - connector_type_id: .xmatters - name: my-xmatters-connector - secrets: - secretsUrl: 'https://example.com?apiKey=xxxxx' - Connectors_create_xmatters_connector_response: - summary: A new xMatters connector. - value: - config: - configUrl: null - usesBasic: false - connector_type_id: .xmatters - id: 4d2d8da0-4d1f-11ee-9367-577408be4681 - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-xmatters-connector - Connectors_get_connector_response: - summary: Get connector details. - value: - config: {} - connector_type_id: .server-log - id: df770e30-8b8b-11ed-a780-3b746c987a81 - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my_server_log_connector - Connectors_get_connector_types_generativeai_response: - summary: A list of connector types for the `generativeAI` feature. - value: - - enabled: true - enabled_in_config: true - enabled_in_license: true - id: .gen-ai - is_system_action_type: false - minimum_license_required: enterprise - name: OpenAI - supported_feature_ids: - - generativeAIForSecurity - - generativeAIForObservability - - generativeAIForSearchPlayground - - enabled: true - enabled_in_config: true - enabled_in_license: true - id: .bedrock - is_system_action_type: false - minimum_license_required: enterprise - name: AWS Bedrock - supported_feature_ids: - - generativeAIForSecurity - - generativeAIForObservability - - generativeAIForSearchPlayground - - enabled: true - enabled_in_config: true - enabled_in_license: true - id: .gemini - is_system_action_type: false - minimum_license_required: enterprise - name: Google Gemini - supported_feature_ids: - - generativeAIForSecurity - Connectors_get_connectors_response: - summary: A list of connectors - value: - - connector_type_id: .email - id: preconfigured-email-connector - is_deprecated: false - is_preconfigured: true - is_system_action: false - name: my-preconfigured-email-notification - referenced_by_count: 0 - - config: - executionTimeField: null - index: test-index - refresh: false - connector_type_id: .index - id: e07d0c80-8b8b-11ed-a780-3b746c987a81 - is_deprecated: false - is_missing_secrets: false - is_preconfigured: false - is_system_action: false - name: my-index-connector - referenced_by_count: 2 - Connectors_run_cases_webhook_connector_request: - summary: Run a Webhook - Case Management connector to create a case. - value: - params: - subAction: pushToService - subActionParams: - comments: - - comment: A comment about the incident. - commentId: 1 - incident: - description: Description of the incident. - id: caseID - severity: low - status: open - tags: - - tag1 - - tag2 - title: Case title - Connectors_run_cases_webhook_connector_response: - summary: >- - Response from a pushToService action for a Webhook - Case Management - connector. - value: - connector_id: 1824b5b8-c005-4dcc-adac-57f92db46459 - data: - comments: - - commentId: 1 - pushedDate: '2023-12-05T19:43:36.360Z' - id: 100665 - pushedDate: '2023-12-05T19:43:36.360Z' - title: TEST-29034 - url: 'https://example.com/browse/TEST-29034' - status: ok - Connectors_run_email_connector_request: - summary: Send an email message from an email connector. - value: - params: - bcc: - - user1@example.com - cc: - - user2@example.com - - user3@example.com - message: Test email message. - subject: Test message subject - to: - - user4@example.com - Connectors_run_email_connector_response: - summary: Response for sending a message from an email connector. - value: - connector_id: 7fc7b9a0-ecc9-11ec-8736-e7d63118c907 - data: - accepted: - - user1@example.com - - user2@example.com - - user3@example.com - - user4@example.com - envelope: - from: tester@example.com - to: - - user1@example.com - - user2@example.com - - user3@example.com - - user4@example.com - envelopeTime: 8 - messageId: <08a92d29-642a-0706-750c-de5996bd5cf3@example.com> - messageSize: 729 - messageTime: 3 - rejected: [] - response: 250 Message queued as QzEXKcGJ - status: ok - Connectors_run_index_connector_request: - summary: Run an index connector. - value: - params: - documents: - - id: my_doc_id - message: 'hello, world' - name: my_doc_name - Connectors_run_index_connector_response: - summary: Response from running an index connector. - value: - connector_id: fd38c600-96a5-11ed-bb79-353b74189cba - data: - errors: false - items: - - create: - _id: 4JtvwYUBrcyxt2NnfW3y - _index: my-index - _primary_term: 1 - _seq_no: 0 - _shards: - failed: 0 - successful: 1 - total: 2 - _version: 1 - result: created - status: 201 - took: 135 - status: ok - Connectors_run_jira_connector_request: - summary: Run a Jira connector to retrieve the list of issue types. - value: - params: - subAction: issueTypes - Connectors_run_jira_connector_response: - summary: Response from retrieving the list of issue types for a Jira connector. - value: - connector_id: b3aad810-edbe-11ec-82d1-11348ecbf4a6 - data: - - id: 10024 - name: Improvement - - id: 10006 - name: Task - - id: 10007 - name: Sub-task - - id: 10025 - name: New Feature - - id: 10023 - name: Bug - - id: 10000 - name: Epic - status: ok - Connectors_run_pagerduty_connector_request: - summary: Run a PagerDuty connector to trigger an alert. - value: - params: - customDetails: - my_data_1: test data - eventAction: trigger - links: - - href: 'http://example.com/pagerduty' - text: An example link - summary: A brief event summary - Connectors_run_pagerduty_connector_response: - summary: Response from running a PagerDuty connector. - value: - connector_id: 45de9f70-954f-4608-b12a-db7cf808e49d - data: - dedup_key: 5115e138b26b484a81eaea779faa6016 - message: Event processed - status: success - status: ok - Connectors_run_server_log_connector_request: - summary: Run a server log connector. - value: - params: - level: warn - message: Test warning message. - Connectors_run_server_log_connector_response: - summary: Response from running a server log connector. - value: - connector_id: 7fc7b9a0-ecc9-11ec-8736-e7d63118c907 - status: ok - Connectors_run_servicenow_itom_connector_request: - summary: Run a ServiceNow ITOM connector to retrieve the list of choices. - value: - params: - subAction: getChoices - subActionParams: - fields: - - severity - - urgency - Connectors_run_servicenow_itom_connector_response: - summary: >- - Response from retrieving the list of choices for a ServiceNow ITOM - connector. - value: - connector_id: 9d9be270-2fd2-11ed-b0e0-87533c532698 - data: - - dependent_value: '' - element: severity - label: Critical - value: 1 - - dependent_value: '' - element: severity - label: Major - value: 2 - - dependent_value: '' - element: severity - label: Minor - value: 3 - - dependent_value: '' - element: severity - label: Warning - value: 4 - - dependent_value: '' - element: severity - label: OK - value: 5 - - dependent_value: '' - element: severity - label: Clear - value: 0 - - dependent_value: '' - element: urgency - label: 1 - High - value: 1 - - dependent_value: '' - element: urgency - label: 2 - Medium - value: 2 - - dependent_value: '' - element: urgency - label: 3 - Low - value: 3 - status: ok - Connectors_run_slack_api_connector_request: - summary: >- - Run a Slack connector that uses the web API method to post a message on - a channel. - value: - params: - subAction: postMessage - subActionParams: - channelIds: - - C123ABC456 - text: A test message. - Connectors_run_slack_api_connector_response: - summary: Response from posting a message with a Slack connector. - value: - connector_id: .slack_api - data: - channel: C123ABC456 - message: - app_id: A01BC2D34EF - blocks: - - block_id: /NXe - elements: - - elements: - - text: A test message. - type: text - type: rich_text_section - type: rich_text - bot_id: B12BCDEFGHI - bot_profile: - app_id: A01BC2D34EF - deleted: false - icons: - image_36: 'https://a.slack-edge.com/80588/img/plugins/app/bot_36.png' - id: B12BCDEFGHI - name: test - team_id: T01ABCDE2F - updated: 1672169705 - team: T01ABCDE2F - text: A test message - ts: '1234567890.123456' - type: message - user: U12A345BC6D - ok: true - ts: '1234567890.123456' - status: ok - Connectors_run_swimlane_connector_request: - summary: Run a Swimlane connector to create an incident. - value: - params: - subAction: pushToService - subActionParams: - comments: - - comment: A comment about the incident. - commentId: 1 - incident: - caseId: '1000' - caseName: Case name - description: Description of the incident. - Connectors_run_swimlane_connector_response: - summary: Response from creating a Swimlane incident. - value: - connector_id: a4746470-2f94-11ed-b0e0-87533c532698 - data: - comments: - - commentId: 1 - pushedDate: '2022-09-08T16:52:27.865Z' - id: aKPmBHWzmdRQtx6Mx - pushedDate: '2022-09-08T16:52:27.866Z' - title: TEST-457 - url: >- - https://elastic.swimlane.url.us/record/aNcL2xniGHGpa2AHb/aKPmBHWzmdRQtx6Mx - status: ok - Connectors_update_index_connector_request: - summary: Update an index connector. - value: - config: - index: updated-index - name: updated-connector - Data_views_create_data_view_request: - summary: Create a data view with runtime fields. + Data_views_create_data_view_request: + summary: Create a data view with runtime fields. value: data_view: name: My Logstash data view @@ -16829,29 +16294,6 @@ components: - user type: string type: array - Connectors_action_id: - description: An identifier for the action. - in: path - name: actionId - required: true - schema: - example: c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad - type: string - Connectors_connector_id: - description: An identifier for the connector. - in: path - name: connectorId - required: true - schema: - example: df770e30-8b8b-11ed-a780-3b746c987a81 - type: string - Connectors_kbn_xsrf: - description: Cross-site request forgery protection - in: header - name: kbn-xsrf - required: true - schema: - type: string Data_views_field_name: description: The name of the runtime field. in: path @@ -17007,55 +16449,6 @@ components: example: default type: string responses: - Connectors_200_actions: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - $ref: '#/components/schemas/Connectors_action_response_properties' - description: Indicates a successful call. - Connectors_401: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - properties: - error: - enum: - - Unauthorized - example: Unauthorized - type: string - message: - type: string - statusCode: - enum: - - 401 - example: 401 - type: integer - title: Unauthorized response - type: object - description: Authorization information is missing or invalid. - Connectors_404: - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - properties: - error: - enum: - - Not Found - example: Not Found - type: string - message: - example: >- - Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not - found - type: string - statusCode: - enum: - - 404 - example: 404 - type: integer - title: Not found response - type: object - description: Object is not found. Fleet_error: content: application/json; Elastic-Api-Version=2023-10-31: @@ -19082,4256 +18475,214 @@ components: type: string version: description: > - The current comment version. To retrieve version values, use the get - comments API. - example: Wzk1LDFd - type: string - required: - - comment - - id - - owner - - type - - version - title: Update case comment request properties for user comments - type: object - Cases_user_actions_find_response_properties: - type: object - properties: - action: - $ref: '#/components/schemas/Cases_actions' - comment_id: - example: 578608d0-03b1-11ed-920c-974bfa104448 - nullable: true - type: string - created_at: - example: '2022-05-13T09:16:17.416Z' - format: date-time - type: string - created_by: - type: object - properties: - email: - example: null - nullable: true - type: string - full_name: - example: null - nullable: true - type: string - profile_uid: - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - type: string - username: - example: elastic - nullable: true - type: string - required: - - email - - full_name - - username - id: - example: 22fd3e30-03b1-11ed-920c-974bfa104448 - type: string - owner: - $ref: '#/components/schemas/Cases_owners' - payload: - oneOf: - - $ref: '#/components/schemas/Cases_payload_alert_comment' - - $ref: '#/components/schemas/Cases_payload_assignees' - - $ref: '#/components/schemas/Cases_payload_connector' - - $ref: '#/components/schemas/Cases_payload_create_case' - - $ref: '#/components/schemas/Cases_payload_delete' - - $ref: '#/components/schemas/Cases_payload_description' - - $ref: '#/components/schemas/Cases_payload_pushed' - - $ref: '#/components/schemas/Cases_payload_settings' - - $ref: '#/components/schemas/Cases_payload_severity' - - $ref: '#/components/schemas/Cases_payload_status' - - $ref: '#/components/schemas/Cases_payload_tags' - - $ref: '#/components/schemas/Cases_payload_title' - - $ref: '#/components/schemas/Cases_payload_user_comment' - type: - description: The type of action. - enum: - - assignees - - create_case - - comment - - connector - - description - - pushed - - tags - - title - - status - - settings - - severity - example: create_case - type: string - version: - example: WzM1ODg4LDFd - type: string - required: - - action - - comment_id - - created_at - - created_by - - id - - owner - - payload - - type - - version - Cases_user_actions_response_properties: - type: object - properties: - action: - $ref: '#/components/schemas/Cases_actions' - action_id: - example: 22fd3e30-03b1-11ed-920c-974bfa104448 - type: string - case_id: - example: 22df07d0-03b1-11ed-920c-974bfa104448 - type: string - comment_id: - example: 578608d0-03b1-11ed-920c-974bfa104448 - nullable: true - type: string - created_at: - example: '2022-05-13T09:16:17.416Z' - format: date-time - type: string - created_by: - type: object - properties: - email: - example: null - nullable: true - type: string - full_name: - example: null - nullable: true - type: string - profile_uid: - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - type: string - username: - example: elastic - nullable: true - type: string - required: - - email - - full_name - - username - owner: - $ref: '#/components/schemas/Cases_owners' - payload: - oneOf: - - $ref: '#/components/schemas/Cases_payload_alert_comment' - - $ref: '#/components/schemas/Cases_payload_assignees' - - $ref: '#/components/schemas/Cases_payload_connector' - - $ref: '#/components/schemas/Cases_payload_create_case' - - $ref: '#/components/schemas/Cases_payload_delete' - - $ref: '#/components/schemas/Cases_payload_description' - - $ref: '#/components/schemas/Cases_payload_pushed' - - $ref: '#/components/schemas/Cases_payload_settings' - - $ref: '#/components/schemas/Cases_payload_severity' - - $ref: '#/components/schemas/Cases_payload_status' - - $ref: '#/components/schemas/Cases_payload_tags' - - $ref: '#/components/schemas/Cases_payload_title' - - $ref: '#/components/schemas/Cases_payload_user_comment' - type: - $ref: '#/components/schemas/Cases_action_types' - required: - - action - - action_id - - case_id - - comment_id - - created_at - - created_by - - owner - - payload - - type - Cases_user_comment_response_properties: - title: Case response properties for user comments - type: object - properties: - comment: - example: A new comment. - type: string - created_at: - example: '2022-05-13T09:16:17.416Z' - format: date-time - type: string - created_by: - $ref: '#/components/schemas/Cases_case_response_created_by_properties' - id: - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 - type: string - owner: - $ref: '#/components/schemas/Cases_owners' - pushed_at: - example: null - format: date-time - nullable: true - type: string - pushed_by: - $ref: '#/components/schemas/Cases_case_response_pushed_by_properties' - type: - enum: - - user - example: user - type: string - updated_at: - example: null - format: date-time - nullable: true - type: string - updated_by: - $ref: '#/components/schemas/Cases_case_response_updated_by_properties' - version: - example: WzIwNDMxLDFd - type: string - required: - - type - Connectors_action_response_properties: - description: The properties vary depending on the action type. - properties: - actionTypeId: - type: string - config: - type: object - id: - type: string - isDeprecated: - description: Indicates whether the action type is deprecated. - type: boolean - isMissingSecrets: - description: Indicates whether secrets are missing for the action. - type: boolean - isPreconfigured: - description: Indicates whether it is a preconfigured action. - type: boolean - name: - type: string - title: Action response properties - type: object - Connectors_auth_type: - description: | - The type of authentication to use: basic, SSL, or none. - enum: - - webhook-authentication-basic - - webhook-authentication-ssl - nullable: true - title: Authentication type - type: string - Connectors_ca: - description: > - A base64 encoded version of the certificate authority file that the - connector can trust to sign and validate certificates. This option is - available for all authentication types. - title: Certificate authority - type: string - Connectors_cert_type: - description: > - If the `authType` is `webhook-authentication-ssl`, specifies whether the - certificate authentication data is in a CRT and key file format or a PFX - file format. - enum: - - ssl-crt-key - - ssl-pfx - title: Certificate type - type: string - Connectors_config_properties_bedrock: - description: Defines properties for connectors when type is `.bedrock`. - properties: - apiUrl: - description: The Amazon Bedrock request URL. - type: string - defaultModel: - default: 'anthropic.claude-3-5-sonnet-20240620-v1:0' - description: > - The generative artificial intelligence model for Amazon Bedrock to - use. Current support is for the Anthropic Claude models. - type: string - required: - - apiUrl - title: Connector request properties for an Amazon Bedrock connector - type: object - Connectors_config_properties_cases_webhook: - description: Defines properties for connectors when type is `.cases-webhook`. - type: object - properties: - authType: - $ref: '#/components/schemas/Connectors_auth_type' - ca: - $ref: '#/components/schemas/Connectors_ca' - certType: - $ref: '#/components/schemas/Connectors_cert_type' - createCommentJson: - description: > - A JSON payload sent to the create comment URL to create a case - comment. You can use variables to add Kibana Cases data to the - payload. The required variable is `case.comment`. Due to Mustache - template variables (the text enclosed in triple braces, for example, - `{{{case.title}}}`), the JSON is not validated when you create the - connector. The JSON is validated once the Mustache variables have - been placed when the REST method runs. Manually ensure that the JSON - is valid, disregarding the Mustache variables, so the later - validation will pass. - example: '{"body": {{{case.comment}}}}' - type: string - createCommentMethod: - default: put - description: > - The REST API HTTP request method to create a case comment in the - third-party system. Valid values are `patch`, `post`, and `put`. - enum: - - patch - - post - - put - type: string - createCommentUrl: - description: > - The REST API URL to create a case comment by ID in the third-party - system. You can use a variable to add the external system ID to the - URL. If you are using the `xpack.actions.allowedHosts setting`, add - the hostname to the allowed hosts. - example: 'https://example.com/issue/{{{external.system.id}}}/comment' - type: string - createIncidentJson: - description: > - A JSON payload sent to the create case URL to create a case. You can - use variables to add case data to the payload. Required variables - are `case.title` and `case.description`. Due to Mustache template - variables (which is the text enclosed in triple braces, for example, - `{{{case.title}}}`), the JSON is not validated when you create the - connector. The JSON is validated after the Mustache variables have - been placed when REST method runs. Manually ensure that the JSON is - valid to avoid future validation errors; disregard Mustache - variables during your review. - example: >- - {"fields": {"summary": {{{case.title}}},"description": - {{{case.description}}},"labels": {{{case.tags}}}}} - type: string - createIncidentMethod: - default: post - description: > - The REST API HTTP request method to create a case in the third-party - system. Valid values are `patch`, `post`, and `put`. - enum: - - patch - - post - - put - type: string - createIncidentResponseKey: - description: >- - The JSON key in the create external case response that contains the - case ID. - type: string - createIncidentUrl: - description: > - The REST API URL to create a case in the third-party system. If you - are using the `xpack.actions.allowedHosts` setting, add the hostname - to the allowed hosts. - type: string - getIncidentResponseExternalTitleKey: - description: >- - The JSON key in get external case response that contains the case - title. - type: string - getIncidentUrl: - description: > - The REST API URL to get the case by ID from the third-party system. - If you are using the `xpack.actions.allowedHosts` setting, add the - hostname to the allowed hosts. You can use a variable to add the - external system ID to the URL. Due to Mustache template variables - (the text enclosed in triple braces, for example, - `{{{case.title}}}`), the JSON is not validated when you create the - connector. The JSON is validated after the Mustache variables have - been placed when REST method runs. Manually ensure that the JSON is - valid, disregarding the Mustache variables, so the later validation - will pass. - example: 'https://example.com/issue/{{{external.system.id}}}' - type: string - hasAuth: - $ref: '#/components/schemas/Connectors_has_auth' - headers: - description: > - A set of key-value pairs sent as headers with the request URLs for - the create case, update case, get case, and create comment methods. - type: string - updateIncidentJson: - description: > - The JSON payload sent to the update case URL to update the case. You - can use variables to add Kibana Cases data to the payload. Required - variables are `case.title` and `case.description`. Due to Mustache - template variables (which is the text enclosed in triple braces, for - example, `{{{case.title}}}`), the JSON is not validated when you - create the connector. The JSON is validated after the Mustache - variables have been placed when REST method runs. Manually ensure - that the JSON is valid to avoid future validation errors; disregard - Mustache variables during your review. - example: >- - {"fields": {"summary": {{{case.title}}},"description": - {{{case.description}}},"labels": {{{case.tags}}}}} - type: string - updateIncidentMethod: - default: put - description: > - The REST API HTTP request method to update the case in the - third-party system. Valid values are `patch`, `post`, and `put`. - enum: - - patch - - post - - put - type: string - updateIncidentUrl: - description: > - The REST API URL to update the case by ID in the third-party system. - You can use a variable to add the external system ID to the URL. If - you are using the `xpack.actions.allowedHosts` setting, add the - hostname to the allowed hosts. - example: 'https://example.com/issue/{{{external.system.ID}}}' - type: string - verificationMode: - $ref: '#/components/schemas/Connectors_verification_mode' - viewIncidentUrl: - description: > - The URL to view the case in the external system. You can use - variables to add the external system ID or external system title to - the URL. - example: >- - https://testing-jira.atlassian.net/browse/{{{external.system.title}}} - type: string - required: - - createIncidentJson - - createIncidentResponseKey - - createIncidentUrl - - getIncidentResponseExternalTitleKey - - getIncidentUrl - - updateIncidentJson - - updateIncidentUrl - - viewIncidentUrl - title: Connector request properties for Webhook - Case Management connector - Connectors_config_properties_d3security: - description: Defines properties for connectors when type is `.d3security`. - properties: - url: - description: > - The D3 Security API request URL. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - url - title: Connector request properties for a D3 Security connector - type: object - Connectors_config_properties_email: - description: Defines properties for connectors when type is `.email`. - type: object - properties: - clientId: - description: > - The client identifier, which is a part of OAuth 2.0 client - credentials authentication, in GUID format. If `service` is - `exchange_server`, this property is required. - nullable: true - type: string - from: - description: > - The from address for all emails sent by the connector. It must be - specified in `user@host-name` format. - type: string - hasAuth: - default: true - description: > - Specifies whether a user and password are required inside the - secrets configuration. - type: boolean - host: - description: > - The host name of the service provider. If the `service` is - `elastic_cloud` (for Elastic Cloud notifications) or one of - Nodemailer's well-known email service providers, this property is - ignored. If `service` is `other`, this property must be defined. - type: string - oauthTokenUrl: - nullable: true - type: string - port: - description: > - The port to connect to on the service provider. If the `service` is - `elastic_cloud` (for Elastic Cloud notifications) or one of - Nodemailer's well-known email service providers, this property is - ignored. If `service` is `other`, this property must be defined. - type: integer - secure: - description: > - Specifies whether the connection to the service provider will use - TLS. If the `service` is `elastic_cloud` (for Elastic Cloud - notifications) or one of Nodemailer's well-known email service - providers, this property is ignored. - type: boolean - service: - description: | - The name of the email service. - enum: - - elastic_cloud - - exchange_server - - gmail - - other - - outlook365 - - ses - type: string - tenantId: - description: > - The tenant identifier, which is part of OAuth 2.0 client credentials - authentication, in GUID format. If `service` is `exchange_server`, - this property is required. - nullable: true - type: string - required: - - from - title: Connector request properties for an email connector - Connectors_config_properties_gemini: - description: Defines properties for connectors when type is `.gemini`. - properties: - apiUrl: - description: The Google Gemini request URL. - type: string - defaultModel: - default: gemini-1.5-pro-001 - description: >- - The generative artificial intelligence model for Google Gemini to - use. - type: string - gcpProjectID: - description: The Google ProjectID that has Vertex AI endpoint enabled. - type: string - gcpRegion: - description: The GCP region where the Vertex AI endpoint enabled. - type: string - required: - - apiUrl - - gcpRegion - - gcpProjectID - title: Connector request properties for an Google Gemini connector - type: object - Connectors_config_properties_genai: - description: Defines properties for connectors when type is `.gen-ai`. - discriminator: - mapping: - Azure OpenAI: '#/components/schemas/Connectors_config_properties_genai_azure' - OpenAI: '#/components/schemas/Connectors_config_properties_genai_openai' - propertyName: apiProvider - oneOf: - - $ref: '#/components/schemas/Connectors_config_properties_genai_azure' - - $ref: '#/components/schemas/Connectors_config_properties_genai_openai' - title: Connector request properties for an OpenAI connector - Connectors_config_properties_genai_azure: - description: > - Defines properties for connectors when type is `.gen-ai` and the API - provider is `Azure OpenAI'. - properties: - apiProvider: - description: The OpenAI API provider. - enum: - - Azure OpenAI - type: string - apiUrl: - description: The OpenAI API endpoint. - type: string - required: - - apiProvider - - apiUrl - title: >- - Connector request properties for an OpenAI connector that uses Azure - OpenAI - type: object - Connectors_config_properties_genai_openai: - description: > - Defines properties for connectors when type is `.gen-ai` and the API - provider is `OpenAI'. - properties: - apiProvider: - description: The OpenAI API provider. - enum: - - OpenAI - type: string - apiUrl: - description: The OpenAI API endpoint. - type: string - defaultModel: - description: The default model to use for requests. - type: string - required: - - apiProvider - - apiUrl - title: Connector request properties for an OpenAI connector - type: object - Connectors_config_properties_index: - description: Defines properties for connectors when type is `.index`. - type: object - properties: - executionTimeField: - default: null - description: A field that indicates when the document was indexed. - nullable: true - type: string - index: - description: The Elasticsearch index to be written to. - type: string - refresh: - default: false - description: > - The refresh policy for the write request, which affects when changes - are made visible to search. Refer to the refresh setting for - Elasticsearch document APIs. - type: boolean - required: - - index - title: Connector request properties for an index connector - Connectors_config_properties_jira: - description: Defines properties for connectors when type is `.jira`. - type: object - properties: - apiUrl: - description: The Jira instance URL. - type: string - projectKey: - description: The Jira project key. - type: string - required: - - apiUrl - - projectKey - title: Connector request properties for a Jira connector - Connectors_config_properties_opsgenie: - description: Defines properties for connectors when type is `.opsgenie`. - type: object - properties: - apiUrl: - description: > - The Opsgenie URL. For example, `https://api.opsgenie.com` or - `https://api.eu.opsgenie.com`. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - apiUrl - title: Connector request properties for an Opsgenie connector - Connectors_config_properties_pagerduty: - description: Defines properties for connectors when type is `.pagerduty`. - properties: - apiUrl: - description: The PagerDuty event URL. - example: 'https://events.pagerduty.com/v2/enqueue' - nullable: true - type: string - title: Connector request properties for a PagerDuty connector - type: object - Connectors_config_properties_resilient: - description: Defines properties for connectors when type is `.resilient`. - type: object - properties: - apiUrl: - description: The IBM Resilient instance URL. - type: string - orgId: - description: The IBM Resilient organization ID. - type: string - required: - - apiUrl - - orgId - title: Connector request properties for a IBM Resilient connector - Connectors_config_properties_sentinelone: - description: Defines properties for connectors when type is `.sentinelone`. - type: object - properties: - url: - description: > - The SentinelOne tenant URL. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - url - title: Connector request properties for a SentinelOne connector - Connectors_config_properties_servicenow: - description: Defines properties for connectors when type is `.servicenow`. - type: object - properties: - apiUrl: - description: The ServiceNow instance URL. - type: string - clientId: - description: > - The client ID assigned to your OAuth application. This property is - required when `isOAuth` is `true`. - type: string - isOAuth: - default: false - description: > - The type of authentication to use. The default value is false, which - means basic authentication is used instead of open authorization - (OAuth). - type: boolean - jwtKeyId: - description: > - The key identifier assigned to the JWT verifier map of your OAuth - application. This property is required when `isOAuth` is `true`. - type: string - userIdentifierValue: - description: > - The identifier to use for OAuth authentication. This identifier - should be the user field you selected when you created an OAuth JWT - API endpoint for external clients in your ServiceNow instance. For - example, if the selected user field is `Email`, the user identifier - should be the user's email address. This property is required when - `isOAuth` is `true`. - type: string - usesTableApi: - default: true - description: > - Determines whether the connector uses the Table API or the Import - Set API. This property is supported only for ServiceNow ITSM and - ServiceNow SecOps connectors. NOTE: If this property is set to - `false`, the Elastic application should be installed in ServiceNow. - type: boolean - required: - - apiUrl - title: Connector request properties for a ServiceNow ITSM connector - Connectors_config_properties_servicenow_itom: - description: Defines properties for connectors when type is `.servicenow`. - type: object - properties: - apiUrl: - description: The ServiceNow instance URL. - type: string - clientId: - description: > - The client ID assigned to your OAuth application. This property is - required when `isOAuth` is `true`. - type: string - isOAuth: - default: false - description: > - The type of authentication to use. The default value is false, which - means basic authentication is used instead of open authorization - (OAuth). - type: boolean - jwtKeyId: - description: > - The key identifier assigned to the JWT verifier map of your OAuth - application. This property is required when `isOAuth` is `true`. - type: string - userIdentifierValue: - description: > - The identifier to use for OAuth authentication. This identifier - should be the user field you selected when you created an OAuth JWT - API endpoint for external clients in your ServiceNow instance. For - example, if the selected user field is `Email`, the user identifier - should be the user's email address. This property is required when - `isOAuth` is `true`. - type: string - required: - - apiUrl - title: Connector request properties for a ServiceNow ITSM connector - Connectors_config_properties_slack_api: - description: Defines properties for connectors when type is `.slack_api`. - properties: - allowedChannels: - description: A list of valid Slack channels. - items: - maxItems: 25 - type: object - properties: - id: - description: The Slack channel ID. - example: C123ABC456 - minLength: 1 - type: string - name: - description: The Slack channel name. - minLength: 1 - type: string - required: - - id - - name - type: array - title: Connector request properties for a Slack connector - type: object - Connectors_config_properties_swimlane: - description: Defines properties for connectors when type is `.swimlane`. - type: object - properties: - apiUrl: - description: The Swimlane instance URL. - type: string - appId: - description: The Swimlane application ID. - type: string - connectorType: - description: >- - The type of connector. Valid values are `all`, `alerts`, and - `cases`. - enum: - - all - - alerts - - cases - type: string - mappings: - description: The field mapping. - properties: - alertIdConfig: - description: Mapping for the alert ID. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Alert identifier mapping - type: object - caseIdConfig: - description: Mapping for the case ID. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case identifier mapping - type: object - caseNameConfig: - description: Mapping for the case name. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case name mapping - type: object - commentsConfig: - description: Mapping for the case comments. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case comment mapping - type: object - descriptionConfig: - description: Mapping for the case description. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Case description mapping - type: object - ruleNameConfig: - description: Mapping for the name of the alert's rule. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Rule name mapping - type: object - severityConfig: - description: Mapping for the severity. - properties: - fieldType: - description: The type of field in Swimlane. - type: string - id: - description: The identifier for the field in Swimlane. - type: string - key: - description: The key for the field in Swimlane. - type: string - name: - description: The name of the field in Swimlane. - type: string - required: - - fieldType - - id - - key - - name - title: Severity mapping - type: object - title: Connector mappings properties for a Swimlane connector - type: object - required: - - apiUrl - - appId - - connectorType - title: Connector request properties for a Swimlane connector - Connectors_config_properties_tines: - description: Defines properties for connectors when type is `.tines`. - properties: - url: - description: > - The Tines tenant URL. If you are using the - `xpack.actions.allowedHosts` setting, make sure this hostname is - added to the allowed hosts. - type: string - required: - - url - title: Connector request properties for a Tines connector - type: object - Connectors_config_properties_torq: - description: Defines properties for connectors when type is `.torq`. - properties: - webhookIntegrationUrl: - description: The endpoint URL of the Elastic Security integration in Torq. - type: string - required: - - webhookIntegrationUrl - title: Connector request properties for a Torq connector - type: object - Connectors_config_properties_webhook: - description: Defines properties for connectors when type is `.webhook`. - properties: - authType: - $ref: '#/components/schemas/Connectors_auth_type' - ca: - $ref: '#/components/schemas/Connectors_ca' - certType: - $ref: '#/components/schemas/Connectors_cert_type' - hasAuth: - $ref: '#/components/schemas/Connectors_has_auth' - headers: - description: A set of key-value pairs sent as headers with the request. - nullable: true - type: object - method: - default: post - description: | - The HTTP request method, either `post` or `put`. - enum: - - post - - put - type: string - url: - description: > - The request URL. If you are using the `xpack.actions.allowedHosts` - setting, add the hostname to the allowed hosts. - type: string - verificationMode: - $ref: '#/components/schemas/Connectors_verification_mode' - title: Connector request properties for a Webhook connector - type: object - Connectors_config_properties_xmatters: - description: Defines properties for connectors when type is `.xmatters`. - properties: - configUrl: - description: > - The request URL for the Elastic Alerts trigger in xMatters. It is - applicable only when `usesBasic` is `true`. - nullable: true - type: string - usesBasic: - default: true - description: >- - Specifies whether the connector uses HTTP basic authentication - (`true`) or URL authentication (`false`). - type: boolean - title: Connector request properties for an xMatters connector - type: object - Connectors_connector_response_properties: - description: The properties vary depending on the connector type. - discriminator: - mapping: - .bedrock: >- - #/components/schemas/Connectors_connector_response_properties_bedrock - .cases-webhook: >- - #/components/schemas/Connectors_connector_response_properties_cases_webhook - .d3security: >- - #/components/schemas/Connectors_connector_response_properties_d3security - .email: '#/components/schemas/Connectors_connector_response_properties_email' - .gemini: '#/components/schemas/Connectors_connector_response_properties_gemini' - .gen-ai: '#/components/schemas/Connectors_connector_response_properties_genai' - .index: '#/components/schemas/Connectors_connector_response_properties_index' - .jira: '#/components/schemas/Connectors_connector_response_properties_jira' - .opsgenie: >- - #/components/schemas/Connectors_connector_response_properties_opsgenie - .pagerduty: >- - #/components/schemas/Connectors_connector_response_properties_pagerduty - .resilient: >- - #/components/schemas/Connectors_connector_response_properties_resilient - .sentinelone: >- - #/components/schemas/Connectors_connector_response_properties_sentinelone - .server-log: >- - #/components/schemas/Connectors_connector_response_properties_serverlog - .servicenow: >- - #/components/schemas/Connectors_connector_response_properties_servicenow - .servicenow-itom: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_itom - .servicenow-sir: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_sir - .slack: >- - #/components/schemas/Connectors_connector_response_properties_slack_webhook - .slack_api: >- - #/components/schemas/Connectors_connector_response_properties_slack_api - .swimlane: >- - #/components/schemas/Connectors_connector_response_properties_swimlane - .teams: '#/components/schemas/Connectors_connector_response_properties_teams' - .tines: '#/components/schemas/Connectors_connector_response_properties_tines' - .torq: '#/components/schemas/Connectors_connector_response_properties_torq' - .webhook: >- - #/components/schemas/Connectors_connector_response_properties_webhook - .xmatters: >- - #/components/schemas/Connectors_connector_response_properties_xmatters - propertyName: connector_type_id - oneOf: - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_bedrock - - $ref: '#/components/schemas/Connectors_connector_response_properties_gemini' - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_cases_webhook - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_d3security - - $ref: '#/components/schemas/Connectors_connector_response_properties_email' - - $ref: '#/components/schemas/Connectors_connector_response_properties_genai' - - $ref: '#/components/schemas/Connectors_connector_response_properties_index' - - $ref: '#/components/schemas/Connectors_connector_response_properties_jira' - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_opsgenie - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_pagerduty - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_resilient - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_sentinelone - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_serverlog - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_servicenow - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_itom - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_servicenow_sir - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_slack_api - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_slack_webhook - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_swimlane - - $ref: '#/components/schemas/Connectors_connector_response_properties_teams' - - $ref: '#/components/schemas/Connectors_connector_response_properties_tines' - - $ref: '#/components/schemas/Connectors_connector_response_properties_torq' - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_webhook - - $ref: >- - #/components/schemas/Connectors_connector_response_properties_xmatters - title: Connector response properties - Connectors_connector_response_properties_bedrock: - title: Connector response properties for an Amazon Bedrock connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_bedrock' - connector_type_id: - description: The type of connector. - enum: - - .bedrock - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - required: - - config - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_cases_webhook: - title: Connector request properties for a Webhook - Case Management connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_cases_webhook' - connector_type_id: - description: The type of connector. - enum: - - .cases-webhook - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_d3security: - title: Connector response properties for a D3 Security connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_d3security' - connector_type_id: - description: The type of connector. - enum: - - .d3security - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_email: - title: Connector response properties for an email connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_email' - connector_type_id: - description: The type of connector. - enum: - - .email - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_gemini: - title: Connector response properties for a Google Gemini connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_gemini' - connector_type_id: - description: The type of connector. - enum: - - .gemini - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_genai: - title: Connector response properties for an OpenAI connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_genai' - connector_type_id: - description: The type of connector. - enum: - - .gen-ai - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_index: - title: Connector response properties for an index connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_index' - connector_type_id: - description: The type of connector. - enum: - - .index - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_jira: - title: Connector response properties for a Jira connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_jira' - connector_type_id: - description: The type of connector. - enum: - - .jira - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_opsgenie: - title: Connector response properties for an Opsgenie connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_opsgenie' - connector_type_id: - description: The type of connector. - enum: - - .opsgenie - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_pagerduty: - title: Connector response properties for a PagerDuty connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_pagerduty' - connector_type_id: - description: The type of connector. - enum: - - .pagerduty - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_resilient: - title: Connector response properties for a IBM Resilient connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_resilient' - connector_type_id: - description: The type of connector. - enum: - - .resilient - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_sentinelone: - title: Connector response properties for a SentinelOne connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_sentinelone' - connector_type_id: - description: The type of connector. - enum: - - .sentinelone - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_serverlog: - title: Connector response properties for a server log connector - type: object - properties: - config: - nullable: true - type: object - connector_type_id: - description: The type of connector. - enum: - - .server-log - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_servicenow: - title: Connector response properties for a ServiceNow ITSM connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_servicenow_itom: - title: Connector response properties for a ServiceNow ITOM connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow_itom' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-itom - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_servicenow_sir: - title: Connector response properties for a ServiceNow SecOps connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-sir - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_slack_api: - title: Connector response properties for a Slack connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_slack_api' - connector_type_id: - description: The type of connector. - enum: - - .slack_api - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_slack_webhook: - title: Connector response properties for a Slack connector - type: object - properties: - connector_type_id: - description: The type of connector. - enum: - - .slack - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_swimlane: - title: Connector response properties for a Swimlane connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_swimlane' - connector_type_id: - description: The type of connector. - enum: - - .swimlane - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_teams: - title: Connector response properties for a Microsoft Teams connector - type: object - properties: - config: - type: object - connector_type_id: - description: The type of connector. - enum: - - .teams - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_tines: - title: Connector response properties for a Tines connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_tines' - connector_type_id: - description: The type of connector. - enum: - - .tines - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_torq: - title: Connector response properties for a Torq connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_torq' - connector_type_id: - description: The type of connector. - enum: - - .torq - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_webhook: - title: Connector response properties for a Webhook connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_webhook' - connector_type_id: - description: The type of connector. - enum: - - .webhook - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_response_properties_xmatters: - title: Connector response properties for an xMatters connector - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_xmatters' - connector_type_id: - description: The type of connector. - enum: - - .xmatters - type: string - id: - description: The identifier for the connector. - type: string - is_deprecated: - $ref: '#/components/schemas/Connectors_is_deprecated' - is_missing_secrets: - $ref: '#/components/schemas/Connectors_is_missing_secrets' - is_preconfigured: - $ref: '#/components/schemas/Connectors_is_preconfigured' - is_system_action: - $ref: '#/components/schemas/Connectors_is_system_action' - name: - description: The display name for the connector. - type: string - referenced_by_count: - $ref: '#/components/schemas/Connectors_referenced_by_count' - required: - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name - Connectors_connector_types: - description: >- - The type of connector. For example, `.email`, `.index`, `.jira`, - `.opsgenie`, or `.server-log`. - enum: - - .bedrock - - .gemini - - .cases-webhook - - .d3security - - .email - - .gen-ai - - .index - - .jira - - .opsgenie - - .pagerduty - - .resilient - - .sentinelone - - .servicenow - - .servicenow-itom - - .servicenow-sir - - .server-log - - .slack - - .slack_api - - .swimlane - - .teams - - .tines - - .torq - - .webhook - - .xmatters - example: .server-log - title: Connector types - type: string - Connectors_create_connector_request: - description: The properties vary depending on the connector type. - discriminator: - mapping: - .bedrock: '#/components/schemas/Connectors_create_connector_request_bedrock' - .cases-webhook: >- - #/components/schemas/Connectors_create_connector_request_cases_webhook - .d3security: '#/components/schemas/Connectors_create_connector_request_d3security' - .email: '#/components/schemas/Connectors_create_connector_request_email' - .gemini: '#/components/schemas/Connectors_create_connector_request_gemini' - .gen-ai: '#/components/schemas/Connectors_create_connector_request_genai' - .index: '#/components/schemas/Connectors_create_connector_request_index' - .jira: '#/components/schemas/Connectors_create_connector_request_jira' - .opsgenie: '#/components/schemas/Connectors_create_connector_request_opsgenie' - .pagerduty: '#/components/schemas/Connectors_create_connector_request_pagerduty' - .resilient: '#/components/schemas/Connectors_create_connector_request_resilient' - .sentinelone: '#/components/schemas/Connectors_create_connector_request_sentinelone' - .server-log: '#/components/schemas/Connectors_create_connector_request_serverlog' - .servicenow: '#/components/schemas/Connectors_create_connector_request_servicenow' - .servicenow-itom: >- - #/components/schemas/Connectors_create_connector_request_servicenow_itom - .servicenow-sir: >- - #/components/schemas/Connectors_create_connector_request_servicenow_sir - .slack: >- - #/components/schemas/Connectors_create_connector_request_slack_webhook - .slack_api: '#/components/schemas/Connectors_create_connector_request_slack_api' - .swimlane: '#/components/schemas/Connectors_create_connector_request_swimlane' - .teams: '#/components/schemas/Connectors_create_connector_request_teams' - .tines: '#/components/schemas/Connectors_create_connector_request_tines' - .torq: '#/components/schemas/Connectors_create_connector_request_torq' - .webhook: '#/components/schemas/Connectors_create_connector_request_webhook' - .xmatters: '#/components/schemas/Connectors_create_connector_request_xmatters' - propertyName: connector_type_id - oneOf: - - $ref: '#/components/schemas/Connectors_create_connector_request_bedrock' - - $ref: '#/components/schemas/Connectors_create_connector_request_gemini' - - $ref: >- - #/components/schemas/Connectors_create_connector_request_cases_webhook - - $ref: '#/components/schemas/Connectors_create_connector_request_d3security' - - $ref: '#/components/schemas/Connectors_create_connector_request_email' - - $ref: '#/components/schemas/Connectors_create_connector_request_genai' - - $ref: '#/components/schemas/Connectors_create_connector_request_index' - - $ref: '#/components/schemas/Connectors_create_connector_request_jira' - - $ref: '#/components/schemas/Connectors_create_connector_request_opsgenie' - - $ref: '#/components/schemas/Connectors_create_connector_request_pagerduty' - - $ref: '#/components/schemas/Connectors_create_connector_request_resilient' - - $ref: '#/components/schemas/Connectors_create_connector_request_sentinelone' - - $ref: '#/components/schemas/Connectors_create_connector_request_serverlog' - - $ref: '#/components/schemas/Connectors_create_connector_request_servicenow' - - $ref: >- - #/components/schemas/Connectors_create_connector_request_servicenow_itom - - $ref: >- - #/components/schemas/Connectors_create_connector_request_servicenow_sir - - $ref: '#/components/schemas/Connectors_create_connector_request_slack_api' - - $ref: >- - #/components/schemas/Connectors_create_connector_request_slack_webhook - - $ref: '#/components/schemas/Connectors_create_connector_request_swimlane' - - $ref: '#/components/schemas/Connectors_create_connector_request_teams' - - $ref: '#/components/schemas/Connectors_create_connector_request_tines' - - $ref: '#/components/schemas/Connectors_create_connector_request_torq' - - $ref: '#/components/schemas/Connectors_create_connector_request_webhook' - - $ref: '#/components/schemas/Connectors_create_connector_request_xmatters' - title: Create connector request body properties - Connectors_create_connector_request_bedrock: - description: >- - The Amazon Bedrock connector uses axios to send a POST request to Amazon - Bedrock. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_bedrock' - connector_type_id: - description: The type of connector. - enum: - - .bedrock - example: .bedrock - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_bedrock' - required: - - config - - connector_type_id - - name - - secrets - title: Create Amazon Bedrock connector request - type: object - Connectors_create_connector_request_cases_webhook: - description: > - The Webhook - Case Management connector uses axios to send POST, PUT, - and GET requests to a case management RESTful API web service. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_cases_webhook' - connector_type_id: - description: The type of connector. - enum: - - .cases-webhook - example: .cases-webhook - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_cases_webhook' - required: - - config - - connector_type_id - - name - title: Create Webhook - Case Managment connector request - type: object - Connectors_create_connector_request_d3security: - description: > - The connector uses axios to send a POST request to a D3 Security - endpoint. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_d3security' - connector_type_id: - description: The type of connector. - enum: - - .d3security - example: .d3security - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_d3security' - required: - - config - - connector_type_id - - name - - secrets - title: Create D3 Security connector request - type: object - Connectors_create_connector_request_email: - description: > - The email connector uses the SMTP protocol to send mail messages, using - an integration of Nodemailer. An exception is Microsoft Exchange, which - uses HTTP protocol for sending emails, Send mail. Email message text is - sent as both plain text and html text. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_email' - connector_type_id: - description: The type of connector. - enum: - - .email - example: .email - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_email' - required: - - config - - connector_type_id - - name - - secrets - title: Create email connector request - type: object - Connectors_create_connector_request_gemini: - description: >- - The Google Gemini connector uses axios to send a POST request to Google - Gemini. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_gemini' - connector_type_id: - description: The type of connector. - enum: - - .gemini - example: .gemini - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_gemini' - required: - - config - - connector_type_id - - name - - secrets - title: Create Google Gemini connector request - type: object - Connectors_create_connector_request_genai: - description: > - The OpenAI connector uses axios to send a POST request to either OpenAI - or Azure OpenAPI. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_genai' - connector_type_id: - description: The type of connector. - enum: - - .gen-ai - example: .gen-ai - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_genai' - required: - - config - - connector_type_id - - name - - secrets - title: Create OpenAI connector request - type: object - Connectors_create_connector_request_index: - description: The index connector indexes a document into Elasticsearch. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_index' - connector_type_id: - description: The type of connector. - enum: - - .index - example: .index - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - required: - - config - - connector_type_id - - name - title: Create index connector request - type: object - Connectors_create_connector_request_jira: - description: The Jira connector uses the REST API v2 to create Jira issues. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_jira' - connector_type_id: - description: The type of connector. - enum: - - .jira - example: .jira - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_jira' - required: - - config - - connector_type_id - - name - - secrets - title: Create Jira connector request - type: object - Connectors_create_connector_request_opsgenie: - description: The Opsgenie connector uses the Opsgenie alert API. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_opsgenie' - connector_type_id: - description: The type of connector. - enum: - - .opsgenie - example: .opsgenie - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_opsgenie' - required: - - config - - connector_type_id - - name - - secrets - title: Create Opsgenie connector request - type: object - Connectors_create_connector_request_pagerduty: - description: > - The PagerDuty connector uses the v2 Events API to trigger, acknowledge, - and resolve PagerDuty alerts. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_pagerduty' - connector_type_id: - description: The type of connector. - enum: - - .pagerduty - example: .pagerduty - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_pagerduty' - required: - - config - - connector_type_id - - name - - secrets - title: Create PagerDuty connector request - type: object - Connectors_create_connector_request_resilient: - description: >- - The IBM Resilient connector uses the RESILIENT REST v2 to create IBM - Resilient incidents. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_resilient' - connector_type_id: - description: The type of connector. - enum: - - .resilient - example: .resilient - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_resilient' - required: - - config - - connector_type_id - - name - - secrets - title: Create IBM Resilient connector request - type: object - Connectors_create_connector_request_sentinelone: - description: > - The SentinelOne connector communicates with SentinelOne Management - Console via REST API. This functionality is in technical preview and may - be changed or removed in a future release. Elastic will work to fix any - issues, but features in technical preview are not subject to the support - SLA of official GA features. - title: Create SentinelOne connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_sentinelone' - connector_type_id: - description: The type of connector. - enum: - - .sentinelone - example: .sentinelone - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_sentinelone' - required: - - config - - connector_type_id - - name - - secrets - x-technical-preview: true - Connectors_create_connector_request_serverlog: - description: This connector writes an entry to the Kibana server log. - properties: - connector_type_id: - description: The type of connector. - enum: - - .server-log - example: .server-log - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - required: - - connector_type_id - - name - title: Create server log connector request - type: object - Connectors_create_connector_request_servicenow: - description: > - The ServiceNow ITSM connector uses the import set API to create - ServiceNow incidents. You can use the connector for rule actions and - cases. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow - example: .servicenow - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - connector_type_id - - name - - secrets - title: Create ServiceNow ITSM connector request - type: object - Connectors_create_connector_request_servicenow_itom: - description: > - The ServiceNow ITOM connector uses the event API to create ServiceNow - events. You can use the connector for rule actions. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow_itom' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-itom - example: .servicenow-itom - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - connector_type_id - - name - - secrets - title: Create ServiceNow ITOM connector request - type: object - Connectors_create_connector_request_servicenow_sir: - description: > - The ServiceNow SecOps connector uses the import set API to create - ServiceNow security incidents. You can use the connector for rule - actions and cases. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - connector_type_id: - description: The type of connector. - enum: - - .servicenow-sir - example: .servicenow-sir - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - connector_type_id - - name - - secrets - title: Create ServiceNow SecOps connector request - type: object - Connectors_create_connector_request_slack_api: - description: The Slack connector uses an API method to send Slack messages. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_slack_api' - connector_type_id: - description: The type of connector. - enum: - - .slack_api - example: .slack_api - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_api' - required: - - connector_type_id - - name - - secrets - title: Create Slack connector request - type: object - Connectors_create_connector_request_slack_webhook: - description: The Slack connector uses Slack Incoming Webhooks. - properties: - connector_type_id: - description: The type of connector. - enum: - - .slack - example: .slack - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_webhook' - required: - - connector_type_id - - name - - secrets - title: Create Slack connector request - type: object - Connectors_create_connector_request_swimlane: - description: >- - The Swimlane connector uses the Swimlane REST API to create Swimlane - records. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_swimlane' - connector_type_id: - description: The type of connector. - enum: - - .swimlane - example: .swimlane - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_swimlane' - required: - - config - - connector_type_id - - name - - secrets - title: Create Swimlane connector request - type: object - Connectors_create_connector_request_teams: - description: The Microsoft Teams connector uses Incoming Webhooks. - properties: - connector_type_id: - description: The type of connector. - enum: - - .teams - example: .teams - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_teams' - required: - - connector_type_id - - name - - secrets - title: Create Microsoft Teams connector request - type: object - Connectors_create_connector_request_tines: - description: > - The Tines connector uses Tines Webhook actions to send events via POST - request. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_tines' - connector_type_id: - description: The type of connector. - enum: - - .tines - example: .tines - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_tines' - required: - - config - - connector_type_id - - name - - secrets - title: Create Tines connector request - type: object - Connectors_create_connector_request_torq: - description: > - The Torq connector uses a Torq webhook to trigger workflows with Kibana - actions. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_torq' - connector_type_id: - description: The type of connector. - enum: - - .torq - example: .torq - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_torq' - required: - - config - - connector_type_id - - name - - secrets - title: Create Torq connector request - type: object - Connectors_create_connector_request_webhook: - description: > - The Webhook connector uses axios to send a POST or PUT request to a web - service. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_webhook' - connector_type_id: - description: The type of connector. - enum: - - .webhook - example: .webhook - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_webhook' - required: - - config - - connector_type_id - - name - - secrets - title: Create Webhook connector request - type: object - Connectors_create_connector_request_xmatters: - description: > - The xMatters connector uses the xMatters Workflow for Elastic to send - actionable alerts to on-call xMatters resources. - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_xmatters' - connector_type_id: - description: The type of connector. - enum: - - .xmatters - example: .xmatters - type: string - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_xmatters' - required: - - config - - connector_type_id - - name - - secrets - title: Create xMatters connector request - type: object - Connectors_crt: - description: >- - If `authType` is `webhook-authentication-ssl` and `certType` is - `ssl-crt-key`, it is a base64 encoded version of the CRT or CERT file. - title: Certificate - type: string - Connectors_features: - description: | - The feature that uses the connector. - enum: - - alerting - - cases - - generativeAIForSecurity - - generativeAIForObservability - - generativeAIForSearchPlayground - - siem - - uptime - type: string - Connectors_has_auth: - default: true - description: >- - If true, a username and password for login type authentication must be - provided. - title: Has authentication - type: boolean - Connectors_is_deprecated: - description: Indicates whether the connector type is deprecated. - example: false - type: boolean - Connectors_is_missing_secrets: - description: >- - Indicates whether secrets are missing for the connector. Secrets - configuration properties vary depending on the connector type. - example: false - type: boolean - Connectors_is_preconfigured: - description: > - Indicates whether it is a preconfigured connector. If true, the `config` - and `is_missing_secrets` properties are omitted from the response. - example: false - type: boolean - Connectors_is_system_action: - description: Indicates whether the connector is used for system actions. - example: false - type: boolean - Connectors_key: - description: >- - If `authType` is `webhook-authentication-ssl` and `certType` is - `ssl-crt-key`, it is a base64 encoded version of the KEY file. - title: Certificate key - type: string - Connectors_pfx: - description: >- - If `authType` is `webhook-authentication-ssl` and `certType` is - `ssl-pfx`, it is a base64 encoded version of the PFX or P12 file. - title: Personal information exchange - type: string - Connectors_referenced_by_count: - description: > - Indicates the number of saved objects that reference the connector. If - `is_preconfigured` is true, this value is not calculated. This property - is returned only by the get all connectors API. - example: 2 - type: integer - Connectors_run_connector_params_acknowledge_resolve_pagerduty: - description: Test an action that acknowledges or resolves a PagerDuty alert. - properties: - dedupKey: - description: The deduplication key for the PagerDuty alert. - maxLength: 255 - type: string - eventAction: - description: The type of event. - enum: - - acknowledge - - resolve - type: string - required: - - dedupKey - - eventAction - title: PagerDuty connector parameters - type: object - Connectors_run_connector_params_documents: - description: Test an action that indexes a document into Elasticsearch. - properties: - documents: - description: The documents in JSON format for index connectors. - items: - additionalProperties: true - type: object - type: array - required: - - documents - title: Index connector parameters - type: object - Connectors_run_connector_params_message_email: - anyOf: - - required: - - bcc - - message - - subject - - required: - - cc - - message - - subject - - required: - - to - - message - - subject - description: > - Test an action that sends an email message. There must be at least one - recipient in `to`, `cc`, or `bcc`. - properties: - bcc: - description: > - A list of "blind carbon copy" email addresses. Addresses can be - specified in `user@host-name` format or in name `` - format - items: - type: string - type: array - cc: - description: > - A list of "carbon copy" email addresses. Addresses can be specified - in `user@host-name` format or in name `` format - items: - type: string - type: array - message: - description: The email message text. Markdown format is supported. - type: string - subject: - description: The subject line of the email. - type: string - to: - description: > - A list of email addresses. Addresses can be specified in - `user@host-name` format or in name `` format. - items: - type: string - type: array - title: Email connector parameters - type: object - Connectors_run_connector_params_message_serverlog: - description: Test an action that writes an entry to the Kibana server log. - properties: - level: - default: info - description: The log level of the message for server log connectors. - enum: - - debug - - error - - fatal - - info - - trace - - warn - type: string - message: - description: The message for server log connectors. - type: string - required: - - message - title: Server log connector parameters - type: object - Connectors_run_connector_params_message_slack: - description: > - Test an action that sends a message to Slack. It is applicable only when - the connector type is `.slack`. - properties: - message: - description: >- - The Slack message text, which cannot contain Markdown, images, or - other advanced formatting. - type: string - required: - - message - title: Slack connector parameters - type: object - Connectors_run_connector_params_trigger_pagerduty: - description: Test an action that triggers a PagerDuty alert. - properties: - class: - description: The class or type of the event. - example: cpu load - type: string - component: - description: >- - The component of the source machine that is responsible for the - event. - example: eth0 - type: string - customDetails: - description: Additional details to add to the event. - type: object - dedupKey: - description: > - All actions sharing this key will be associated with the same - PagerDuty alert. This value is used to correlate trigger and - resolution. - maxLength: 255 - type: string - eventAction: - description: The type of event. - enum: - - trigger - type: string - group: - description: The logical grouping of components of a service. - example: app-stack - type: string - links: - description: A list of links to add to the event. - items: - type: object - properties: - href: - description: The URL for the link. - type: string - text: - description: A plain text description of the purpose of the link. - type: string - type: array - severity: - default: info - description: The severity of the event on the affected system. - enum: - - critical - - error - - info - - warning - type: string - source: - description: > - The affected system, such as a hostname or fully qualified domain - name. Defaults to the Kibana saved object id of the action. - type: string - summary: - description: A summery of the event. - maxLength: 1024 - type: string - timestamp: - description: >- - An ISO-8601 timestamp that indicates when the event was detected or - generated. - format: date-time - type: string - required: - - eventAction - title: PagerDuty connector parameters - type: object - Connectors_run_connector_request: - description: The properties vary depending on the connector type. - properties: - params: - oneOf: - - $ref: >- - #/components/schemas/Connectors_run_connector_params_acknowledge_resolve_pagerduty - - $ref: '#/components/schemas/Connectors_run_connector_params_documents' - - $ref: >- - #/components/schemas/Connectors_run_connector_params_message_email - - $ref: >- - #/components/schemas/Connectors_run_connector_params_message_serverlog - - $ref: >- - #/components/schemas/Connectors_run_connector_params_message_slack - - $ref: >- - #/components/schemas/Connectors_run_connector_params_trigger_pagerduty - - description: Test an action that involves a subaction. - discriminator: - mapping: - addEvent: >- - #/components/schemas/Connectors_run_connector_subaction_addevent - closeAlert: >- - #/components/schemas/Connectors_run_connector_subaction_closealert - closeIncident: >- - #/components/schemas/Connectors_run_connector_subaction_closeincident - createAlert: >- - #/components/schemas/Connectors_run_connector_subaction_createalert - fieldsByIssueType: >- - #/components/schemas/Connectors_run_connector_subaction_fieldsbyissuetype - getChoices: >- - #/components/schemas/Connectors_run_connector_subaction_getchoices - getFields: >- - #/components/schemas/Connectors_run_connector_subaction_getfields - getIncident: >- - #/components/schemas/Connectors_run_connector_subaction_getincident - issue: >- - #/components/schemas/Connectors_run_connector_subaction_issue - issues: >- - #/components/schemas/Connectors_run_connector_subaction_issues - issueTypes: >- - #/components/schemas/Connectors_run_connector_subaction_issuetypes - pushToService: >- - #/components/schemas/Connectors_run_connector_subaction_pushtoservice - propertyName: subAction - oneOf: - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_addevent - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_closealert - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_closeincident - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_createalert - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_fieldsbyissuetype - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_getchoices - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_getfields - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_getincident - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_issue - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_issues - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_issuetypes - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_postmessage - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_pushtoservice - - $ref: >- - #/components/schemas/Connectors_run_connector_subaction_validchannelid - title: Subaction parameters - required: - - params - title: Run connector request body properties - type: object - Connectors_run_connector_subaction_addevent: - description: The `addEvent` subaction for ServiceNow ITOM connectors. - title: The addEvent subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - addEvent - type: string - subActionParams: - description: The set of configuration properties for the action. - type: object - properties: - additional_info: - description: Additional information about the event. - type: string - description: - description: The details about the event. - type: string - event_class: - description: A specific instance of the source. - type: string - message_key: - description: >- - All actions sharing this key are associated with the same - ServiceNow alert. The default value is `:`. - type: string - metric_name: - description: The name of the metric. - type: string - node: - description: The host that the event was triggered for. - type: string - resource: - description: The name of the resource. - type: string - severity: - description: The severity of the event. - type: string - source: - description: The name of the event source type. - type: string - time_of_event: - description: The time of the event. - type: string - type: - description: The type of event. - type: string - required: - - subAction - Connectors_run_connector_subaction_closealert: - description: The `closeAlert` subaction for Opsgenie connectors. - title: The closeAlert subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - closeAlert - type: string - subActionParams: - type: object - properties: - alias: - description: >- - The unique identifier used for alert deduplication in Opsgenie. - The alias must match the value used when creating the alert. - type: string - note: - description: Additional information for the alert. - type: string - source: - description: The display name for the source of the alert. - type: string - user: - description: The display name for the owner. - type: string - required: - - alias - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_closeincident: - description: The `closeIncident` subaction for ServiceNow ITSM connectors. - title: The closeIncident subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - closeIncident - type: string - subActionParams: - type: object - properties: - incident: - anyOf: - - required: - - correlation_id - - required: - - externalId - type: object - properties: - correlation_id: - default: '{{rule.id}}:{{alert.id}}' - description: > - An identifier that is assigned to the incident when it is - created by the connector. NOTE: If you use the default value - and the rule generates multiple alerts that use the same - alert IDs, the latest open incident for this correlation ID - is closed unless you specify the external ID. - maxLength: 100 - nullable: true - type: string - externalId: - description: >- - The unique identifier (`incidentId`) for the incident in - ServiceNow. - nullable: true - type: string - required: - - incident - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_createalert: - description: The `createAlert` subaction for Opsgenie connectors. - title: The createAlert subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - createAlert - type: string - subActionParams: - type: object - properties: - actions: - description: The custom actions available to the alert. - items: - type: string - type: array - alias: - description: The unique identifier used for alert deduplication in Opsgenie. - type: string - description: - description: >- - A description that provides detailed information about the - alert. - type: string - details: - additionalProperties: true - description: The custom properties of the alert. - example: - key1: value1 - key2: value2 - type: object - entity: - description: >- - The domain of the alert. For example, the application or server - name. - type: string - message: - description: The alert message. - type: string - note: - description: Additional information for the alert. - type: string - priority: - description: The priority level for the alert. - enum: - - P1 - - P2 - - P3 - - P4 - - P5 - type: string - responders: - description: > - The entities to receive notifications about the alert. If `type` - is `user`, either `id` or `username` is required. If `type` is - `team`, either `id` or `name` is required. - items: - type: object - properties: - id: - description: The identifier for the entity. - type: string - name: - description: The name of the entity. - type: string - type: - description: 'The type of responders, in this case `escalation`.' - enum: - - escalation - - schedule - - team - - user - type: string - username: - description: A valid email address for the user. - type: string - type: array - source: - description: The display name for the source of the alert. - type: string - tags: - description: The tags for the alert. - items: - type: string - type: array - user: - description: The display name for the owner. - type: string - visibleTo: - description: >- - The teams and users that the alert will be visible to without - sending a notification. Only one of `id`, `name`, or `username` - is required. - items: - type: object - properties: - id: - description: The identifier for the entity. - type: string - name: - description: The name of the entity. - type: string - type: - description: Valid values are `team` and `user`. - enum: - - team - - user - type: string - username: - description: >- - The user name. This property is required only when the - `type` is `user`. - type: string - required: - - type - type: array - required: - - message - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_fieldsbyissuetype: - description: The `fieldsByIssueType` subaction for Jira connectors. - title: The fieldsByIssueType subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - fieldsByIssueType - type: string - subActionParams: - type: object - properties: - id: - description: The Jira issue type identifier. - example: 10024 - type: string - required: - - id - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_getchoices: - description: >- - The `getChoices` subaction for ServiceNow ITOM, ServiceNow ITSM, and - ServiceNow SecOps connectors. - title: The getChoices subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - getChoices - type: string - subActionParams: - description: The set of configuration properties for the action. - type: object - properties: - fields: - description: An array of fields. - items: - type: string - type: array - required: - - fields - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_getfields: - description: >- - The `getFields` subaction for Jira, ServiceNow ITSM, and ServiceNow - SecOps connectors. - title: The getFields subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - getFields - type: string - required: - - subAction - Connectors_run_connector_subaction_getincident: - description: >- - The `getIncident` subaction for Jira, ServiceNow ITSM, and ServiceNow - SecOps connectors. - properties: - subAction: - description: The action to test. - enum: - - getIncident - type: string - subActionParams: - type: object - properties: - externalId: - description: >- - The Jira, ServiceNow ITSM, or ServiceNow SecOps issue - identifier. - example: 71778 - type: string - required: - - externalId - required: - - subAction - - subActionParams - title: The getIncident subaction - type: object - Connectors_run_connector_subaction_issue: - description: The `issue` subaction for Jira connectors. - title: The issue subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - issue - type: string - subActionParams: - type: object - properties: - id: - description: The Jira issue identifier. - example: 71778 - type: string - required: - - id - required: - - subAction - Connectors_run_connector_subaction_issues: - description: The `issues` subaction for Jira connectors. - title: The issues subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - issues - type: string - subActionParams: - type: object - properties: - title: - description: The title of the Jira issue. - type: string - required: - - title - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_issuetypes: - description: The `issueTypes` subaction for Jira connectors. - title: The issueTypes subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - issueTypes - type: string - required: - - subAction - Connectors_run_connector_subaction_postmessage: - description: > - Test an action that sends a message to Slack. It is applicable only when - the connector type is `.slack_api`. - properties: - subAction: - description: The action to test. - enum: - - postMessage - type: string - subActionParams: - description: The set of configuration properties for the action. - type: object - properties: - channelIds: - description: > - The Slack channel identifier, which must be one of the - `allowedChannels` in the connector configuration. - items: - type: string - maxItems: 1 - type: array - channels: - deprecated: true - description: | - The name of a channel that your Slack app has access to. - items: - type: string - maxItems: 1 - type: array - text: - description: > - The Slack message text. If it is a Slack webhook connector, the - text cannot contain Markdown, images, or other advanced - formatting. If it is a Slack web API connector, it can contain - either plain text or block kit messages. - minLength: 1 - type: string - required: - - subAction - - subActionParams - title: The postMessage subaction - type: object - Connectors_run_connector_subaction_pushtoservice: - description: >- - The `pushToService` subaction for Jira, ServiceNow ITSM, ServiceNow - SecOps, Swimlane, and Webhook - Case Management connectors. - title: The pushToService subaction - type: object - properties: - subAction: - description: The action to test. - enum: - - pushToService - type: string - subActionParams: - description: The set of configuration properties for the action. - type: object - properties: - comments: - description: >- - Additional information that is sent to Jira, ServiceNow ITSM, - ServiceNow SecOps, or Swimlane. - items: - type: object - properties: - comment: - description: >- - A comment related to the incident. For example, describe - how to troubleshoot the issue. - type: string - commentId: - description: A unique identifier for the comment. - type: integer - type: array - incident: - description: >- - Information necessary to create or update a Jira, ServiceNow - ITSM, ServiveNow SecOps, or Swimlane incident. - type: object - properties: - alertId: - description: The alert identifier for Swimlane connectors. - type: string - caseId: - description: >- - The case identifier for the incident for Swimlane - connectors. - type: string - caseName: - description: The case name for the incident for Swimlane connectors. - type: string - category: - description: >- - The category of the incident for ServiceNow ITSM and - ServiceNow SecOps connectors. - type: string - correlation_display: - description: >- - A descriptive label of the alert for correlation purposes - for ServiceNow ITSM and ServiceNow SecOps connectors. - type: string - correlation_id: - description: > - The correlation identifier for the security incident for - ServiceNow ITSM and ServiveNow SecOps connectors. Connectors - using the same correlation ID are associated with the same - ServiceNow incident. This value determines whether a new - ServiceNow incident is created or an existing one is - updated. Modifying this value is optional; if not modified, - the rule ID and alert ID are combined as `{{ruleID}}:{{alert - ID}}` to form the correlation ID value in ServiceNow. The - maximum character length for this value is 100 characters. - NOTE: Using the default configuration of `{{ruleID}}:{{alert - ID}}` ensures that ServiceNow creates a separate incident - record for every generated alert that uses a unique alert - ID. If the rule generates multiple alerts that use the same - alert IDs, ServiceNow creates and continually updates a - single incident record for the alert. - type: string - description: - description: >- - The description of the incident for Jira, ServiceNow ITSM, - ServiceNow SecOps, Swimlane, and Webhook - Case Management - connectors. - type: string - dest_ip: - description: > - A list of destination IP addresses related to the security - incident for ServiceNow SecOps connectors. The IPs are added - as observables to the security incident. - oneOf: - - type: string - - items: - type: string - type: array - externalId: - description: > - The Jira, ServiceNow ITSM, or ServiceNow SecOps issue - identifier. If present, the incident is updated. Otherwise, - a new incident is created. - type: string - id: - description: >- - The external case identifier for Webhook - Case Management - connectors. - type: string - impact: - description: The impact of the incident for ServiceNow ITSM connectors. - type: string - issueType: - description: >- - The type of incident for Jira connectors. For example, - 10006. To obtain the list of valid values, set `subAction` - to `issueTypes`. - type: integer - labels: - description: > - The labels for the incident for Jira connectors. NOTE: - Labels cannot contain spaces. - items: - type: string - type: array - malware_hash: - description: >- - A list of malware hashes related to the security incident - for ServiceNow SecOps connectors. The hashes are added as - observables to the security incident. - oneOf: - - type: string - - items: - type: string - type: array - malware_url: - description: >- - A list of malware URLs related to the security incident for - ServiceNow SecOps connectors. The URLs are added as - observables to the security incident. - oneOf: - - type: string - - items: - type: string - type: array - type: string - otherFields: - additionalProperties: true - description: > - Custom field identifiers and their values for Jira - connectors. - maxProperties: 20 - type: object - parent: - description: >- - The ID or key of the parent issue for Jira connectors. - Applies only to `Sub-task` types of issues. - type: string - priority: - description: >- - The priority of the incident in Jira and ServiceNow SecOps - connectors. - type: string - ruleName: - description: The rule name for Swimlane connectors. - type: string - severity: - description: >- - The severity of the incident for ServiceNow ITSM and - Swimlane connectors. - type: string - short_description: - description: > - A short description of the incident for ServiceNow ITSM and - ServiceNow SecOps connectors. It is used for searching the - contents of the knowledge base. - type: string - source_ip: - description: >- - A list of source IP addresses related to the security - incident for ServiceNow SecOps connectors. The IPs are added - as observables to the security incident. - oneOf: - - type: string - - items: - type: string - type: array - status: - description: >- - The status of the incident for Webhook - Case Management - connectors. - type: string - subcategory: - description: >- - The subcategory of the incident for ServiceNow ITSM and - ServiceNow SecOps connectors. - type: string - summary: - description: A summary of the incident for Jira connectors. - type: string - tags: - description: A list of tags for Webhook - Case Management connectors. - items: - type: string - type: array - title: - description: > - A title for the incident for Jira and Webhook - Case - Management connectors. It is used for searching the contents - of the knowledge base. - type: string - urgency: - description: The urgency of the incident for ServiceNow ITSM connectors. - type: string - required: - - subAction - - subActionParams - Connectors_run_connector_subaction_validchannelid: - description: > - Retrieves information about a valid Slack channel identifier. It is - applicable only when the connector type is `.slack_api`. - properties: - subAction: - description: The action to test. - enum: - - validChannelId - type: string - subActionParams: - type: object - properties: - channelId: - description: The Slack channel identifier. - example: C123ABC456 - type: string - required: - - channelId - required: - - subAction - - subActionParams - title: The validChannelId subaction - type: object - Connectors_secrets_properties_bedrock: - description: Defines secrets for connectors when type is `.bedrock`. - properties: - accessKey: - description: The AWS access key for authentication. - type: string - secret: - description: The AWS secret for authentication. - type: string - required: - - accessKey - - secret - title: Connector secrets properties for an Amazon Bedrock connector - type: object - Connectors_secrets_properties_cases_webhook: - title: Connector secrets properties for Webhook - Case Management connector - type: object - properties: - crt: - $ref: '#/components/schemas/Connectors_crt' - key: - $ref: '#/components/schemas/Connectors_key' - password: - description: > - The password for HTTP basic authentication. If `hasAuth` is set to - `true` and and `authType` is `webhook-authentication-basic`, this - property is required. - type: string - pfx: - $ref: '#/components/schemas/Connectors_pfx' - user: - description: > - The username for HTTP basic authentication. If `hasAuth` is set to - `true` and `authType` is `webhook-authentication-basic`, this - property is required. - type: string - Connectors_secrets_properties_d3security: - description: Defines secrets for connectors when type is `.d3security`. - type: object - properties: - token: - description: The D3 Security token. - type: string - required: - - token - title: Connector secrets properties for a D3 Security connector - Connectors_secrets_properties_email: - description: Defines secrets for connectors when type is `.email`. - properties: - clientSecret: - description: > - The Microsoft Exchange Client secret for OAuth 2.0 client - credentials authentication. It must be URL-encoded. If `service` is - `exchange_server`, this property is required. - type: string - password: - description: > - The password for HTTP basic authentication. If `hasAuth` is set to - `true`, this property is required. - type: string - user: - description: > - The username for HTTP basic authentication. If `hasAuth` is set to - `true`, this property is required. - type: string - title: Connector secrets properties for an email connector - type: object - Connectors_secrets_properties_gemini: - description: Defines secrets for connectors when type is `.gemini`. - properties: - credentialsJSON: - description: >- - The service account credentials JSON file. The service account - should have Vertex AI user IAM role assigned to it. - type: string - required: - - credentialsJSON - title: Connector secrets properties for a Google Gemini connector - type: object - Connectors_secrets_properties_genai: - description: Defines secrets for connectors when type is `.gen-ai`. - properties: - apiKey: - description: The OpenAI API key. - type: string - title: Connector secrets properties for an OpenAI connector - type: object - Connectors_secrets_properties_jira: - description: Defines secrets for connectors when type is `.jira`. - type: object - properties: - apiToken: - description: The Jira API authentication token for HTTP basic authentication. - type: string - email: - description: The account email for HTTP Basic authentication. - type: string - required: - - apiToken - - email - title: Connector secrets properties for a Jira connector - Connectors_secrets_properties_opsgenie: - description: Defines secrets for connectors when type is `.opsgenie`. - type: object - properties: - apiKey: - description: The Opsgenie API authentication key for HTTP Basic authentication. - type: string - required: - - apiKey - title: Connector secrets properties for an Opsgenie connector - Connectors_secrets_properties_pagerduty: - description: Defines secrets for connectors when type is `.pagerduty`. - properties: - routingKey: - description: > - A 32 character PagerDuty Integration Key for an integration on a - service. - type: string - required: - - routingKey - title: Connector secrets properties for a PagerDuty connector - type: object - Connectors_secrets_properties_resilient: - description: Defines secrets for connectors when type is `.resilient`. - type: object - properties: - apiKeyId: - description: The authentication key ID for HTTP Basic authentication. - type: string - apiKeySecret: - description: The authentication key secret for HTTP Basic authentication. - type: string - required: - - apiKeyId - - apiKeySecret - title: Connector secrets properties for IBM Resilient connector - Connectors_secrets_properties_sentinelone: - description: Defines secrets for connectors when type is `.sentinelone`. - properties: - token: - description: The A SentinelOne API token. - type: string - required: - - token - title: Connector secrets properties for a SentinelOne connector - type: object - Connectors_secrets_properties_servicenow: - description: >- - Defines secrets for connectors when type is `.servicenow`, - `.servicenow-sir`, or `.servicenow-itom`. - properties: - clientSecret: - description: >- - The client secret assigned to your OAuth application. This property - is required when `isOAuth` is `true`. - type: string - password: - description: >- - The password for HTTP basic authentication. This property is - required when `isOAuth` is `false`. - type: string - privateKey: - description: >- - The RSA private key that you created for use in ServiceNow. This - property is required when `isOAuth` is `true`. - type: string - privateKeyPassword: - description: >- - The password for the RSA private key. This property is required when - `isOAuth` is `true` and you set a password on your private key. - type: string - username: - description: >- - The username for HTTP basic authentication. This property is - required when `isOAuth` is `false`. - type: string - title: >- - Connector secrets properties for ServiceNow ITOM, ServiceNow ITSM, and - ServiceNow SecOps connectors - type: object - Connectors_secrets_properties_slack_api: - description: Defines secrets for connectors when type is `.slack`. - type: object - properties: - token: - description: Slack bot user OAuth token. - type: string - required: - - token - title: Connector secrets properties for a Web API Slack connector - Connectors_secrets_properties_slack_webhook: - description: Defines secrets for connectors when type is `.slack`. - type: object - properties: - webhookUrl: - description: Slack webhook url. - type: string - required: - - webhookUrl - title: Connector secrets properties for a Webhook Slack connector - Connectors_secrets_properties_swimlane: - description: Defines secrets for connectors when type is `.swimlane`. - properties: - apiToken: - description: Swimlane API authentication token. - type: string - title: Connector secrets properties for a Swimlane connector - type: object - Connectors_secrets_properties_teams: - description: Defines secrets for connectors when type is `.teams`. - properties: - webhookUrl: - description: > - The URL of the incoming webhook. If you are using the - `xpack.actions.allowedHosts` setting, add the hostname to the - allowed hosts. - type: string - required: - - webhookUrl - title: Connector secrets properties for a Microsoft Teams connector - type: object - Connectors_secrets_properties_tines: - description: Defines secrets for connectors when type is `.tines`. - properties: - email: - description: The email used to sign in to Tines. - type: string - token: - description: The Tines API token. - type: string - required: - - email - - token - title: Connector secrets properties for a Tines connector - type: object - Connectors_secrets_properties_torq: - description: Defines secrets for connectors when type is `.torq`. - properties: - token: - description: The secret of the webhook authentication header. - type: string - required: - - token - title: Connector secrets properties for a Torq connector - type: object - Connectors_secrets_properties_webhook: - description: Defines secrets for connectors when type is `.webhook`. - properties: - crt: - $ref: '#/components/schemas/Connectors_crt' - key: - $ref: '#/components/schemas/Connectors_key' - password: - description: > - The password for HTTP basic authentication or the passphrase for the - SSL certificate files. If `hasAuth` is set to `true` and `authType` - is `webhook-authentication-basic`, this property is required. - type: string - pfx: - $ref: '#/components/schemas/Connectors_pfx' - user: - description: > - The username for HTTP basic authentication. If `hasAuth` is set to - `true` and `authType` is `webhook-authentication-basic`, this - property is required. - type: string - title: Connector secrets properties for a Webhook connector - type: object - Connectors_secrets_properties_xmatters: - description: Defines secrets for connectors when type is `.xmatters`. - properties: - password: - description: > - A user name for HTTP basic authentication. It is applicable only - when `usesBasic` is `true`. - type: string - secretsUrl: - description: > - The request URL for the Elastic Alerts trigger in xMatters with the - API key included in the URL. It is applicable only when `usesBasic` - is `false`. - type: string - user: - description: > - A password for HTTP basic authentication. It is applicable only when - `usesBasic` is `true`. - type: string - title: Connector secrets properties for an xMatters connector - type: object - Connectors_update_connector_request: - description: The properties vary depending on the connector type. - oneOf: - - $ref: '#/components/schemas/Connectors_update_connector_request_bedrock' - - $ref: '#/components/schemas/Connectors_update_connector_request_gemini' - - $ref: >- - #/components/schemas/Connectors_update_connector_request_cases_webhook - - $ref: '#/components/schemas/Connectors_update_connector_request_d3security' - - $ref: '#/components/schemas/Connectors_update_connector_request_email' - - $ref: '#/components/schemas/Connectors_create_connector_request_genai' - - $ref: '#/components/schemas/Connectors_update_connector_request_index' - - $ref: '#/components/schemas/Connectors_update_connector_request_jira' - - $ref: '#/components/schemas/Connectors_update_connector_request_opsgenie' - - $ref: '#/components/schemas/Connectors_update_connector_request_pagerduty' - - $ref: '#/components/schemas/Connectors_update_connector_request_resilient' - - $ref: '#/components/schemas/Connectors_update_connector_request_sentinelone' - - $ref: '#/components/schemas/Connectors_update_connector_request_serverlog' - - $ref: '#/components/schemas/Connectors_update_connector_request_servicenow' - - $ref: >- - #/components/schemas/Connectors_update_connector_request_servicenow_itom - - $ref: '#/components/schemas/Connectors_update_connector_request_slack_api' - - $ref: >- - #/components/schemas/Connectors_update_connector_request_slack_webhook - - $ref: '#/components/schemas/Connectors_update_connector_request_swimlane' - - $ref: '#/components/schemas/Connectors_update_connector_request_teams' - - $ref: '#/components/schemas/Connectors_update_connector_request_tines' - - $ref: '#/components/schemas/Connectors_update_connector_request_torq' - - $ref: '#/components/schemas/Connectors_update_connector_request_webhook' - - $ref: '#/components/schemas/Connectors_update_connector_request_xmatters' - title: Update connector request body properties - Connectors_update_connector_request_bedrock: - title: Update Amazon Bedrock connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_bedrock' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_bedrock' - required: - - config - - name - Connectors_update_connector_request_cases_webhook: - title: Update Webhook - Case Managment connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_cases_webhook' - name: - description: The display name for the connector. - example: my-connector - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_cases_webhook' - required: - - config - - name - Connectors_update_connector_request_d3security: - title: Update D3 Security connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_d3security' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_d3security' - required: - - config - - name - - secrets - Connectors_update_connector_request_email: - title: Update email connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_email' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_email' - required: - - config - - name - Connectors_update_connector_request_gemini: - title: Update Google Gemini connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_gemini' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_gemini' - required: - - config - - name - Connectors_update_connector_request_index: - title: Update index connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_index' - name: - description: The display name for the connector. - type: string - required: - - config - - name - Connectors_update_connector_request_jira: - title: Update Jira connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_jira' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_jira' - required: - - config - - name - - secrets - Connectors_update_connector_request_opsgenie: - title: Update Opsgenie connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_opsgenie' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_opsgenie' - required: - - config - - name - - secrets - Connectors_update_connector_request_pagerduty: - title: Update PagerDuty connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_pagerduty' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_pagerduty' - required: - - config - - name - - secrets - Connectors_update_connector_request_resilient: - title: Update IBM Resilient connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_resilient' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_resilient' - required: - - config - - name - - secrets - Connectors_update_connector_request_sentinelone: - title: Update SentinelOne connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_sentinelone' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_sentinelone' - required: - - config - - name - - secrets - Connectors_update_connector_request_serverlog: - title: Update server log connector request - type: object - properties: - name: - description: The display name for the connector. + The current comment version. To retrieve version values, use the get + comments API. + example: Wzk1LDFd type: string required: - - name - Connectors_update_connector_request_servicenow: - title: Update ServiceNow ITSM connector or ServiceNow SecOps request + - comment + - id + - owner + - type + - version + title: Update case comment request properties for user comments type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow' - name: - description: The display name for the connector. - type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - name - - secrets - Connectors_update_connector_request_servicenow_itom: - title: Create ServiceNow ITOM connector request + Cases_user_actions_find_response_properties: type: object properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_servicenow_itom' - name: - description: The display name for the connector. + action: + $ref: '#/components/schemas/Cases_actions' + comment_id: + example: 578608d0-03b1-11ed-920c-974bfa104448 + nullable: true type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_servicenow' - required: - - config - - name - - secrets - Connectors_update_connector_request_slack_api: - title: Update Slack connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_slack_api' - name: - description: The display name for the connector. + created_at: + example: '2022-05-13T09:16:17.416Z' + format: date-time type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_api' - required: - - name - - secrets - Connectors_update_connector_request_slack_webhook: - title: Update Slack connector request - type: object - properties: - name: - description: The display name for the connector. + created_by: + type: object + properties: + email: + example: null + nullable: true + type: string + full_name: + example: null + nullable: true + type: string + profile_uid: + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + type: string + username: + example: elastic + nullable: true + type: string + required: + - email + - full_name + - username + id: + example: 22fd3e30-03b1-11ed-920c-974bfa104448 type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_slack_webhook' - required: - - name - - secrets - Connectors_update_connector_request_swimlane: - title: Update Swimlane connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_swimlane' - name: - description: The display name for the connector. - example: my-connector + owner: + $ref: '#/components/schemas/Cases_owners' + payload: + oneOf: + - $ref: '#/components/schemas/Cases_payload_alert_comment' + - $ref: '#/components/schemas/Cases_payload_assignees' + - $ref: '#/components/schemas/Cases_payload_connector' + - $ref: '#/components/schemas/Cases_payload_create_case' + - $ref: '#/components/schemas/Cases_payload_delete' + - $ref: '#/components/schemas/Cases_payload_description' + - $ref: '#/components/schemas/Cases_payload_pushed' + - $ref: '#/components/schemas/Cases_payload_settings' + - $ref: '#/components/schemas/Cases_payload_severity' + - $ref: '#/components/schemas/Cases_payload_status' + - $ref: '#/components/schemas/Cases_payload_tags' + - $ref: '#/components/schemas/Cases_payload_title' + - $ref: '#/components/schemas/Cases_payload_user_comment' + type: + description: The type of action. + enum: + - assignees + - create_case + - comment + - connector + - description + - pushed + - tags + - title + - status + - settings + - severity + example: create_case type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_swimlane' - required: - - config - - name - - secrets - Connectors_update_connector_request_teams: - title: Update Microsoft Teams connector request - type: object - properties: - name: - description: The display name for the connector. + version: + example: WzM1ODg4LDFd type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_teams' required: - - name - - secrets - Connectors_update_connector_request_tines: - title: Update Tines connector request + - action + - comment_id + - created_at + - created_by + - id + - owner + - payload + - type + - version + Cases_user_actions_response_properties: type: object properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_tines' - name: - description: The display name for the connector. + action: + $ref: '#/components/schemas/Cases_actions' + action_id: + example: 22fd3e30-03b1-11ed-920c-974bfa104448 type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_tines' - required: - - config - - name - - secrets - Connectors_update_connector_request_torq: - title: Update Torq connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_torq' - name: - description: The display name for the connector. + case_id: + example: 22df07d0-03b1-11ed-920c-974bfa104448 type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_torq' - required: - - config - - name - - secrets - Connectors_update_connector_request_webhook: - title: Update Webhook connector request - type: object - properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_webhook' - name: - description: The display name for the connector. + comment_id: + example: 578608d0-03b1-11ed-920c-974bfa104448 + nullable: true type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_webhook' + created_at: + example: '2022-05-13T09:16:17.416Z' + format: date-time + type: string + created_by: + type: object + properties: + email: + example: null + nullable: true + type: string + full_name: + example: null + nullable: true + type: string + profile_uid: + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + type: string + username: + example: elastic + nullable: true + type: string + required: + - email + - full_name + - username + owner: + $ref: '#/components/schemas/Cases_owners' + payload: + oneOf: + - $ref: '#/components/schemas/Cases_payload_alert_comment' + - $ref: '#/components/schemas/Cases_payload_assignees' + - $ref: '#/components/schemas/Cases_payload_connector' + - $ref: '#/components/schemas/Cases_payload_create_case' + - $ref: '#/components/schemas/Cases_payload_delete' + - $ref: '#/components/schemas/Cases_payload_description' + - $ref: '#/components/schemas/Cases_payload_pushed' + - $ref: '#/components/schemas/Cases_payload_settings' + - $ref: '#/components/schemas/Cases_payload_severity' + - $ref: '#/components/schemas/Cases_payload_status' + - $ref: '#/components/schemas/Cases_payload_tags' + - $ref: '#/components/schemas/Cases_payload_title' + - $ref: '#/components/schemas/Cases_payload_user_comment' + type: + $ref: '#/components/schemas/Cases_action_types' required: - - config - - name - - secrets - Connectors_update_connector_request_xmatters: - title: Update xMatters connector request + - action + - action_id + - case_id + - comment_id + - created_at + - created_by + - owner + - payload + - type + Cases_user_comment_response_properties: + title: Case response properties for user comments type: object properties: - config: - $ref: '#/components/schemas/Connectors_config_properties_xmatters' - name: - description: The display name for the connector. + comment: + example: A new comment. + type: string + created_at: + example: '2022-05-13T09:16:17.416Z' + format: date-time + type: string + created_by: + $ref: '#/components/schemas/Cases_case_response_created_by_properties' + id: + example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + type: string + owner: + $ref: '#/components/schemas/Cases_owners' + pushed_at: + example: null + format: date-time + nullable: true + type: string + pushed_by: + $ref: '#/components/schemas/Cases_case_response_pushed_by_properties' + type: + enum: + - user + example: user + type: string + updated_at: + example: null + format: date-time + nullable: true + type: string + updated_by: + $ref: '#/components/schemas/Cases_case_response_updated_by_properties' + version: + example: WzIwNDMxLDFd type: string - secrets: - $ref: '#/components/schemas/Connectors_secrets_properties_xmatters' required: - - config - - name - - secrets - Connectors_verification_mode: - default: full - description: > - Controls the verification of certificates. Use `full` to validate that - the certificate has an issue date within the `not_before` and - `not_after` dates, chains to a trusted certificate authority (CA), and - has a hostname or IP address that matches the names within the - certificate. Use `certificate` to validate the certificate and verify - that it is signed by a trusted authority; this option does not check the - certificate hostname. Use `none` to skip certificate validation. - enum: - - certificate - - full - - none - title: Verification mode - type: string + - type Data_views_400_response: title: Bad request type: object @@ -24173,18 +19524,25 @@ components: type: object properties: active: + description: >- + When false, the enrollment API key is revoked and cannot be used for + enrolling Elastic Agents. type: boolean api_key: + description: The enrollment API key (token) used for enrolling Elastic Agents. type: string api_key_id: + description: The ID of the API key in the Security API. type: string created_at: type: string id: type: string name: + description: The name of the enrollment API key. type: string policy_id: + description: The ID of the agent policy the Elastic Agent will be enrolled in. type: string required: - id @@ -24841,6 +20199,7 @@ components: - version policy_id: deprecated: true + nullable: true type: string policy_ids: items: @@ -25725,6 +21084,11 @@ components: policy's namespace. example: customnamespace type: string + output_id: + description: Output ID to send package data to + example: output-id + nullable: true + type: string overrides: description: >- Override settings that are defined in the package policy. The @@ -25753,6 +21117,7 @@ components: deprecated: true description: Agent policy ID where that package policy will be added example: agent-policy-id + nullable: true type: string policy_ids: description: Agent policy IDs where that package policy will be added @@ -27603,8 +22968,7 @@ tags: name: APM annotations - description: Case APIs enable you to open and track issues. name: cases - - description: Connector APIs enable you to create and manage connectors. - name: connectors + - name: connectors - name: Data streams - description: >- Data view APIs enable you to manage data views, formerly known as Kibana From 8b2cb75a575a69d17d122f7e971190f8c10b10c8 Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:31:31 -0700 Subject: [PATCH 10/28] [Response Ops] Fix flaky maintenance window E2E tests (#188487) ## Summary Issue: https://github.com/elastic/kibana/issues/187818 Fix flaky test where it's not waiting for the page to load before searching maintenance window. Also slightly improve the maintenance window table to not flicker when loading. Instead it should just show the spinner. ### 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 --- .../hooks/use_find_maintenance_windows.ts | 2 + .../maintenance_windows_list.test.tsx | 6 +- .../components/maintenance_windows_list.tsx | 56 ++++++++++++------- .../components/table_actions_popover.test.tsx | 5 ++ .../components/table_actions_popover.tsx | 6 +- .../pages/maintenance_windows/index.tsx | 6 +- .../maintenance_windows_table.ts | 3 +- .../triggers_actions_ui/stack_alerts_page.ts | 12 ++++ 8 files changed, 67 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/alerting/public/hooks/use_find_maintenance_windows.ts b/x-pack/plugins/alerting/public/hooks/use_find_maintenance_windows.ts index ab36720e893a5..7f8293dbd5dd0 100644 --- a/x-pack/plugins/alerting/public/hooks/use_find_maintenance_windows.ts +++ b/x-pack/plugins/alerting/public/hooks/use_find_maintenance_windows.ts @@ -39,6 +39,7 @@ export const useFindMaintenanceWindows = (props?: UseFindMaintenanceWindowsProps const { isLoading, isFetching, + isInitialLoading, data = [], refetch, } = useQuery({ @@ -54,6 +55,7 @@ export const useFindMaintenanceWindows = (props?: UseFindMaintenanceWindowsProps return { maintenanceWindows: data, isLoading: enabled && (isLoading || isFetching), + isInitialLoading, refetch, }; }; diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.test.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.test.tsx index 6efbe04e99b5f..5f9c5b23409c0 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.test.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.test.tsx @@ -92,7 +92,7 @@ describe('MaintenanceWindowsList', () => { const result = appMockRenderer.render( {}} - loading={false} + isLoading={false} items={items} readOnly={false} /> @@ -125,7 +125,7 @@ describe('MaintenanceWindowsList', () => { const result = appMockRenderer.render( {}} - loading={false} + isLoading={false} items={items} readOnly={true} /> @@ -142,7 +142,7 @@ describe('MaintenanceWindowsList', () => { const result = appMockRenderer.render( diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.tsx index 7e474859981ef..f91856dc8aec9 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/maintenance_windows_list.tsx @@ -5,17 +5,17 @@ * 2.0. */ -import React, { ReactElement, useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { formatDate, EuiInMemoryTable, EuiBasicTableColumn, EuiFlexGroup, EuiFlexItem, - SearchFilterConfig, EuiBadge, useEuiTheme, EuiButton, + EuiSearchBarProps, } from '@elastic/eui'; import { css } from '@emotion/react'; import { SortDirection } from '../types'; @@ -35,7 +35,7 @@ import { useArchiveMaintenanceWindow } from '../../../hooks/use_archive_maintena import { useFinishAndArchiveMaintenanceWindow } from '../../../hooks/use_finish_and_archive_maintenance_window'; interface MaintenanceWindowsListProps { - loading: boolean; + isLoading: boolean; items: MaintenanceWindow[]; readOnly: boolean; refreshData: () => void; @@ -99,21 +99,9 @@ const rowProps = (item: MaintenanceWindow) => ({ }); export const MaintenanceWindowsList = React.memo( - ({ loading, items, readOnly, refreshData }) => { - const search: { filters: SearchFilterConfig[]; toolsRight: ReactElement } = { - filters: [ - { - type: 'custom_component', - component: StatusFilter, - }, - ], - toolsRight: ( - - {i18n.REFRESH} - - ), - }; + ({ isLoading, items, readOnly, refreshData }) => { const { euiTheme } = useEuiTheme(); + const { navigateToEditMaintenanceWindows } = useEditMaintenanceWindowsNavigation(); const onEdit = useCallback( (id) => navigateToEditMaintenanceWindows(id), @@ -127,6 +115,7 @@ export const MaintenanceWindowsList = React.memo( ); const { mutate: archiveMaintenanceWindow, isLoading: isLoadingArchive } = useArchiveMaintenanceWindow(); + const onArchive = useCallback( (id: string, archive: boolean) => archiveMaintenanceWindow( @@ -137,11 +126,16 @@ export const MaintenanceWindowsList = React.memo( ); const { mutate: finishAndArchiveMaintenanceWindow, isLoading: isLoadingFinishAndArchive } = useFinishAndArchiveMaintenanceWindow(); + const onCancelAndArchive = useCallback( (id: string) => finishAndArchiveMaintenanceWindow(id, { onSuccess: () => refreshData() }), [finishAndArchiveMaintenanceWindow, refreshData] ); + const isMutatingOrLoading = useMemo(() => { + return isLoadingFinish || isLoadingArchive || isLoadingFinishAndArchive || isLoading; + }, [isLoadingFinish, isLoadingArchive, isLoadingFinishAndArchive, isLoading]); + const tableCss = useMemo(() => { return css` .euiTableRow { @@ -160,6 +154,7 @@ export const MaintenanceWindowsList = React.memo( return ( ( }, }, ], - [onArchive, onCancel, onCancelAndArchive, onEdit] + [isMutatingOrLoading, onArchive, onCancel, onCancelAndArchive, onEdit] ); const columns = useMemo( @@ -178,12 +173,35 @@ export const MaintenanceWindowsList = React.memo( [actions, readOnly] ); + const search: EuiSearchBarProps = useMemo( + () => ({ + filters: [ + { + type: 'custom_component', + component: StatusFilter, + }, + ], + toolsRight: ( + + {i18n.REFRESH} + + ), + }), + [isMutatingOrLoading, refreshData] + ); + return ( { const result = appMockRenderer.render( {}} onCancel={() => {}} @@ -39,6 +40,7 @@ describe('TableActionsPopover', () => { const result = appMockRenderer.render( {}} onCancel={() => {}} @@ -56,6 +58,7 @@ describe('TableActionsPopover', () => { const result = appMockRenderer.render( {}} onCancel={() => {}} @@ -72,6 +75,7 @@ describe('TableActionsPopover', () => { const result = appMockRenderer.render( {}} onCancel={() => {}} @@ -88,6 +92,7 @@ describe('TableActionsPopover', () => { const result = appMockRenderer.render( {}} onCancel={() => {}} diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/table_actions_popover.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/table_actions_popover.tsx index c91f518f6976f..b50351eb1188e 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/table_actions_popover.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/table_actions_popover.tsx @@ -21,6 +21,7 @@ import { MaintenanceWindowStatus } from '../../../../common'; export interface TableActionsPopoverProps { id: string; status: MaintenanceWindowStatus; + isLoading: boolean; onEdit: (id: string) => void; onCancel: (id: string) => void; onArchive: (id: string, archive: boolean) => void; @@ -30,7 +31,7 @@ type ModalType = 'cancel' | 'cancelAndArchive' | 'archive' | 'unarchive'; type ActionType = ModalType | 'edit'; export const TableActionsPopover: React.FC = React.memo( - ({ id, status, onEdit, onCancel, onArchive, onCancelAndArchive }) => { + ({ id, status, isLoading, onEdit, onCancel, onArchive, onCancelAndArchive }) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); const [isModalVisible, setIsModalVisible] = useState(false); const [modalType, setModalType] = useState(); @@ -197,6 +198,7 @@ export const TableActionsPopover: React.FC = React.mem const button = useMemo( () => ( = React.mem onClick={onButtonClick} /> ), - [onButtonClick] + [isLoading, onButtonClick] ); return ( diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/index.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/index.tsx index e517625c7212d..f88cba50d8a39 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/index.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/index.tsx @@ -40,7 +40,7 @@ export const MaintenanceWindowsPage = React.memo(() => { const { navigateToCreateMaintenanceWindow } = useCreateMaintenanceWindowNavigation(); - const { isLoading, maintenanceWindows, refetch } = useFindMaintenanceWindows({ + const { isLoading, isInitialLoading, maintenanceWindows, refetch } = useFindMaintenanceWindows({ enabled: hasLicense, }); @@ -81,7 +81,7 @@ export const MaintenanceWindowsPage = React.memo(() => { }; }, [setBadge, chrome]); - if (isLoading) { + if (isInitialLoading) { return ; } @@ -127,7 +127,7 @@ export const MaintenanceWindowsPage = React.memo(() => { diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/maintenance_windows/maintenance_windows_table.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/maintenance_windows/maintenance_windows_table.ts index 3b01650a9c6e8..0b228be252ca3 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/maintenance_windows/maintenance_windows_table.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/maintenance_windows/maintenance_windows_table.ts @@ -20,8 +20,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { let objectRemover: ObjectRemover; const browser = getService('browser'); - // Failing: See https://github.com/elastic/kibana/issues/187818 - describe.skip('Maintenance windows table', function () { + describe('Maintenance windows table', function () { before(async () => { objectRemover = await createObjectRemover({ getService }); }); diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts index d5ce657fd5981..5fa3a6cc0d9a3 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/stack_alerts_page.ts @@ -34,6 +34,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await security.testUser.setRoles(['alerts_and_actions_role']); }); + after(async () => { + await security.testUser.restoreDefaults(); + }); + it('Loads the page', async () => { await pageObjects.common.navigateToUrl( 'management', @@ -77,6 +81,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await security.testUser.setRoles(['only_actions_role']); }); + after(async () => { + await security.testUser.restoreDefaults(); + }); + it('Loads the page but shows missing permission prompt', async () => { await pageObjects.common.navigateToUrl( 'management', @@ -103,6 +111,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); }); + after(async () => { + await security.testUser.restoreDefaults(); + }); + it('Loads the page', async () => { log.debug('Checking for section heading to say Alerts.'); From 2629fa82a871904c745d155b46f49d0e2a1f1d0a Mon Sep 17 00:00:00 2001 From: Davis McPhee Date: Wed, 4 Sep 2024 00:26:49 -0300 Subject: [PATCH 11/28] [Discover] [Unified Data Table] Improve Discover / Unified Data Table performance in ES|QL mode (#191249) ## Summary This PR includes several performance improvements for ES|QL mode in Discover: - Memoize `UnifiedDataTableRenderCellValue` to reduce re-renders. - Show the loading spinner immediately on state changes that should trigger a refetch so that changed state isn't applied to the grid before the fetch completes. This also helps to reduce re-renders on state changes. - Replace [`EuiDataGrid` in-memory sorting](https://eui.elastic.co/#/tabular-content/data-grid-advanced#data-grid-in-memory) with a custom implementation using the `@kbn/sort-predicates` package (the same one Lens uses for its data grid). EUI in-memory sorting has a drastic impact on performance because it renders the entire grid off screen in order to parse cell values, detect their schema, and then sort the rows. This can cause rendering delays of several seconds for larger datasets on each render of the data grid. The new approach will sort in memory based on actual field values and pass the sorted rows to the data grid, which is both much more performant as well as improving the sorting behaviour across field types. - Use the `overscanRowCount` option from [react-window](https://github.com/bvaughn/react-window) to render some additional rows outside of view in the data grid, which minimizes pop-in of rows while scrolling quickly. There are also a couple of bug fixes included in the PR as a result of the new sorting behaviour: - Numeric columns are now sorted correctly where previously they used alphabetic sorting. - The "Copy column" action in data grid columns now correctly copies the column values in the current sort order instead of copying them unsorted as it used to. Before - 66,904 `UnifiedDataTableRenderCellValue` render calls: https://github.com/user-attachments/assets/04caca0d-35e7-421c-b8e3-5a37a1d65177 After - 424 `UnifiedDataTableRenderCellValue` render calls: https://github.com/user-attachments/assets/dba1a106-6bd6-4f1b-b60e-4741228c488b Before profile: profile_old After profile: profile_new Before scrolling: https://github.com/user-attachments/assets/8d9dbdbd-df3e-48df-af9a-539deda8d5ea After scrolling: https://github.com/user-attachments/assets/d6309275-e00d-44ee-a59f-2d1e5d30bb60 ### 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 - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Jatin Kathuria --- .../src/__mocks__/es_hits.ts | 2 + .../src/components/data_table.test.tsx | 1508 ++++++++++------- .../src/components/data_table.tsx | 140 +- .../src/hooks/use_sorting.ts | 113 ++ .../src/utils/get_render_cell_value.tsx | 16 +- packages/kbn-unified-data-table/tsconfig.json | 1 + .../utils/build_state_subscribe.ts | 6 + .../apps/discover/esql/_esql_view.ts | 25 +- .../apps/discover/group5/_url_state.ts | 6 +- .../data_table/index.test.tsx | 6 +- .../common/discover/esql/_esql_view.ts | 14 +- 11 files changed, 1137 insertions(+), 700 deletions(-) create mode 100644 packages/kbn-unified-data-table/src/hooks/use_sorting.ts diff --git a/packages/kbn-discover-utils/src/__mocks__/es_hits.ts b/packages/kbn-discover-utils/src/__mocks__/es_hits.ts index 0cde2c6a00d19..ff5feab164add 100644 --- a/packages/kbn-discover-utils/src/__mocks__/es_hits.ts +++ b/packages/kbn-discover-utils/src/__mocks__/es_hits.ts @@ -72,6 +72,8 @@ const generateFieldValue = (field: DataViewField, index: number) => { return Array.from(field.name).reduce((sum, char) => sum + char.charCodeAt(0) + index, 0); case KBN_FIELD_TYPES.STRING: return `${field.name}_${index}`; + case KBN_FIELD_TYPES._SOURCE: + return { [field.name]: `${field.name}_${index}` }; default: throw new Error(`Unsupported type ${field.type}`); } diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index f78405f12be82..11863df636e86 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -16,7 +16,12 @@ import { import { Storage } from '@kbn/kibana-utils-plugin/public'; import { act } from 'react-dom/test-utils'; import { findTestSubject } from '@elastic/eui/lib/test'; -import { buildDataViewMock, deepMockedFields, esHitsMock } from '@kbn/discover-utils/src/__mocks__'; +import { + buildDataViewMock, + deepMockedFields, + esHitsMock, + generateEsHits, +} from '@kbn/discover-utils/src/__mocks__'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { DataLoadingState, UnifiedDataTable, UnifiedDataTableProps } from './data_table'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -30,7 +35,7 @@ import { testTrailingControlColumns, } from '../../__mocks__/external_control_columns'; import { DatatableColumnType } from '@kbn/expressions-plugin/common'; -import { render, screen } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { CELL_CLASS } from '../utils/get_render_cell_value'; import { defaultTimeColumnWidth } from '../constants'; @@ -44,7 +49,9 @@ jest.mock('@kbn/cell-actions', () => ({ useDataGridColumnsCellActions: (prop: unknown) => mockUseDataGridColumnsCellActions(prop), })); -export const dataViewMock = buildDataViewMock({ +const EXTENDED_JEST_TIMEOUT = 10000; + +const dataViewMock = buildDataViewMock({ name: 'the-data-view', fields: deepMockedFields, timeFieldName: '@timestamp', @@ -96,10 +103,11 @@ const DataTable = (props: Partial) => ( const capabilities = capabilitiesServiceMock.createStartContract().capabilities; -const renderDataTable = (props: Partial) => { +const renderDataTable = async (props: Partial) => { const DataTableWrapped = () => { const [columns, setColumns] = useState(props.columns ?? []); const [settings, setSettings] = useState(props.settings); + const [sort, setSort] = useState(props.sort ?? []); const { onSetColumns } = useColumns({ capabilities, @@ -136,18 +144,26 @@ const renderDataTable = (props: Partial) => { }, }); }} + sort={sort} + onSort={setSort as UnifiedDataTableProps['onSort']} /> ); }; render(); + + // EuiDataGrid makes state updates after calling requestAnimationFrame, which can lead + // to "Can't perform a React state update on an unmounted component." warnings in tests, + // so we need to wait for the next animation frame to avoid this + await screen.findByTestId('discoverDocTable'); + await act(() => new Promise((resolve) => requestAnimationFrame(() => resolve()))); }; async function getComponent(props: UnifiedDataTableProps = getProps()) { const component = mountWithIntl(); await act(async () => { - // needed by cell actions to complete async loading + // needed by cell actions to complete async loading and avoid act warning component.update(); }); return component; @@ -210,203 +226,357 @@ describe('UnifiedDataTable', () => { component = await getComponent(); }); - test('no documents are selected initially', async () => { - expect(getSelectedDocNr(component)).toBe(0); - expect(getDisplayedDocNr(component)).toBe(5); - }); + test( + 'no documents are selected initially', + async () => { + expect(getSelectedDocNr(component)).toBe(0); + expect(getDisplayedDocNr(component)).toBe(5); + }, + EXTENDED_JEST_TIMEOUT + ); - test('Allows selection/deselection of multiple documents', async () => { - await toggleDocSelection(component, esHitsMock[0]); - expect(getSelectedDocNr(component)).toBe(1); - await toggleDocSelection(component, esHitsMock[1]); - expect(getSelectedDocNr(component)).toBe(2); - await toggleDocSelection(component, esHitsMock[1]); - expect(getSelectedDocNr(component)).toBe(1); - }); + test( + 'Allows selection/deselection of multiple documents', + async () => { + await toggleDocSelection(component, esHitsMock[0]); + expect(getSelectedDocNr(component)).toBe(1); + await toggleDocSelection(component, esHitsMock[1]); + expect(getSelectedDocNr(component)).toBe(2); + await toggleDocSelection(component, esHitsMock[1]); + expect(getSelectedDocNr(component)).toBe(1); + }, + EXTENDED_JEST_TIMEOUT + ); - test('deselection of all selected documents', async () => { - await toggleDocSelection(component, esHitsMock[0]); - await toggleDocSelection(component, esHitsMock[1]); - expect(getSelectedDocNr(component)).toBe(2); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'dscGridClearSelectedDocuments').simulate('click'); - expect(getSelectedDocNr(component)).toBe(0); - }); + test( + 'deselection of all selected documents', + async () => { + await toggleDocSelection(component, esHitsMock[0]); + await toggleDocSelection(component, esHitsMock[1]); + expect(getSelectedDocNr(component)).toBe(2); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'dscGridClearSelectedDocuments').simulate('click'); + expect(getSelectedDocNr(component)).toBe(0); + }, + EXTENDED_JEST_TIMEOUT + ); - test('showing only selected documents and undo selection', async () => { - await toggleDocSelection(component, esHitsMock[0]); - await toggleDocSelection(component, esHitsMock[1]); - expect(getSelectedDocNr(component)).toBe(2); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'dscGridShowSelectedDocuments').simulate('click'); - expect(getDisplayedDocNr(component)).toBe(2); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - component.update(); - findTestSubject(component, 'dscGridShowAllDocuments').simulate('click'); - expect(getDisplayedDocNr(component)).toBe(5); - }); + test( + 'showing only selected documents and undo selection', + async () => { + await toggleDocSelection(component, esHitsMock[0]); + await toggleDocSelection(component, esHitsMock[1]); + expect(getSelectedDocNr(component)).toBe(2); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'dscGridShowSelectedDocuments').simulate('click'); + expect(getDisplayedDocNr(component)).toBe(2); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + component.update(); + findTestSubject(component, 'dscGridShowAllDocuments').simulate('click'); + expect(getDisplayedDocNr(component)).toBe(5); + }, + EXTENDED_JEST_TIMEOUT + ); - test('showing selected documents, underlying data changes, all documents are displayed, selection is gone', async () => { - await toggleDocSelection(component, esHitsMock[0]); - await toggleDocSelection(component, esHitsMock[1]); - expect(getSelectedDocNr(component)).toBe(2); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'dscGridShowSelectedDocuments').simulate('click'); - expect(getDisplayedDocNr(component)).toBe(2); - component.setProps({ - rows: [ - { - _index: 'i', - _id: '6', - _score: 1, - _source: { - date: '2020-20-02T12:12:12.128', - name: 'test6', - extension: 'doc', - bytes: 50, + test( + 'showing selected documents, underlying data changes, all documents are displayed, selection is gone', + async () => { + await toggleDocSelection(component, esHitsMock[0]); + await toggleDocSelection(component, esHitsMock[1]); + expect(getSelectedDocNr(component)).toBe(2); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'dscGridShowSelectedDocuments').simulate('click'); + expect(getDisplayedDocNr(component)).toBe(2); + component.setProps({ + rows: [ + { + _index: 'i', + _id: '6', + _score: 1, + _source: { + date: '2020-20-02T12:12:12.128', + name: 'test6', + extension: 'doc', + bytes: 50, + }, }, - }, - ].map((row) => buildDataTableRecord(row, dataViewMock)), - }); - expect(getDisplayedDocNr(component)).toBe(1); - expect(getSelectedDocNr(component)).toBe(0); - }); + ].map((row) => buildDataTableRecord(row, dataViewMock)), + }); + expect(getDisplayedDocNr(component)).toBe(1); + expect(getSelectedDocNr(component)).toBe(0); + }, + EXTENDED_JEST_TIMEOUT + ); - test('showing only selected documents and remove filter deselecting each doc manually', async () => { - await toggleDocSelection(component, esHitsMock[0]); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'dscGridShowSelectedDocuments').simulate('click'); - expect(getDisplayedDocNr(component)).toBe(1); - await toggleDocSelection(component, esHitsMock[0]); - expect(getDisplayedDocNr(component)).toBe(5); - await toggleDocSelection(component, esHitsMock[0]); - expect(getDisplayedDocNr(component)).toBe(5); - }); + test( + 'showing only selected documents and remove filter deselecting each doc manually', + async () => { + await toggleDocSelection(component, esHitsMock[0]); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'dscGridShowSelectedDocuments').simulate('click'); + expect(getDisplayedDocNr(component)).toBe(1); + await toggleDocSelection(component, esHitsMock[0]); + expect(getDisplayedDocNr(component)).toBe(5); + await toggleDocSelection(component, esHitsMock[0]); + expect(getDisplayedDocNr(component)).toBe(5); + }, + EXTENDED_JEST_TIMEOUT + ); - test('copying selected documents to clipboard as JSON', async () => { - await toggleDocSelection(component, esHitsMock[0]); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'dscGridCopySelectedDocumentsJSON').simulate('click'); - expect(navigator.clipboard.writeText).toHaveBeenCalledWith( - '[{"_index":"i","_id":"1","_score":1,"_type":"_doc","_source":{"date":"2020-20-01T12:12:12.123","message":"test1","bytes":20}}]' - ); - }); + test( + 'copying selected documents to clipboard as JSON', + async () => { + await toggleDocSelection(component, esHitsMock[0]); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'dscGridCopySelectedDocumentsJSON').simulate('click'); + // wait for async copy action to avoid act warning + await act(() => new Promise((resolve) => setTimeout(resolve, 0))); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + '[{"_index":"i","_id":"1","_score":1,"_type":"_doc","_source":{"date":"2020-20-01T12:12:12.123","message":"test1","bytes":20}}]' + ); + }, + EXTENDED_JEST_TIMEOUT + ); - test('copying selected documents to clipboard as text', async () => { - await toggleDocSelection(component, esHitsMock[2]); - await toggleDocSelection(component, esHitsMock[1]); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'unifiedDataTableCopyRowsAsText').simulate('click'); - expect(navigator.clipboard.writeText).toHaveBeenCalledWith( - '"\'@timestamp"\t"_index"\t"_score"\tbytes\tdate\textension\tmessage\tname\n-\ti\t1\t-\t"2020-20-01T12:12:12.124"\tjpg\t-\ttest2\n-\ti\t1\t50\t"2020-20-01T12:12:12.124"\tgif\t-\ttest3' - ); - }); + test( + 'copying selected documents to clipboard as text', + async () => { + await toggleDocSelection(component, esHitsMock[2]); + await toggleDocSelection(component, esHitsMock[1]); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'unifiedDataTableCopyRowsAsText').simulate('click'); + // wait for async copy action to avoid act warning + await act(() => new Promise((resolve) => setTimeout(resolve, 0))); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + '"\'@timestamp"\t"_index"\t"_score"\tbytes\tdate\textension\tmessage\tname\n-\ti\t1\t-\t"2020-20-01T12:12:12.124"\tjpg\t-\ttest2\n-\ti\t1\t50\t"2020-20-01T12:12:12.124"\tgif\t-\ttest3' + ); + }, + EXTENDED_JEST_TIMEOUT + ); - test('copying selected columns to clipboard as text', async () => { - component = await getComponent({ - ...getProps(), - columns: ['date', 'extension', 'name'], - }); - await toggleDocSelection(component, esHitsMock[2]); - await toggleDocSelection(component, esHitsMock[1]); - findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - findTestSubject(component, 'unifiedDataTableCopyRowsAsText').simulate('click'); - expect(navigator.clipboard.writeText).toHaveBeenCalledWith( - '"\'@timestamp"\tdate\textension\tname\n-\t"2020-20-01T12:12:12.124"\tjpg\ttest2\n-\t"2020-20-01T12:12:12.124"\tgif\ttest3' - ); - }); + test( + 'copying selected columns to clipboard as text', + async () => { + component = await getComponent({ + ...getProps(), + columns: ['date', 'extension', 'name'], + }); + await toggleDocSelection(component, esHitsMock[2]); + await toggleDocSelection(component, esHitsMock[1]); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'unifiedDataTableCopyRowsAsText').simulate('click'); + // wait for async copy action to avoid act warning + await act(() => new Promise((resolve) => setTimeout(resolve, 0))); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + '"\'@timestamp"\tdate\textension\tname\n-\t"2020-20-01T12:12:12.124"\tjpg\ttest2\n-\t"2020-20-01T12:12:12.124"\tgif\ttest3' + ); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('edit field button', () => { - it('should render the edit field button if onFieldEdited is provided', async () => { - renderDataTable({ columns: ['message'], onFieldEdited: jest.fn() }); - expect(screen.queryByTestId('dataGridHeaderCellActionGroup-message')).not.toBeInTheDocument(); - userEvent.click(screen.getByRole('button', { name: 'message' })); - expect(screen.getByTestId('dataGridHeaderCellActionGroup-message')).toBeInTheDocument(); - expect(screen.getByTestId('gridEditFieldButton')).toBeInTheDocument(); - }); + it( + 'should render the edit field button if onFieldEdited is provided', + async () => { + await renderDataTable({ columns: ['message'], onFieldEdited: jest.fn() }); + expect( + screen.queryByTestId('dataGridHeaderCellActionGroup-message') + ).not.toBeInTheDocument(); + userEvent.click(screen.getByRole('button', { name: 'message' })); + expect(screen.getByTestId('dataGridHeaderCellActionGroup-message')).toBeInTheDocument(); + expect(screen.getByTestId('gridEditFieldButton')).toBeInTheDocument(); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should not render the edit field button if onFieldEdited is not provided', async () => { - renderDataTable({ columns: ['message'] }); - expect(screen.queryByTestId('dataGridHeaderCellActionGroup-message')).not.toBeInTheDocument(); - userEvent.click(screen.getByRole('button', { name: 'message' })); - expect(screen.getByTestId('dataGridHeaderCellActionGroup-message')).toBeInTheDocument(); - expect(screen.queryByTestId('gridEditFieldButton')).not.toBeInTheDocument(); - }); + it( + 'should not render the edit field button if onFieldEdited is not provided', + async () => { + await renderDataTable({ columns: ['message'] }); + expect( + screen.queryByTestId('dataGridHeaderCellActionGroup-message') + ).not.toBeInTheDocument(); + userEvent.click(screen.getByRole('button', { name: 'message' })); + expect(screen.getByTestId('dataGridHeaderCellActionGroup-message')).toBeInTheDocument(); + expect(screen.queryByTestId('gridEditFieldButton')).not.toBeInTheDocument(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('cellActionsTriggerId', () => { - it('should call useDataGridColumnsCellActions with empty params when no cellActionsTriggerId is provided', async () => { - await getComponent({ - ...getProps(), - columns: ['message'], - onFieldEdited: jest.fn(), - }); - expect(mockUseDataGridColumnsCellActions).toHaveBeenCalledWith({ - triggerId: undefined, - getCellValue: expect.any(Function), - fields: undefined, - dataGridRef: expect.any(Object), - metadata: { - dataViewId: 'the-data-view-id', - someKey: 'someValue', - }, - }); - }); + it( + 'should call useDataGridColumnsCellActions with empty params when no cellActionsTriggerId is provided', + async () => { + await getComponent({ + ...getProps(), + columns: ['message'], + onFieldEdited: jest.fn(), + }); + expect(mockUseDataGridColumnsCellActions).toHaveBeenCalledWith({ + triggerId: undefined, + getCellValue: expect.any(Function), + fields: undefined, + dataGridRef: expect.any(Object), + metadata: { + dataViewId: 'the-data-view-id', + someKey: 'someValue', + }, + }); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should call useDataGridColumnsCellActions properly when cellActionsTriggerId defined', async () => { - await getComponent({ - ...getProps(), - columns: ['message'], - onFieldEdited: jest.fn(), - cellActionsTriggerId: 'test', - }); - expect(mockUseDataGridColumnsCellActions).toHaveBeenCalledWith({ - triggerId: 'test', - getCellValue: expect.any(Function), - fields: [ - dataViewMock.getFieldByName('@timestamp')?.toSpec(), - dataViewMock.getFieldByName('message')?.toSpec(), - ], - dataGridRef: expect.any(Object), - metadata: { - dataViewId: 'the-data-view-id', - someKey: 'someValue', - }, - }); - }); + it( + 'should call useDataGridColumnsCellActions properly when cellActionsTriggerId defined', + async () => { + await getComponent({ + ...getProps(), + columns: ['message'], + onFieldEdited: jest.fn(), + cellActionsTriggerId: 'test', + }); + expect(mockUseDataGridColumnsCellActions).toHaveBeenCalledWith({ + triggerId: 'test', + getCellValue: expect.any(Function), + fields: [ + dataViewMock.getFieldByName('@timestamp')?.toSpec(), + dataViewMock.getFieldByName('message')?.toSpec(), + ], + dataGridRef: expect.any(Object), + metadata: { + dataViewId: 'the-data-view-id', + someKey: 'someValue', + }, + }); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('sorting', () => { - it('should enable in memory sorting with plain records', async () => { - const component = await getComponent({ - ...getProps(), - columns: ['message'], - isPlainRecord: true, - }); + const getButton = (name: string) => screen.getByRole('button', { name }); + const getCellValuesByColumn = () => { + const columns = screen + .getAllByRole('columnheader') + .map((header) => header.dataset.gridcellColumnId!); + const values = screen + .getAllByRole('gridcell') + .map((cell) => cell.querySelector('.unifiedDataTable__cellValue')?.textContent ?? ''); + return values.reduce>((acc, value, i) => { + const column = columns[i % columns.length]; + acc[column] = acc[column] ?? []; + acc[column].push(value); + return acc; + }, {}); + }; - expect( - ( - findTestSubject(component, 'docTable') - .find('EuiDataGridInMemoryRenderer') - .first() - .props() as Record - ).inMemory - ).toMatchInlineSnapshot(` - Object { - "level": "sorting", - } - `); - }); + it( + 'should apply client side sorting in ES|QL mode', + async () => { + await renderDataTable({ + isPlainRecord: true, + columns: ['message'], + rows: generateEsHits(dataViewMock, 10).map((hit) => + buildDataTableRecord(hit, dataViewMock) + ), + }); + let values = getCellValuesByColumn(); + expect(values.message).toEqual([ + 'message_0', + 'message_1', + 'message_2', + 'message_3', + 'message_4', + 'message_5', + 'message_6', + 'message_7', + 'message_8', + 'message_9', + ]); + userEvent.click(getButton('message')); + // Column sort button incorrectly renders as "Sort " instead + // of "Sort Z-A" in Jest tests, so we need to find it by index + userEvent.click(screen.getAllByRole('button', { name: /Sort/ })[2], undefined, { + skipPointerEventsCheck: true, + }); + await waitFor(() => { + values = getCellValuesByColumn(); + expect(values.message).toEqual([ + 'message_9', + 'message_8', + 'message_7', + 'message_6', + 'message_5', + 'message_4', + 'message_3', + 'message_2', + 'message_1', + 'message_0', + ]); + }); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should apply sorting', async () => { - const component = await getComponent({ - ...getProps(), - sort: [['message', 'desc']], - columns: ['message'], - }); + it( + 'should not apply client side sorting if not in ES|QL mode', + async () => { + await renderDataTable({ + columns: ['message'], + rows: generateEsHits(dataViewMock, 10).map((hit) => + buildDataTableRecord(hit, dataViewMock) + ), + }); + let values = getCellValuesByColumn(); + expect(values.message).toEqual([ + 'message_0', + 'message_1', + 'message_2', + 'message_3', + 'message_4', + 'message_5', + 'message_6', + 'message_7', + 'message_8', + 'message_9', + ]); + userEvent.click(getButton('message')); + // Column sort button incorrectly renders as "Sort " instead + // of "Sort Z-A" in Jest tests, so we need to find it by index + userEvent.click(screen.getAllByRole('button', { name: /Sort/ })[2], undefined, { + skipPointerEventsCheck: true, + }); + await waitFor(() => { + values = getCellValuesByColumn(); + expect(values.message).toEqual([ + 'message_0', + 'message_1', + 'message_2', + 'message_3', + 'message_4', + 'message_5', + 'message_6', + 'message_7', + 'message_8', + 'message_9', + ]); + }); + }, + EXTENDED_JEST_TIMEOUT + ); - expect(component.find(EuiDataGrid).last().prop('sorting')).toMatchInlineSnapshot(` + it( + 'should apply sorting', + async () => { + const component = await getComponent({ + ...getProps(), + sort: [['message', 'desc']], + columns: ['message'], + }); + + expect(component.find(EuiDataGrid).last().prop('sorting')).toMatchInlineSnapshot(` Object { "columns": Array [ Object { @@ -417,20 +587,24 @@ describe('UnifiedDataTable', () => { "onSort": [Function], } `); - }); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should not apply unknown sorting', async () => { - const component = await getComponent({ - ...getProps(), - sort: [ - ['bytes', 'desc'], - ['unknown', 'asc'], - ['message', 'desc'], - ], - columns: ['bytes', 'message'], - }); + it( + 'should not apply unknown sorting', + async () => { + const component = await getComponent({ + ...getProps(), + sort: [ + ['bytes', 'desc'], + ['unknown', 'asc'], + ['message', 'desc'], + ], + columns: ['bytes', 'message'], + }); - expect(component.find(EuiDataGrid).last().prop('sorting')).toMatchInlineSnapshot(` + expect(component.find(EuiDataGrid).last().prop('sorting')).toMatchInlineSnapshot(` Object { "columns": Array [ Object { @@ -445,19 +619,24 @@ describe('UnifiedDataTable', () => { "onSort": [Function], } `); - }); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('display settings', () => { - it('should include additional display settings if onUpdateSampleSize is provided', async () => { - const component = await getComponent({ - ...getProps(), - sampleSizeState: 150, - onUpdateSampleSize: jest.fn(), - onUpdateRowHeight: jest.fn(), - }); - - expect(component.find(EuiDataGrid).first().prop('toolbarVisibility')).toMatchInlineSnapshot(` + it( + 'should include additional display settings if onUpdateSampleSize is provided', + async () => { + const component = await getComponent({ + ...getProps(), + sampleSizeState: 150, + onUpdateSampleSize: jest.fn(), + onUpdateRowHeight: jest.fn(), + }); + + expect(component.find(EuiDataGrid).first().prop('toolbarVisibility')) + .toMatchInlineSnapshot(` Object { "additionalControls": null, "showColumnSelector": false, @@ -482,16 +661,21 @@ describe('UnifiedDataTable', () => { "showSortSelector": true, } `); - }); - - it('should not include additional display settings if onUpdateSampleSize is not provided', async () => { - const component = await getComponent({ - ...getProps(), - sampleSizeState: 200, - onUpdateRowHeight: jest.fn(), - }); + }, + EXTENDED_JEST_TIMEOUT + ); - expect(component.find(EuiDataGrid).first().prop('toolbarVisibility')).toMatchInlineSnapshot(` + it( + 'should not include additional display settings if onUpdateSampleSize is not provided', + async () => { + const component = await getComponent({ + ...getProps(), + sampleSizeState: 200, + onUpdateRowHeight: jest.fn(), + }); + + expect(component.find(EuiDataGrid).first().prop('toolbarVisibility')) + .toMatchInlineSnapshot(` Object { "additionalControls": null, "showColumnSelector": false, @@ -515,16 +699,21 @@ describe('UnifiedDataTable', () => { "showSortSelector": true, } `); - }); - - it('should hide display settings if no handlers provided', async () => { - const component = await getComponent({ - ...getProps(), - onUpdateRowHeight: undefined, - onUpdateSampleSize: undefined, - }); + }, + EXTENDED_JEST_TIMEOUT + ); - expect(component.find(EuiDataGrid).first().prop('toolbarVisibility')).toMatchInlineSnapshot(` + it( + 'should hide display settings if no handlers provided', + async () => { + const component = await getComponent({ + ...getProps(), + onUpdateRowHeight: undefined, + onUpdateSampleSize: undefined, + }); + + expect(component.find(EuiDataGrid).first().prop('toolbarVisibility')) + .toMatchInlineSnapshot(` Object { "additionalControls": null, "showColumnSelector": false, @@ -533,302 +722,358 @@ describe('UnifiedDataTable', () => { "showSortSelector": true, } `); - }); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('custom control columns', () => { - it('should be able to customise the leading controls', async () => { - const component = await getComponent({ - ...getProps(), - expandedDoc: { - id: 'test', - raw: { - _index: 'test_i', - _id: 'test', + it( + 'should be able to customise the leading controls', + async () => { + const component = await getComponent({ + ...getProps(), + expandedDoc: { + id: 'test', + raw: { + _index: 'test_i', + _id: 'test', + }, + flattened: { test: jest.fn() }, }, - flattened: { test: jest.fn() }, - }, - setExpandedDoc: jest.fn(), - renderDocumentView: jest.fn(), - externalControlColumns: [testLeadingControlColumn], - rowAdditionalLeadingControls: mockRowAdditionalLeadingControls, - }); - - expect(findTestSubject(component, 'test-body-control-column-cell').exists()).toBeTruthy(); - expect( - findTestSubject(component, 'exampleRowControl-visBarVerticalStacked').exists() - ).toBeTruthy(); - expect( - findTestSubject(component, 'unifiedDataTable_additionalRowControl_menuControl').exists() - ).toBeTruthy(); - }); + setExpandedDoc: jest.fn(), + renderDocumentView: jest.fn(), + externalControlColumns: [testLeadingControlColumn], + rowAdditionalLeadingControls: mockRowAdditionalLeadingControls, + }); + + expect(findTestSubject(component, 'test-body-control-column-cell').exists()).toBeTruthy(); + expect( + findTestSubject(component, 'exampleRowControl-visBarVerticalStacked').exists() + ).toBeTruthy(); + expect( + findTestSubject(component, 'unifiedDataTable_additionalRowControl_menuControl').exists() + ).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should be able to customise the trailing controls', async () => { - const component = await getComponent({ - ...getProps(), - expandedDoc: { - id: 'test', - raw: { - _index: 'test_i', - _id: 'test', + it( + 'should be able to customise the trailing controls', + async () => { + const component = await getComponent({ + ...getProps(), + expandedDoc: { + id: 'test', + raw: { + _index: 'test_i', + _id: 'test', + }, + flattened: { test: jest.fn() }, }, - flattened: { test: jest.fn() }, - }, - setExpandedDoc: jest.fn(), - renderDocumentView: jest.fn(), - externalControlColumns: [testLeadingControlColumn], - trailingControlColumns: testTrailingControlColumns, - }); - - expect(findTestSubject(component, 'test-body-control-column-cell').exists()).toBeTruthy(); - expect( - findTestSubject(component, 'test-trailing-column-popover-button').exists() - ).toBeTruthy(); - }); + setExpandedDoc: jest.fn(), + renderDocumentView: jest.fn(), + externalControlColumns: [testLeadingControlColumn], + trailingControlColumns: testTrailingControlColumns, + }); + + expect(findTestSubject(component, 'test-body-control-column-cell').exists()).toBeTruthy(); + expect( + findTestSubject(component, 'test-trailing-column-popover-button').exists() + ).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('externalControlColumns', () => { - it('should render external leading control columns', async () => { - const component = await getComponent({ - ...getProps(), - expandedDoc: { - id: 'test', - raw: { - _index: 'test_i', - _id: 'test', + it( + 'should render external leading control columns', + async () => { + const component = await getComponent({ + ...getProps(), + expandedDoc: { + id: 'test', + raw: { + _index: 'test_i', + _id: 'test', + }, + flattened: { test: jest.fn() }, }, - flattened: { test: jest.fn() }, - }, - setExpandedDoc: jest.fn(), - renderDocumentView: jest.fn(), - externalControlColumns: [testLeadingControlColumn], - }); + setExpandedDoc: jest.fn(), + renderDocumentView: jest.fn(), + externalControlColumns: [testLeadingControlColumn], + }); - expect(findTestSubject(component, 'docTableExpandToggleColumn').exists()).toBeTruthy(); - expect(findTestSubject(component, 'test-body-control-column-cell').exists()).toBeTruthy(); - }); - }); - - it('should render provided in renderDocumentView DocumentView on expand clicked', async () => { - const expandedDoc = { - id: 'test', - raw: { - _index: 'test_i', - _id: 'test', + expect(findTestSubject(component, 'docTableExpandToggleColumn').exists()).toBeTruthy(); + expect(findTestSubject(component, 'test-body-control-column-cell').exists()).toBeTruthy(); }, - flattened: { test: jest.fn() }, - }; - const columnsMetaOverride = { testField: { type: 'number' as DatatableColumnType } }; - const renderDocumentViewMock = jest.fn((hit: DataTableRecord) => ( -

- )); - - const component = await getComponent({ - ...getProps(), - expandedDoc, - setExpandedDoc: jest.fn(), - columnsMeta: columnsMetaOverride, - renderDocumentView: renderDocumentViewMock, - externalControlColumns: [testLeadingControlColumn], - }); - - findTestSubject(component, 'docTableExpandToggleColumn').first().simulate('click'); - expect(findTestSubject(component, 'test-document-view').exists()).toBeTruthy(); - expect(renderDocumentViewMock).toHaveBeenLastCalledWith( - expandedDoc, - getProps().rows, - ['_source'], - columnsMetaOverride + EXTENDED_JEST_TIMEOUT ); }); - describe('externalAdditionalControls', () => { - it('should render external additional toolbar controls', async () => { + it( + 'should render provided in renderDocumentView DocumentView on expand clicked', + async () => { + const expandedDoc = { + id: 'test', + raw: { + _index: 'test_i', + _id: 'test', + }, + flattened: { test: jest.fn() }, + }; + const columnsMetaOverride = { testField: { type: 'number' as DatatableColumnType } }; + const renderDocumentViewMock = jest.fn((hit: DataTableRecord) => ( +
{hit.id}
+ )); + const component = await getComponent({ ...getProps(), - columns: ['message'], - externalAdditionalControls: , + expandedDoc, + setExpandedDoc: jest.fn(), + columnsMeta: columnsMetaOverride, + renderDocumentView: renderDocumentViewMock, + externalControlColumns: [testLeadingControlColumn], }); - expect(findTestSubject(component, 'test-additional-control').exists()).toBeTruthy(); - expect(findTestSubject(component, 'dataGridColumnSelectorButton').exists()).toBeTruthy(); - }); + findTestSubject(component, 'docTableExpandToggleColumn').first().simulate('click'); + expect(findTestSubject(component, 'test-document-view').exists()).toBeTruthy(); + expect(renderDocumentViewMock).toHaveBeenLastCalledWith( + expandedDoc, + getProps().rows, + ['_source'], + columnsMetaOverride + ); + }, + EXTENDED_JEST_TIMEOUT + ); + + describe('externalAdditionalControls', () => { + it( + 'should render external additional toolbar controls', + async () => { + const component = await getComponent({ + ...getProps(), + columns: ['message'], + externalAdditionalControls: , + }); + + expect(findTestSubject(component, 'test-additional-control').exists()).toBeTruthy(); + expect(findTestSubject(component, 'dataGridColumnSelectorButton').exists()).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('externalCustomRenderers', () => { - it('should render only host column with the custom renderer, message should be rendered with the default cell renderer', async () => { - const component = await getComponent({ - ...getProps(), - columns: ['message', 'host'], - externalCustomRenderers: { - host: (props: EuiDataGridCellValueElementProps) => ( -
{props.columnId}
- ), - }, - }); + it( + 'should render only host column with the custom renderer, message should be rendered with the default cell renderer', + async () => { + const component = await getComponent({ + ...getProps(), + columns: ['message', 'host'], + externalCustomRenderers: { + host: (props: EuiDataGridCellValueElementProps) => ( +
{props.columnId}
+ ), + }, + }); - expect(findTestSubject(component, 'test-renderer-host').exists()).toBeTruthy(); - expect(findTestSubject(component, 'test-renderer-message').exists()).toBeFalsy(); - }); + expect(findTestSubject(component, 'test-renderer-host').exists()).toBeTruthy(); + expect(findTestSubject(component, 'test-renderer-message').exists()).toBeFalsy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('renderCustomGridBody', () => { - it('should render custom grid body for each row', async () => { - const component = await getComponent({ - ...getProps(), - columns: ['message', 'host'], - trailingControlColumns: [ - { - id: 'row-details', - - // The header cell should be visually hidden, but available to screen readers - width: 0, - headerCellRender: () => <>, - headerCellProps: { className: 'euiScreenReaderOnly' }, - - // The footer cell can be hidden to both visual & SR users, as it does not contain meaningful information - footerCellProps: { style: { display: 'none' } }, - - // When rendering this custom cell, we'll want to override - // the automatic width/heights calculated by EuiDataGrid - rowCellRender: jest.fn(), - }, - ], - renderCustomGridBody: (props: EuiDataGridCustomBodyProps) => ( -
- -
- ), - }); + it( + 'should render custom grid body for each row', + async () => { + const component = await getComponent({ + ...getProps(), + columns: ['message', 'host'], + trailingControlColumns: [ + { + id: 'row-details', + + // The header cell should be visually hidden, but available to screen readers + width: 0, + headerCellRender: () => <>, + headerCellProps: { className: 'euiScreenReaderOnly' }, + + // The footer cell can be hidden to both visual & SR users, as it does not contain meaningful information + footerCellProps: { style: { display: 'none' } }, + + // When rendering this custom cell, we'll want to override + // the automatic width/heights calculated by EuiDataGrid + rowCellRender: jest.fn(), + }, + ], + renderCustomGridBody: (props: EuiDataGridCustomBodyProps) => ( +
+ +
+ ), + }); - expect(findTestSubject(component, 'test-renderer-custom-grid-body').exists()).toBeTruthy(); - }); + expect(findTestSubject(component, 'test-renderer-custom-grid-body').exists()).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('componentsTourSteps', () => { - it('should render tour step for the first row of leading control column expandButton', async () => { - const component = await getComponent({ - ...getProps(), - expandedDoc: { - id: 'test', - raw: { - _index: 'test_i', - _id: 'test', + it( + 'should render tour step for the first row of leading control column expandButton', + async () => { + const component = await getComponent({ + ...getProps(), + expandedDoc: { + id: 'test', + raw: { + _index: 'test_i', + _id: 'test', + }, + flattened: { test: jest.fn() }, }, - flattened: { test: jest.fn() }, - }, - setExpandedDoc: jest.fn(), - renderDocumentView: jest.fn(), - componentsTourSteps: { expandButton: 'test-expand' }, - }); - - const gridExpandBtn = findTestSubject(component, 'docTableExpandToggleColumn').first(); - const tourStep = gridExpandBtn.getDOMNode().getAttribute('id'); - expect(tourStep).toEqual('test-expand'); - }); + setExpandedDoc: jest.fn(), + renderDocumentView: jest.fn(), + componentsTourSteps: { expandButton: 'test-expand' }, + }); + + const gridExpandBtn = findTestSubject(component, 'docTableExpandToggleColumn').first(); + const tourStep = gridExpandBtn.getDOMNode().getAttribute('id'); + expect(tourStep).toEqual('test-expand'); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('renderCustomToolbar', () => { - it('should render a custom toolbar', async () => { - let toolbarParams: Record = {}; - let gridParams: Record = {}; - const renderCustomToolbarMock = jest.fn((props) => { - toolbarParams = props.toolbarProps; - gridParams = props.gridProps; - return
Custom layout
; - }); - const component = await getComponent({ - ...getProps(), - renderCustomToolbar: renderCustomToolbarMock, - }); - - // custom toolbar should be rendered - expect(findTestSubject(component, 'custom-toolbar').exists()).toBe(true); - - expect(renderCustomToolbarMock).toHaveBeenLastCalledWith( - expect.objectContaining({ - toolbarProps: expect.objectContaining({ - hasRoomForGridControls: true, - }), - gridProps: expect.objectContaining({ - additionalControls: null, - }), - }) - ); - - // the default eui controls should be available for custom rendering - expect(toolbarParams?.columnSortingControl).toBeTruthy(); - expect(toolbarParams?.keyboardShortcutsControl).toBeTruthy(); - expect(gridParams?.additionalControls).toBe(null); - - // additional controls become available after selecting a document - act(() => { - component - .find('.euiDataGridRowCell[data-gridcell-column-id="select"] .euiCheckbox__input') - .first() - .simulate('change'); - }); + it( + 'should render a custom toolbar', + async () => { + let toolbarParams: Record = {}; + let gridParams: Record = {}; + const renderCustomToolbarMock = jest.fn((props) => { + toolbarParams = props.toolbarProps; + gridParams = props.gridProps; + return
Custom layout
; + }); + const component = await getComponent({ + ...getProps(), + renderCustomToolbar: renderCustomToolbarMock, + }); + + // custom toolbar should be rendered + expect(findTestSubject(component, 'custom-toolbar').exists()).toBe(true); + + expect(renderCustomToolbarMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + toolbarProps: expect.objectContaining({ + hasRoomForGridControls: true, + }), + gridProps: expect.objectContaining({ + additionalControls: null, + }), + }) + ); + + // the default eui controls should be available for custom rendering + expect(toolbarParams?.columnSortingControl).toBeTruthy(); + expect(toolbarParams?.keyboardShortcutsControl).toBeTruthy(); + expect(gridParams?.additionalControls).toBe(null); + + // additional controls become available after selecting a document + act(() => { + component + .find('.euiDataGridRowCell[data-gridcell-column-id="select"] .euiCheckbox__input') + .first() + .simulate('change'); + }); - expect(toolbarParams?.keyboardShortcutsControl).toBeTruthy(); - expect(gridParams?.additionalControls).toBeTruthy(); - }); + expect(toolbarParams?.keyboardShortcutsControl).toBeTruthy(); + expect(gridParams?.additionalControls).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('gridStyleOverride', () => { - it('should render the grid with the default style if no gridStyleOverride is provided', async () => { - const component = await getComponent({ - ...getProps(), - }); - - const grid = findTestSubject(component, 'docTable'); + it( + 'should render the grid with the default style if no gridStyleOverride is provided', + async () => { + const component = await getComponent({ + ...getProps(), + }); + + const grid = findTestSubject(component, 'docTable'); + + expect(grid.hasClass('euiDataGrid--bordersHorizontal')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--fontSizeSmall')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--paddingSmall')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--headerUnderline')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--stripes')).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); - expect(grid.hasClass('euiDataGrid--bordersHorizontal')).toBeTruthy(); - expect(grid.hasClass('euiDataGrid--fontSizeSmall')).toBeTruthy(); - expect(grid.hasClass('euiDataGrid--paddingSmall')).toBeTruthy(); - expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeTruthy(); - expect(grid.hasClass('euiDataGrid--headerUnderline')).toBeTruthy(); - expect(grid.hasClass('euiDataGrid--stripes')).toBeTruthy(); - }); - it('should render the grid with style override if gridStyleOverride is provided', async () => { - const component = await getComponent({ - ...getProps(), - gridStyleOverride: { - stripes: false, - rowHover: 'none', - border: 'none', - }, - }); + it( + 'should render the grid with style override if gridStyleOverride is provided', + async () => { + const component = await getComponent({ + ...getProps(), + gridStyleOverride: { + stripes: false, + rowHover: 'none', + border: 'none', + }, + }); - const grid = findTestSubject(component, 'docTable'); + const grid = findTestSubject(component, 'docTable'); - expect(grid.hasClass('euiDataGrid--stripes')).toBeFalsy(); - expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeFalsy(); - expect(grid.hasClass('euiDataGrid--bordersNone')).toBeTruthy(); - }); + expect(grid.hasClass('euiDataGrid--stripes')).toBeFalsy(); + expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeFalsy(); + expect(grid.hasClass('euiDataGrid--bordersNone')).toBeTruthy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('rowLineHeightOverride', () => { - it('should render the grid with the default row line height if no rowLineHeightOverride is provided', async () => { - const component = await getComponent({ - ...getProps(), - }); - - const gridRowCell = findTestSubject(component, 'dataGridRowCell').first(); - expect(gridRowCell.prop('style')).toMatchObject({ - lineHeight: '1.6em', - }); - }); - it('should render the grid with row line height override if rowLineHeightOverride is provided', async () => { - const component = await getComponent({ - ...getProps(), - rowLineHeightOverride: '24px', - }); + it( + 'should render the grid with the default row line height if no rowLineHeightOverride is provided', + async () => { + const component = await getComponent({ + ...getProps(), + }); + + const gridRowCell = findTestSubject(component, 'dataGridRowCell').first(); + expect(gridRowCell.prop('style')).toMatchObject({ + lineHeight: '1.6em', + }); + }, + EXTENDED_JEST_TIMEOUT + ); - const gridRowCell = findTestSubject(component, 'dataGridRowCell').first(); - expect(gridRowCell.prop('style')).toMatchObject({ - lineHeight: '24px', - }); - }); + it( + 'should render the grid with row line height override if rowLineHeightOverride is provided', + async () => { + const component = await getComponent({ + ...getProps(), + rowLineHeightOverride: '24px', + }); + + const gridRowCell = findTestSubject(component, 'dataGridRowCell').first(); + expect(gridRowCell.prop('style')).toMatchObject({ + lineHeight: '24px', + }); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('document comparison', () => { @@ -855,6 +1100,11 @@ describe('UnifiedDataTable', () => { await openSelectedRowsMenu(); userEvent.click(await screen.findByTestId('unifiedDataTableCompareSelectedDocuments')); await screen.findByText('Comparing 2 documents'); + // EuiDataGrid makes state updates after calling requestAnimationFrame, which can lead + // to "Can't perform a React state update on an unmounted component." warnings in tests, + // so we need to wait for the next animation frame to avoid this + await screen.findByTestId('unifiedDataTableCompareDocuments'); + await act(() => new Promise((resolve) => requestAnimationFrame(() => resolve()))); }; const getFullScreenButton = () => screen.queryByTestId('dataGridFullScreenButton'); @@ -872,84 +1122,130 @@ describe('UnifiedDataTable', () => { const getCellValues = () => Array.from(document.querySelectorAll(`.${CELL_CLASS}`)).map(({ textContent }) => textContent); - it('should not allow comparison if less than 2 documents are selected', async () => { - renderDataTable({ enableComparisonMode: true }); - expect(getSelectedDocumentsButton()).not.toBeInTheDocument(); - selectDocument(esHitsMock[0]); - expect(getSelectedDocumentsButton()).toBeInTheDocument(); - await openSelectedRowsMenu(); - expect(getCompareDocumentsButton()).not.toBeInTheDocument(); - await closeSelectedRowsMenu(); - selectDocument(esHitsMock[1]); - expect(getSelectedDocumentsButton()).toBeInTheDocument(); - await openSelectedRowsMenu(); - expect(getCompareDocumentsButton()).toBeInTheDocument(); - await closeSelectedRowsMenu(); - }); + it( + 'should not allow comparison if less than 2 documents are selected', + async () => { + await renderDataTable({ enableComparisonMode: true }); + expect(getSelectedDocumentsButton()).not.toBeInTheDocument(); + selectDocument(esHitsMock[0]); + expect(getSelectedDocumentsButton()).toBeInTheDocument(); + await openSelectedRowsMenu(); + expect(getCompareDocumentsButton()).not.toBeInTheDocument(); + await closeSelectedRowsMenu(); + selectDocument(esHitsMock[1]); + expect(getSelectedDocumentsButton()).toBeInTheDocument(); + await openSelectedRowsMenu(); + expect(getCompareDocumentsButton()).toBeInTheDocument(); + await closeSelectedRowsMenu(); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should not allow comparison if comparison mode is disabled', async () => { - renderDataTable({ enableComparisonMode: false }); - selectDocument(esHitsMock[0]); - selectDocument(esHitsMock[1]); - await openSelectedRowsMenu(); - expect(getCompareDocumentsButton()).not.toBeInTheDocument(); - await closeSelectedRowsMenu(); - }); + it( + 'should not allow comparison if comparison mode is disabled', + async () => { + await renderDataTable({ enableComparisonMode: false }); + selectDocument(esHitsMock[0]); + selectDocument(esHitsMock[1]); + await openSelectedRowsMenu(); + expect(getCompareDocumentsButton()).not.toBeInTheDocument(); + await closeSelectedRowsMenu(); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should allow comparison if 2 or more documents are selected and comparison mode is enabled', async () => { - renderDataTable({ enableComparisonMode: true }); - await goToComparisonMode(); - expect(getColumnHeaders()).toEqual(['Field', '1', '2']); - expect(getCellValues()).toEqual(['', '', 'i', 'i', '20', '', '', 'jpg', 'test1', '']); - }); + it( + 'should allow comparison if 2 or more documents are selected and comparison mode is enabled', + async () => { + await renderDataTable({ enableComparisonMode: true }); + await goToComparisonMode(); + expect(getColumnHeaders()).toEqual(['Field', '1', '2']); + expect(getCellValues()).toEqual(['', '', 'i', 'i', '20', '', '', 'jpg', 'test1', '']); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should show full screen button if showFullScreenButton is true', async () => { - renderDataTable({ enableComparisonMode: true, showFullScreenButton: true }); - await goToComparisonMode(); - expect(getFullScreenButton()).toBeInTheDocument(); - }); + it( + 'should show full screen button if showFullScreenButton is true', + async () => { + await renderDataTable({ enableComparisonMode: true, showFullScreenButton: true }); + await goToComparisonMode(); + expect(getFullScreenButton()).toBeInTheDocument(); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should hide full screen button if showFullScreenButton is false', async () => { - renderDataTable({ enableComparisonMode: true, showFullScreenButton: false }); - await goToComparisonMode(); - expect(getFullScreenButton()).not.toBeInTheDocument(); - }); + it( + 'should hide full screen button if showFullScreenButton is false', + async () => { + await renderDataTable({ enableComparisonMode: true, showFullScreenButton: false }); + await goToComparisonMode(); + expect(getFullScreenButton()).not.toBeInTheDocument(); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should render selected fields', async () => { - const columns = ['bytes', 'message']; - renderDataTable({ enableComparisonMode: true, columns }); - await goToComparisonMode(); - expect(getFieldColumns()).toEqual(['@timestamp', ...columns]); - }); + it( + 'should render selected fields', + async () => { + const columns = ['bytes', 'message']; + await renderDataTable({ enableComparisonMode: true, columns }); + await goToComparisonMode(); + expect(getFieldColumns()).toEqual(['@timestamp', ...columns]); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should render all available fields if no fields are selected', async () => { - renderDataTable({ enableComparisonMode: true }); - await goToComparisonMode(); - expect(getFieldColumns()).toEqual(['@timestamp', '_index', 'bytes', 'extension', 'message']); - }); + it( + 'should render all available fields if no fields are selected', + async () => { + await renderDataTable({ enableComparisonMode: true }); + await goToComparisonMode(); + expect(getFieldColumns()).toEqual([ + '@timestamp', + '_index', + 'bytes', + 'extension', + 'message', + ]); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('getRowIndicator', () => { - it('should render the color indicator control', async () => { - const component = await getComponent({ - ...getProps(), - getRowIndicator: jest.fn(() => ({ color: 'blue', label: 'test' })), - }); - - expect(findTestSubject(component, 'dataGridHeaderCell-colorIndicator').exists()).toBeTruthy(); - expect( - findTestSubject(component, 'unifiedDataTableRowColorIndicatorCell').first().prop('title') - ).toEqual('test'); - }); - - it('should not render the color indicator control by default', async () => { - const component = await getComponent({ - ...getProps(), - getRowIndicator: undefined, - }); + it( + 'should render the color indicator control', + async () => { + const component = await getComponent({ + ...getProps(), + getRowIndicator: jest.fn(() => ({ color: 'blue', label: 'test' })), + }); + + expect( + findTestSubject(component, 'dataGridHeaderCell-colorIndicator').exists() + ).toBeTruthy(); + expect( + findTestSubject(component, 'unifiedDataTableRowColorIndicatorCell').first().prop('title') + ).toEqual('test'); + }, + EXTENDED_JEST_TIMEOUT + ); - expect(findTestSubject(component, 'dataGridHeaderCell-colorIndicator').exists()).toBeFalsy(); - }); + it( + 'should not render the color indicator control by default', + async () => { + const component = await getComponent({ + ...getProps(), + getRowIndicator: undefined, + }); + + expect( + findTestSubject(component, 'dataGridHeaderCell-colorIndicator').exists() + ).toBeFalsy(); + }, + EXTENDED_JEST_TIMEOUT + ); }); describe('columns', () => { @@ -960,66 +1256,90 @@ describe('UnifiedDataTable', () => { const getButton = (name: string) => screen.getByRole('button', { name }); const queryButton = (name: string) => screen.queryByRole('button', { name }); - it('should reset the last column to auto width if only absolute width columns remain', async () => { - renderDataTable({ - columns: ['message', 'extension', 'bytes'], - settings: { - columns: { - extension: { width: 50 }, - bytes: { width: 50 }, + it( + 'should reset the last column to auto width if only absolute width columns remain', + async () => { + await renderDataTable({ + columns: ['message', 'extension', 'bytes'], + settings: { + columns: { + extension: { width: 50 }, + bytes: { width: 50 }, + }, }, - }, - }); - expect(getColumnHeader('message')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - expect(getColumnHeader('extension')).toHaveStyle({ width: '50px' }); - expect(getColumnHeader('bytes')).toHaveStyle({ width: '50px' }); - userEvent.click(getButton('message')); - userEvent.click(getButton('Remove column'), undefined, { skipPointerEventsCheck: true }); - expect(queryColumnHeader('message')).not.toBeInTheDocument(); - expect(getColumnHeader('extension')).toHaveStyle({ width: '50px' }); - expect(getColumnHeader('bytes')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - }); + }); + expect(getColumnHeader('message')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + expect(getColumnHeader('extension')).toHaveStyle({ width: '50px' }); + expect(getColumnHeader('bytes')).toHaveStyle({ width: '50px' }); + userEvent.click(getButton('message')); + userEvent.click(getButton('Remove column'), undefined, { skipPointerEventsCheck: true }); + await waitFor(() => { + expect(queryColumnHeader('message')).not.toBeInTheDocument(); + }); + expect(getColumnHeader('extension')).toHaveStyle({ width: '50px' }); + expect(getColumnHeader('bytes')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should not reset the last column to auto width when there are remaining auto width columns', async () => { - renderDataTable({ - columns: ['message', 'extension', 'bytes'], - settings: { - columns: { - bytes: { width: 50 }, + it( + 'should not reset the last column to auto width when there are remaining auto width columns', + async () => { + await renderDataTable({ + columns: ['message', 'extension', 'bytes'], + settings: { + columns: { + bytes: { width: 50 }, + }, }, - }, - }); - expect(getColumnHeader('message')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - expect(getColumnHeader('extension')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - expect(getColumnHeader('bytes')).toHaveStyle({ width: '50px' }); - userEvent.click(getButton('message')); - userEvent.click(getButton('Remove column'), undefined, { skipPointerEventsCheck: true }); - expect(queryColumnHeader('message')).not.toBeInTheDocument(); - expect(getColumnHeader('extension')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - expect(getColumnHeader('bytes')).toHaveStyle({ width: '50px' }); - }); + }); + expect(getColumnHeader('message')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + expect(getColumnHeader('extension')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + expect(getColumnHeader('bytes')).toHaveStyle({ width: '50px' }); + userEvent.click(getButton('message')); + userEvent.click(getButton('Remove column'), undefined, { skipPointerEventsCheck: true }); + await waitFor(() => { + expect(queryColumnHeader('message')).not.toBeInTheDocument(); + }); + expect(getColumnHeader('extension')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + expect(getColumnHeader('bytes')).toHaveStyle({ width: '50px' }); + }, + EXTENDED_JEST_TIMEOUT + ); - it('should show the reset width button only for absolute width columns, and allow resetting to default width', async () => { - renderDataTable({ - columns: ['message', 'extension'], - settings: { - columns: { - '@timestamp': { width: 50 }, - extension: { width: 50 }, + it( + 'should show the reset width button only for absolute width columns, and allow resetting to default width', + async () => { + await renderDataTable({ + columns: ['message', 'extension'], + settings: { + columns: { + '@timestamp': { width: 50 }, + extension: { width: 50 }, + }, }, - }, - }); - expect(getColumnHeader('@timestamp')).toHaveStyle({ width: '50px' }); - userEvent.click(getButton('@timestamp')); - userEvent.click(getButton('Reset width'), undefined, { skipPointerEventsCheck: true }); - expect(getColumnHeader('@timestamp')).toHaveStyle({ width: `${defaultTimeColumnWidth}px` }); - expect(getColumnHeader('message')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - userEvent.click(getButton('message')); - expect(queryButton('Reset width')).not.toBeInTheDocument(); - expect(getColumnHeader('extension')).toHaveStyle({ width: '50px' }); - userEvent.click(getButton('extension')); - userEvent.click(getButton('Reset width'), undefined, { skipPointerEventsCheck: true }); - expect(getColumnHeader('extension')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); - }); + }); + expect(getColumnHeader('@timestamp')).toHaveStyle({ width: '50px' }); + userEvent.click(getButton('@timestamp')); + userEvent.click(getButton('Reset width'), undefined, { skipPointerEventsCheck: true }); + await waitFor(() => { + expect(getColumnHeader('@timestamp')).toHaveStyle({ + width: `${defaultTimeColumnWidth}px`, + }); + }); + expect(getColumnHeader('message')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + userEvent.click(getButton('message')); + expect(queryButton('Reset width')).not.toBeInTheDocument(); + await waitFor(() => { + expect(getColumnHeader('extension')).toHaveStyle({ width: '50px' }); + }); + userEvent.click(getButton('extension')); + userEvent.click(getButton('Reset width'), undefined, { skipPointerEventsCheck: true }); + await waitFor(() => { + expect(getColumnHeader('extension')).toHaveStyle({ width: EUI_DEFAULT_COLUMN_WIDTH }); + }); + }, + EXTENDED_JEST_TIMEOUT + ); }); }); diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 96c5004c61a95..73860538e0593 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -23,7 +23,6 @@ import { EuiLoadingSpinner, EuiIcon, EuiDataGridRefProps, - EuiDataGridInMemory, EuiDataGridControlColumn, EuiDataGridCustomBodyProps, EuiDataGridStyle, @@ -43,7 +42,7 @@ import { getShouldShowFieldHandler } from '@kbn/discover-utils'; import type { DataViewFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { ThemeServiceStart } from '@kbn/react-kibana-context-common'; -import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import { type DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import { AdditionalFieldGroups } from '@kbn/unified-field-list'; import { DATA_GRID_DENSITY_STYLE_MAP, useDataGridDensity } from '../hooks/use_data_grid_density'; @@ -91,8 +90,15 @@ import { type ColorIndicatorControlColumnParams, getAdditionalRowControlColumns, } from './custom_control_columns'; +import { useSorting } from '../hooks/use_sorting'; const CONTROL_COLUMN_IDS_DEFAULT = [SELECT_ROW, OPEN_DETAILS]; +const THEME_DEFAULT = { darkMode: false }; +const VIRTUALIZATION_OPTIONS: EuiDataGridProps['virtualizationOptions'] = { + // Allowing some additional rows to be rendered outside + // the view minimizes pop-in when scrolling quickly + overscanRowCount: 20, +}; export type SortOrder = [string, string]; @@ -102,13 +108,6 @@ export enum DataLoadingState { loaded = 'loaded', } -const themeDefault = { darkMode: false }; - -interface SortObj { - id: string; - direction: string; -} - /** * Unified Data Table props */ @@ -484,7 +483,7 @@ export const UnifiedDataTable = ({ }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = services; - const { darkMode } = useObservable(services.theme?.theme$ ?? of(themeDefault), themeDefault); + const { darkMode } = useObservable(services.theme?.theme$ ?? of(THEME_DEFAULT), THEME_DEFAULT); const dataGridRef = useRef(null); const [isFilterActive, setIsFilterActive] = useState(false); const [isCompareActive, setIsCompareActive] = useState(false); @@ -507,20 +506,55 @@ export const UnifiedDataTable = ({ } }, [isFilterActive, hasSelectedDocs, setIsFilterActive]); + const timeFieldName = dataView.timeFieldName; + const shouldPrependTimeFieldColumn = useCallback( + (activeColumns: string[]) => + canPrependTimeFieldColumn( + activeColumns, + timeFieldName, + columnsMeta, + showTimeCol, + isPlainRecord + ), + [timeFieldName, isPlainRecord, showTimeCol, columnsMeta] + ); + + const visibleColumns = useMemo(() => { + return getVisibleColumns( + displayedColumns, + dataView, + shouldPrependTimeFieldColumn(displayedColumns) + ); + }, [dataView, displayedColumns, shouldPrependTimeFieldColumn]); + + const { sortedRows, sorting } = useSorting({ + rows, + visibleColumns, + columnsMeta, + sort, + dataView, + isPlainRecord, + isSortEnabled, + defaultColumns, + onSort, + }); + const displayedRows = useMemo(() => { - if (!rows) { + if (!sortedRows) { return []; } + if (!isFilterActive || !hasSelectedDocs) { - return rows; + return sortedRows; } - const rowsFiltered = rows.filter((row) => isDocSelected(row.id)); - if (!rowsFiltered.length) { - // in case the selected docs are no longer part of the sample of 500, show all docs - return rows; - } - return rowsFiltered; - }, [rows, isFilterActive, hasSelectedDocs, isDocSelected]); + + const rowsFiltered = sortedRows.filter((row) => isDocSelected(row.id)); + + return rowsFiltered.length + ? rowsFiltered + : // in case the selected docs are no longer part of the sample of 500, show all docs + sortedRows; + }, [sortedRows, isFilterActive, hasSelectedDocs, isDocSelected]); const valueToStringConverter: ValueToStringConverter = useCallback( (rowIndex, columnId, options) => { @@ -709,25 +743,6 @@ export const UnifiedDataTable = ({ [dataView, onFieldEdited, services?.dataViewFieldEditor] ); - const timeFieldName = dataView.timeFieldName; - const shouldPrependTimeFieldColumn = useCallback( - (activeColumns: string[]) => - canPrependTimeFieldColumn( - activeColumns, - timeFieldName, - columnsMeta, - showTimeCol, - isPlainRecord - ), - [timeFieldName, isPlainRecord, showTimeCol, columnsMeta] - ); - - const visibleColumns = useMemo( - () => - getVisibleColumns(displayedColumns, dataView, shouldPrependTimeFieldColumn(displayedColumns)), - [dataView, displayedColumns, shouldPrependTimeFieldColumn] - ); - const getCellValue = useCallback( (fieldName, rowIndex) => displayedRows[rowIndex % displayedRows.length].flattened[fieldName] as Serializable, @@ -848,47 +863,6 @@ export const UnifiedDataTable = ({ [visibleColumns, onSetColumns, shouldPrependTimeFieldColumn] ); - /** - * Sorting - */ - const sortingColumns = useMemo( - () => - sort - .map(([id, direction]) => ({ id, direction })) - .filter(({ id }) => visibleColumns.includes(id)), - [sort, visibleColumns] - ); - - const onTableSort = useCallback( - (sortingColumnsData) => { - if (isSortEnabled) { - if (onSort) { - onSort(sortingColumnsData.map(({ id, direction }: SortObj) => [id, direction])); - } - } - }, - [onSort, isSortEnabled] - ); - - const sorting = useMemo(() => { - if (isSortEnabled) { - // in ES|QL mode, sorting is disabled when in Document view - // ideally we want the @timestamp column to be sortable server side - // but it needs discussion before moving forward like this - if (isPlainRecord && !columns.length) { - return undefined; - } - return { - columns: sortingColumns, - onSort: onTableSort, - }; - } - return { - columns: sortingColumns, - onSort: () => {}, - }; - }, [isSortEnabled, sortingColumns, isPlainRecord, columns.length, onTableSort]); - const canSetExpandedDoc = Boolean(setExpandedDoc && !!renderDocumentView); const leadingControlColumns: EuiDataGridControlColumn[] = useMemo(() => { @@ -1036,12 +1010,6 @@ export const UnifiedDataTable = ({ onUpdateDataGridDensity, ]); - const inMemory = useMemo(() => { - return isPlainRecord && columns.length - ? ({ level: 'sorting' } as EuiDataGridInMemory) - : undefined; - }, [columns.length, isPlainRecord]); - const toolbarVisibility = useMemo( () => defaultColumns @@ -1161,13 +1129,13 @@ export const UnifiedDataTable = ({ sorting={sorting as EuiDataGridSorting} toolbarVisibility={toolbarVisibility} rowHeightsOptions={rowHeightsOptions} - inMemory={inMemory} gridStyle={gridStyle} renderCustomGridBody={renderCustomGridBody} renderCustomToolbar={renderCustomToolbarFn} trailingControlColumns={trailingControlColumns} cellContext={cellContext} renderCellPopover={renderCustomPopover} + virtualizationOptions={VIRTUALIZATION_OPTIONS} /> )} diff --git a/packages/kbn-unified-data-table/src/hooks/use_sorting.ts b/packages/kbn-unified-data-table/src/hooks/use_sorting.ts new file mode 100644 index 0000000000000..d8b1f586f680c --- /dev/null +++ b/packages/kbn-unified-data-table/src/hooks/use_sorting.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { DataView } from '@kbn/data-views-plugin/public'; +import type { DataTableRecord } from '@kbn/discover-utils'; +import { getSortingCriteria } from '@kbn/sort-predicates'; +import { useMemo } from 'react'; +import type { EuiDataGridColumnSortingConfig, EuiDataGridProps } from '@elastic/eui'; +import type { SortOrder } from '../components/data_table'; +import type { DataTableColumnsMeta } from '../types'; + +export const useSorting = ({ + rows, + visibleColumns, + columnsMeta, + sort, + dataView, + isPlainRecord, + isSortEnabled, + defaultColumns, + onSort, +}: { + rows: DataTableRecord[] | undefined; + visibleColumns: string[]; + columnsMeta: DataTableColumnsMeta | undefined; + sort: SortOrder[]; + dataView: DataView; + isPlainRecord: boolean; + isSortEnabled: boolean; + defaultColumns: boolean; + onSort: ((sort: string[][]) => void) | undefined; +}) => { + const sortingColumns = useMemo(() => { + return sort + .map(([id, direction]) => ({ id, direction })) + .filter((col) => visibleColumns.includes(col.id)) as EuiDataGridColumnSortingConfig[]; + }, [sort, visibleColumns]); + + const comparators = useMemo(() => { + if (!isPlainRecord || !rows || !sortingColumns.length) { + return; + } + + return sortingColumns.reduce number>>( + (acc, { id, direction }) => { + const field = dataView.fields.getByName(id); + + if (!field) { + return acc; + } + + const sortField = getSortingCriteria( + columnsMeta?.[id]?.type ?? field.type, + id, + dataView.getFormatterForField(field) + ); + + acc.push((a, b) => sortField(a.flattened, b.flattened, direction as 'asc' | 'desc')); + + return acc; + }, + [] + ); + }, [columnsMeta, dataView, isPlainRecord, rows, sortingColumns]); + + const sortedRows = useMemo(() => { + if (!rows || !comparators) { + return rows; + } + + return [...rows].sort((a, b) => { + for (const comparator of comparators) { + const result = comparator(a, b); + + if (result !== 0) { + return result; + } + } + + return 0; + }); + }, [comparators, rows]); + + const sorting = useMemo(() => { + if (!isSortEnabled) { + return { + columns: sortingColumns, + onSort: () => {}, + }; + } + + // in ES|QL mode, sorting is disabled when in Document view + // ideally we want the @timestamp column to be sortable server side + // but it needs discussion before moving forward like this + if (isPlainRecord && defaultColumns) { + return undefined; + } + + return { + columns: sortingColumns, + onSort: (sortingColumnsData) => { + onSort?.(sortingColumnsData.map(({ id, direction }) => [id, direction])); + }, + }; + }, [isSortEnabled, isPlainRecord, defaultColumns, sortingColumns, onSort]); + + return { sortedRows, sorting }; +}; diff --git a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx index 1b856d665d301..3b2badeee91c3 100644 --- a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx +++ b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { useEffect, useContext } from 'react'; +import React, { useEffect, useContext, memo } from 'react'; import { i18n } from '@kbn/i18n'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { @@ -26,6 +26,8 @@ import { DataTablePopoverCellValue } from '../components/data_table_cell_value'; export const CELL_CLASS = 'unifiedDataTable__cellValue'; +const IS_JEST_ENVIRONMENT = typeof jest !== 'undefined'; + export const getRenderCellValueFn = ({ dataView, rows, @@ -49,7 +51,7 @@ export const getRenderCellValueFn = ({ isPlainRecord?: boolean; isCompressed?: boolean; }) => { - return function UnifiedDataTableRenderCellValue({ + const UnifiedDataTableRenderCellValue = ({ rowIndex, columnId, isDetails, @@ -57,7 +59,7 @@ export const getRenderCellValueFn = ({ colIndex, isExpandable, isExpanded, - }: EuiDataGridCellValueElementProps) { + }: EuiDataGridCellValueElementProps) => { const row = rows ? rows[rowIndex] : undefined; const field = dataView.fields.getByName(columnId); const ctx = useContext(UnifiedDataTableContext); @@ -153,6 +155,14 @@ export const getRenderCellValueFn = ({ /> ); }; + + // When memoizing renderCellValue, the following warning is logged in Jest tests: + // Failed prop type: Invalid prop `renderCellValue` supplied to `EuiDataGridCellContent`, expected one of type [function]. + // This is due to incorrect prop type validation that EUI generates for testing components in Jest, + // but is not an actual issue encountered outside of tests + return IS_JEST_ENVIRONMENT + ? UnifiedDataTableRenderCellValue + : memo(UnifiedDataTableRenderCellValue); }; /** diff --git a/packages/kbn-unified-data-table/tsconfig.json b/packages/kbn-unified-data-table/tsconfig.json index ca3372bd40f30..c50d2084efa39 100644 --- a/packages/kbn-unified-data-table/tsconfig.json +++ b/packages/kbn-unified-data-table/tsconfig.json @@ -39,5 +39,6 @@ "@kbn/unified-field-list", "@kbn/core-notifications-browser", "@kbn/core-capabilities-browser-mocks", + "@kbn/sort-predicates", ] } diff --git a/src/plugins/discover/public/application/main/state_management/utils/build_state_subscribe.ts b/src/plugins/discover/public/application/main/state_management/utils/build_state_subscribe.ts index 865992187089a..7285dd8a914ea 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/build_state_subscribe.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/build_state_subscribe.ts @@ -25,6 +25,7 @@ import { DataSourceType, isDataSourceType, } from '../../../../../common/data_sources'; +import { sendLoadingMsg } from '../../hooks/use_saved_search_messages'; /** * Builds a subscribe function for the AppStateContainer, that is executed when the AppState changes in URL @@ -161,6 +162,11 @@ export const buildStateSubscribe = JSON.stringify(logData, null, 2) ); + // Set documents loading to true immediately on state changes since there's a delay + // on the fetch and we don't want to see state changes reflected in the data grid + // until the fetch is complete (it also helps to minimize data grid re-renders) + sendLoadingMsg(dataState.data$.documents$, dataState.data$.documents$.getValue()); + dataState.fetch(); } }; diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index 7bdcb1bfe17fb..febe99901f626 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; - +import kbnRison from '@kbn/rison'; import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { @@ -51,8 +51,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern' ); await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await PageObjects.common.navigateToApp('discover'); - await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + after(async () => { + await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); }); describe('ES|QL in Discover', () => { @@ -328,8 +332,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('with slow queries', () => { it('should show only one entry in inspector for table/visualization', async function () { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from kibana_sample_data_flights' }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); await PageObjects.discover.selectTextBaseLang(); - const testQuery = `from kibana_sample_data_flights | limit 10`; + const testQuery = `from logstash-* | limit 10`; await monacoEditor.setCodeEditorValue(testQuery); await browser.execute(() => { @@ -470,7 +481,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first cell contains the highest value', async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; }); expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( @@ -485,7 +496,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first cell contains the same highest value', async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; }); await browser.refresh(); @@ -496,7 +507,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first cell contains the same highest value after reload', async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; }); await PageObjects.discover.clickNewSearchButton(); @@ -514,7 +525,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; } ); diff --git a/test/functional/apps/discover/group5/_url_state.ts b/test/functional/apps/discover/group5/_url_state.ts index 2516f2ed08659..c143b7829239e 100644 --- a/test/functional/apps/discover/group5/_url_state.ts +++ b/test/functional/apps/discover/group5/_url_state.ts @@ -173,7 +173,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - expect(await dataGrid.getRowsText()).to.eql([ + expect((await dataGrid.getRowsText()).slice(0, 6)).to.eql([ 'Sep 22, 2015 @ 20:44:05.521jpg1,808', 'Sep 22, 2015 @ 20:41:53.463png1,969', 'Sep 22, 2015 @ 20:40:22.952jpg1,576', @@ -208,7 +208,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Sep 22, 2015 @ 17:22:12.782css1,583', ]; - expect(await dataGrid.getRowsText()).to.eql(filteredRows); + expect((await dataGrid.getRowsText()).slice(0, 6)).to.eql(filteredRows); expect(await PageObjects.discover.getHitCount()).to.be(totalHitsForTwoFilters); await testSubjects.existOrFail('unsavedChangesBadge'); @@ -217,7 +217,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - expect(await dataGrid.getRowsText()).to.eql(filteredRows); + expect((await dataGrid.getRowsText()).slice(0, 6)).to.eql(filteredRows); expect(await PageObjects.discover.getHitCount()).to.be(totalHitsForTwoFilters); await testSubjects.existOrFail('unsavedChangesBadge'); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx index eb20b408e3ff5..78ffadeb37ff8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx @@ -229,7 +229,7 @@ describe('unified data table', () => { async () => { const rowHeight = { initial: 2, - new: 1, + new: 4, }; const customMockStore = createMockStore(); @@ -240,7 +240,9 @@ describe('unified data table', () => { }) ); - render(); + render( + + ); expect(await screen.findByTestId('discoverDocTable')).toBeVisible(); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 7cb49894e7de5..d2eebb13acb83 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -50,10 +50,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern' ); await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await PageObjects.svlCommonPage.loginAsAdmin(); await PageObjects.common.navigateToApp('discover'); await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + after(async () => { + await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); }); describe('ES|QL in Discover', () => { @@ -453,7 +457,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first cell contains the highest value', async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; }); expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( @@ -468,7 +472,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first cell contains the same highest value', async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; }); await browser.refresh(); @@ -479,7 +483,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first cell contains the same highest value after reload', async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; }); await PageObjects.discover.clickNewSearchButton(); @@ -497,7 +501,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { async () => { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); - return text === '483'; + return text === '17,966'; } ); From 0c8dd0a047fcdeaa5cf71e5afde17e4771a73dbe Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:58:16 +1000 Subject: [PATCH 12/28] [api-docs] 2024-09-04 Daily api_docs build (#192054) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/820 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.devdocs.json | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_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.devdocs.json | 24 ++ api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.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.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/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.devdocs.json | 40 +-- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.devdocs.json | 72 ++++- api_docs/investigate_app.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_grouping.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.devdocs.json | 50 ++++ api_docs/kbn_apm_synthtrace.mdx | 4 +- .../kbn_apm_synthtrace_client.devdocs.json | 17 +- api_docs/kbn_apm_synthtrace_client.mdx | 4 +- api_docs/kbn_apm_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.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_cbor.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_cloud_security_posture.mdx | 2 +- ...cloud_security_posture_common.devdocs.json | 2 +- .../kbn_cloud_security_posture_common.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 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.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 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- .../kbn_deeplinks_observability.devdocs.json | 14 + api_docs/kbn_deeplinks_observability.mdx | 4 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.mdx | 2 +- api_docs/kbn_esql_utils.mdx | 2 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grid_layout.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 +- .../kbn_investigation_shared.devdocs.json | 254 ++++++++++++++++++ api_docs/kbn_investigation_shared.mdx | 4 +- 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_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.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_recently_accessed.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_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- api_docs/kbn_security_ui_components.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 +- ...ion_exception_list_components.devdocs.json | 10 +- ...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 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.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_table_persist.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_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.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.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 | 32 ++- api_docs/observability.mdx | 4 +- 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.devdocs.json | 175 ++++++++++++ api_docs/observability_shared.mdx | 4 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 16 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- 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/threat_intelligence.mdx | 2 +- api_docs/timelines.devdocs.json | 4 +- 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 +- 744 files changed, 1399 insertions(+), 785 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 16a21a9dc8f92..a9d96a42f8957 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index c5a3da4a626ab..e7b6e04447548 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index b08e916c45e13..a348b7d5a8e41 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 1f3152550a166..58226bd0cf12c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index c4fa6c4ad5e96..2e2467e527aa4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 6707c3d01cb69..0011950fc83eb 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -6149,7 +6149,7 @@ }, ">; } & { start: number; end: number; }; }; }) => Promise<", "ServiceEntities", - ">; } & ", + " | undefined>; } & ", "APMRouteCreateOptions", "; \"POST /internal/apm/entities/services/detailed_statistics\": { endpoint: \"POST /internal/apm/entities/services/detailed_statistics\"; params?: ", "TypeC", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 3fe1216d0849d..3384b680d1e82 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index a3d0d705bcc78..d1617a86e5a10 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index e5cfaa99e379c..f49be2c77f004 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 11821a5ab0664..7091f0cecdab3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 2de2251e85a27..946ae448c273a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 14886d710078b..3fe39d7d87a97 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 6e3f841b8beb1..503c0f260f597 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 7a92bd48d73dd..73dfb01f7878d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 57a9e0c60be4a..efd6ef775ebe9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index be33d0b304341..7772a62d74e4b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index c400d0322c1cc..3a1257852b91a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 2a6f7919e9354..0db6a0a524330 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 98f336c975396..0e79aec2b7194 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 7e8eea84cbd4c..32d177185b23c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 8b05a9f8b3c9e..70335885c2ebc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 78ec2eaa6a68f..c3fc284d460ef 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 9885024ef94b1..a1dd7fbffa488 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 44743080131ed..70353bbdd7ec3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index d944cc29c7bc3..10e744b78da03 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 5d31a42c91d52..4e27a7f498fec 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 7ccac08a9ad97..02148f916ae5f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index dd6d2bf5c52e4..c653d70c880ec 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index b178caaa3ac3e..5b8784fe4e44e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 06862010b1957..1b68cca161294 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 9f9155888a7c3..72c86cd07df14 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index fabc965d7d28a..219f59ba54762 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 26f1ccc96993f..4718541aa1238 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index abb0b1320eb0c..4c475fed8fdc0 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -270,6 +270,18 @@ "DatasetQualityRouteHandlerResources", " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | null | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; userPrivileges?: { canMonitor: boolean; } | undefined; }>; } & ", "DatasetQualityRouteCreateOptions", + "; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values\": { endpoint: \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; degradedField: ", + "StringC", + "; }>; }> | undefined; handler: ({}: ", + "DatasetQualityRouteHandlerResources", + " & { params: { path: { dataStream: string; degradedField: string; }; }; }) => Promise<{ field: string; values: string[]; }>; } & ", + "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\": { endpoint: \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\"; params?: ", "TypeC", "<{ path: ", @@ -447,6 +459,18 @@ "DatasetQualityRouteHandlerResources", " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | null | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; userPrivileges?: { canMonitor: boolean; } | undefined; }>; } & ", "DatasetQualityRouteCreateOptions", + "; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values\": { endpoint: \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; degradedField: ", + "StringC", + "; }>; }> | undefined; handler: ({}: ", + "DatasetQualityRouteHandlerResources", + " & { params: { path: { dataStream: string; degradedField: string; }; }; }) => Promise<{ field: string; values: string[]; }>; } & ", + "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\": { endpoint: \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 44518a544173a..b80356f4f182d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index cf37b9456534d..8532d47a7c98c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index a4c10067bb149..b62a87242c1d4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 7a604d743ffce..3c7e127bad3f5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 547632fba4193..ea1f91be71d3d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index cf8abdaa3ec16..5164047390e41 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index c712b42dce1ad..1cfbf5169cc94 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index e908422dcd7b6..ed2eb920a2f2e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index d13fcf2a41871..295eef3ff67d2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index e68f995e18876..44353f00a69ff 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 542194e6c87f9..ca327b7c2a18a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 02a89c4114891..08bdf957acfa3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 4ffb34284fd51..e736ec9e8d649 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 73dd8877e0512..a3240347c7770 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index f87f12d1984d5..5053e9568c28f 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 09eb2068d1d7c..ee7a315dc646b 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 5c03f5276caf6..41d16c588457b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index cdc428f1a25c5..5b58ef9e07df4 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index b4d634f19c776..3925db5fbbab4 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-09-03 +date: 2024-09-04 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 f69b08a67763d..b802c4fdaeb0c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 185560a259cfc..78e00d45a90a6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 6547069e5dca4..6602c3fe906d0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 6eacffbb98ea0..7ffccb4bed2f1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index db1b71e4493f2..42f243dc0a492 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index f7f46e5ace406..e322b97ed85b0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 5f10949d90870..0f27f4798fd01 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 14c75e9424798..884f2111e4bf9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 6590aae390108..f517d844e4cd6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 097ac4f84c2e3..0f75d70c2e67f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 13bd7077aa20e..95d383edffdb0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 11dd8d089a217..c19eb03d70eab 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index aea0c661891cc..cf4251f26b316 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index eae6b7a0c1aa2..b136f847e28d5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 2bc4ec808147a..a38a63547b257 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 76c0403d169c6..7a4a0138eb6ef 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 49288240766f3..6af98937e04ea 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 80e8fbf48a65f..82fdf61b94248 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index f0be19f694751..0993e80d5766b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index ad8803736cecb..5ffb520b6ad7f 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-09-03 +date: 2024-09-04 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 e07f1cb697b23..4d553af5d138c 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-09-03 +date: 2024-09-04 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 dbcc410c62dc2..7a74e83ab837e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 5a1029fdc909f..eaac1cbe4e941 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index c8df77ec558df..1d9f8771d5b8f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index eb9680b3c7f45..e3514a62f90f6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 8402794af739a..aab1b754f5f35 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 6fb078f558cf6..c6a9208f7468d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index c7a25584a8ef6..0a1bd9d621145 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index efa963b883813..f2bcd790a9808 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index abfc6eb9b45ab..d777abb07c7a8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 71aa6df8cd278..eae9b32b5fc9d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 937fea9788601..37600fc7c5c2a 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 62f79d17e7229..bd72b6333769f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 01bb56c732972..7ac2dcfb4ecd0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index a5a4e83b4bc52..7e5fb612e2868 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.devdocs.json b/api_docs/integration_assistant.devdocs.json index 3fafbef540dff..f1b88ed3bc69f 100644 --- a/api_docs/integration_assistant.devdocs.json +++ b/api_docs/integration_assistant.devdocs.json @@ -214,7 +214,7 @@ "label": "BuildIntegrationRequestBody", "description": [], "signature": [ - "{ integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "{ integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -379,7 +379,7 @@ "\nThe dataStream object." ], "signature": [ - "{ name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "{ name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -506,7 +506,7 @@ "\nThe input type for the dataStream to pull logs from." ], "signature": [ - "\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\"" + "\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\"" ], "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", "deprecated": false, @@ -523,7 +523,7 @@ "\nThe integration object." ], "signature": [ - "{ name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "{ name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -767,7 +767,7 @@ "label": "BuildIntegrationRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ integration: Zod.ZodObject<{ name: Zod.ZodString; title: Zod.ZodString; description: Zod.ZodString; dataStreams: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -847,7 +847,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -863,7 +863,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -879,7 +879,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -895,7 +895,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -911,7 +911,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }; }, { integration: { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1322,7 +1322,7 @@ "label": "DataStream", "description": [], "signature": [ - "Zod.ZodObject<{ name: Zod.ZodString; title: Zod.ZodString; description: Zod.ZodString; inputTypes: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1402,7 +1402,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1637,7 +1637,7 @@ "label": "InputType", "description": [], "signature": [ - "Zod.ZodEnum<[\"aws-cloudwatch\", \"aws-s3\", \"azure-blob-storage\", \"azure-eventhub\", \"cel\", \"cloudfoundry\", \"filestream\", \"gcp-pubsub\", \"gcs\", \"http-endpoint\", \"journald\", \"kafka\", \"tcp\", \"udp\"]>" + "Zod.ZodEnum<[\"aws-cloudwatch\", \"aws-s3\", \"azure-blob-storage\", \"azure-eventhub\", \"cel\", \"cloudfoundry\", \"filestream\", \"gcp-pubsub\", \"gcs\", \"http_endpoint\", \"journald\", \"kafka\", \"tcp\", \"udp\"]>" ], "path": "x-pack/plugins/integration_assistant/common/api/model/common_attributes.ts", "deprecated": false, @@ -1652,7 +1652,7 @@ "label": "Integration", "description": [], "signature": [ - "Zod.ZodObject<{ name: Zod.ZodString; title: Zod.ZodString; description: Zod.ZodString; dataStreams: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray, \"many\">; rawSamples: Zod.ZodArray; pipeline: Zod.ZodObject<{ name: Zod.ZodOptional; description: Zod.ZodOptional; version: Zod.ZodOptional; processors: Zod.ZodArray; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }>; docs: Zod.ZodArray, Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">>, \"many\">; samplesFormat: Zod.ZodObject<{ name: Zod.ZodEnum<[\"ndjson\", \"json\", \"csv\", \"structured\", \"unstructured\", \"unsupported\"]>; multiline: Zod.ZodOptional; json_path: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }, { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1732,7 +1732,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }, { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1748,7 +1748,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectInputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }>, \"many\">; logo: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", @@ -1764,7 +1764,7 @@ "section": "def-common.ESProcessorItem", "text": "ESProcessorItem" }, - "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http-endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", + "[] | undefined; }; docs: Zod.objectOutputType<{}, Zod.ZodTypeAny, \"passthrough\">[]; samplesFormat: { name: \"json\" | \"ndjson\" | \"csv\" | \"structured\" | \"unstructured\" | \"unsupported\"; multiline?: boolean | undefined; json_path?: string[] | undefined; }; }[]; logo?: string | undefined; }, { name: string; title: string; description: string; dataStreams: { name: string; title: string; description: string; inputTypes: (\"kafka\" | \"aws-cloudwatch\" | \"aws-s3\" | \"azure-blob-storage\" | \"azure-eventhub\" | \"cel\" | \"cloudfoundry\" | \"filestream\" | \"gcp-pubsub\" | \"gcs\" | \"http_endpoint\" | \"journald\" | \"tcp\" | \"udp\")[]; rawSamples: string[]; pipeline: { processors: ", { "pluginId": "integrationAssistant", "scope": "common", diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index e601c666f6a19..385a15fda876d 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-09-03 +date: 2024-09-04 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 98bdd0af55b40..612b0bf3967e3 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-09-03 +date: 2024-09-04 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 cc34720a67a27..a4a135461cf8e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.devdocs.json b/api_docs/investigate_app.devdocs.json index e4ef66657279e..932cba12f7bab 100644 --- a/api_docs/investigate_app.devdocs.json +++ b/api_docs/investigate_app.devdocs.json @@ -60,6 +60,30 @@ "InvestigateAppRouteHandlerResources", " & { params: { path: { investigationId: string; }; }; }) => Promise<({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]>; } & ", "InvestigateAppRouteCreateOptions", + "; \"PUT /api/observability/investigations/{investigationId}/items/{itemId} 2023-10-31\": { endpoint: \"PUT /api/observability/investigations/{investigationId}/items/{itemId} 2023-10-31\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ investigationId: ", + "StringC", + "; itemId: ", + "StringC", + "; }>; body: ", + "TypeC", + "<{ title: ", + "StringC", + "; type: ", + "StringC", + "; params: ", + "RecordC", + "<", + "StringC", + ", ", + "AnyC", + ">; }>; }> | undefined; handler: ({}: ", + "InvestigateAppRouteHandlerResources", + " & { params: { path: { investigationId: string; itemId: string; }; body: { title: string; type: string; params: { [x: string]: any; }; }; }; }) => Promise; } & ", + "InvestigateAppRouteCreateOptions", "; \"DELETE /api/observability/investigations/{investigationId}/items/{itemId} 2023-10-31\": { endpoint: \"DELETE /api/observability/investigations/{investigationId}/items/{itemId} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", @@ -94,16 +118,6 @@ "InvestigateAppRouteHandlerResources", " & { params: { path: { investigationId: string; }; body: { title: string; type: string; params: { [x: string]: any; }; }; }; }) => Promise<{ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; }>; } & ", "InvestigateAppRouteCreateOptions", - "; \"DELETE /api/observability/investigations/{investigationId} 2023-10-31\": { endpoint: \"DELETE /api/observability/investigations/{investigationId} 2023-10-31\"; params?: ", - "TypeC", - "<{ path: ", - "TypeC", - "<{ investigationId: ", - "StringC", - "; }>; }> | undefined; handler: ({}: ", - "InvestigateAppRouteHandlerResources", - " & { params: { path: { investigationId: string; }; }; }) => Promise; } & ", - "InvestigateAppRouteCreateOptions", "; \"DELETE /api/observability/investigations/{investigationId}/notes/{noteId} 2023-10-31\": { endpoint: \"DELETE /api/observability/investigations/{investigationId}/notes/{noteId} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", @@ -156,6 +170,44 @@ "InvestigateAppRouteHandlerResources", " & { params: { path: { investigationId: string; }; body: { content: string; }; }; }) => Promise<{ id: string; content: string; createdAt: number; createdBy: string; }>; } & ", "InvestigateAppRouteCreateOptions", + "; \"DELETE /api/observability/investigations/{investigationId} 2023-10-31\": { endpoint: \"DELETE /api/observability/investigations/{investigationId} 2023-10-31\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ investigationId: ", + "StringC", + "; }>; }> | undefined; handler: ({}: ", + "InvestigateAppRouteHandlerResources", + " & { params: { path: { investigationId: string; }; }; }) => Promise; } & ", + "InvestigateAppRouteCreateOptions", + "; \"PUT /api/observability/investigations/{investigationId} 2023-10-31\": { endpoint: \"PUT /api/observability/investigations/{investigationId} 2023-10-31\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ investigationId: ", + "StringC", + "; }>; body: ", + "PartialC", + "<{ title: ", + "StringC", + "; status: ", + "UnionC", + "<[", + "LiteralC", + "<\"ongoing\">, ", + "LiteralC", + "<\"closed\">]>; params: ", + "TypeC", + "<{ timeRange: ", + "TypeC", + "<{ from: ", + "NumberC", + "; to: ", + "NumberC", + "; }>; }>; }>; }> | undefined; handler: ({}: ", + "InvestigateAppRouteHandlerResources", + " & { params: { path: { investigationId: string; }; body: { title?: string | undefined; status?: \"closed\" | \"ongoing\" | undefined; params?: { timeRange: { from: number; to: number; }; } | undefined; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", + "InvestigateAppRouteCreateOptions", "; \"GET /api/observability/investigations/{investigationId} 2023-10-31\": { endpoint: \"GET /api/observability/investigations/{investigationId} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 6d2c3bda0ca0a..3dadfb125ac44 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 62b5fc0bf9b85..559b84f7c7b0c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 6e846fabe62e0..0430dd0ff009b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index f94bf122ffe31..9ac9be5e16de7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 3bbbfdb3097d5..c135ea04c7538 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 1b5a9ff85140c..7408afbd8bee9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index c1c39ab01cace..99fffbc22e03f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 67a5a9b11a25e..630ffdc3118b8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 65f2b1977de95..23eda69ed8744 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 2f140912d761a..f1d3606ee746c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index e5f562c2bb303..50b620bec389a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index d55fb22b9e35a..b01845dbcfe4d 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index c199159790278..aef34a61a447c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index ec3cf53c4cca2..f3dc0513d3bc9 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-09-03 +date: 2024-09-04 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 de392da7d37c1..48185cc463460 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 881843924aab1..f1c2410251285 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 415e797385763..405dc244233ea 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.devdocs.json b/api_docs/kbn_apm_synthtrace.devdocs.json index 33cbffd896893..3c806005b1463 100644 --- a/api_docs/kbn_apm_synthtrace.devdocs.json +++ b/api_docs/kbn_apm_synthtrace.devdocs.json @@ -770,6 +770,56 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.LogsSynthtraceEsClient.createIndex", + "type": "Function", + "tags": [], + "label": "createIndex", + "description": [], + "signature": [ + "(index: string, mappings?: ", + "MappingTypeMapping", + " | undefined) => Promise" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.LogsSynthtraceEsClient.createIndex.$1", + "type": "string", + "tags": [], + "label": "index", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.LogsSynthtraceEsClient.createIndex.$2", + "type": "Object", + "tags": [], + "label": "mappings", + "description": [], + "signature": [ + "MappingTypeMapping", + " | undefined" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 8b21a1f6bb4f4..2f8bf7bf44ac2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 53 | 0 | 53 | 9 | +| 56 | 0 | 56 | 9 | ## Server diff --git a/api_docs/kbn_apm_synthtrace_client.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index 8f29a85704f03..94fa78faa93a5 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -2741,7 +2741,22 @@ "label": "LogDocument", "description": [], "signature": [ - "{ '@timestamp'?: number | undefined; } & Partial<{ 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'error.message'?: string | undefined; 'event.original'?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'kubernetes.pod.uid'?: string | undefined; 'aws.s3.bucket.name'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'container.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.exception.stacktrace'?: string | undefined; 'error.log.stacktrace'?: string | undefined; 'log.custom': Record; 'host.geo.location': number[]; 'host.ip': string; 'network.bytes': number; 'tls.established': boolean; 'event.duration': number; 'event.start': Date; 'event.end': Date; }>" + "{ '@timestamp'?: number | undefined; } & Partial<{ 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'error.message'?: string | undefined; 'event.original'?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'kubernetes.pod.uid'?: string | undefined; 'aws.s3.bucket.name'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'container.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.exception.stacktrace'?: string | undefined; 'error.log.stacktrace'?: string | undefined; 'log.custom': Record; 'host.geo.location': number[]; 'host.ip': string; 'network.bytes': number; 'tls.established': boolean; 'event.duration': number; 'event.start': Date; 'event.end': Date; test_field: string | string[]; date: Date; severity: string; msg: string; svc: string; hostname: string; thisisaverylongfieldnamethatevendoesnotcontainanyspaceswhyitcouldpotentiallybreakouruiinseveralplaces: string; }>" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.LONG_FIELD_NAME", + "type": "string", + "tags": [], + "label": "LONG_FIELD_NAME", + "description": [], + "signature": [ + "\"thisisaverylongfieldnamethatevendoesnotcontainanyspaceswhyitcouldpotentiallybreakouruiinseveralplaces\"" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index f4964a4ac6852..fcb127d8e0ec9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 204 | 0 | 204 | 33 | +| 205 | 0 | 205 | 33 | ## Common diff --git a/api_docs/kbn_apm_types.mdx b/api_docs/kbn_apm_types.mdx index 0d698ed5f02a3..1f83f24cfa16f 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index fa40654af7939..279bb6b44de93 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 74dd643758746..cb9e2c5cd0b8f 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 615dafa7e0d74..e94548a4ccb27 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 5c801f30a8853..20471029bed9c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index fca5a0c266b7e..08a7da5344934 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 050e727093941..efdf3da767da4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 607d4a38b0701..8697c3a471d24 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index a2051ad08a310..0a5e0e2723943 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 11c94c1cd95ab..c8051ffc266f1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index ff8470df23589..6c75269ce887b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 0c5536315ea73..0e38e558527a5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 26d49ab312193..0a380ef725711 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 7b33d32e1e315..24a5868c040bb 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 80f522333a107..d073a89194abf 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 88c92fccf24c3..51d2d3ca4eb93 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 5e224252ff5b6..792d5e935e42b 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.devdocs.json b/api_docs/kbn_cloud_security_posture_common.devdocs.json index ccac5b517f03c..854d90ed1a0f0 100644 --- a/api_docs/kbn_cloud_security_posture_common.devdocs.json +++ b/api_docs/kbn_cloud_security_posture_common.devdocs.json @@ -558,7 +558,7 @@ "label": "CDR_LATEST_THIRD_PARTY_MISCONFIGURATIONS_INDEX_PATTERN", "description": [], "signature": [ - "\"logs-*_latest_misconfigurations_cdr\"" + "\"security_solution-*.misconfiguration_latest\"" ], "path": "x-pack/packages/kbn-cloud-security-posture-common/constants.ts", "deprecated": false, diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index 98465608e7938..701cae6f345c8 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 55599978b6ce0..aff2682776629 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 16f4f1d11de7d..4ddc18f8e23f9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 79014158fc256..18e8b2176b1d5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 4f53ddc0fca2a..8880044e759f9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index f4efc5e01d7f3..f4ea8de69b132 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 27ae0aa0e709d..724fdf9db7a2a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index ac76c14c534a2..331cbf796fd67 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 2761065c0b786..9a812ddbd21ee 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index 3f7c5b4bc2a7b..f3ab445f10c3f 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index 3d40fab8706ba..8f90f672b2d6d 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index e5bb83f91f1ce..ba4c19a325528 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index bce5cc3d32bbf..86c290aeb347e 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.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 82d56f9826657..7f74f65192d42 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 021535c5dfe31..0da2d661d111d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 4e8b9fae44ce1..3f1a1d48170db 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 72ae49d1b26ca..22d517f7bafc8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 510a57052c233..e66ea0de67df4 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-09-03 +date: 2024-09-04 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 13cf19313eebe..7bfc1826263d9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index c511a69f8f059..0ef602e7ecd61 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 2d2599b244252..73a750a28aee9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index d3d3838024f16..ec8425b7ccaa5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 19d41ab3e59e9..a6bef083e2143 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index fc5e164a468b4..51a21430602e1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 0087f4ea84863..aedf82955bc87 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 4cb5bd7bd2e2e..08b390dbad8b0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 937591fd3f6a7..344e1585a8b31 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index fc88bfb4f467f..b7cfc11dd5881 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 13c97dfd8594b..fd263d0da0243 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index e993b76e00d5e..a26f39e580c14 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index d89619eca664f..ee897cccf0a9f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index ad2b8ef73847a..d5859ccc33f09 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 43c91e82eb3da..ca25863d9612e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 3274762751e9e..9ea4d7d3c4970 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index c0158fa5cd0ed..ab224b821bec6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 024ad634fe9d7..ef93d0899ca91 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 3f1167cd02a2d..6596f50dc4db1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index f84e3bf40ca65..7c22798c5785b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index f3799130ed987..36c34d2a56bd8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 34d3b5363a6dd..7c3db61aa23a2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index ac27c3b2fa914..cc790f9c12ab0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index d4652577857c6..4fcf194c7d6f1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index c1084481de176..f5ae9aa1caa4d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 19538bc8353aa..ebb4df5788432 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 5b720def86251..310007143d8d6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 0edfbd9a5db6a..5581104e64345 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 843f0f9937084..74d1d6c119109 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 7fcf6e3d3b66b..faba4717db97b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 95df2757b18a4..c5b804958b60e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index b6276c2e0ebca..9a5ef43e8a7c3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 67bdb7108b124..528623370d127 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index d49a815622371..f5c02b5b67ca3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 8db715a292b32..6b1153087b658 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 3439560dd99ee..1c99699305989 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index c621982c3bb43..3895b1b576bfd 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 903e13ae98917..f974f19958e31 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 0c2dcd33ad6be..989d33def0047 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 4aef4be9ac92a..0a9f15e852610 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index ca0f08a098aad..fa7739b740f6e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index ab0f537112d06..46c9c0384fdd6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 69049bd26af95..f5f2d338b27f8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 188a7c07e6bb1..5eb26fb820ade 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 210d550af7b89..2d63c31c73d26 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 1594086737e0b..7a4d8c90d652d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 230a33e832b0b..b862638404f10 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index da1b473accd8b..8bc80eb8f4ae1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index fbec23e75f250..8b6467a259859 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 6a3f986743862..1c44a19a36092 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 92ffc742f515e..6eef3c1882394 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 9ed25a41d2589..319776c5b8007 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index da41969a4315c..29f0ded3958c2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 71cfccaf936c8..5a175971839e9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 27c9b67a003da..cfe35a2725fc5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index f80a5a99d41a0..88d9f997983f5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 936de4f16f80c..45e0f8f634157 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 46cbf98450a21..cfcd17fc37805 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index e19450fcd7da3..32e3e69f9adbc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 3a353c834b12c..ff9c035f9a4fd 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index a43d9182eae42..3fbd795a8dbd4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 4443340a410d5..94fac70ad4457 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 5b3b5105b9fcf..28f2a4c6930cd 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index f6f67181572bc..abae79dfefb0a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index a44a64765056c..c7887dddb0207 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 38f9e40d0301f..df1d8aba926a9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 72f7d1d496c9f..9a31b369bcad3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 5fed500250745..342105f735f7a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 04739e5d6c9e4..985ab93d9a169 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index fa27c596fcfc3..ed6ecdecb15d9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 017fb89e996e0..afb8f9a2dd6c4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index b67501bd541a3..37fc19a2b3f2e 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-09-03 +date: 2024-09-04 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 78cb2f6afd253..0fc2f72610dae 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index a1d0af6954693..0c7fc91829983 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 671be415ece22..88b4d032303c0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 3a527b53f7a86..b6cbf47afe578 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index af165a09479bc..30ead82395d64 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index bd8bdc5ec0afc..2a3c508e9fede 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 612cdfc8e8509..dba8b1a00060f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 48e43a9b40545..bf7fdb074c7ce 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 1d32b7dc719db..a0a47e4c0b979 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 7389c89c59fdb..debf4bcd72dad 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 2536da8efc31d..db1afd9580124 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 2fff355d542ac..a4d17c14d8630 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 5b5a112944965..a19d6e98165de 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 3bfe76d345646..f902903e81981 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 9cef2e3367eba..66abdae41a868 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-09-03 +date: 2024-09-04 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 f4ede8d106fde..782abedd69f0a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 18b311c5963a1..7dc286ab09d33 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 288a2bc8ca607..0003eb81b371f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 8c020d420a746..2c89aeb4110ac 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 2352fedbf0563..f13b2275efb32 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index f3b0d2dac56cd..26e0fdd65ffc7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index ac20031a6a774..f751c2e9a044d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index c2f1c39d7999c..676214c86f712 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 037667f9fa1ef..6a23573209a72 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 8d7eda6ff14f7..c6b98d2fd75f6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index d5a907a3fd9ee..7b27e0bc94264 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 6451fb580eee3..74b495d95555a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index f375f9409a5de..e4943f500bc06 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 8c49b743bced0..407114d5b5c9b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 13c905f9a0ea1..aa66b25e5b651 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index f179969c46ef4..dfbf8e8e546cf 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index ae01ba7c8da3b..f88a7e0670395 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 2e9106641a4d1..4dffdca13c164 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index d487a560b02d6..280620d2a7431 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 92bc5a2197ce0..f9f6d95a608a0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index f9ac132cab441..92d422ee1cb7b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 595fd6010a44c..fd6f992a6806f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 8fca796595dca..eddf96c2af21c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index ef4d33d917b22..41f21617c03a4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index ec9d9f6f5cee2..9869fb04fab36 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 7c4853c5f55d3..7445e138e7f26 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index b294fa08b3f39..8ce873bfbc9ef 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index b48d25e618c31..d30d7b68a0575 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index ac6bae7550afd..9ef30136e5d3a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 3a2600ba0de85..388a952bab8f0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index aba5b57f62c0c..9665d1e6469ea 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index aece14d4c48f4..52147ea38fcfd 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 891a975b7e680..ff75fe924dbbb 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index ca560a7a64f00..ab1dfaaf13356 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index bfea06bd8e716..117dd7d61b8a3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index e35d4141854e4..544a7d6da4bc2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index ee12520de4e88..eea9d0df8b422 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index a5e61a27ba81e..01b0a5af2fee8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 61614a80f0428..a1ff25f22fd93 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 9a1c25949e6be..7a5e86c2be5c1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index f0fc1f965afc4..9c21489c94800 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 89b889cc87807..fec936debdb7e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 0b73db6e9bcb8..6feb019413700 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 19987bdce69c2..d46e1b763089c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index d6911303ca244..bd25796fd3384 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index fcf002b56e161..a43d9170a2f6b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 885d336bc7c27..5676e231691bc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 3f9c8e0a508de..00d4485d13a3e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 2ffa2e1cdab95..3d9ef42dcbeb6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 31d2ae6e60cdd..06e91248663f7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index c28ce0a9b1329..6c386737b0eb6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index bce0b7e9bdaf5..95f6e9ef70fcc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 7838b5d8a8aab..5d57a62cc158a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 074e99955347a..12bf2febeaf99 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index c0a647df196ee..e1132ee5c0ab0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 1029e5a2e613e..783b210d5db08 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 89d6a7a3abaaf..d54850fcdc7e4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 188767e40bb53..129d35d764324 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 764d9f807861c..2651a7461ebac 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 5fa99a5f1ac98..2653b1e15cd8d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 0189e27b94525..16265a74e5977 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 522e5f7f3a733..c006121a04fae 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index d70818a0216e2..97ed2ead3b69c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 4dd7e3ac90fb8..de8b2efff9bf4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 73a532fd48636..ac9a9b64fb77c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 55fb6ff29388f..651056f95df05 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 52de6a2c992df..28e6be1de29f1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 56e87d2007a73..fec5c4b8ff82e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 2b87cbd78d315..3ad53ef0097f8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 48e0ebecb499a..f67c59d20f097 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 88e68b408777d..c27c18e51fa37 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 5bd31ca21b642..907cfe7e8f520 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index ed749b0b2441b..6086c66c3c1ba 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 3f2dcf5cd462f..acd638afb1221 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 936a82066432f..1210c83a9688e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 8691e0d31b558..f812953045745 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 507ed4b62daa3..341cb0e95a28f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index cfa0bd2b62a1d..fd965c197bde0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 89c2262f9f25e..13ca400a0df95 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index b1dd998c80dab..a2b1414f21f22 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index dad2d93564033..bb599762ba48f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 58de82514f3b1..86bc7cf0a1b4f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 102d29bee8cae..963ea3e8e9e34 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index f338410d7e9ab..994e35ef8ad5b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 1f9fd0b2ff462..55af1cdf22c45 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 8dbdd304ac95c..9cfdea131cab8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index dcd061116ff53..f73d23b97b5af 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 0df1555f8c9b9..9f104678d9115 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 40c13f406434d..dbcae1c93b8a6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 8f2df050ccdd4..c23be5e0a41e3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index be8ccbf56bf27..bee65da3469fb 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 1b14449422b6c..d8a7a1f0b661f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 41f0648370d85..6b1586e63eb62 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 330a921dd4ec7..84cd64edcb99b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index d35151ecddce5..b665773da8de4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index beb8f1d89b996..9927ee8ac96c5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index ba55a5fd26bdc..858a2476cec2a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index c8ed837f15161..61dd0be6c03f0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 9312c87a84e7a..5317b0a8410c3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 79d64ecbd850d..c70467335f51c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 7a833c6f666dc..7d84314fa8320 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.devdocs.json b/api_docs/kbn_deeplinks_observability.devdocs.json index 8f071974422c8..35fde7e1e3c3d 100644 --- a/api_docs/kbn_deeplinks_observability.devdocs.json +++ b/api_docs/kbn_deeplinks_observability.devdocs.json @@ -100,6 +100,20 @@ "path": "packages/deeplinks/observability/locators/dataset_quality_details.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/deeplinks-observability", + "id": "def-common.DataQualityDetailsLocatorParams.expandedDegradedField", + "type": "string", + "tags": [], + "label": "expandedDegradedField", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/deeplinks/observability/locators/dataset_quality_details.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 0dd142711757d..a41de0f085f3b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 61 | 0 | 49 | 0 | +| 62 | 0 | 50 | 0 | ## Common diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 1a0a1534e4632..8a582b8a38b4e 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-09-03 +date: 2024-09-04 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 24b8f560fdd19..8c82db1c85789 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 57f478287a5e1..9306aec202af2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 733a7f6b1bb59..77edebb706f24 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 915e973e8f550..6b119c051d3a4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index d9c17a923c792..d6dee6da05c37 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 0fec71d22a273..acf3c0d7dc12d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index e7d435b11318c..80f4b8f3232fe 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 087d4843e1d4c..9da1711e43746 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 636220368c48f..c4e02fc8dd03c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index eff371b71a113..ed06a44ab404a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index b87ca89eab49e..30f0793da078c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 5bc50ae4e9c33..737169709bcd1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index df5e2f9535f81..21a0719d70233 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 07affdd05dd98..55b6bebf590e8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 648360c3fcd9b..25ac55e67eee9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index fa7f6dc52f20f..ccb312a40575e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 1d1bcb745b93b..283876c601d14 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 014048b750741..d74087395b4b2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index fcc1ebe974989..7130256e5a0bc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index dc3d8a11be723..20b2f8611c096 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index dcd92beee8f8b..b304f930df5e8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index ca59a7bc98639..2bd66fa782cda 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 4a933a3aa44ff..0858a15d82dea 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index f50dc02f01d3f..e8ac560dd7a4d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index b4d978c2344e5..72098a61ebee0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index e2260083ee9aa..be2b035135a2b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index b877b126bbadf..c0c384d7e9237 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 4351b99669523..6f43a7a7ca129 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 85987c23dda5a..8f24b4f68ab85 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 2593da5f49ad9..4068354e9f72d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index c04fe40826729..f16d5e6f2d8cd 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 7a33575238027..3a3e454bedd2d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 846dc03021d16..e7f07db91fd62 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 617d6ca492826..34b34b59b24c7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index b0ee71db7c73e..94b18d555a77c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index aac5e345438e2..c18d2d4feaa6f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 7eeb30dad05b6..8fb6ebf0bafe3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 37c5cb5456c52..35036ad4307fa 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 91c25bfaf4713..d3f681d908b88 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 60276eb34a3d1..ab8dca013e975 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 6631ce87e6a95..290aeb7e3ad3d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 6a255c891d0e9..8822819530a3a 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 11b6206cf0ce2..7abc8239f7a17 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 44aa8bea15d95..511488182bd6e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index d20c03e1706fc..a4208754d01e7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 2951ef90605bc..b13bc8e541396 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 67808add5c881..9d60b2b4fc2f5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 2b7c5cad238d7..c46dc8292555c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index ec917b389122e..a1d8721da3e26 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 54e45dedf0d0d..f11b214e4c1b1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 6177134aeb05c..410a04682e121 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 683a930041bca..a1b0513581707 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index c8e09f870d8f5..d67e8e0ea414a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 13d5fdee07b2b..d6ea4cdd3955b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index bd09ec66fb3cb..0b21369d169e3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 97198efecb5eb..22fb6aeeb0b42 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.devdocs.json b/api_docs/kbn_investigation_shared.devdocs.json index e785c44f633f7..e9444469952dd 100644 --- a/api_docs/kbn_investigation_shared.devdocs.json +++ b/api_docs/kbn_investigation_shared.devdocs.json @@ -307,6 +307,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.UpdateInvestigationItemParams", + "type": "Type", + "tags": [], + "label": "UpdateInvestigationItemParams", + "description": [], + "signature": [ + "{ title: string; type: string; params: { [x: string]: any; }; }" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update_item.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.UpdateInvestigationItemResponse", + "type": "Type", + "tags": [], + "label": "UpdateInvestigationItemResponse", + "description": [], + "signature": [ + "{ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; }" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update_item.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/investigation-shared", "id": "def-common.UpdateInvestigationNoteParams", @@ -336,6 +366,36 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.UpdateInvestigationParams", + "type": "Type", + "tags": [], + "label": "UpdateInvestigationParams", + "description": [], + "signature": [ + "{ title?: string | undefined; status?: \"closed\" | \"ongoing\" | undefined; params?: { timeRange: { from: number; to: number; }; } | undefined; }" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.UpdateInvestigationResponse", + "type": "Type", + "tags": [], + "label": "UpdateInvestigationResponse", + "description": [], + "signature": [ + "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [ @@ -1247,6 +1307,76 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.updateInvestigationItemParamsSchema", + "type": "Object", + "tags": [], + "label": "updateInvestigationItemParamsSchema", + "description": [], + "signature": [ + "TypeC", + "<{ path: ", + "TypeC", + "<{ investigationId: ", + "StringC", + "; itemId: ", + "StringC", + "; }>; body: ", + "TypeC", + "<{ title: ", + "StringC", + "; type: ", + "StringC", + "; params: ", + "RecordC", + "<", + "StringC", + ", ", + "AnyC", + ">; }>; }>" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update_item.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.updateInvestigationItemResponseSchema", + "type": "Object", + "tags": [], + "label": "updateInvestigationItemResponseSchema", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ id: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; }>, ", + "TypeC", + "<{ title: ", + "StringC", + "; type: ", + "StringC", + "; params: ", + "RecordC", + "<", + "StringC", + ", ", + "AnyC", + ">; }>]>" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update_item.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/investigation-shared", "id": "def-common.updateInvestigationNoteParamsSchema", @@ -1296,6 +1426,130 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.updateInvestigationParamsSchema", + "type": "Object", + "tags": [], + "label": "updateInvestigationParamsSchema", + "description": [], + "signature": [ + "TypeC", + "<{ path: ", + "TypeC", + "<{ investigationId: ", + "StringC", + "; }>; body: ", + "PartialC", + "<{ title: ", + "StringC", + "; status: ", + "UnionC", + "<[", + "LiteralC", + "<\"ongoing\">, ", + "LiteralC", + "<\"closed\">]>; params: ", + "TypeC", + "<{ timeRange: ", + "TypeC", + "<{ from: ", + "NumberC", + "; to: ", + "NumberC", + "; }>; }>; }>; }>" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.updateInvestigationResponseSchema", + "type": "Object", + "tags": [], + "label": "updateInvestigationResponseSchema", + "description": [], + "signature": [ + "TypeC", + "<{ id: ", + "StringC", + "; title: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; params: ", + "TypeC", + "<{ timeRange: ", + "TypeC", + "<{ from: ", + "NumberC", + "; to: ", + "NumberC", + "; }>; }>; origin: ", + "UnionC", + "<[", + "TypeC", + "<{ type: ", + "LiteralC", + "<\"alert\">; id: ", + "StringC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<\"blank\">; }>]>; status: ", + "UnionC", + "<[", + "LiteralC", + "<\"ongoing\">, ", + "LiteralC", + "<\"closed\">]>; notes: ", + "ArrayC", + "<", + "TypeC", + "<{ id: ", + "StringC", + "; content: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; }>>; items: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ id: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; }>, ", + "TypeC", + "<{ title: ", + "StringC", + "; type: ", + "StringC", + "; params: ", + "RecordC", + "<", + "StringC", + ", ", + "AnyC", + ">; }>]>>; }>" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ] } diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index 86ca950348923..64c4e845ebaba 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.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 | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 48 | 0 | +| 56 | 0 | 56 | 0 | ## Common diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 44c9305e90137..8d3fb0b07414a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index bdf736feb386d..1073439b7c70a 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-09-03 +date: 2024-09-04 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 37a6c3755558e..941b4dd524151 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index f89a35560b02e..6fca2bfb13625 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 79c655a1c374b..c60b50a4c1612 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-09-03 +date: 2024-09-04 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 993b7944f8118..2b5894f5902f8 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-09-03 +date: 2024-09-04 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 fc3b6068418cd..90b88bf507a41 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index a138d24d50b9a..decddf8c1c6dc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 2f56fb9072ee7..49ad601e68d1d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 0a7c3c1d91023..39f17c7d5e4c8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 60c7182bdc534..c821a5a7ba606 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 964a787e7981d..3b93e22461bec 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 4ae42093b2e2b..87b9fb9dbff04 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 422aa1f0900cb..7899d63814ee8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 229f721db9c29..f827979a70045 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 363b624c0f8b2..0b5c093b0d9af 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index a44b6ff9f9c6e..72d2ecd893be6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index cec3f707e8507..dda8e3d9e7b62 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index a926e600733e1..7cb0210543e57 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 4c2807f9f6f1f..f2863f3f45080 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 4698ec12b6c8b..ebfd96fd4b010 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 8b322e28b6c8a..83b24df9b40e5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index c9d5fe6157f91..6cf89e770e159 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index cee27b415d271..c57ba88e6e8d0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index d0020aeb79293..60ac8e4ad5f66 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 3577f85b193cc..2928501aebd14 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 81ee17dcbcd56..3432f3f90fa4b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index cff233154e208..7f2904002c499 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 1914f02a414a1..47f28165bdf8a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 8147e16f58e0f..2138126b24272 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index a3dd5ced16424..b548bc944060e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 2e388eff399c6..c40aace563729 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 8bb8e4a0b4c29..73de4ec119c6b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index fc997028b5ce0..3fa5f7d9c946e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index f3e70f94762fe..156d4b84d8e7f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 6e2dcc47d3cff..6da632ed5eeeb 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 48ec650804f75..652c238f4973b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index ff3981fe5d3f2..cd96d5a38eeff 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 2c80fa0ea2010..f0516390e768a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 45923c0f41d23..a04530433bbe2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 7a2569a9808ba..bc73de9254e3f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index a0c2b4781037b..cc40794f097f2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index e18bd187c27da..10511a9a17efc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 4aee5e0ebff6d..af3846a090d7b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index e7f8e1e5aa756..030702d4f680d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index e1c4df638fdd9..d4c5a9c24fe5a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index b7d87c4a8873a..d22ac5d767184 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index ef001b17a79a0..6d22b27ddc9c4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index c29c38405fa48..70917fd530a12 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index db8cf858dfe4e..7fcef8bc31430 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 55e03d10e8d1a..f69e7b152d8c3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index c268aa9673aeb..d592a178610b9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 7c8351f948bea..9f484e34d2757 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index db64190d59aa4..76796298613d7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 6908f47f87b9a..d67cd116c2959 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 6f4bcc4748de8..cc54250116e74 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 8b41d617f2776..56ec5ba8cefed 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index a454fac2a511c..4f6bdffbc42c0 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 2c2e87f879456..0be7162b4177b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 84cbfde66bd8f..54a6b2a1439c1 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index b2210771f7b58..c65729ec169be 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 42ed1efe8d031..56b3991e4a19d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index e2b375458e04a..a1b3574287f44 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 3d2113d7d1490..20ed1d4ee9e5f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 4b417e098ba28..6274a608fe97f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index f1c36bb1b3719..6ca37eca11166 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index fe42133573506..2106f842157c4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index d05ffc85bd4fd..4e49a09095334 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 4da1a0ce79d95..e3774c6034cc4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index a65c9b2dee786..7dad7d321979c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index a9e4a36460532..d9c4612407a92 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index dac33ce629dfd..6c3432a8e62cb 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 14dba8301e418..8cf2c4ae4a739 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 051919fa7822f..a98b30e5b8237 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 805dcdd3773eb..889a5bc39ffce 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 102971c6d855c..07f210d027d18 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 3e61a16b212f8..22be016c7065b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 2576218a8ae0e..2f3d31c43c10c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index a1ba9f354b616..35f9face2066f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 25aac36d42b65..33986673f7c9e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index b0c378d2cff3a..85522fbeec5cd 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 01ab81bd11723..522f5540a0a28 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index f6c9116591a7e..701262a1c6202 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 1b6d23e20a948..a1e811c670f38 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 6a0295d5baaca..74852cfe97930 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index ea9c599c93a2e..afce45d0a4e5a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 751fafacf492f..66152c140d050 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 23714e3264288..89598c5495039 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 3806215e28525..7212fe86162d6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index b71c4267562de..5186037899cb0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 103a22bd6a2b1..8aab840657761 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 2b9a138b0dd91..4c2c55b5044e6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 309c253315b6c..1715c1683e2fc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index b8a61dd639978..839d7402fa94a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 0dd9fd7c85fad..3d58778f8fb77 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 87f24573212e8..3670be002372b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index c231b012d77ce..d4a5141d826d6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 1064c4b82eaa0..256565ca78b89 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 9b22ce4581659..47114d5c0e1e2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 21c4901d2a3b4..52eecec810e55 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index bc93cb5b30681..8d8b98ddee18b 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-09-03 +date: 2024-09-04 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 92536bb2f08c0..79253a7fdec43 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-09-03 +date: 2024-09-04 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 fdc4901450e06..f1bd8870c9afe 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-09-03 +date: 2024-09-04 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 3765b19cfc0d8..214ba21b97491 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-09-03 +date: 2024-09-04 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 28f36476ea803..781db8173e579 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index cd67cc9ed895f..9a5744269a248 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index dacb6aa29e1b6..5946ec1e70f47 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index d3560698368d7..ca34a897bc561 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 3f7da429aa3a6..f2581007d4041 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index f3cc34b371370..05d28d93a2bc4 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 07de06a8b57ce..5a3a7a0cc093e 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-09-03 +date: 2024-09-04 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 db61714a211e5..22ecdee55b18b 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-09-03 +date: 2024-09-04 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 256551c1967b3..8a6a39916b011 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 743a32bd003d0..281e5c9ab5b42 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-09-03 +date: 2024-09-04 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 75b976201d1af..0483060fbb8a8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 9e407d168bc82..9aca26b5a155d 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-09-03 +date: 2024-09-04 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.mdx b/api_docs/kbn_security_api_key_management.mdx index 131c6becca233..3ddb746cf6f7c 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 90e6ec6beda75..0247ed5a45bce 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 3af850028cb32..ada47bf2c1198 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index dabe9ecd86b45..18fd6c268ac43 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index a93abe7661bc4..ccb7267d86577 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 23ae78e943ccb..57c9bd94560f6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index d20bfd87d8a86..e6d2a30443b0a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 6b3fb5cf5deb3..ab238040178b9 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 3787493a52fea..ac8c2b774bc2b 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 8487642cdeffc..3af5682c67e64 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index d64c30ea4574d..8f294d89c970b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index f32828e9da533..3b9a818ef5ba7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 109a439ac6095..f999ee849f789 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index b853a1c05f477..ee7c468413ae2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index a6ae8eb902810..943d19da3734d 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 29d973eee31e9..73b22d223a38f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index f063d33841c42..94a0497829528 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 509b95634478f..aed6d30854700 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index a4fd0099e2ba4..ab617c53cc5a5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index c74cbf9537ed0..c92fd0063f687 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -851,7 +851,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -865,7 +865,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -1004,7 +1004,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1018,7 +1018,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1144,7 +1144,7 @@ "label": "showValueListModal", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType | \"line\" | \"rect\" | \"code\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index a387184cb140a..59c397bad97a2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 7c636cdc133c8..e8ea613b18bca 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index eb46691b26e4e..7f74bbe1b4a3f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index d6225206b0202..1a9c8987ae96a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index da9c4a32d527d..fce0b8aeb01a0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index b7700c307edb9..c3cffbff1588e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 8da78b401bd69..753e45141c420 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 90eb8936c9b34..4c246a77bccc6 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 03bad25fd57c7..8dd4184bd489f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 9513185d0cfd2..589465a7e60af 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index d32e23f86db0a..598b8e3181072 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 0e8300f802060..fea6f723429be 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 7a4fe937a3a0f..1d468c71c1f3e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 2d6844d260c1d..e6cdb09bcdcd7 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-09-03 +date: 2024-09-04 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 82a8a715c19c0..e600e5e227130 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 7523c330db7be..298d6d199be78 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index c119e8af127fe..1707958f08492 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index a62cb3beef217..036b329a0404f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 155d39b493a0d..daf5973ad37e3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index d1f2185432031..86f7ef794a54e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index c899fdb126d9f..360f251a9f6e0 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-09-03 +date: 2024-09-04 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 16b5f147c59da..db072a8c01231 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index a4d714e9eb8fc..f25753ab130ac 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index f676cc3e6f848..336f0455bac07 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index d79f981516d9e..c9f95c974e2b4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index d8aab6abd5428..6868f49737991 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index af7d971c5a81f..0eb21c5b0aa1c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 09aababd74209..d56ff27f9f56a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index d1281c4f43a44..f5ea6cb6a8756 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index bc35ac0203ae4..c9e33fb5a6749 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 7404677761243..b126750227fe9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index f4651001dc313..8f3e2d3bdbf8e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index d29f077e57cbe..3a7bcc434f3b4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 3082611961a4b..6c1706d3c57b1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 162c179da6910..0269fdbbf4bc7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 06ac39493fa9c..4f2095783395c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 10db561eb7546..729fc14af688c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index d6feddaa3568c..2e24fe9dca0c3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 9c61074f2ef81..46a624f32dc53 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 0fea60d64e6cc..ac50ff0502bae 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index d075c7d2bcdc9..a2621122b26ad 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index c5c29b2d7eaae..1ee2f1621629e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index beced320cd39b..0fbc4d39797ee 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index dbb1c9d87ced2..f2c2820ccf63e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index f9cc0bd0bf59f..a84cf1d9209cf 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index ae3449775d055..7e2df7017d582 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 54c07d69482ea..5834fd12cb166 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 179149060bee3..f556b25893265 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 1f2531a5378e5..0034ed2775f04 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index e9ba1f96b2f2d..d20551adc6ec7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index cea0fcb25d567..17448fa4d0eea 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 999a224e48e54..095523ea354c7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index ccb02e7e1ae2f..fd82a288a2ebe 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index b86d7bb68ec43..3a1cf8509382e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 23255e0360373..7608db04c35ef 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 23074e62d0eef..bc42e12c5eb5b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index a088327cf546a..841b608a5daa7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 364440b7a1d51..4f9ac10166644 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index ffe79e8573260..290cbc9322a2a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 4108804b1eba8..d68ab0bcc6308 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 41de6f3994c9c..61707537e684c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 88b2688ff544b..de4b9b19560d9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 78a7f32009a02..5b0a03edac53f 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index a3bb7fa6212ac..f5b92bc61f044 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index c9e827d805bda..6d5703c52790b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 581861249bb17..83f8b61079cf1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 1198d9aeaa67b..00f0086ab1540 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index bd03036f3c70c..df938c55c590f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 2a9f92396ca95..aaf8416dacfb0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index eae1a9e479f68..7d040de9cc191 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index a36e187432a60..57525a0efa81d 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index 70c4003c6dbfc..10c916f446831 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index c12febdaedf04..978e9b2524433 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 2cfc845af36b8..8f835b18285d7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 944b6f6cdc7b8..7f00c708d2d69 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index adc38666ce650..d364104d8639f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 00ff17673de72..db99dcde34184 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index b368a4c521ac3..2a5a38f3dedf8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 160b0ea806fbe..f17fa71943a73 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index c29be79180ea4..ec482d6ffc521 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index fdfa2c6cd754a..bb1d900e584c2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 7b2943fea77e7..73a20839f60ba 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-09-03 +date: 2024-09-04 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 b43ebaac963ec..811f9df289f23 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 3f69af7c91806..1e7878abc9886 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index d47d5bb0dcd95..4139b45246462 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 557da822987db..4f845c83a1b6e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 9b862e3fde8c5..961e06aa509e3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 72b381b708bfc..d02d246cbb992 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-09-03 +date: 2024-09-04 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 1765a2d67356c..32bb2d5ef722e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index e08f88bb43e70..f0ef14e11199d 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-09-03 +date: 2024-09-04 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 affed4715f0f7..485cb97701713 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 16519dfc0ea38..2485c4138ddb3 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-09-03 +date: 2024-09-04 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 d937f38b711a1..bfd0d42c068f1 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 8e5d658cb8684..6ab3aff6bf587 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index aa210cbbce67c..7673ed5324131 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index f2258ec2ea27a..d2d412f5ed754 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 8829f6ad6ba82..02402120c5fbf 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 36fcef7d5fdd0..a547afddd5720 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index e6a94c069b4f0..aef692ac03fbc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index f2c6ac87f7392..9df65573fdd10 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 12a465ce1ce70..5146945ed1a7e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index b69d728f8ebd1..37a32c8663a0e 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index cf5f25a4a2446..3a819e02c0c64 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 51d15d7b9803d..cf03c2818767d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index a3b7a684d031d..523380eae221a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 6a8dd41596b67..ce22af8a4af40 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 2f584741bdc66..d897e59c0679f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 112f06f8d8bb1..babb32abaf909 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index a6fa9717cf3d5..eab4906c08acc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index f509f13144641..0cc079aefdde0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index c671377f6ecc4..7c78dbd8ee683 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 086c4ef896c58..9cbb5461fbab9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 1a879dece07ae..83370ffe7317f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index cd12957f451c2..4eb7815516970 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index daf2077832fea..7d38f1033707f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 85d6e9fbae0ef..2494db764b25f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 2eb20153bc637..8152b3487d704 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index c461adbfa0da3..83abb95369e1b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index c4c3bd5ed57d1..b3b00bd073e22 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index f41ec54abdb64..de7f986a8678d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index d8a83bf7768b8..585cadbe24612 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 5563f818e9a20..a2f6c8fc693fe 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index a3fc083c10733..3d9168c9fcabf 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 147c0fef03c0d..dbf568f979cbc 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-09-03 +date: 2024-09-04 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 16c7e89cffc97..b855936d2c0c7 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-09-03 +date: 2024-09-04 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 5666384066d97..0a42640104e23 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 31b5953aa46e1..207351ad4a000 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 2192fa13c393f..f7c8e011858e4 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-09-03 +date: 2024-09-04 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 9be924035f454..8408376f57800 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -787,7 +787,7 @@ }, " | undefined; list: () => string[]; }; selectedAlertId?: string | undefined; } & ", "CommonProps", - " & { as?: \"div\" | undefined; } & _EuiFlyoutProps & Omit, HTMLDivElement>, keyof _EuiFlyoutProps> & Omit, HTMLDivElement>, \"key\" | keyof React.HTMLAttributes | \"css\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }, \"id\" | \"key\" | \"prefix\" | \"type\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"size\" | \"paddingSize\" | \"onClose\" | \"ref\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\">, \"id\" | \"key\" | \"prefix\" | \"type\" | \"onError\" | \"defaultValue\" | \"security\" | \"alert\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"alerts\" | \"size\" | \"paddingSize\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\" | \"rawAlert\" | \"isInApp\" | \"observabilityRuleTypeRegistry\" | \"selectedAlertId\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }> & { readonly _result: ({ alert, rawAlert, alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => JSX.Element | null; }" + " & { as?: \"div\" | undefined; } & _EuiFlyoutProps & Omit, HTMLDivElement>, keyof _EuiFlyoutProps> & Omit, HTMLDivElement>, \"key\" | keyof React.HTMLAttributes | \"css\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }, \"id\" | \"key\" | \"prefix\" | \"type\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"size\" | \"paddingSize\" | \"ref\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\">, \"id\" | \"key\" | \"prefix\" | \"type\" | \"onError\" | \"defaultValue\" | \"security\" | \"alert\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"alerts\" | \"size\" | \"paddingSize\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\" | \"rawAlert\" | \"isInApp\" | \"observabilityRuleTypeRegistry\" | \"selectedAlertId\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }> & { readonly _result: ({ alert, rawAlert, alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => JSX.Element | null; }" ], "path": "x-pack/plugins/observability_solution/observability/public/index.ts", "deprecated": false, @@ -13963,6 +13963,36 @@ } ], "misc": [ + { + "parentPluginId": "observability", + "id": "def-common.AlertsLocator", + "type": "Type", + "tags": [], + "label": "AlertsLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "observability", + "scope": "common", + "docId": "kibObservabilityPluginApi", + "section": "def-common.AlertsLocatorParams", + "text": "AlertsLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability/common/locators/alerts.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-common.alertsLocatorID", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index ba893839a444b..92649ba2ae59c 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-09-03 +date: 2024-09-04 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 | |-------------------|-----------|------------------------|-----------------| -| 702 | 2 | 695 | 22 | +| 703 | 2 | 696 | 22 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 5d8b40720d058..93d16c5006beb 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 146471bdf9a0c..1faad687a496a 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 39c77fa311156..105b2df23e788 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 9cc6a57e4e830..007c24e992d09 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 7ee61acba45f0..178d61ff04054 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index e796b97644767..fa501fbd58bba 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -4255,6 +4255,106 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.MetricsExplorerLocatorDefinition", + "type": "Class", + "tags": [], + "label": "MetricsExplorerLocatorDefinition", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.MetricsExplorerLocatorDefinition", + "text": "MetricsExplorerLocatorDefinition" + }, + " implements ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorDefinition", + "text": "LocatorDefinition" + }, + "<", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.MetricsExplorerLocatorParams", + "text": "MetricsExplorerLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.MetricsExplorerLocatorDefinition.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "\"METRICS_EXPLORER_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.MetricsExplorerLocatorDefinition.getLocation", + "type": "Function", + "tags": [], + "label": "getLocation", + "description": [], + "signature": [ + "(params: ", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.MetricsExplorerLocatorParams", + "text": "MetricsExplorerLocatorParams" + }, + ") => Promise<{ app: string; path: string; state: {}; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.MetricsExplorerLocatorDefinition.getLocation.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.MetricsExplorerLocatorParams", + "text": "MetricsExplorerLocatorParams" + } + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ServiceOverviewLocatorDefinition", @@ -5455,6 +5555,36 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.MetricsExplorerLocatorParams", + "type": "Interface", + "tags": [], + "label": "MetricsExplorerLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.MetricsExplorerLocatorParams", + "text": "MetricsExplorerLocatorParams" + }, + " extends ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + } + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ServiceOverviewParams", @@ -6809,6 +6939,51 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.METRICS_EXPLORER_LOCATOR_ID", + "type": "string", + "tags": [], + "label": "METRICS_EXPLORER_LOCATOR_ID", + "description": [], + "signature": [ + "\"METRICS_EXPLORER_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.MetricsExplorerLocator", + "type": "Type", + "tags": [], + "label": "MetricsExplorerLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.MetricsExplorerLocatorParams", + "text": "MetricsExplorerLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/infra/metrics_explorer_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.NETWORK_TIMINGS_FIELDS", diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 2eb233e5ecf87..e57798321e277 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 449 | 1 | 444 | 19 | +| 456 | 1 | 451 | 19 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 0c55dedfdc4f2..f3afcde08300f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 9fcf01314448c..f6eb8cf0d76ac 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 2bc8f7f5fc7cd..2d06b51b485a7 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 52880 | 243 | 39716 | 1942 | +| 52901 | 243 | 39737 | 1942 | ## Plugin Directory @@ -150,13 +150,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 702 | 2 | 695 | 22 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 703 | 2 | 696 | 22 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 286 | 1 | 284 | 27 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 19 | 0 | 19 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 21 | 0 | 21 | 0 | -| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 449 | 1 | 444 | 19 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 456 | 1 | 451 | 19 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 | @@ -256,8 +256,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 18 | 0 | 18 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 4 | 0 | 4 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 53 | 0 | 53 | 9 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 204 | 0 | 204 | 33 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 56 | 0 | 56 | 9 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 205 | 0 | 205 | 33 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 316 | 0 | 315 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 3 | 0 | 3 | 0 | @@ -481,7 +481,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 3 | 0 | 3 | 0 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 61 | 0 | 49 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 62 | 0 | 50 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 17 | 0 | 17 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 5 | 0 | 5 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | @@ -539,7 +539,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 48 | 0 | 48 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 56 | 0 | 56 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 60 | 0 | 60 | 4 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 44 | 0 | 44 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 13 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index a737c87a973c4..a6a272a4847b3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index fb32c620c3547..4d5eb2427cc3e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 62cf434f72fb5..4f43ea42b1261 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index c683cc7d8cbdd..1afb2f3d0fe85 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index ad143aca42a85..b39d2202e4132 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index fecf637d414d9..d94cb4f6beab5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 72fa80e8ea4c6..92589ef0b0bde 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index cdffde211b768..4436e21f57fbe 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index e3f208eb8de02..d4b233dcfea35 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index ef6275a89bbea..00f947f89fa69 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index f85810a830c99..d0708ca0b3829 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 04225124158eb..6c1b890dfa2e4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index c4474082e7bf2..098fa86ed12fc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index df800e0953960..d2165d9903e0c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index e74a2e3f6ba4e..56a01cb9a488f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index d9f549d1cbabe..ebb6b4579b66c 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 943ffcaa7640d..5a59c6e1a7cd0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index c06b708f91f29..464894cd90e6b 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 1a837cbe1bc76..6561852261e8f 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-09-03 +date: 2024-09-04 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 615a37d1ce7d5..85b957fc32a7b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index 73c94fe24361a..249f293142ede 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index b32986374fcce..a447457c453ce 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-09-03 +date: 2024-09-04 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 746f65a3faf1b..c7066dbfcdd68 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-09-03 +date: 2024-09-04 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 c947872b787f0..8dee517a44d0e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 5808657df8aa4..ff4d754d44a9b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index f93f80b5b9216..908cf07283a19 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 3bd81405205bb..28da3e74463c9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 6d6d7c469a48d..ab922a6ca531b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 9509328d06b4b..63e9d4fe896af 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index f014d7ea652e6..168c333e3552f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 4f93581ab0ef0..9b13e3f4db0eb 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-09-03 +date: 2024-09-04 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 850dd69eddfdb..f966d1969ea3f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index c5ec6e0461629..ab976b5225130 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index b0e28c9946e3e..a1d7d4f35fbe8 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index b2245b6fb5b35..1b205e53302dc 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 9af297f1c7256..c7df8aaa01198 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 7d42e045bf956..455b6b8ed44e4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 5cea2b13f9d1c..dcb5d1128ba36 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index db4f61878a743..d799d6afc7b09 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 115dbd5127ea2..f9856709b2fe4 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 84f6e6437e028..c42345ce4e54b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 32a03fe3d823e..8e47c67645ba3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index dd72b8bd3070d..ddd60224da44b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 6be708e19cda9..c6a7bcea4b600 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index b932cbc25538b..7341ce56f1a2e 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -4279,7 +4279,7 @@ "label": "TimelineEventsAllOptionsInput", "description": [], "signature": [ - "{ sort: { field: string; esTypes: string[]; direction: ", + "{ sort: { field: string; direction: ", { "pluginId": "timelines", "scope": "common", @@ -4287,7 +4287,7 @@ "section": "def-common.Direction", "text": "Direction" }, - "; type?: string | undefined; }[]; fields: (string | { field: string; include_unmapped: boolean; })[]; language: \"kuery\" | \"lucene\"; fieldRequested: string[]; factoryQueryType: ", + "; esTypes: string[]; type?: string | undefined; }[]; fields: (string | { field: string; include_unmapped: boolean; })[]; language: \"kuery\" | \"lucene\"; fieldRequested: string[]; factoryQueryType: ", { "pluginId": "timelines", "scope": "common", diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index cd1f5d4dbe671..32c8a1a60df3d 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index be6c1d63fb574..c6b403fe1bcb3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index a9c5bd26cb120..b024e1f8bee70 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index c7ddf3ccdf976..5baf948dca658 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index f3f57f5402b40..9438a6bbdec7f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index bb065de7083b0..f993534b0c636 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 0e55a7d5089bd..261df406e0d86 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 9fbd91e63d3cb..644389a0f6635 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index d5b1aabae0acc..93d734215769b 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 61b8d6ffcddf8..d06d9758541ab 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 9c35fd54723f8..38d05c84acf76 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 4dcfcc3893078..3d95915bc7d82 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 5658d03fcb595..eeeb2657d3411 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 5532f82ac5a41..d53400f12e4fe 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 306673fdf8ad6..d1d5c6798ccf9 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 0b4802f91ab9e..8c7f820073b1e 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index abb365cc614c6..1b7ad85928ea0 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 750d3de0c00f1..0c9930f81bcf2 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 847c1ca5633e1..caf3df6733519 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index dd6449c757af6..48c0038915e5f 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index c3cdbde5ba256..fca93f8baecd3 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index e2be0f5a0b495..47c8a6d390614 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 5cbeac0106bfa..8abf2b174ba18 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 27b4ae7212bb9..88482cc64e4b5 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-09-03 +date: 2024-09-04 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 8d7fbb730662b4301bc983930f703da60153f059 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 4 Sep 2024 18:49:42 +1000 Subject: [PATCH 13/28] skip failing test suite (#192023) --- .../test_suites/task_manager/task_partitions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts index 5a4f956655ab3..bc8cde3877673 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts @@ -115,7 +115,8 @@ export default function ({ getService }: FtrProviderContext) { .then((result) => (result as unknown as SearchResults).hits.hits); } - describe('task partitions', () => { + // Failing: See https://github.com/elastic/kibana/issues/192023 + describe.skip('task partitions', () => { beforeEach(async () => { const exists = await es.indices.exists({ index: testHistoryIndex }); if (exists) { From 7aae05da09be053679bf74205ffb906be4f0409f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Wed, 4 Sep 2024 10:03:14 +0100 Subject: [PATCH 14/28] [Stateful sidenav] Add ML group menu in oblt & search (#190682) --- .../ui/components/navigation_section_ui.tsx | 2 +- .../observability/public/navigation_tree.ts | 129 ++++++++++++++++++ .../tests/observability_sidenav.ts | 2 +- 3 files changed, 131 insertions(+), 2 deletions(-) diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx index 6a53239590d92..0d1814828369f 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx @@ -342,7 +342,7 @@ function nodeToEuiCollapsibleNavProps( if (renderAs === 'panelOpener') { // Render as a panel opener (button to open a panel as a second navigation) return { - items: [...renderPanelOpener(navNode, deps)], + items: [...renderPanelOpener(navNode, { spaceBefore, ...deps })], isVisible: true, }; } diff --git a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts index 65256a1584461..9a064af35d3e8 100644 --- a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts +++ b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts @@ -338,6 +338,135 @@ const navTree: NavigationTreeDefinition = { { link: 'fleet', }, + { + id: 'machine_learning-landing', + link: 'securitySolutionUI:machine_learning-landing', + renderAs: 'panelOpener', + spaceBefore: null, + children: [ + { + children: [ + { + link: 'ml:overview', + }, + { + link: 'ml:notifications', + }, + { + link: 'ml:memoryUsage', + }, + ], + }, + { + id: 'category-anomaly_detection', + title: i18n.translate('xpack.observability.obltNav.ml.anomaly_detection', { + defaultMessage: 'Anomaly detection', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:anomalyDetection', + title: i18n.translate('xpack.observability.obltNav.ml.anomaly_detection.jobs', { + defaultMessage: 'Jobs', + }), + }, + { + link: 'ml:anomalyExplorer', + }, + { + link: 'ml:singleMetricViewer', + }, + { + link: 'ml:settings', + }, + ], + }, + { + id: 'category-data_frame analytics', + title: i18n.translate('xpack.observability.obltNav.ml.data_frame_analytics', { + defaultMessage: 'Data frame analytics', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:dataFrameAnalytics', + title: i18n.translate( + 'xpack.observability.obltNav.ml.data_frame_analytics.jobs', + { + defaultMessage: 'Jobs', + } + ), + }, + { + link: 'ml:resultExplorer', + }, + { + link: 'ml:analyticsMap', + }, + ], + }, + { + id: 'category-model_management', + title: i18n.translate('xpack.observability.obltNav.ml.model_management', { + defaultMessage: 'Model management', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:nodesOverview', + }, + ], + }, + { + id: 'category-data_visualizer', + title: i18n.translate('xpack.observability.obltNav.ml.data_visualizer', { + defaultMessage: 'Data visualizer', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:fileUpload', + title: i18n.translate( + 'xpack.observability.obltNav.ml.data_visualizer.file_data_visualizer', + { + defaultMessage: 'File data visualizer', + } + ), + }, + { + link: 'ml:indexDataVisualizer', + title: i18n.translate( + 'xpack.observability.obltNav.ml.data_visualizer.file_data_visualizer', + { + defaultMessage: 'Data view data visualizer', + } + ), + }, + { + link: 'ml:dataDrift', + }, + ], + }, + { + id: 'category-aiops_labs', + title: i18n.translate('xpack.observability.obltNav.ml.aiops_labs', { + defaultMessage: 'Aiops labs', + }), + breadcrumbStatus: 'hidden', + children: [ + { + link: 'ml:logRateAnalysis', + }, + { + link: 'ml:logPatternAnalysis', + }, + { + link: 'ml:changePointDetections', + }, + ], + }, + ], + }, { id: 'cloudLinkUserAndRoles', cloudLink: 'userAndRoles', diff --git a/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts b/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts index 9e4db0c33da52..c21844d851dce 100644 --- a/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts +++ b/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts @@ -52,7 +52,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await solutionNavigation.sidenav.openSection('observability_project_nav.aiMl'); // open AI & ML subsection await solutionNavigation.sidenav.clickLink({ deepLinkId: 'ml:anomalyDetection' }); await solutionNavigation.sidenav.expectLinkActive({ deepLinkId: 'ml:anomalyDetection' }); - await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AI & ML' }); + await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Anomaly Detection' }); await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'ml:anomalyDetection', }); From 760958fed9273d05c4f74c7ded9812d757987c24 Mon Sep 17 00:00:00 2001 From: Julian Gernun <17549662+jcger@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:13:00 +0200 Subject: [PATCH 15/28] [Response Ops][Cases] Flaky Cases List Row Actions Update (#192058) Fixes https://github.com/elastic/kibana/issues/191242 Toasts are stacking up until covering the row action to be clicked next. This PR dismiss every toast created after each test. In the status update test this might happen as well and therefore I did add the toast dismissal to the whole row actions test suite. Screenshot 4 --- .../functional/test_suites/observability/cases/list_view.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts index 0605df54825e2..64d28534e8a90 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts @@ -211,6 +211,10 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); describe('row actions', () => { + afterEach(async () => { + await toasts.dismissAll(); + }); + describe('Status', () => { createNCasesBeforeDeleteAllAfter(1, getPageObject, getService); @@ -258,7 +262,6 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { createNCasesBeforeDeleteAllAfter(1, getPageObject, getService); it('deletes a case correctly', async () => { - await toasts.dismissAll(); await cases.casesTable.deleteCase(0); await cases.casesTable.waitForTableToFinishLoading(); await cases.casesTable.validateCasesTableHasNthRows(0); From c5242d7e5bc3a9b4123dfb83e49a568abd3e440d Mon Sep 17 00:00:00 2001 From: natasha-moore-elastic <137783811+natasha-moore-elastic@users.noreply.github.com> Date: Wed, 4 Sep 2024 10:29:27 +0100 Subject: [PATCH 16/28] Improves Endpoint management API docs content (#191932) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Resolves https://github.com/elastic/security-docs-internal/issues/37 by improving the Endpoint management API docs content. Adds missing and improves existing operation summaries and operation descriptions to adhere to our [OAS standards](https://elasticco.atlassian.net/wiki/spaces/DOC/pages/450494532/API+reference+docs). **Note**: Couldn’t add descriptions for the following operations, since they’re not documented in [ESS API docs](https://www.elastic.co/guide/en/security/8.15/management-api-overview.html): - POST /api/endpoint/protection_updates_note/{package_policy_id} - GET /api/endpoint/protection_updates_note/{package_policy_id} - GET /api/endpoint/policy/summaries - GET /api/endpoint/policy_response - POST /api/endpoint/suggestions/{suggestion_type} - GET /api/endpoint/metadata - GET /api/endpoint/metadata/{id} - GET /api/endpoint/metadata/transforms --------- Co-authored-by: Ash <1849116+ashokaditya@users.noreply.github.com> Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../deprecated_action_log.schema.yaml | 4 +- .../actions/details/details.schema.yaml | 4 +- .../file_download/file_download.schema.yaml | 6 +- .../actions/file_info/file_info.schema.yaml | 6 +- .../endpoint/actions/list/list.schema.yaml | 4 +- .../execute/execute.schema.yaml | 4 +- .../get_file/get_file.schema.yaml | 4 +- .../isolate/deprecated_isolate.schema.yaml | 6 +- .../isolate/isolate.schema.yaml | 4 +- .../kill_process/kill_process.schema.yaml | 4 +- .../running_procs/running_procs.schema.yaml | 4 +- .../response_actions/scan/scan.schema.yaml | 4 +- .../suspend_process.schema.yaml | 4 +- .../deprecated_unisolate.schema.yaml | 6 +- .../unisolate/unisolate.schema.yaml | 4 +- .../upload/upload.schema.yaml | 4 +- .../endpoint/actions/state/state.schema.yaml | 3 +- .../actions/status/status.schema.yaml | 4 +- .../metadata/get_metadata.schema.yaml | 6 +- ...eprecated_agent_policy_summary.schema.yaml | 2 +- .../policy/policy_response.schema.yaml | 2 +- .../protection_updates_note.schema.yaml | 4 +- ...agement_api_2023_10_31.bundled.schema.yaml | 107 +++++++++++------- ...agement_api_2023_10_31.bundled.schema.yaml | 89 ++++++++------- .../services/security_solution_api.gen.ts | 50 ++++---- 25 files changed, 192 insertions(+), 147 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/action_log/deprecated_action_log.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/action_log/deprecated_action_log.schema.yaml index d46a1cbe7d9ba..783fc4794f8bc 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/action_log/deprecated_action_log.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/action_log/deprecated_action_log.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action_log/{agent_id}: get: - summary: Get action requests log schema + summary: Get an action request log operationId: EndpointGetActionLog - description: Get action requests log + description: Get an action request log for the specified agent ID. deprecated: true x-codegen-enabled: false x-labels: [ess, serverless] diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/details/details.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/details/details.schema.yaml index ec3a184e6e9a9..7cf2f808e06f8 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/details/details.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/details/details.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/{action_id}: get: - summary: Get Action details schema + summary: Get action details operationId: EndpointGetActionsDetails - description: Get action details + description: Get the details of a response action using the action ID. x-codegen-enabled: true x-labels: [ess, serverless] parameters: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/file_download/file_download.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/file_download/file_download.schema.yaml index 8842d1b6acc61..a17baf34b782d 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/file_download/file_download.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/file_download/file_download.schema.yaml @@ -3,11 +3,11 @@ info: title: File Download Schema version: '2023-10-31' paths: - /api/endpoint/action/{action_id}/file/{file_id}/download`: + /api/endpoint/action/{action_id}/file/{file_id}/download: get: - summary: File Download schema + summary: Download a file operationId: EndpointFileDownload - description: Download a file from an endpoint + description: Download a file from an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] parameters: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/file_info/file_info.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/file_info/file_info.schema.yaml index 6199dc56ed1b0..5552ff2054772 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/file_info/file_info.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/file_info/file_info.schema.yaml @@ -3,11 +3,11 @@ info: title: File Info Schema version: '2023-10-31' paths: - /api/endpoint/action/{action_id}/file/{file_id}`: + /api/endpoint/action/{action_id}/file/{file_id}: get: - summary: File Info schema + summary: Get file information operationId: EndpointFileInfo - description: Get file info + description: Get information for the specified file using the file ID. x-codegen-enabled: true x-labels: [ess, serverless] parameters: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/list/list.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/list/list.schema.yaml index b91ba03c60b8d..8e7dcfd5412f4 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/list/list.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/list/list.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action: get: - summary: Get Actions List schema + summary: Get response actions operationId: EndpointGetActionsList - description: Get a list of action requests and their responses + description: Get a list of all response actions. x-codegen-enabled: true x-labels: [ess, serverless] parameters: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/execute/execute.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/execute/execute.schema.yaml index beafae76a4ba6..f2496687b8fb0 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/execute/execute.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/execute/execute.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/execute: post: - summary: Execute Action + summary: Run a command operationId: EndpointExecuteAction - description: Execute a given command on an endpoint + description: Run a shell command on an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/get_file/get_file.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/get_file/get_file.schema.yaml index a5211580d7e42..cc36b843110b8 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/get_file/get_file.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/get_file/get_file.schema.yaml @@ -6,9 +6,9 @@ info: paths: /api/endpoint/action/get_file: post: - summary: Get File Action + summary: Get a file operationId: EndpointGetFileAction - description: Get a file from an endpoint + description: Get a file from an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/deprecated_isolate.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/deprecated_isolate.schema.yaml index 89d97c948c5d9..6b6b6c317265e 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/deprecated_isolate.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/deprecated_isolate.schema.yaml @@ -5,7 +5,11 @@ info: paths: /api/endpoint/isolate: post: - summary: Permanently redirects to a new location + summary: Isolate an endpoint + description: | + Isolate an endpoint from the network. + > info + > This URL will return a 308 permanent redirect to `POST :/api/endpoint/action/isolate`. operationId: EndpointIsolateRedirect deprecated: true x-codegen-enabled: true diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/isolate.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/isolate.schema.yaml index f721c69efa570..5bfd57a4e406d 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/isolate.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/isolate/isolate.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/isolate: post: - summary: Isolate Action + summary: Isolate an endpoint operationId: EndpointIsolateAction - description: Isolate an endpoint + description: Isolate an endpoint from the network. The endpoint remains isolated until it's released. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/kill_process/kill_process.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/kill_process/kill_process.schema.yaml index 0014026664fe2..65b2e0a4be1b0 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/kill_process/kill_process.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/kill_process/kill_process.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/kill_process: post: - summary: Kill process Action + summary: Terminate a process operationId: EndpointKillProcessAction - description: Kill a running process on an endpoint + description: Terminate a running process on an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/running_procs/running_procs.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/running_procs/running_procs.schema.yaml index 0d5ced3b205f4..d49af9a84bc8e 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/running_procs/running_procs.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/running_procs/running_procs.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/running_procs: post: - summary: Get Running Processes Action + summary: Get running processes operationId: EndpointGetProcessesAction - description: Get list of running processes on an endpoint + description: Get a list of all processes running on an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/scan/scan.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/scan/scan.schema.yaml index beea986e4546c..7ebf23a51ad7a 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/scan/scan.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/scan/scan.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/scan: post: - summary: Scan Action + summary: Scan a file or directory operationId: EndpointScanAction - description: Scan a file or directory + description: Scan a specific file or directory on an endpoint for malware. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/suspend_process/suspend_process.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/suspend_process/suspend_process.schema.yaml index f5f5b1e46ed2d..1ca77ee262442 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/suspend_process/suspend_process.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/suspend_process/suspend_process.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/suspend_process: post: - summary: Suspend process Action + summary: Suspend a process operationId: EndpointSuspendProcessAction - description: Suspend a running process on an endpoint + description: Suspend a running process on an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/deprecated_unisolate.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/deprecated_unisolate.schema.yaml index 1d347f90fed44..f8504193cc060 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/deprecated_unisolate.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/deprecated_unisolate.schema.yaml @@ -5,7 +5,11 @@ info: paths: /api/endpoint/unisolate: post: - summary: Permanently redirects to a new location + summary: Release an isolated endpoint + description: | + Release an isolated endpoint, allowing it to rejoin a network. + > info + > This URL will return a 308 permanent redirect to `POST :/api/endpoint/action/unisolate`. operationId: EndpointUnisolateRedirect deprecated: true x-codegen-enabled: true diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/unisolate.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/unisolate.schema.yaml index 6c12a21f3241a..344f1c89eb096 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/unisolate.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/unisolate/unisolate.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/unisolate: post: - summary: Unisolate Action + summary: Release an isolated endpoint operationId: EndpointUnisolateAction - description: Release an endpoint + description: Release an isolated endpoint, allowing it to rejoin a network. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/upload/upload.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/upload/upload.schema.yaml index ff62065ae5403..512fc6c4d4613 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/upload/upload.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/response_actions/upload/upload.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action/upload: post: - summary: Upload Action + summary: Upload a file operationId: EndpointUploadAction - description: Upload a file to an endpoint + description: Upload a file to an endpoint. x-codegen-enabled: true x-labels: [ess, serverless] requestBody: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/state/state.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/state/state.schema.yaml index f97bd90104cfb..467cc3e7e93d8 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/state/state.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/state/state.schema.yaml @@ -5,7 +5,8 @@ info: paths: /api/endpoint/action/state: get: - summary: Get Action State schema + summary: Get actions state + description: Get a response actions state, which reports whether encryption is enabled. operationId: EndpointGetActionsState x-codegen-enabled: true x-labels: [ess, serverless] diff --git a/x-pack/plugins/security_solution/common/api/endpoint/actions/status/status.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/actions/status/status.schema.yaml index 235cd87be0219..5d75a8a17faee 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/actions/status/status.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/actions/status/status.schema.yaml @@ -5,9 +5,9 @@ info: paths: /api/endpoint/action_status: get: - summary: Get Actions status schema + summary: Get response actions status operationId: EndpointGetActionsStatus - description: Get action status + description: Get the status of response actions for the specified agent IDs. x-codegen-enabled: true x-labels: [ess, serverless] parameters: diff --git a/x-pack/plugins/security_solution/common/api/endpoint/metadata/get_metadata.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/metadata/get_metadata.schema.yaml index 5ecea044053d2..680eb1b3be7ed 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/metadata/get_metadata.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/metadata/get_metadata.schema.yaml @@ -5,7 +5,7 @@ info: paths: /api/endpoint/metadata: get: - summary: Get Metadata List schema + summary: Get a metadata list operationId: GetEndpointMetadataList x-codegen-enabled: true x-labels: [ess, serverless] @@ -25,7 +25,7 @@ paths: /api/endpoint/metadata/transforms: get: - summary: Get Metadata Transform schema + summary: Get metadata transforms operationId: GetEndpointMetadataTransform x-codegen-enabled: false x-labels: [ess, serverless] @@ -39,7 +39,7 @@ paths: /api/endpoint/metadata/{id}: get: - summary: Get Metadata schema + summary: Get metadata operationId: GetEndpointMetadata x-codegen-enabled: false x-labels: [ess, serverless] diff --git a/x-pack/plugins/security_solution/common/api/endpoint/policy/deprecated_agent_policy_summary.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/policy/deprecated_agent_policy_summary.schema.yaml index 803010a4e8268..4850a0010d27b 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/policy/deprecated_agent_policy_summary.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/policy/deprecated_agent_policy_summary.schema.yaml @@ -5,7 +5,7 @@ info: paths: /api/endpoint/policy/summaries: get: - summary: Get Agent Policy Summary schema + summary: Get an agent policy summary operationId: GetAgentPolicySummary deprecated: true x-codegen-enabled: true diff --git a/x-pack/plugins/security_solution/common/api/endpoint/policy/policy_response.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/policy/policy_response.schema.yaml index 7acc39013da85..b103fdd37aba2 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/policy/policy_response.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/policy/policy_response.schema.yaml @@ -5,7 +5,7 @@ info: paths: /api/endpoint/policy_response: get: - summary: Get Policy Response schema + summary: Get a policy response operationId: GetPolicyResponse x-codegen-enabled: true x-labels: [ess, serverless] diff --git a/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note.schema.yaml b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note.schema.yaml index 44c02e417b185..e08e643bcb0b0 100644 --- a/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note.schema.yaml @@ -5,7 +5,7 @@ info: paths: /api/endpoint/protection_updates_note/{package_policy_id}: get: - summary: Get Protection Updates Note schema + summary: Get a protection updates note operationId: GetProtectionUpdatesNote x-codegen-enabled: true x-labels: [ess, serverless] @@ -23,7 +23,7 @@ paths: schema: $ref: '../model/schema/common.schema.yaml#/components/schemas/ProtectionUpdatesNoteResponse' post: - summary: Create Update Protection Updates Note schema + summary: Create or update a protection updates note operationId: CreateUpdateProtectionUpdatesNote x-codegen-enabled: true x-labels: [ess, serverless] diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml index 2f64b045cf7ff..384aa3147e87b 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml @@ -13,7 +13,7 @@ servers: paths: /api/endpoint/action: get: - description: Get a list of action requests and their responses + description: Get a list of all response actions. operationId: EndpointGetActionsList parameters: - in: query @@ -28,13 +28,13 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Actions List schema + summary: Get response actions tags: - Security Solution Endpoint Management API '/api/endpoint/action_log/{agent_id}': get: deprecated: true - description: Get action requests log + description: Get an action request log for the specified agent ID. operationId: EndpointGetActionLog parameters: - in: path @@ -54,12 +54,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get action requests log schema + summary: Get an action request log tags: - Security Solution Endpoint Management API /api/endpoint/action_status: get: - description: Get action status + description: Get the status of response actions for the specified agent IDs. operationId: EndpointGetActionsStatus parameters: - in: query @@ -77,12 +77,12 @@ paths: schema: $ref: '#/components/schemas/ActionStatusSuccessResponse' description: OK - summary: Get Actions status schema + summary: Get response actions status tags: - Security Solution Endpoint Management API '/api/endpoint/action/{action_id}': get: - description: Get action details + description: Get the details of a response action using the action ID. operationId: EndpointGetActionsDetails parameters: - in: path @@ -97,13 +97,13 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Action details schema + summary: Get action details tags: - Security Solution Endpoint Management API - '/api/endpoint/action/{action_id}/file/{file_id}/download`': + '/api/endpoint/action/{action_id}/file/{file_id}': get: - description: Download a file from an endpoint - operationId: EndpointFileDownload + description: Get information for the specified file using the file ID. + operationId: EndpointFileInfo parameters: - in: path name: action_id @@ -122,13 +122,13 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: File Download schema + summary: Get file information tags: - Security Solution Endpoint Management API - '/api/endpoint/action/{action_id}/file/{file_id}`': + '/api/endpoint/action/{action_id}/file/{file_id}/download': get: - description: Get file info - operationId: EndpointFileInfo + description: Download a file from an endpoint. + operationId: EndpointFileDownload parameters: - in: path name: action_id @@ -147,12 +147,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: File Info schema + summary: Download a file tags: - Security Solution Endpoint Management API /api/endpoint/action/execute: post: - description: Execute a given command on an endpoint + description: Run a shell command on an endpoint. operationId: EndpointExecuteAction requestBody: content: @@ -167,12 +167,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Execute Action + summary: Run a command tags: - Security Solution Endpoint Management API /api/endpoint/action/get_file: post: - description: Get a file from an endpoint + description: Get a file from an endpoint. operationId: EndpointGetFileAction requestBody: content: @@ -187,12 +187,14 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get File Action + summary: Get a file tags: - Security Solution Endpoint Management API /api/endpoint/action/isolate: post: - description: Isolate an endpoint + description: >- + Isolate an endpoint from the network. The endpoint remains isolated + until it's released. operationId: EndpointIsolateAction requestBody: content: @@ -207,12 +209,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Isolate Action + summary: Isolate an endpoint tags: - Security Solution Endpoint Management API /api/endpoint/action/kill_process: post: - description: Kill a running process on an endpoint + description: Terminate a running process on an endpoint. operationId: EndpointKillProcessAction requestBody: content: @@ -227,12 +229,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Kill process Action + summary: Terminate a process tags: - Security Solution Endpoint Management API /api/endpoint/action/running_procs: post: - description: Get list of running processes on an endpoint + description: Get a list of all processes running on an endpoint. operationId: EndpointGetProcessesAction requestBody: content: @@ -247,12 +249,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Running Processes Action + summary: Get running processes tags: - Security Solution Endpoint Management API /api/endpoint/action/scan: post: - description: Scan a file or directory + description: Scan a specific file or directory on an endpoint for malware. operationId: EndpointScanAction requestBody: content: @@ -267,11 +269,14 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Scan Action + summary: Scan a file or directory tags: - Security Solution Endpoint Management API /api/endpoint/action/state: get: + description: >- + Get a response actions state, which reports whether encryption is + enabled. operationId: EndpointGetActionsState responses: '200': @@ -280,12 +285,12 @@ paths: schema: $ref: '#/components/schemas/ActionStateSuccessResponse' description: OK - summary: Get Action State schema + summary: Get actions state tags: - Security Solution Endpoint Management API /api/endpoint/action/suspend_process: post: - description: Suspend a running process on an endpoint + description: Suspend a running process on an endpoint. operationId: EndpointSuspendProcessAction requestBody: content: @@ -300,12 +305,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Suspend process Action + summary: Suspend a process tags: - Security Solution Endpoint Management API /api/endpoint/action/unisolate: post: - description: Release an endpoint + description: 'Release an isolated endpoint, allowing it to rejoin a network.' operationId: EndpointUnisolateAction requestBody: content: @@ -320,12 +325,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Unisolate Action + summary: Release an isolated endpoint tags: - Security Solution Endpoint Management API /api/endpoint/action/upload: post: - description: Upload a file to an endpoint + description: Upload a file to an endpoint. operationId: EndpointUploadAction requestBody: content: @@ -340,12 +345,19 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Upload Action + summary: Upload a file tags: - Security Solution Endpoint Management API /api/endpoint/isolate: post: deprecated: true + description: > + Isolate an endpoint from the network. + + > info + + > This URL will return a 308 permanent redirect to `POST :/api/endpoint/action/isolate`. operationId: EndpointIsolateRedirect requestBody: content: @@ -383,7 +395,7 @@ paths: schema: example: /api/endpoint/action/isolate type: string - summary: Permanently redirects to a new location + summary: Isolate an endpoint tags: - Security Solution Endpoint Management API /api/endpoint/metadata: @@ -402,7 +414,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Metadata List schema + summary: Get a metadata list tags: - Security Solution Endpoint Management API '/api/endpoint/metadata/{id}': @@ -421,7 +433,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Metadata schema + summary: Get metadata tags: - Security Solution Endpoint Management API /api/endpoint/metadata/transforms: @@ -434,7 +446,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Metadata Transform schema + summary: Get metadata transforms tags: - Security Solution Endpoint Management API /api/endpoint/policy_response: @@ -456,7 +468,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Policy Response schema + summary: Get a policy response tags: - Security Solution Endpoint Management API /api/endpoint/policy/summaries: @@ -482,7 +494,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Agent Policy Summary schema + summary: Get an agent policy summary tags: - Security Solution Endpoint Management API '/api/endpoint/protection_updates_note/{package_policy_id}': @@ -501,7 +513,7 @@ paths: schema: $ref: '#/components/schemas/ProtectionUpdatesNoteResponse' description: OK - summary: Get Protection Updates Note schema + summary: Get a protection updates note tags: - Security Solution Endpoint Management API post: @@ -528,7 +540,7 @@ paths: schema: $ref: '#/components/schemas/ProtectionUpdatesNoteResponse' description: OK - summary: Create Update Protection Updates Note schema + summary: Create or update a protection updates note tags: - Security Solution Endpoint Management API '/api/endpoint/suggestions/{suggestion_type}': @@ -570,6 +582,13 @@ paths: /api/endpoint/unisolate: post: deprecated: true + description: > + Release an isolated endpoint, allowing it to rejoin a network. + + > info + + > This URL will return a 308 permanent redirect to `POST :/api/endpoint/action/unisolate`. operationId: EndpointUnisolateRedirect requestBody: content: @@ -607,7 +626,7 @@ paths: schema: example: /api/endpoint/action/unisolate type: string - summary: Permanently redirects to a new location + summary: Release an isolated endpoint tags: - Security Solution Endpoint Management API components: diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml index cb1c177e78bf8..87ee066125354 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_endpoint_management_api_2023_10_31.bundled.schema.yaml @@ -13,7 +13,7 @@ servers: paths: /api/endpoint/action: get: - description: Get a list of action requests and their responses + description: Get a list of all response actions. operationId: EndpointGetActionsList parameters: - in: query @@ -28,13 +28,13 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Actions List schema + summary: Get response actions tags: - Security Solution Endpoint Management API '/api/endpoint/action_log/{agent_id}': get: deprecated: true - description: Get action requests log + description: Get an action request log for the specified agent ID. operationId: EndpointGetActionLog parameters: - in: path @@ -54,12 +54,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get action requests log schema + summary: Get an action request log tags: - Security Solution Endpoint Management API /api/endpoint/action_status: get: - description: Get action status + description: Get the status of response actions for the specified agent IDs. operationId: EndpointGetActionsStatus parameters: - in: query @@ -77,12 +77,12 @@ paths: schema: $ref: '#/components/schemas/ActionStatusSuccessResponse' description: OK - summary: Get Actions status schema + summary: Get response actions status tags: - Security Solution Endpoint Management API '/api/endpoint/action/{action_id}': get: - description: Get action details + description: Get the details of a response action using the action ID. operationId: EndpointGetActionsDetails parameters: - in: path @@ -97,13 +97,13 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Action details schema + summary: Get action details tags: - Security Solution Endpoint Management API - '/api/endpoint/action/{action_id}/file/{file_id}/download`': + '/api/endpoint/action/{action_id}/file/{file_id}': get: - description: Download a file from an endpoint - operationId: EndpointFileDownload + description: Get information for the specified file using the file ID. + operationId: EndpointFileInfo parameters: - in: path name: action_id @@ -122,13 +122,13 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: File Download schema + summary: Get file information tags: - Security Solution Endpoint Management API - '/api/endpoint/action/{action_id}/file/{file_id}`': + '/api/endpoint/action/{action_id}/file/{file_id}/download': get: - description: Get file info - operationId: EndpointFileInfo + description: Download a file from an endpoint. + operationId: EndpointFileDownload parameters: - in: path name: action_id @@ -147,12 +147,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: File Info schema + summary: Download a file tags: - Security Solution Endpoint Management API /api/endpoint/action/execute: post: - description: Execute a given command on an endpoint + description: Run a shell command on an endpoint. operationId: EndpointExecuteAction requestBody: content: @@ -167,12 +167,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Execute Action + summary: Run a command tags: - Security Solution Endpoint Management API /api/endpoint/action/get_file: post: - description: Get a file from an endpoint + description: Get a file from an endpoint. operationId: EndpointGetFileAction requestBody: content: @@ -187,12 +187,14 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get File Action + summary: Get a file tags: - Security Solution Endpoint Management API /api/endpoint/action/isolate: post: - description: Isolate an endpoint + description: >- + Isolate an endpoint from the network. The endpoint remains isolated + until it's released. operationId: EndpointIsolateAction requestBody: content: @@ -207,12 +209,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Isolate Action + summary: Isolate an endpoint tags: - Security Solution Endpoint Management API /api/endpoint/action/kill_process: post: - description: Kill a running process on an endpoint + description: Terminate a running process on an endpoint. operationId: EndpointKillProcessAction requestBody: content: @@ -227,12 +229,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Kill process Action + summary: Terminate a process tags: - Security Solution Endpoint Management API /api/endpoint/action/running_procs: post: - description: Get list of running processes on an endpoint + description: Get a list of all processes running on an endpoint. operationId: EndpointGetProcessesAction requestBody: content: @@ -247,12 +249,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Running Processes Action + summary: Get running processes tags: - Security Solution Endpoint Management API /api/endpoint/action/scan: post: - description: Scan a file or directory + description: Scan a specific file or directory on an endpoint for malware. operationId: EndpointScanAction requestBody: content: @@ -267,11 +269,14 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Scan Action + summary: Scan a file or directory tags: - Security Solution Endpoint Management API /api/endpoint/action/state: get: + description: >- + Get a response actions state, which reports whether encryption is + enabled. operationId: EndpointGetActionsState responses: '200': @@ -280,12 +285,12 @@ paths: schema: $ref: '#/components/schemas/ActionStateSuccessResponse' description: OK - summary: Get Action State schema + summary: Get actions state tags: - Security Solution Endpoint Management API /api/endpoint/action/suspend_process: post: - description: Suspend a running process on an endpoint + description: Suspend a running process on an endpoint. operationId: EndpointSuspendProcessAction requestBody: content: @@ -300,12 +305,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Suspend process Action + summary: Suspend a process tags: - Security Solution Endpoint Management API /api/endpoint/action/unisolate: post: - description: Release an endpoint + description: 'Release an isolated endpoint, allowing it to rejoin a network.' operationId: EndpointUnisolateAction requestBody: content: @@ -320,12 +325,12 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Unisolate Action + summary: Release an isolated endpoint tags: - Security Solution Endpoint Management API /api/endpoint/action/upload: post: - description: Upload a file to an endpoint + description: Upload a file to an endpoint. operationId: EndpointUploadAction requestBody: content: @@ -340,7 +345,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Upload Action + summary: Upload a file tags: - Security Solution Endpoint Management API /api/endpoint/metadata: @@ -359,7 +364,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Metadata List schema + summary: Get a metadata list tags: - Security Solution Endpoint Management API '/api/endpoint/metadata/{id}': @@ -378,7 +383,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Metadata schema + summary: Get metadata tags: - Security Solution Endpoint Management API /api/endpoint/metadata/transforms: @@ -391,7 +396,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Metadata Transform schema + summary: Get metadata transforms tags: - Security Solution Endpoint Management API /api/endpoint/policy_response: @@ -413,7 +418,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Policy Response schema + summary: Get a policy response tags: - Security Solution Endpoint Management API /api/endpoint/policy/summaries: @@ -439,7 +444,7 @@ paths: schema: $ref: '#/components/schemas/SuccessResponse' description: OK - summary: Get Agent Policy Summary schema + summary: Get an agent policy summary tags: - Security Solution Endpoint Management API '/api/endpoint/protection_updates_note/{package_policy_id}': @@ -458,7 +463,7 @@ paths: schema: $ref: '#/components/schemas/ProtectionUpdatesNoteResponse' description: OK - summary: Get Protection Updates Note schema + summary: Get a protection updates note tags: - Security Solution Endpoint Management API post: @@ -485,7 +490,7 @@ paths: schema: $ref: '#/components/schemas/ProtectionUpdatesNoteResponse' description: OK - summary: Create Update Protection Updates Note schema + summary: Create or update a protection updates note tags: - Security Solution Endpoint Management API '/api/endpoint/suggestions/{suggestion_type}': diff --git a/x-pack/test/api_integration/services/security_solution_api.gen.ts b/x-pack/test/api_integration/services/security_solution_api.gen.ts index b1df28bdf908c..0ba9936f4eb66 100644 --- a/x-pack/test/api_integration/services/security_solution_api.gen.ts +++ b/x-pack/test/api_integration/services/security_solution_api.gen.ts @@ -366,7 +366,7 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, /** - * Execute a given command on an endpoint + * Run a shell command on an endpoint. */ endpointExecuteAction(props: EndpointExecuteActionProps) { return supertest @@ -377,32 +377,29 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Download a file from an endpoint + * Download a file from an endpoint. */ endpointFileDownload(props: EndpointFileDownloadProps) { return supertest .get( - replaceParams( - '/api/endpoint/action/{action_id}/file/{file_id}/download`', - props.params - ) + replaceParams('/api/endpoint/action/{action_id}/file/{file_id}/download', props.params) ) .set('kbn-xsrf', 'true') .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, /** - * Get file info + * Get information for the specified file using the file ID. */ endpointFileInfo(props: EndpointFileInfoProps) { return supertest - .get(replaceParams('/api/endpoint/action/{action_id}/file/{file_id}`', props.params)) + .get(replaceParams('/api/endpoint/action/{action_id}/file/{file_id}', props.params)) .set('kbn-xsrf', 'true') .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, /** - * Get action details + * Get the details of a response action using the action ID. */ endpointGetActionsDetails(props: EndpointGetActionsDetailsProps) { return supertest @@ -412,7 +409,7 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, /** - * Get a list of action requests and their responses + * Get a list of all response actions. */ endpointGetActionsList(props: EndpointGetActionsListProps) { return supertest @@ -422,6 +419,9 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query(props.query); }, + /** + * Get a response actions state, which reports whether encryption is enabled. + */ endpointGetActionsState() { return supertest .get('/api/endpoint/action/state') @@ -430,7 +430,7 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, /** - * Get action status + * Get the status of response actions for the specified agent IDs. */ endpointGetActionsStatus(props: EndpointGetActionsStatusProps) { return supertest @@ -441,7 +441,7 @@ Migrations are initiated per index. While the process is neither destructive nor .query(props.query); }, /** - * Get a file from an endpoint + * Get a file from an endpoint. */ endpointGetFileAction(props: EndpointGetFileActionProps) { return supertest @@ -452,7 +452,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Get list of running processes on an endpoint + * Get a list of all processes running on an endpoint. */ endpointGetProcessesAction(props: EndpointGetProcessesActionProps) { return supertest @@ -463,7 +463,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Isolate an endpoint + * Isolate an endpoint from the network. The endpoint remains isolated until it's released. */ endpointIsolateAction(props: EndpointIsolateActionProps) { return supertest @@ -473,6 +473,12 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Isolate an endpoint from the network. +> info +> This URL will return a 308 permanent redirect to `POST :/api/endpoint/action/isolate`. + + */ endpointIsolateRedirect(props: EndpointIsolateRedirectProps) { return supertest .post('/api/endpoint/isolate') @@ -482,7 +488,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Kill a running process on an endpoint + * Terminate a running process on an endpoint. */ endpointKillProcessAction(props: EndpointKillProcessActionProps) { return supertest @@ -493,7 +499,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Scan a file or directory + * Scan a specific file or directory on an endpoint for malware. */ endpointScanAction(props: EndpointScanActionProps) { return supertest @@ -504,7 +510,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Suspend a running process on an endpoint + * Suspend a running process on an endpoint. */ endpointSuspendProcessAction(props: EndpointSuspendProcessActionProps) { return supertest @@ -515,7 +521,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Release an endpoint + * Release an isolated endpoint, allowing it to rejoin a network. */ endpointUnisolateAction(props: EndpointUnisolateActionProps) { return supertest @@ -525,6 +531,12 @@ Migrations are initiated per index. While the process is neither destructive nor .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(props.body as object); }, + /** + * Release an isolated endpoint, allowing it to rejoin a network. +> info +> This URL will return a 308 permanent redirect to `POST :/api/endpoint/action/unisolate`. + + */ endpointUnisolateRedirect(props: EndpointUnisolateRedirectProps) { return supertest .post('/api/endpoint/unisolate') @@ -534,7 +546,7 @@ Migrations are initiated per index. While the process is neither destructive nor .send(props.body as object); }, /** - * Upload a file to an endpoint + * Upload a file to an endpoint. */ endpointUploadAction(props: EndpointUploadActionProps) { return supertest From 4a59b49917f25f9933965cff90ac064c6127bfb2 Mon Sep 17 00:00:00 2001 From: Katerina Date: Wed, 4 Sep 2024 13:07:42 +0300 Subject: [PATCH 17/28] [APM][Refactor] Rename create_assets_es_client to create_entities_es_client (#192061) ## Summary Refactoring: Rename assets to entities --- .../create_entities_es_client.ts} | 0 .../routes/custom_dashboards/get_entities_with_dashboards.ts | 2 +- .../apm/server/routes/custom_dashboards/route.ts | 2 +- .../apm/server/routes/entities/get_entities.ts | 2 +- .../routes/entities/get_service_entities_history_metrics.ts | 2 +- .../routes/entities/get_service_entities_history_timeseries.ts | 2 +- .../apm/server/routes/entities/get_service_entity_summary.ts | 2 +- .../apm/server/routes/entities/get_service_latest_entity.ts | 2 +- .../apm/server/routes/entities/services/get_service_entities.ts | 2 +- .../apm/server/routes/entities/services/routes.ts | 2 +- .../routes/historical_data/has_historical_entities_data.ts | 2 +- .../apm/server/routes/historical_data/route.ts | 2 +- .../observability_solution/apm/server/routes/services/route.ts | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/{create_assets_es_client/create_assets_es_clients.ts => create_entities_es_client/create_entities_es_client.ts} (100%) diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client.ts similarity index 100% rename from x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts rename to x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client.ts diff --git a/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/get_entities_with_dashboards.ts b/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/get_entities_with_dashboards.ts index 0d5b443ae6d45..df1f785216367 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/get_entities_with_dashboards.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/get_entities_with_dashboards.ts @@ -9,7 +9,7 @@ import { kqlQuery, termQuery } from '@kbn/observability-plugin/server'; import { estypes } from '@elastic/elasticsearch'; import { SERVICE_NAME } from '../../../common/es_fields/apm'; import { SavedApmCustomDashboard } from '../../../common/custom_dashboards'; -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; function getSearchRequest(filters: estypes.QueryDslQueryContainer[]) { return { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/route.ts index 4fcc1508715d1..750bacb4ba455 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/custom_dashboards/route.ts @@ -14,7 +14,7 @@ import { getCustomDashboards } from './get_custom_dashboards'; import { getServicesWithDashboards } from './get_services_with_dashboards'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; import { rangeRt } from '../default_api_types'; -import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { getEntitiesWithDashboards } from './get_entities_with_dashboards'; const serviceDashboardSaveRoute = createApmServerRoute({ diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_entities.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_entities.ts index a69a906454ff7..e3a40b698eb13 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_entities.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_entities.ts @@ -14,7 +14,7 @@ import { } from '../../../common/es_fields/apm'; import { FIRST_SEEN, LAST_SEEN, ENTITY, ENTITY_TYPE } from '../../../common/es_fields/entities'; import { environmentQuery } from '../../../common/utils/environment_query'; -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { getServiceEntitiesHistoryMetrics } from './get_service_entities_history_metrics'; import { EntitiesRaw, EntityType, ServiceEntities } from './types'; import { isFiniteNumber } from '../../../common/utils/is_finite_number'; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_metrics.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_metrics.ts index 606c1748aa0a0..5355cfd8b563c 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_metrics.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_metrics.ts @@ -16,7 +16,7 @@ import { ENTITY_METRICS_THROUGHPUT, LAST_SEEN, } from '../../../common/es_fields/entities'; -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; interface Params { entitiesESClient: EntitiesESClient; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_timeseries.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_timeseries.ts index 6e969b6022bf2..73811a544701b 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_timeseries.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entities_history_timeseries.ts @@ -17,7 +17,7 @@ import { LAST_SEEN, } from '../../../common/es_fields/entities'; import { SERVICE_NAME } from '../../../common/es_fields/apm'; -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { environmentQuery } from '../../../common/utils/environment_query'; interface Params { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entity_summary.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entity_summary.ts index 37e3ddef9ecc0..84886272ba54a 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entity_summary.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_entity_summary.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { withApmSpan } from '../../utils/with_apm_span'; import { getServiceLatestEntity } from './get_service_latest_entity'; import { ServiceEntities } from './types'; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_latest_entity.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_latest_entity.ts index f4a4e4d1a81a4..71cead9a17301 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_latest_entity.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/get_service_latest_entity.ts @@ -14,7 +14,7 @@ import { import { ENTITY, ENTITY_TYPE } from '../../../common/es_fields/entities'; import { environmentQuery } from '../../../common/utils/environment_query'; import { isFiniteNumber } from '../../../common/utils/is_finite_number'; -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { entitiesRangeQuery } from './get_entities'; import { EntitiesRaw, EntityType, ServiceEntities } from './types'; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/services/get_service_entities.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/services/get_service_entities.ts index 0f90afb214cbf..084fbbe438952 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/services/get_service_entities.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/services/get_service_entities.ts @@ -7,7 +7,7 @@ import { errors } from '@elastic/elasticsearch'; import { Logger } from '@kbn/core/server'; import { WrappedElasticsearchClientError } from '@kbn/observability-plugin/server'; -import { EntitiesESClient } from '../../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { withApmSpan } from '../../../utils/with_apm_span'; import { getEntities } from '../get_entities'; import { calculateAvgMetrics } from '../utils/calculate_avg_metrics'; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts index 027bd5bd09c98..fad2e495e8c6e 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts @@ -9,7 +9,7 @@ import { jsonRt } from '@kbn/io-ts-utils'; import * as t from 'io-ts'; import { EntityServiceListItem } from '../../../../common/entities/types'; import { environmentQuery } from '../../../../common/utils/environment_query'; -import { createEntitiesESClient } from '../../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { createEntitiesESClient } from '../../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { createApmServerRoute } from '../../apm_routes/create_apm_server_route'; import { environmentRt, kueryRt, rangeRt } from '../../default_api_types'; import { getServiceEntities } from './get_service_entities'; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_entities_data.ts b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_entities_data.ts index 13c6ebcf7bfd9..f245c27a99036 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_entities_data.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_entities_data.ts @@ -7,7 +7,7 @@ import { WrappedElasticsearchClientError } from '@kbn/observability-plugin/server'; import { Logger } from '@kbn/core/server'; import { errors } from '@elastic/elasticsearch'; -import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { EntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; export async function hasEntitiesData(entitiesESClient: EntitiesESClient, logger: Logger) { const params = { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts index 484590a00a36e..94b7d40b84c2d 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { hasHistoricalAgentData } from './has_historical_agent_data'; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts index f80c58c19ed93..1d4cbd0cef1c3 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts @@ -80,7 +80,7 @@ import { import { getThroughput, ServiceThroughputResponse } from './get_throughput'; import { getServiceEntitySummary } from '../entities/get_service_entity_summary'; import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; -import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_entities_es_client/create_entities_es_client'; const servicesRoute = createApmServerRoute({ endpoint: 'GET /internal/apm/services', From 00230cfe0c23ccbdbbe217f549f64a45f24429a6 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 4 Sep 2024 12:12:27 +0200 Subject: [PATCH 18/28] [CI] use kibana_install_dir from built artifacts (#191909) ## Summary I noticed recently, that the step "Copying ES Snapshot cache" got cancelled due to a lost agent. On closer inspection, it leads to the changed file (`.buildkite/scripts/steps/functional/osquery_cypress.sh`) where with a note, there's a kibana rebuild. Unless there's something special in that rebuild, we should be using the artifacts built in the build step. So let's follow the TODO notes, and use the downloaded artifacts - this should save ~6m per step where the osquery tests were warmed up. ## Before From [on-merge#49584](https://buildkite.com/elastic/kibana-on-merge/builds/49584), running the pre-PR version: - You can see, after the copying of es snapshot cache, the command to build kibana's plugins is ran, taking 6+ minutes Screenshot 2024-09-02 at 16 25 43 ## After This is on the [PR build](https://buildkite.com/elastic/kibana-pull-request/builds/231455#0191b2cc-f8be-410d-860d-59ab9f984477): - You can see, the es snapshot cache update is only 6 sec, after that, we can get going with the testing Screenshot 2024-09-02 at 16 28 10 ## Results On a primitive comparison between the PR build (https://buildkite.com/elastic/kibana-pull-request/builds/231505) and an on-merge run (https://buildkite.com/elastic/kibana-on-merge/builds/49598) we've **saved on average 9 minutes per runs** of `Osquery Cypress Tests`. We can only say more adequate savings once we compare on-merge with on-merge, but it can be estimated this would be **16 x 9 minutes = 144 minutes** (16 = 8 osquery cypress + 8 osquery serverless cypress) per on-merges. --- .buildkite/scripts/steps/functional/osquery_cypress.sh | 6 +----- .buildkite/scripts/steps/functional/osquery_cypress_burn.sh | 5 ++--- .../scripts/steps/functional/security_serverless_osquery.sh | 6 +----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/.buildkite/scripts/steps/functional/osquery_cypress.sh b/.buildkite/scripts/steps/functional/osquery_cypress.sh index 9ba7cabc4d1cb..0ae47edd8c8e7 100755 --- a/.buildkite/scripts/steps/functional/osquery_cypress.sh +++ b/.buildkite/scripts/steps/functional/osquery_cypress.sh @@ -4,11 +4,7 @@ set -euo pipefail source .buildkite/scripts/steps/functional/common.sh -# TODO: remove the line below to use build artifacts for tests. -# in addition to remove the line, we will have to expose the kibana install dir into the downloaded build location -# by exporting a var like: -# export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION} -node scripts/build_kibana_platform_plugins.js +export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION} export JOB=kibana-osquery-cypress diff --git a/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh b/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh index 8068dccac64f3..bebd391d95254 100755 --- a/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh +++ b/.buildkite/scripts/steps/functional/osquery_cypress_burn.sh @@ -2,10 +2,9 @@ set -euo pipefail -source .buildkite/scripts/common/util.sh +source .buildkite/scripts/steps/functional/common.sh -.buildkite/scripts/bootstrap.sh -node scripts/build_kibana_platform_plugins.js +export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION} export JOB=kibana-osquery-cypress diff --git a/.buildkite/scripts/steps/functional/security_serverless_osquery.sh b/.buildkite/scripts/steps/functional/security_serverless_osquery.sh index 27ed0c79871ee..9844222e7f869 100755 --- a/.buildkite/scripts/steps/functional/security_serverless_osquery.sh +++ b/.buildkite/scripts/steps/functional/security_serverless_osquery.sh @@ -4,11 +4,7 @@ set -euo pipefail source .buildkite/scripts/steps/functional/common.sh -# TODO: remove the line below to use build artifacts for tests. -# in addition to remove the line, we will have to expose the kibana install dir into the downloaded build location -# by exporting a var like: -# export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION} -node scripts/build_kibana_platform_plugins.js +export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION} export JOB=kibana-osquery-cypress-serverless From d21d3987e83b35e530acf233da4793374d9fb75c Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Wed, 4 Sep 2024 13:45:27 +0200 Subject: [PATCH 19/28] Add publicBaseUrl to Elasticsearch config (#191837) ## Summary This adds a publicBaseUrl to the Elasticsearch plugin config so users can set a publicly accessible URL for Elasticsearch. --------- Co-authored-by: Rudolf Meijering --- docs/setup/settings.asciidoc | 9 ++++++--- .../src/elasticsearch_config.ts | 1 + .../core-elasticsearch-server/src/contracts.ts | 6 ++++++ x-pack/plugins/cloud/server/plugin.ts | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 6df6c8f3c95ee..98968780f3368 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -14,7 +14,7 @@ KBN_PATH_CONF=/home/kibana/config ./bin/kibana -- The default host and port settings configure {kib} to run on `localhost:5601`. To change this behavior and allow remote users to connect, you'll need to update your `kibana.yml` file. You can also enable SSL and set a -variety of other options. +variety of other options. Environment variables can be injected into configuration using `${MY_ENV_VAR}` syntax. By default, configuration validation will fail if an environment variable used in the config file is not present when Kibana starts. This behavior can be changed by using a default value @@ -93,7 +93,7 @@ The maximum number of sockets that can be used for communications with {es}. *Default: `Infinity`* [[elasticsearch-maxResponseSize]] `elasticsearch.maxResponseSize`:: -Either `false` or a `byteSize` value. When set, responses from {es} with a size higher than the defined limit will be rejected. +Either `false` or a `byteSize` value. When set, responses from {es} with a size higher than the defined limit will be rejected. This is intended to be used as a circuit-breaker mechanism to avoid memory errors in case of unexpectedly high responses coming from {es}. *Default: `false`* @@ -117,6 +117,9 @@ listed here must be on the same cluster. *Default: `[ "http://localhost:9200" ]` To enable SSL/TLS for outbound connections to {es}, use the `https` protocol in this setting. +[[elasticsearch-publicBaseUrl]] `elasticsearch.publicBaseUrl:`:: +The URL through which Elasticsearch is publicly accessible, if any. This will be shown to users in Kibana when they need connection details for your Elasticsearch cluster. + [[elasticsearch-pingTimeout]] `elasticsearch.pingTimeout`:: Time in milliseconds to wait for {es} to respond to pings. *Default: the value of the <> setting* @@ -470,7 +473,7 @@ identifies this {kib} instance. *Default: `"your-hostname"`* setting specifies the port to use. *Default: `5601`* `server.protocol`:: -experimental[] The http protocol to use, either `http1` or `http2`. Set to `http2` to enable `HTTP/2` support for the {kib} server. +experimental[] The http protocol to use, either `http1` or `http2`. Set to `http2` to enable `HTTP/2` support for the {kib} server. *Default: `http1`* + NOTE: By default, enabling `http2` requires a valid `h2c` configuration, meaning that TLS must be enabled via <> diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_config.ts b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_config.ts index 010bc3ac1c796..4807cfe8e598c 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_config.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_config.ts @@ -190,6 +190,7 @@ export const configSchema = schema.object({ { defaultValue: [] } ), dnsCacheTtl: schema.duration({ defaultValue: 0, min: 0 }), + publicBaseUrl: schema.maybe(hostURISchema), }); const deprecations: ConfigDeprecationProvider = () => [ diff --git a/packages/core/elasticsearch/core-elasticsearch-server/src/contracts.ts b/packages/core/elasticsearch/core-elasticsearch-server/src/contracts.ts index fced65ce95c79..e1584e9e63cf3 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server/src/contracts.ts +++ b/packages/core/elasticsearch/core-elasticsearch-server/src/contracts.ts @@ -90,6 +90,12 @@ export interface ElasticsearchServiceSetup { */ readonly config$: Observable; }; + + /** + * The public base URL (if any) that should be used by end users to access the Elasticsearch cluster. + */ + + readonly publicBaseUrl?: string; } /** diff --git a/x-pack/plugins/cloud/server/plugin.ts b/x-pack/plugins/cloud/server/plugin.ts index 362a69b4ac0a6..4d77cae8d870f 100644 --- a/x-pack/plugins/cloud/server/plugin.ts +++ b/x-pack/plugins/cloud/server/plugin.ts @@ -202,7 +202,7 @@ export class CloudPlugin implements Plugin { organizationId, instanceSizeMb: readInstanceSizeMb(), deploymentId, - elasticsearchUrl: decodedId?.elasticsearchUrl, + elasticsearchUrl: core.elasticsearch.publicBaseUrl || decodedId?.elasticsearchUrl, kibanaUrl: decodedId?.kibanaUrl, cloudHost: decodedId?.host, cloudDefaultPort: decodedId?.defaultPort, From e9eb03ace8110201f986895b8d16900f4d99c6d1 Mon Sep 17 00:00:00 2001 From: Katerina Date: Wed, 4 Sep 2024 14:48:00 +0300 Subject: [PATCH 20/28] [APM][ECO] Update logs error % to logs error rate in service inventory (#191959) ## Summary closes https://github.com/elastic/kibana/issues/191253 - Update the metrics filter for the log error rate in service builtin definition - Update column from Log error rate % to log Error rate - Update the formula and the tooltip ### Before https://github.com/user-attachments/assets/87e22dc8-1a67-49ac-ad21-cecf0a1fbb14 ### After https://github.com/user-attachments/assets/3d5eafdb-a829-46f0-a5f0-36b62969ceaf --- .../entities/charts/log_error_rate_chart.tsx | 2 +- .../table/get_service_columns.tsx | 6 ++-- .../charts/helper/get_metrics_formulas.tsx | 2 +- .../server/lib/entities/built_in/services.ts | 11 ++------ .../translations/translations/fr-FR.json | 28 +++++++++---------- .../translations/translations/ja-JP.json | 28 +++++++++---------- .../translations/translations/zh-CN.json | 28 +++++++++---------- 7 files changed, 50 insertions(+), 55 deletions(-) diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/entities/charts/log_error_rate_chart.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/entities/charts/log_error_rate_chart.tsx index 68b41a6542a1a..419605236c8a8 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/entities/charts/log_error_rate_chart.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/entities/charts/log_error_rate_chart.tsx @@ -94,7 +94,7 @@ export function LogErrorRateChart({ height }: { height: number }) { formula={getMetricsFormula(ChartMetricType.LOG_ERROR_RATE)} description={ ); diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_metrics_formulas.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_metrics_formulas.tsx index 5e969d250e1dd..e5b694832c301 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_metrics_formulas.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_metrics_formulas.tsx @@ -12,7 +12,7 @@ export enum ChartMetricType { const metricsFormulasMap: Record = { [ChartMetricType.LOG_RATE]: `count(kql='log.level: *') / [PERIOD_IN_MINUTES]`, - [ChartMetricType.LOG_ERROR_RATE]: `count(kql='log.level: "error" OR log.level: "ERROR"') / count(kql='log.level: *')`, + [ChartMetricType.LOG_ERROR_RATE]: `count(kql='log.level: "error" OR log.level: "ERROR" OR error.log.level: "error"') / [PERIOD_IN_MINUTES]`, }; export function getMetricsFormula(chartMetricType: ChartMetricType) { diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts index 4c97d5cec72ed..78f6b9f4e6041 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts @@ -20,7 +20,7 @@ const serviceTransactionFilter = (additionalFilters: string[] = []) => { export const builtInServicesFromLogsEntityDefinition: EntityDefinition = entityDefinitionSchema.parse({ - version: '1.0.0', + version: '1.0.1', id: `${BUILT_IN_ID_PREFIX}services_from_ecs_data`, name: 'Services from ECS data', description: @@ -104,17 +104,12 @@ export const builtInServicesFromLogsEntityDefinition: EntityDefinition = }, { name: 'logErrorRate', - equation: 'A / B', + equation: 'A', metrics: [ { name: 'A', aggregation: 'doc_count', - filter: 'log.level: "error" OR error.log.level: "error"', - }, - { - name: 'B', - aggregation: 'doc_count', - filter: 'log.level: * OR error.log.level: *', + filter: 'log.level: "error" OR log.level: "ERROR" OR error.log.level: "error"', }, ], }, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c7110d0042477..760d745ebe0c8 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -9473,7 +9473,16 @@ "visualizationUiComponents.filterQueryInput.clickToEdit": "Cliquer pour modifier", "visualizationUiComponents.filterQueryInput.emptyFilterQuery": "(vide)", "visualizationUiComponents.filterQueryInput.label": "Filtrer par", + "visualizationUiComponents.iconSelect.alertIconLabel": "Alerte", + "visualizationUiComponents.iconSelect.asteriskIconLabel": "Astérisque", + "visualizationUiComponents.iconSelect.bellIconLabel": "Cloche", + "visualizationUiComponents.iconSelect.boltIconLabel": "Éclair", + "visualizationUiComponents.iconSelect.bugIconLabel": "Bug", + "visualizationUiComponents.iconSelect.commentIconLabel": "Commentaire", + "visualizationUiComponents.iconSelect.flagIconLabel": "Drapeau", "visualizationUiComponents.iconSelect.label": "Décoration de l’icône", + "visualizationUiComponents.iconSelect.noIconLabel": "Aucun", + "visualizationUiComponents.iconSelect.tagIconLabel": "Balise", "visualizationUiComponents.lineMarker.textVisibility": "Décoration du texte", "visualizationUiComponents.nameInput.columnLabel": "Nom", "visualizationUiComponents.queryInput.queryPlaceholderKql": "{example}", @@ -11089,8 +11098,8 @@ "xpack.apm.serviceIcons.service": "Service", "xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "Architecture", "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, =0 {Zone de disponibilité} one {Zone de disponibilité} other {Zones de disponibilité}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} other {Noms de fonction}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, =0 {Type de déclencheur} one {Type de déclencheur} other {Types de déclencheurs}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} other {Noms de fonction}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, =0{Type de machine} one {Type de machine} other {Types de machines}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.projectIdLabel": "ID de projet", "xpack.apm.serviceIcons.serviceDetails.cloud.providerLabel": "Fournisseur cloud", @@ -26028,15 +26037,6 @@ "xpack.lens.xyChart.horizontalAxisLabel": "Axe horizontal", "xpack.lens.xyChart.horizontalLeftAxisLabel": "Axe supérieur horizontal", "xpack.lens.xyChart.horizontalRightAxisLabel": "Axe inférieur horizontal", - "visualizationUiComponents.iconSelect.alertIconLabel": "Alerte", - "visualizationUiComponents.iconSelect.asteriskIconLabel": "Astérisque", - "visualizationUiComponents.iconSelect.bellIconLabel": "Cloche", - "visualizationUiComponents.iconSelect.boltIconLabel": "Éclair", - "visualizationUiComponents.iconSelect.bugIconLabel": "Bug", - "visualizationUiComponents.iconSelect.commentIconLabel": "Commentaire", - "visualizationUiComponents.iconSelect.flagIconLabel": "Drapeau", - "visualizationUiComponents.iconSelect.noIconLabel": "Aucun", - "visualizationUiComponents.iconSelect.tagIconLabel": "Balise", "xpack.lens.xyChart.layerAnnotation": "Annotation", "xpack.lens.xyChart.layerAnnotationsIgnoreTitle": "Calques ignorant les filtres globaux", "xpack.lens.xyChart.layerAnnotationsLabel": "Annotations", @@ -26951,8 +26951,8 @@ "xpack.maps.source.esSearch.descendingLabel": "décroissant", "xpack.maps.source.esSearch.extentFilterLabel": "Filtre dynamique pour les données de la zone de carte visible", "xpack.maps.source.esSearch.fieldNotFoundMsg": "Impossible de trouver \"{fieldName}\" dans le modèle d'indexation \"{indexPatternName}\".", - "xpack.maps.source.esSearch.geoFieldLabel": "Champ géospatial", "xpack.maps.source.esSearch.geofieldLabel": "Champ géospatial", + "xpack.maps.source.esSearch.geoFieldLabel": "Champ géospatial", "xpack.maps.source.esSearch.geoFieldTypeLabel": "Type de champ géospatial", "xpack.maps.source.esSearch.indexOverOneLengthEditError": "Votre vue de données pointe vers plusieurs index. Un seul index est autorisé par vue de données.", "xpack.maps.source.esSearch.indexZeroLengthEditError": "Votre vue de données ne pointe vers aucun index.", @@ -36409,8 +36409,8 @@ "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.maxAlertsFieldLessThanWarning": "Kibana ne permet qu'un maximum de {maxNumber} {maxNumber, plural, =1 {alerte} other {alertes}} par exécution de règle.", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.nameFieldRequiredError": "Nom obligatoire.", "xpack.securitySolution.detectionEngine.createRule.stepAboutrule.noteHelpText": "Ajouter un guide d'investigation sur les règles...", - "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "Fournissez des instructions sur les conditions préalables à la règle, telles que les intégrations requises, les étapes de configuration et tout ce qui est nécessaire au bon fonctionnement de la règle.", "xpack.securitySolution.detectionEngine.createRule.stepAboutrule.setupHelpText": "Ajouter le guide de configuration de règle...", + "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "Fournissez des instructions sur les conditions préalables à la règle, telles que les intégrations requises, les étapes de configuration et tout ce qui est nécessaire au bon fonctionnement de la règle.", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupLabel": "Guide de configuration", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.tagFieldEmptyError": "Une balise ne doit pas être vide", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.threatIndicatorPathFieldEmptyError": "Le remplacement du préfixe d'indicateur ne peut pas être vide.", @@ -42010,8 +42010,8 @@ "xpack.slo.sloEmbeddable.config.sloSelector.placeholder": "Sélectionner un SLO", "xpack.slo.sloEmbeddable.displayName": "Aperçu du SLO", "xpack.slo.sloEmbeddable.overview.sloNotFoundText": "Le SLO a été supprimé. Vous pouvez supprimer sans risque le widget du tableau de bord.", - "xpack.slo.sLOGridItem.targetFlexItemLabel": "Cible {target}", "xpack.slo.sloGridItem.targetFlexItemLabel": "Cible {target}", + "xpack.slo.sLOGridItem.targetFlexItemLabel": "Cible {target}", "xpack.slo.sloGroupConfiguration.customFiltersLabel": "Personnaliser le filtre", "xpack.slo.sloGroupConfiguration.customFiltersOptional": "Facultatif", "xpack.slo.sloGroupConfiguration.customFilterText": "Personnaliser le filtre", @@ -43457,8 +43457,8 @@ "xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle": "Webhook - Données de gestion des cas", "xpack.stackConnectors.components.d3security.bodyCodeEditorAriaLabel": "Éditeur de code", "xpack.stackConnectors.components.d3security.bodyFieldLabel": "Corps", - "xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security", "xpack.stackConnectors.components.d3security.connectorTypeTitle": "Données D3", + "xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security", "xpack.stackConnectors.components.d3security.eventTypeFieldLabel": "Type d'événement", "xpack.stackConnectors.components.d3security.invalidActionText": "Nom d'action non valide.", "xpack.stackConnectors.components.d3security.requiredActionText": "L'action est requise.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index df3185aff999b..366d85478acda 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9468,7 +9468,16 @@ "visualizationUiComponents.filterQueryInput.clickToEdit": "クリックして編集", "visualizationUiComponents.filterQueryInput.emptyFilterQuery": "(空)", "visualizationUiComponents.filterQueryInput.label": "フィルタリング条件", + "visualizationUiComponents.iconSelect.alertIconLabel": "アラート", + "visualizationUiComponents.iconSelect.asteriskIconLabel": "アスタリスク", + "visualizationUiComponents.iconSelect.bellIconLabel": "ベル", + "visualizationUiComponents.iconSelect.boltIconLabel": "ボルト", + "visualizationUiComponents.iconSelect.bugIconLabel": "バグ", + "visualizationUiComponents.iconSelect.commentIconLabel": "コメント", + "visualizationUiComponents.iconSelect.flagIconLabel": "旗", "visualizationUiComponents.iconSelect.label": "アイコン装飾", + "visualizationUiComponents.iconSelect.noIconLabel": "なし", + "visualizationUiComponents.iconSelect.tagIconLabel": "タグ", "visualizationUiComponents.lineMarker.textVisibility": "テキスト装飾", "visualizationUiComponents.nameInput.columnLabel": "名前", "visualizationUiComponents.queryInput.queryPlaceholderKql": "{example}", @@ -11079,8 +11088,8 @@ "xpack.apm.serviceIcons.service": "サービス", "xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "アーキテクチャー", "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, other {可用性ゾーン}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {関数名}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, other {トリガータイプ}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {関数名}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, other {コンピュータータイプ} }\n ", "xpack.apm.serviceIcons.serviceDetails.cloud.projectIdLabel": "プロジェクト ID", "xpack.apm.serviceIcons.serviceDetails.cloud.providerLabel": "クラウドプロバイダー", @@ -26017,15 +26026,6 @@ "xpack.lens.xyChart.horizontalAxisLabel": "横軸", "xpack.lens.xyChart.horizontalLeftAxisLabel": "横上軸", "xpack.lens.xyChart.horizontalRightAxisLabel": "横下軸", - "visualizationUiComponents.iconSelect.alertIconLabel": "アラート", - "visualizationUiComponents.iconSelect.asteriskIconLabel": "アスタリスク", - "visualizationUiComponents.iconSelect.bellIconLabel": "ベル", - "visualizationUiComponents.iconSelect.boltIconLabel": "ボルト", - "visualizationUiComponents.iconSelect.bugIconLabel": "バグ", - "visualizationUiComponents.iconSelect.commentIconLabel": "コメント", - "visualizationUiComponents.iconSelect.flagIconLabel": "旗", - "visualizationUiComponents.iconSelect.noIconLabel": "なし", - "visualizationUiComponents.iconSelect.tagIconLabel": "タグ", "xpack.lens.xyChart.layerAnnotation": "注釈", "xpack.lens.xyChart.layerAnnotationsIgnoreTitle": "グローバルフィルターを無視するレイヤー", "xpack.lens.xyChart.layerAnnotationsLabel": "注釈", @@ -26940,8 +26940,8 @@ "xpack.maps.source.esSearch.descendingLabel": "降順", "xpack.maps.source.esSearch.extentFilterLabel": "マップの表示範囲でデータを動的にフィルタリング", "xpack.maps.source.esSearch.fieldNotFoundMsg": "インデックスパターン''{indexPatternName}''に''{fieldName}''が見つかりません。", - "xpack.maps.source.esSearch.geoFieldLabel": "地理空間フィールド", "xpack.maps.source.esSearch.geofieldLabel": "地理空間フィールド", + "xpack.maps.source.esSearch.geoFieldLabel": "地理空間フィールド", "xpack.maps.source.esSearch.geoFieldTypeLabel": "地理空間フィールドタイプ", "xpack.maps.source.esSearch.indexOverOneLengthEditError": "データビューは複数のインデックスを参照しています。データビューごとに1つのインデックスのみが許可されています。", "xpack.maps.source.esSearch.indexZeroLengthEditError": "データビューはどのインデックスも参照していません。", @@ -36393,8 +36393,8 @@ "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.maxAlertsFieldLessThanWarning": "Kibanaで許可される最大数は、1回の実行につき、{maxNumber} {maxNumber, plural, other {アラート}}です。", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.nameFieldRequiredError": "名前が必要です。", "xpack.securitySolution.detectionEngine.createRule.stepAboutrule.noteHelpText": "ルール調査ガイドを追加...", - "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "必要な統合、構成ステップ、ルールが正常に動作するために必要な他のすべての項目といった、ルール前提条件に関する指示を入力します。", "xpack.securitySolution.detectionEngine.createRule.stepAboutrule.setupHelpText": "ルールセットアップガイドを追加...", + "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "必要な統合、構成ステップ、ルールが正常に動作するために必要な他のすべての項目といった、ルール前提条件に関する指示を入力します。", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupLabel": "セットアップガイド", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.tagFieldEmptyError": "タグを空にすることはできません", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.threatIndicatorPathFieldEmptyError": "インジケータープレフィックスの無効化を空にすることはできません", @@ -41994,8 +41994,8 @@ "xpack.slo.sloEmbeddable.config.sloSelector.placeholder": "SLOを選択", "xpack.slo.sloEmbeddable.displayName": "SLO概要", "xpack.slo.sloEmbeddable.overview.sloNotFoundText": "SLOが削除されました。ウィジェットをダッシュボードから安全に削除できます。", - "xpack.slo.sLOGridItem.targetFlexItemLabel": "目標{target}", "xpack.slo.sloGridItem.targetFlexItemLabel": "目標{target}", + "xpack.slo.sLOGridItem.targetFlexItemLabel": "目標{target}", "xpack.slo.sloGroupConfiguration.customFiltersLabel": "カスタムフィルター", "xpack.slo.sloGroupConfiguration.customFiltersOptional": "オプション", "xpack.slo.sloGroupConfiguration.customFilterText": "カスタムフィルター", @@ -43437,8 +43437,8 @@ "xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle": "Webフック - ケース管理データ", "xpack.stackConnectors.components.d3security.bodyCodeEditorAriaLabel": "コードエディター", "xpack.stackConnectors.components.d3security.bodyFieldLabel": "本文", - "xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3セキュリティ", "xpack.stackConnectors.components.d3security.connectorTypeTitle": "D3データ", + "xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3セキュリティ", "xpack.stackConnectors.components.d3security.eventTypeFieldLabel": "イベントタイプ", "xpack.stackConnectors.components.d3security.invalidActionText": "無効なアクション名です。", "xpack.stackConnectors.components.d3security.requiredActionText": "アクションが必要です。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 3a241ffc431c1..455314827fd7e 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9482,7 +9482,16 @@ "visualizationUiComponents.filterQueryInput.clickToEdit": "单击以编辑", "visualizationUiComponents.filterQueryInput.emptyFilterQuery": "(空)", "visualizationUiComponents.filterQueryInput.label": "筛选依据", + "visualizationUiComponents.iconSelect.alertIconLabel": "告警", + "visualizationUiComponents.iconSelect.asteriskIconLabel": "星号", + "visualizationUiComponents.iconSelect.bellIconLabel": "钟铃", + "visualizationUiComponents.iconSelect.boltIconLabel": "闪电", + "visualizationUiComponents.iconSelect.bugIconLabel": "昆虫", + "visualizationUiComponents.iconSelect.commentIconLabel": "注释", + "visualizationUiComponents.iconSelect.flagIconLabel": "旗帜", "visualizationUiComponents.iconSelect.label": "图标装饰", + "visualizationUiComponents.iconSelect.noIconLabel": "无", + "visualizationUiComponents.iconSelect.tagIconLabel": "标签", "visualizationUiComponents.lineMarker.textVisibility": "文本装饰", "visualizationUiComponents.nameInput.columnLabel": "名称", "visualizationUiComponents.queryInput.queryPlaceholderKql": "{example}", @@ -11098,8 +11107,8 @@ "xpack.apm.serviceIcons.service": "服务", "xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "架构", "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, other {可用性区域}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {功能名称}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, other {触发类型}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {功能名称}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, other {机器类型}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.projectIdLabel": "项目 ID", "xpack.apm.serviceIcons.serviceDetails.cloud.providerLabel": "云服务提供商", @@ -26049,15 +26058,6 @@ "xpack.lens.xyChart.horizontalAxisLabel": "水平轴", "xpack.lens.xyChart.horizontalLeftAxisLabel": "水平顶轴", "xpack.lens.xyChart.horizontalRightAxisLabel": "水平底轴", - "visualizationUiComponents.iconSelect.alertIconLabel": "告警", - "visualizationUiComponents.iconSelect.asteriskIconLabel": "星号", - "visualizationUiComponents.iconSelect.bellIconLabel": "钟铃", - "visualizationUiComponents.iconSelect.boltIconLabel": "闪电", - "visualizationUiComponents.iconSelect.bugIconLabel": "昆虫", - "visualizationUiComponents.iconSelect.commentIconLabel": "注释", - "visualizationUiComponents.iconSelect.flagIconLabel": "旗帜", - "visualizationUiComponents.iconSelect.noIconLabel": "无", - "visualizationUiComponents.iconSelect.tagIconLabel": "标签", "xpack.lens.xyChart.layerAnnotation": "标注", "xpack.lens.xyChart.layerAnnotationsIgnoreTitle": "忽略全局筛选的图层", "xpack.lens.xyChart.layerAnnotationsLabel": "标注", @@ -26972,8 +26972,8 @@ "xpack.maps.source.esSearch.descendingLabel": "降序", "xpack.maps.source.esSearch.extentFilterLabel": "在可见地图区域中动态筛留数据", "xpack.maps.source.esSearch.fieldNotFoundMsg": "在索引模式“{indexPatternName}”中找不到“{fieldName}”。", - "xpack.maps.source.esSearch.geoFieldLabel": "地理空间字段", "xpack.maps.source.esSearch.geofieldLabel": "地理空间字段", + "xpack.maps.source.esSearch.geoFieldLabel": "地理空间字段", "xpack.maps.source.esSearch.geoFieldTypeLabel": "地理空间字段类型", "xpack.maps.source.esSearch.indexOverOneLengthEditError": "您的数据视图指向多个索引。每个数据视图只允许一个索引。", "xpack.maps.source.esSearch.indexZeroLengthEditError": "您的数据视图未指向任何索引。", @@ -36435,8 +36435,8 @@ "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.maxAlertsFieldLessThanWarning": "每次规则运行时,Kibana 最多只允许 {maxNumber} 个{maxNumber, plural, other {告警}}。", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.nameFieldRequiredError": "名称必填。", "xpack.securitySolution.detectionEngine.createRule.stepAboutrule.noteHelpText": "添加规则调查指南......", - "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "提供有关规则先决条件的说明,如所需集成、配置步骤,以及规则正常运行所需的任何其他内容。", "xpack.securitySolution.detectionEngine.createRule.stepAboutrule.setupHelpText": "添加规则设置指南......", + "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "提供有关规则先决条件的说明,如所需集成、配置步骤,以及规则正常运行所需的任何其他内容。", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupLabel": "设置指南", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.tagFieldEmptyError": "标签不得为空", "xpack.securitySolution.detectionEngine.createRule.stepAboutRule.threatIndicatorPathFieldEmptyError": "指标前缀覆盖不得为空", @@ -42038,8 +42038,8 @@ "xpack.slo.sloEmbeddable.config.sloSelector.placeholder": "选择 SLO", "xpack.slo.sloEmbeddable.displayName": "SLO 概览", "xpack.slo.sloEmbeddable.overview.sloNotFoundText": "SLO 已删除。您可以放心从仪表板中删除小组件。", - "xpack.slo.sLOGridItem.targetFlexItemLabel": "目标 {target}", "xpack.slo.sloGridItem.targetFlexItemLabel": "目标 {target}", + "xpack.slo.sLOGridItem.targetFlexItemLabel": "目标 {target}", "xpack.slo.sloGroupConfiguration.customFiltersLabel": "定制筛选", "xpack.slo.sloGroupConfiguration.customFiltersOptional": "可选", "xpack.slo.sloGroupConfiguration.customFilterText": "定制筛选", @@ -43485,8 +43485,8 @@ "xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle": "Webhook - 案例管理数据", "xpack.stackConnectors.components.d3security.bodyCodeEditorAriaLabel": "代码编辑器", "xpack.stackConnectors.components.d3security.bodyFieldLabel": "正文", - "xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security", "xpack.stackConnectors.components.d3security.connectorTypeTitle": "D3 数据", + "xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security", "xpack.stackConnectors.components.d3security.eventTypeFieldLabel": "事件类型", "xpack.stackConnectors.components.d3security.invalidActionText": "操作名称无效。", "xpack.stackConnectors.components.d3security.requiredActionText": "“操作”必填。", From 8c67fecd3297b3cf9d460bad59baeb9e30995d3c Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 4 Sep 2024 13:14:52 +0100 Subject: [PATCH 21/28] [ML] Renaming ML API service (#191742) Addresses the comment from the description of this [PR](https://github.com/elastic/kibana/pull/189729): `We have a bit of a mix of naming: ml, mlApiServices, useMlApiContext() for the same thing` Renames: `useMlApiContext` -> `useMlApi` `ml` -> `mlApi` `mlApiServices` -> `mlApi` `MlApiServices ` -> `MlApi` E.g. we can now use `const mlApi = useMlApi();` Rather than: `const ml = useMlApiContext();` or `const mlServices = useMlApiContext();` or ``` const { services: { mlServices: { mlApiServices }, }, } = useMlKibana(); ``` --- .../ml/public/alerting/job_selector.tsx | 4 +-- .../capabilities/check_capabilities.ts | 10 +++---- .../capabilities/get_capabilities.ts | 6 ++-- .../annotation_flyout/index.test.tsx | 2 +- .../annotations/annotation_flyout/index.tsx | 8 ++--- .../annotations_table/annotations_table.js | 6 ++-- .../anomalies_table/anomalies_table.js | 4 +-- .../components/anomalies_table/links_menu.tsx | 8 ++--- .../custom_urls/custom_url_editor/list.tsx | 6 ++-- .../custom_urls/custom_url_editor/utils.ts | 24 +++++++-------- .../components/custom_urls/custom_urls.tsx | 4 +-- .../data_recognizer/data_recognizer.js | 5 ++-- .../delete_space_aware_item_check_modal.tsx | 4 +-- .../export_jobs_flyout_content.tsx | 6 ++-- .../export_jobs_flyout/jobs_export_service.ts | 12 ++++---- .../import_jobs_flyout/import_jobs_flyout.tsx | 2 +- .../import_jobs_flyout/validate.ts | 4 +-- .../job_selector/job_selector_flyout.tsx | 4 +-- .../job_spaces_sync_flyout.tsx | 4 +-- .../new_job_awaiting_node_shared.tsx | 10 +++---- .../ml_entity_selector.test.tsx | 16 +++++----- .../ml_entity_selector/ml_entity_selector.tsx | 4 +-- .../add_inference_pipeline_flyout.tsx | 4 +-- .../components/reindex_with_pipeline.tsx | 10 +++---- .../ml_inference/components/test_pipeline.tsx | 10 +++---- .../ml_inference/hooks/use_fetch_pipelines.ts | 4 +-- .../ml_inference/retry_create_data_view.ts | 10 +++---- .../ml_saved_objects_spaces_list.tsx | 4 +-- .../edit_model_snapshot_flyout.tsx | 8 ++--- .../model_snapshots/model_snapshots_table.tsx | 16 +++++----- .../revert_model_snapshot_flyout.tsx | 8 ++--- .../node_available_warning/hooks.ts | 14 ++++----- .../rule_editor/rule_editor_flyout.js | 16 +++++----- .../rule_editor/rule_editor_flyout.test.js | 2 +- .../select_rule_action/rule_action_panel.js | 4 +-- .../rule_action_panel.test.js | 2 +- .../components/rule_editor/utils.js | 23 +++++--------- .../saved_objects_warning.tsx | 4 +-- .../scatterplot_matrix.test.tsx | 2 +- .../scatterplot_matrix/scatterplot_matrix.tsx | 4 +-- .../validate_job/validate_job_view.js | 2 +- .../validate_job/validate_job_view.test.js | 2 +- .../contexts/kibana/__mocks__/index.ts | 2 +- .../kibana/__mocks__/kibana_context.ts | 2 +- .../kibana/__mocks__/use_ml_api_context.ts | 6 ++-- .../application/contexts/kibana/index.ts | 2 +- .../contexts/kibana/use_ml_api_context.ts | 4 +-- .../ml/ml_notifications_context.test.tsx | 30 +++++++++---------- .../contexts/ml/ml_notifications_context.tsx | 6 ++-- .../data_frame_analytics/common/analytics.ts | 14 ++++----- .../common/get_index_data.ts | 8 ++--- .../common/get_index_fields.ts | 6 ++-- .../common/use_results_view_config.ts | 8 ++--- .../advanced_step/advanced_step_form.tsx | 6 ++-- .../configuration_step_form.tsx | 8 ++--- .../create_analytics_advanced_editor.tsx | 6 ++-- .../create_step_footer/create_step_footer.tsx | 6 ++-- .../details_step/details_step_form.tsx | 8 ++--- .../components/shared/fetch_explain_data.ts | 6 ++-- .../validation_step_wrapper.tsx | 4 +-- .../hooks/use_has_index_permission.ts | 2 +- .../hooks/use_index_data.ts | 10 +++---- .../pages/analytics_creation/page.tsx | 9 ++++-- .../use_confusion_matrix.ts | 8 ++--- .../use_roc_curve.ts | 6 ++-- .../expandable_section_analytics.tsx | 8 ++--- .../use_exploration_results.ts | 10 +++---- .../outlier_exploration/use_outlier_data.ts | 10 +++---- .../regression_exploration/evaluate_panel.tsx | 12 ++++---- .../pages/analytics_exploration/page.tsx | 4 +-- .../action_delete/delete_action_name.test.tsx | 2 +- .../action_edit/edit_action_flyout.tsx | 8 ++--- .../expanded_row_messages_pane.tsx | 6 ++-- .../use_create_analytics_form.ts | 8 ++--- .../analytics_service/delete_analytics.ts | 14 ++++----- .../analytics_service/get_analytics.ts | 8 ++--- .../analytics_service/start_analytics.ts | 6 ++-- .../analytics_service/stop_analytics.ts | 6 ++-- .../analytics_id_selector.tsx | 4 +-- .../pages/job_map/page.tsx | 4 +-- .../job_map/use_fetch_analytics_map_data.ts | 6 ++-- .../file_based/file_datavisualizer.tsx | 8 ++--- .../index_based/data_loader/data_loader.ts | 6 ++-- .../index_based/index_data_visualizer.tsx | 8 ++--- .../explorer/actions/load_explorer_data.ts | 23 ++++++-------- .../explorer/anomaly_explorer_context.tsx | 6 ++-- .../application/explorer/explorer_utils.ts | 14 ++++----- .../datafeed_chart_flyout.tsx | 14 ++++----- .../edit_query_delay.tsx | 4 +-- .../edit_job_flyout/edit_job_flyout.js | 10 +++---- .../components/edit_job_flyout/edit_utils.js | 10 +++---- .../edit_job_flyout/tabs/detectors.js | 2 +- .../edit_job_flyout/tabs/job_details.js | 4 +-- .../components/job_actions/management.js | 4 +-- .../job_details/datafeed_preview_tab.tsx | 4 +-- .../forecasts_table/forecasts_table.js | 4 +-- .../job_details/job_messages_pane.tsx | 8 ++--- .../job_filter_bar/job_filter_bar.tsx | 4 +-- .../components/jobs_list/jobs_list.js | 6 ++-- .../jobs_list_view/jobs_list_view.js | 12 ++++---- .../multi_job_actions/actions_menu.js | 4 +-- .../group_selector/group_selector.js | 6 ++-- .../start_datafeed_modal.js | 2 +- .../jobs/jobs_list/components/utils.d.ts | 11 +++---- .../jobs/jobs_list/components/utils.js | 22 +++++--------- .../common/chart_loader/chart_loader.ts | 19 +++++------- .../new_job/common/chart_loader/searches.ts | 6 ++-- .../job_creator/advanced_job_creator.ts | 6 ++-- .../job_creator/categorization_job_creator.ts | 6 ++-- .../common/job_creator/geo_job_creator.ts | 6 ++-- .../new_job/common/job_creator/job_creator.ts | 12 ++++---- .../common/job_creator/job_creator_factory.ts | 6 ++-- .../job_creator/multi_metric_job_creator.ts | 6 ++-- .../job_creator/population_job_creator.ts | 6 ++-- .../common/job_creator/rare_job_creator.ts | 6 ++-- .../job_creator/single_metric_job_creator.ts | 6 ++-- .../util/model_memory_estimator.test.ts | 6 ++-- .../util/model_memory_estimator.ts | 14 ++++----- .../new_job/common/job_runner/job_runner.ts | 10 +++---- .../common/job_validator/validators.ts | 6 ++-- .../new_job/common/map_loader/map_loader.ts | 6 ++-- .../categorization_examples_loader.ts | 2 +- .../common/results_loader/results_loader.ts | 4 +-- .../new_job/common/results_loader/searches.ts | 6 ++-- .../quick_create_job_base.ts | 14 ++++----- .../new_job/job_from_lens/quick_create_job.ts | 6 ++-- .../new_job/job_from_lens/route_resolver.ts | 16 +++------- .../new_job/job_from_map/quick_create_job.ts | 6 ++-- .../new_job/job_from_map/route_resolver.ts | 9 +++--- .../quick_create_job.ts | 6 ++-- .../route_resolver.ts | 8 ++--- .../datafeed_preview.tsx | 4 +-- .../components/data_view/change_data_view.tsx | 8 ++--- .../calendars/calendars_selection.tsx | 6 ++-- .../estimate_bucket_span.ts | 6 ++-- .../category_stopped_partitions.tsx | 6 ++-- .../categorization_view/top_categories.tsx | 6 ++-- .../jobs/new_job/pages/new_job/page.tsx | 14 ++++----- .../jobs/new_job/recognize/page.tsx | 2 +- .../ml_nodes_check/check_ml_nodes.ts | 6 ++-- .../create_pipeline_for_model_flyout.tsx | 4 +-- .../model_management/model_actions.tsx | 6 ++-- .../test_models/selected_model.tsx | 4 +-- .../components/notifications_list.test.tsx | 4 +-- .../components/notifications_list.tsx | 6 ++-- .../anomaly_detection_panel.tsx | 6 ++-- .../overview/components/content.tsx | 4 +-- .../public/application/routing/resolvers.ts | 4 +-- .../analytics_job_creation.tsx | 6 ++-- .../routing/routes/explorer/explorer.tsx | 4 +-- .../routing/routes/explorer/state_manager.tsx | 4 +-- .../routing/routes/new_job/from_lens.tsx | 4 +-- .../routing/routes/new_job/from_map.tsx | 4 +-- .../routes/new_job/from_pattern_analysis.tsx | 4 +-- .../routing/routes/new_job/recognize.tsx | 10 +++---- .../routing/routes/new_job/wizard.tsx | 9 +++--- .../timeseriesexplorer.test.tsx | 2 +- .../timeseriesexplorer/timeseriesexplorer.tsx | 4 +-- .../application/routing/use_resolver.tsx | 8 ++--- .../services/anomaly_detector_service.ts | 10 +++---- .../anomaly_explorer_charts_service.test.ts | 4 +-- .../anomaly_explorer_charts_service.ts | 8 ++--- .../application/services/calendar_service.ts | 13 ++++---- .../services/field_format_service.ts | 12 ++++---- .../services/field_format_service_factory.ts | 6 ++-- .../application/services/forecast_service.ts | 18 +++++------ .../services/get_shared_ml_services.ts | 8 ++--- .../application/services/job_service.d.ts | 4 +-- .../application/services/job_service.js | 10 +++---- .../services/ml_api_service/index.ts | 4 +-- .../services/ml_server_info.test.ts | 4 +-- .../application/services/ml_server_info.ts | 6 ++-- .../load_new_job_capabilities.ts | 8 ++--- .../new_job_capabilities_service.test.ts | 4 +-- .../new_job_capabilities_service.ts | 16 +++++----- .../new_job_capabilities_service_analytics.ts | 16 +++++----- .../services/results_service/index.ts | 14 ++++----- .../results_service/result_service_rx.ts | 16 +++++----- .../results_service/results_service.d.ts | 4 +-- .../results_service/results_service.js | 22 +++++++------- .../settings/anomaly_detection_settings.tsx | 8 ++--- .../settings/calendars/edit/new_calendar.js | 10 +++---- .../calendars/edit/new_calendar.test.js | 2 +- .../settings/calendars/edit/utils.js | 20 ++++++------- .../settings/calendars/list/calendars_list.js | 8 ++--- .../calendars/list/calendars_list.test.js | 4 +-- .../calendars/list/delete_calendars.js | 9 ++---- .../delete_filter_list_modal.js | 2 +- .../delete_filter_lists.js | 4 +-- .../filter_lists/edit/edit_filter_list.js | 6 ++-- .../edit/edit_filter_list.test.js | 2 +- .../settings/filter_lists/edit/utils.js | 16 +++++----- .../filter_lists/list/filter_lists.js | 4 +-- .../filter_lists/list/filter_lists.test.js | 4 +-- .../application/settings/settings.test.tsx | 2 +- .../forecasting_modal/forecasting_modal.js | 10 +++---- .../components/forecasting_modal/modal.js | 6 ++-- .../series_controls/series_controls.tsx | 2 +- .../timeseries_chart/timeseries_chart.js | 2 +- .../timeseries_chart/timeseries_chart.test.js | 2 +- .../timeseries_chart_with_tooltip.tsx | 4 +-- .../timeseriesexplorer/timeseriesexplorer.js | 18 +++++------ .../timeseriesexplorer_embeddable_chart.js | 6 ++-- .../time_series_search_service.ts | 17 +++++------ .../public/application/util/get_services.ts | 12 ++++---- .../util/time_series_explorer_service.ts | 18 +++++------ .../anomaly_charts_initializer.test.tsx | 4 +-- .../anomaly_charts_initializer.tsx | 4 +-- ...et_anomaly_charts_services_dependencies.ts | 12 ++++---- .../anomaly_swimlane_embeddable_factory.tsx | 4 +-- .../anomaly_swimlane_initializer.tsx | 4 +-- .../job_creation/aiops/flyout/create_job.tsx | 12 ++++---- .../job_creation/common/job_details.tsx | 4 +-- .../layer/compatible_layer.tsx | 6 ++-- .../layer/compatible_layer.tsx | 6 ++-- .../single_metric_viewer/get_services.ts | 20 ++++++------- ...ingle_metric_viewer_embeddable_factory.tsx | 4 +-- .../single_metric_viewer_initializer.tsx | 14 ++++----- .../single_metric_viewer_setup_flyout.tsx | 8 ++--- x-pack/plugins/ml/public/embeddables/types.ts | 6 ++-- .../ml/public/maps/anomaly_job_selector.tsx | 4 +-- .../maps/anomaly_layer_wizard_factory.tsx | 4 +-- .../plugins/ml/public/maps/anomaly_source.tsx | 4 +-- .../ml/public/maps/anomaly_source_factory.ts | 8 ++--- .../maps/create_anomaly_source_editor.tsx | 4 +-- x-pack/plugins/ml/public/maps/util.ts | 4 +-- x-pack/plugins/ml/public/plugin.ts | 6 ++-- .../single_metric_viewer.tsx | 10 +++---- .../create_single_metric_viewer.tsx | 8 ++--- 229 files changed, 827 insertions(+), 878 deletions(-) diff --git a/x-pack/plugins/ml/public/alerting/job_selector.tsx b/x-pack/plugins/ml/public/alerting/job_selector.tsx index 80ef8a5fed0c3..68bc75e2de2b5 100644 --- a/x-pack/plugins/ml/public/alerting/job_selector.tsx +++ b/x-pack/plugins/ml/public/alerting/job_selector.tsx @@ -14,7 +14,7 @@ import { EuiButton, EuiComboBox, EuiEmptyPrompt, EuiFormRow } from '@elastic/eui import useMountedState from 'react-use/lib/useMountedState'; import { useMlKibana } from '../application/contexts/kibana'; import type { JobId } from '../../common/types/anomaly_detection_jobs'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; import { ALL_JOBS_SELECTION } from '../../common/constants/alerts'; import { LoadingIndicator } from '../application/components/loading_indicator'; @@ -26,7 +26,7 @@ interface JobSelection { export interface JobSelectorControlProps { jobsAndGroupIds?: string[]; onChange: (jobSelection: JobSelection) => void; - adJobsApiService: MlApiServices['jobs']; + adJobsApiService: MlApi['jobs']; /** * Validation is handled by alerting framework */ diff --git a/x-pack/plugins/ml/public/application/capabilities/check_capabilities.ts b/x-pack/plugins/ml/public/application/capabilities/check_capabilities.ts index ee7868adb41fa..ed930b857473d 100644 --- a/x-pack/plugins/ml/public/application/capabilities/check_capabilities.ts +++ b/x-pack/plugins/ml/public/application/capabilities/check_capabilities.ts @@ -27,7 +27,7 @@ import { type MlCapabilitiesKey, } from '../../../common/types/capabilities'; import { getCapabilities } from './get_capabilities'; -import type { MlApiServices } from '../services/ml_api_service'; +import type { MlApi } from '../services/ml_api_service'; import type { MlGlobalServices } from '../app'; let _capabilities: MlCapabilities = getDefaultCapabilities(); @@ -54,7 +54,7 @@ export class MlCapabilitiesService { private _subscription: Subscription | undefined; - constructor(private readonly mlApiServices: MlApiServices) { + constructor(private readonly mlApi: MlApi) { this.init(); } @@ -67,7 +67,7 @@ export class MlCapabilitiesService { tap(() => { this._isLoading$.next(true); }), - switchMap(() => from(this.mlApiServices.checkMlCapabilities())), + switchMap(() => from(this.mlApi.checkMlCapabilities())), retry({ delay: CAPABILITIES_REFRESH_INTERVAL }) ) .subscribe((results) => { @@ -197,11 +197,11 @@ export function checkGetManagementMlJobsResolver({ mlCapabilities }: MlGlobalSer } export function checkCreateJobsCapabilitiesResolver( - mlApiServices: MlApiServices, + mlApi: MlApi, redirectToJobsManagementPage: () => Promise ): Promise { return new Promise((resolve, reject) => { - getCapabilities(mlApiServices) + getCapabilities(mlApi) .then(async ({ capabilities, isPlatinumOrTrialLicense }) => { _capabilities = capabilities; // if the license is basic (isPlatinumOrTrialLicense === false) then do not redirect, diff --git a/x-pack/plugins/ml/public/application/capabilities/get_capabilities.ts b/x-pack/plugins/ml/public/application/capabilities/get_capabilities.ts index 2f7ad039b2700..079256997e1c5 100644 --- a/x-pack/plugins/ml/public/application/capabilities/get_capabilities.ts +++ b/x-pack/plugins/ml/public/application/capabilities/get_capabilities.ts @@ -5,10 +5,10 @@ * 2.0. */ -import type { MlApiServices } from '../services/ml_api_service'; +import type { MlApi } from '../services/ml_api_service'; import type { MlCapabilitiesResponse } from '../../../common/types/capabilities'; -export function getCapabilities(ml: MlApiServices): Promise { - return ml.checkMlCapabilities(); +export function getCapabilities(mlApi: MlApi): Promise { + return mlApi.checkMlCapabilities(); } diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.test.tsx b/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.test.tsx index 81cafabbae827..7d8434dcc4680 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.test.tsx +++ b/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.test.tsx @@ -21,7 +21,7 @@ import { MlAnnotationUpdatesContext } from '../../../contexts/ml/ml_annotation_u const kibanaReactContextMock = createKibanaReactContext({ mlServices: { - mlApiServices: { + mlApi: { annotations: { indexAnnotation: jest.fn().mockResolvedValue({}), deleteAnnotation: jest.fn().mockResolvedValue({}), diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx b/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx index 3bea429042299..eb54db4f327dc 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx +++ b/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx @@ -136,10 +136,10 @@ export class AnnotationFlyoutUI extends Component { this.deletionInProgress = true; - const ml = this.context.services.mlServices.mlApiServices; + const mlApi = this.context.services.mlServices.mlApi; const toastNotifications = this.context.services.notifications.toasts; try { - await ml.annotations.deleteAnnotation(annotationState._id); + await mlApi.annotations.deleteAnnotation(annotationState._id); toastNotifications.addSuccess( i18n.translate( 'xpack.ml.timeSeriesExplorer.timeSeriesChart.deletedAnnotationNotificationMessage', @@ -241,9 +241,9 @@ export class AnnotationFlyoutUI extends Component { annotation.event = annotation.event ?? ANNOTATION_EVENT_USER; annotationUpdatesService.setValue(null); - const ml = this.context.services.mlServices.mlApiServices; + const mlApi = this.context.services.mlServices.mlApi; const toastNotifications = this.context.services.notifications.toasts; - ml.annotations + mlApi.annotations .indexAnnotation(annotation) .then(() => { annotationsRefreshed(); diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js index cea2554876c4d..b5842e479ba11 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js +++ b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js @@ -103,7 +103,7 @@ class AnnotationsTableUI extends Component { }; this.mlJobService = mlJobServiceFactory( toastNotificationServiceProvider(props.kibana.services.notifications.toasts), - props.kibana.services.mlServices.mlApiServices + props.kibana.services.mlServices.mlApi ); } @@ -115,11 +115,11 @@ class AnnotationsTableUI extends Component { isLoading: true, }); - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; if (dataCounts.processed_record_count > 0) { // Load annotations for the selected job. - ml.annotations + mlApi.annotations .getAnnotations$({ jobIds: [job.job_id], earliestMs: null, diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js index 80ee0f7a64820..4429a3022122e 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js @@ -68,7 +68,7 @@ export class AnomaliesTableInternal extends Component { } toggleRow = async (item, tab = ANOMALIES_TABLE_TABS.DETAILS) => { - const ml = this.context.services.mlServices.mlApiServices; + const mlApi = this.context.services.mlServices.mlApi; const itemIdToExpandedRowMap = { ...this.state.itemIdToExpandedRowMap }; if (itemIdToExpandedRowMap[item.rowId]) { delete itemIdToExpandedRowMap[item.rowId]; @@ -81,7 +81,7 @@ export class AnomaliesTableInternal extends Component { if (examples !== undefined) { try { - definition = await ml.results.getCategoryDefinition( + definition = await mlApi.results.getCategoryDefinition( item.jobId, item.source.mlcategory[0] ); diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx index 70364abc50389..ccf9083c90791 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx @@ -58,7 +58,7 @@ import { getUrlForRecord, openCustomUrlWindow } from '../../util/custom_url_util import type { SourceIndicesWithGeoFields } from '../../explorer/explorer_utils'; import { escapeDoubleQuotes, getDateFormatTz } from '../../explorer/explorer_utils'; import { usePermissionCheck } from '../../capabilities/check_capabilities'; -import { useMlApiContext, useMlKibana } from '../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../contexts/kibana'; import { useMlIndexUtils } from '../../util/index_service'; import { getQueryStringForInfluencers } from './get_query_string_for_influencers'; @@ -110,7 +110,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { }, } = kibana; const { getDataViewById, getDataViewIdFromName } = useMlIndexUtils(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const mlJobService = useMlJobService(); const job = useMemo(() => { @@ -510,7 +510,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { // - use first value (will only ever be more than one if influenced by category other than by/partition/over). const categoryId = record.mlcategory[0]; - ml.results + mlApi.results .getCategoryDefinition(jobId, categoryId) .then((resp) => { // Prefix each of the terms with '+' so that the Elasticsearch Query String query @@ -647,7 +647,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { // Get the definition of the category and use the terms or regex to view the // matching events in the Kibana Discover tab depending on whether the // categorization field is of mapping type text (preferred) or keyword. - ml.results + mlApi.results .getCategoryDefinition(record.job_id, categoryId) .then(async (resp) => { // We should not redirect to Discover if data view doesn't exist diff --git a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx index 16dba857ed6cc..bb913b8ecec34 100644 --- a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx +++ b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx @@ -29,7 +29,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import { parseUrlState } from '@kbn/ml-url-state'; -import { useMlApiContext, useMlKibana } from '../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../contexts/kibana'; import { useToastNotificationService } from '../../../services/toast_notification_service'; import { isValidLabel, openCustomUrlWindow } from '../../../util/custom_url_utils'; import { getTestUrl } from './utils'; @@ -73,7 +73,7 @@ export const CustomUrlList: FC = ({ data: { dataViews }, }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { displayErrorToast } = useToastNotificationService(); const [expandedUrlIndex, setExpandedUrlIndex] = useState(null); @@ -162,7 +162,7 @@ export const CustomUrlList: FC = ({ if (index < customUrls.length) { try { const testUrl = await getTestUrl( - ml, + mlApi, job, customUrl, timefieldName, diff --git a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/utils.ts b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/utils.ts index cd0a52e170453..0fc2a7b514b2d 100644 --- a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/utils.ts +++ b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/utils.ts @@ -47,7 +47,7 @@ import { escapeForElasticsearchQuery } from '../../../util/string_utils'; import type { CombinedJob, Job } from '../../../../../common/types/anomaly_detection_jobs'; import { isAnomalyDetectionJob } from '../../../../../common/types/anomaly_detection_jobs'; import type { TimeRangeType } from './constants'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; export interface TimeRange { type: TimeRangeType; @@ -427,7 +427,7 @@ function buildAppStateQueryParam(queryFieldNames: string[]) { // may contain dollar delimited partition / influencer entity tokens and // drilldown time range settings. async function getAnomalyDetectionJobTestUrl( - ml: MlApiServices, + mlApi: MlApi, job: Job, customUrl: MlUrlConfig ): Promise { @@ -455,7 +455,7 @@ async function getAnomalyDetectionJobTestUrl( let resp; try { - resp = await ml.results.anomalySearch( + resp = await mlApi.results.anomalySearch( { body, }, @@ -479,8 +479,8 @@ async function getAnomalyDetectionJobTestUrl( try { // attempt load the non-combined job and datafeed so they can be used in the datafeed preview const [{ jobs }, { datafeeds }] = await Promise.all([ - ml.getJobs({ jobId: job.job_id }), - ml.getDatafeeds({ datafeedId: job.datafeed_config?.datafeed_id ?? '' }), + mlApi.getJobs({ jobId: job.job_id }), + mlApi.getDatafeeds({ datafeedId: job.datafeed_config?.datafeed_id ?? '' }), ]); datafeedConfig = datafeeds[0]; jobConfig = jobs[0]; @@ -500,7 +500,7 @@ async function getAnomalyDetectionJobTestUrl( delete jobConfig.datafeed_config; } - const preview = (await ml.jobs.datafeedPreview( + const preview = (await mlApi.jobs.datafeedPreview( undefined, jobConfig, datafeedConfig @@ -520,7 +520,7 @@ async function getAnomalyDetectionJobTestUrl( } async function getDataFrameAnalyticsTestUrl( - ml: MlApiServices, + mlApi: MlApi, job: DataFrameAnalyticsConfig, customUrl: MlKibanaUrlConfig, timeFieldName: string | null, @@ -543,13 +543,13 @@ async function getDataFrameAnalyticsTestUrl( }, }; - resp = await ml.esSearch(body); + resp = await mlApi.esSearch(body); if (resp && resp.hits.total.value > 0) { record = resp.hits.hits[0]._source; } else { // No results for this job yet so use source index for example doc. - resp = await ml.esSearch({ + resp = await mlApi.esSearch({ index: Array.isArray(job.source.index) ? job.source.index.join(',') : job.source.index, body: { size: 1, @@ -594,7 +594,7 @@ async function getDataFrameAnalyticsTestUrl( } export function getTestUrl( - ml: MlApiServices, + mlApi: MlApi, job: Job | DataFrameAnalyticsConfig, customUrl: MlUrlConfig, timeFieldName: string | null, @@ -603,7 +603,7 @@ export function getTestUrl( ) { if (isDataFrameAnalyticsConfigs(job) || isPartialDFAJob) { return getDataFrameAnalyticsTestUrl( - ml, + mlApi, job as DataFrameAnalyticsConfig, customUrl, timeFieldName, @@ -612,5 +612,5 @@ export function getTestUrl( ); } - return getAnomalyDetectionJobTestUrl(ml, job, customUrl); + return getAnomalyDetectionJobTestUrl(mlApi, job, customUrl); } diff --git a/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx b/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx index 8c92a4c4515a5..7bec64f3bf6b3 100644 --- a/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx +++ b/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx @@ -178,7 +178,7 @@ export class CustomUrls extends Component { http: { basePath }, data: { dataViews }, dashboard, - mlServices: { mlApiServices: ml }, + mlServices: { mlApi }, } = this.context.services; const dataViewId = this.state?.editorSettings?.kibanaSettings?.discoverIndexPatternId; const job = this.props.job; @@ -194,7 +194,7 @@ export class CustomUrls extends Component { buildCustomUrlFromSettings(dashboard, this.state.editorSettings as CustomUrlSettings).then( (customUrl) => { getTestUrl( - ml, + mlApi, job, customUrl, timefieldName, diff --git a/x-pack/plugins/ml/public/application/components/data_recognizer/data_recognizer.js b/x-pack/plugins/ml/public/application/components/data_recognizer/data_recognizer.js index 409002011926d..7f4501a087784 100644 --- a/x-pack/plugins/ml/public/application/components/data_recognizer/data_recognizer.js +++ b/x-pack/plugins/ml/public/application/components/data_recognizer/data_recognizer.js @@ -29,9 +29,10 @@ export class DataRecognizer extends Component { } componentDidMount() { - const ml = this.context.services.mlServices.mlApiServices; + const mlApi = this.context.services.mlServices.mlApi; // once the mount is complete, call the recognize endpoint to see if the index format is known to us, - ml.recognizeIndex({ indexPatternTitle: this.indexPattern.title }) + mlApi + .recognizeIndex({ indexPatternTitle: this.indexPattern.title }) .then((resp) => { // Sort results by title prior to display resp.sort((res1, res2) => res1.title.localeCompare(res2.title)); diff --git a/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx b/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx index 70290bee78c98..053c6e0ad8039 100644 --- a/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx +++ b/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx @@ -27,7 +27,7 @@ import type { CanDeleteMLSpaceAwareItemsResponse, MlSavedObjectType, } from '../../../../common/types/saved_objects'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { useToastNotificationService } from '../../services/toast_notification_service'; import { ManagedJobsWarningCallout } from '../../jobs/jobs_list/components/confirm_modals/managed_jobs_warning_callout'; @@ -252,7 +252,7 @@ export const DeleteSpaceAwareItemCheckModal: FC = ({ const { savedObjects: { canDeleteMLSpaceAwareItems, removeItemFromCurrentSpace }, - } = useMlApiContext(); + } = useMlApi(); const { displayErrorToast, displaySuccessToast } = useToastNotificationService(); // delay showing the modal to avoid flickering diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout_content.tsx b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout_content.tsx index 987280d2617db..2bda1c4ea24f0 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout_content.tsx +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout_content.tsx @@ -96,16 +96,16 @@ export const ExportJobsFlyoutContent = ({ const { services: { notifications: { toasts }, - mlServices: { mlUsageCollection, mlApiServices }, + mlServices: { mlUsageCollection, mlApi }, }, } = useMlKibana(); const { getJobs, dataFrameAnalytics: { getDataFrameAnalytics }, - } = mlApiServices; + } = mlApi; - const jobsExportService = useMemo(() => new JobsExportService(mlApiServices), [mlApiServices]); + const jobsExportService = useMemo(() => new JobsExportService(mlApi), [mlApi]); const [adJobIds, setAdJobIds] = useState([]); const [dfaJobIds, setDfaJobIds] = useState([]); const [selectedJobIds, setSelectedJobIds] = useState([]); diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/jobs_export_service.ts b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/jobs_export_service.ts index 52e9bb2e101c2..bdc77872c7261 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/jobs_export_service.ts +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/jobs_export_service.ts @@ -8,7 +8,7 @@ // @ts-expect-error import { saveAs } from '@elastic/filesaver'; import type { DataFrameAnalyticsConfig } from '@kbn/ml-data-frame-analytics-utils'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { JobType } from '../../../../../common/types/saved_objects'; import type { Job, Datafeed } from '../../../../../common/types/anomaly_detection_jobs'; import { GLOBAL_CALENDAR } from '../../../../../common/constants/calendars'; @@ -27,18 +27,16 @@ type ExportableConfigs = | DataFrameAnalyticsConfig[]; export class JobsExportService { - constructor(private _mlApiServices: MlApiServices) {} + constructor(private _mlApi: MlApi) {} public async exportAnomalyDetectionJobs(jobIds: string[]) { - const configs = await Promise.all( - jobIds.map((id) => this._mlApiServices.jobs.jobForCloning(id, true)) - ); + const configs = await Promise.all(jobIds.map((id) => this._mlApi.jobs.jobForCloning(id, true))); this._export(configs, 'anomaly-detector'); } public async exportDataframeAnalyticsJobs(jobIds: string[]) { const { data_frame_analytics: configs } = - await this._mlApiServices.dataFrameAnalytics.getDataFrameAnalytics(jobIds.join(','), true); + await this._mlApi.dataFrameAnalytics.getDataFrameAnalytics(jobIds.join(','), true); this._export(configs, 'data-frame-analytics'); } @@ -58,7 +56,7 @@ export class JobsExportService { } public async getJobDependencies(jobs: Job[]): Promise { - const calendars = await this._mlApiServices.calendars(); + const calendars = await this._mlApi.calendars(); // create a map of all jobs in groups const groups = jobs.reduce((acc, cur) => { diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx index d0870466aa89a..de13bed60152d 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx @@ -57,7 +57,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled, onImportComplete }) => notifications: { toasts }, mlServices: { mlUsageCollection, - mlApiServices: { + mlApi: { jobs: { bulkCreateJobs }, dataFrameAnalytics: { createDataFrameAnalytics }, filters: { filters: getFilters }, diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts index 611a3c464b440..235c3d7b5ffe0 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts @@ -12,7 +12,7 @@ import { isValidIndexName } from '../../../../../common/util/es_utils'; import { isJobIdValid } from '../../../../../common/util/job_utils'; import { JOB_ID_MAX_LENGTH } from '../../../../../common/constants/validation'; import type { JobIdObject } from './jobs_import_service'; -import { useMlApiContext } from '../../../contexts/kibana'; +import { useMlApi } from '../../../contexts/kibana'; export const useValidateIds = ( jobType: JobType | null, @@ -25,7 +25,7 @@ export const useValidateIds = ( jobs: { jobsExist: adJobsExist }, dataFrameAnalytics: { jobsExist: dfaJobsExist }, checkIndicesExists, - } = useMlApiContext(); + } = useMlApi(); const validateIds = useCallback(async () => { const jobIdExistsChecks: string[] = []; diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx index b4da44047fd86..02fb52c120303 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx @@ -74,7 +74,7 @@ export const JobSelectorFlyoutContent: FC = ({ const { services: { notifications, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); @@ -163,7 +163,7 @@ export const JobSelectorFlyoutContent: FC = ({ async function fetchJobs() { try { - const resp = await mlApiServices.jobs.jobsWithTimerange(dateFormatTz); + const resp = await mlApi.jobs.jobsWithTimerange(dateFormatTz); const normalizedJobs = normalizeTimes(resp.jobs, dateFormatTz, DEFAULT_GANTT_BAR_WIDTH); const { groups: groupsWithTimerange, groupsMap } = getGroupsFromJobs(normalizedJobs); setJobs(normalizedJobs); diff --git a/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx b/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx index a36a2abd025cc..fe4b23fbdf3a1 100644 --- a/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx @@ -24,7 +24,7 @@ import { EuiSpacer, } from '@elastic/eui'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import type { SyncSavedObjectResponse, SyncResult } from '../../../../common/types/saved_objects'; import { SyncList } from './sync_list'; import { useToastNotificationService } from '../../services/toast_notification_service'; @@ -40,7 +40,7 @@ export const JobSpacesSyncFlyout: FC = ({ onClose }) => { const [syncResp, setSyncResp] = useState(null); const { savedObjects: { syncSavedObjects }, - } = useMlApiContext(); + } = useMlApi(); async function loadSyncList(simulate: boolean = true) { setLoading(true); diff --git a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx index 44860fc5a8834..f70bf526ae113 100644 --- a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx +++ b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx @@ -13,7 +13,7 @@ import { EuiCallOut, EuiSpacer, EuiLink } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { JOB_STATE } from '../../../../../common/constants/states'; -import { mlApiServicesProvider } from '../../../services/ml_api_service'; +import { mlApiProvider } from '../../../services/ml_api_service'; import { HttpService } from '../../../services/http_service'; import type { CloudInfo } from '../../../services/ml_server_info'; import { extractDeploymentId } from '../../../services/ml_server_info'; @@ -28,7 +28,7 @@ function isJobAwaitingNodeAssignment(job: estypes.MlJobStats) { const MLJobsAwaitingNodeWarning: FC = ({ jobIds }) => { const { http } = useKibana().services; - const ml = useMemo(() => mlApiServicesProvider(new HttpService(http!)), [http]); + const mlApi = useMemo(() => mlApiProvider(new HttpService(http!)), [http]); const [unassignedJobCount, setUnassignedJobCount] = useState(0); const [cloudInfo, setCloudInfo] = useState(null); @@ -40,13 +40,13 @@ const MLJobsAwaitingNodeWarning: FC = ({ jobIds }) => { return; } - const { lazyNodeCount } = await ml.mlNodeCount(); + const { lazyNodeCount } = await mlApi.mlNodeCount(); if (lazyNodeCount === 0) { setUnassignedJobCount(0); return; } - const { jobs } = await ml.getJobStats({ jobId: jobIds.join(',') }); + const { jobs } = await mlApi.getJobStats({ jobId: jobIds.join(',') }); const unassignedJobs = jobs.filter(isJobAwaitingNodeAssignment); setUnassignedJobCount(unassignedJobs.length); } catch (error) { @@ -63,7 +63,7 @@ const MLJobsAwaitingNodeWarning: FC = ({ jobIds }) => { } try { - const resp = await ml.mlInfo(); + const resp = await mlApi.mlInfo(); const cloudId = resp.cloudId ?? null; const isCloudTrial = resp.isCloudTrial === true; setCloudInfo({ diff --git a/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.test.tsx b/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.test.tsx index 1ab9bf280b291..04591a6a9037e 100644 --- a/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.test.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { render, waitFor, screen } from '@testing-library/react'; import { MlEntitySelector } from './ml_entity_selector'; -import { useMlApiContext } from '../../contexts/kibana'; -import type { MlApiServices } from '../../services/ml_api_service'; +import { useMlApi } from '../../contexts/kibana'; +import type { MlApi } from '../../services/ml_api_service'; import { useToastNotificationService } from '../../services/toast_notification_service'; jest.mock('../../contexts/kibana'); @@ -32,7 +32,7 @@ describe('MlEntitySelector', () => { return Promise.resolve([{ model_id: 'model_01' }]); }); - (useMlApiContext as jest.MockedFunction).mockImplementation(() => { + (useMlApi as jest.MockedFunction).mockImplementation(() => { return { jobs: { getAllJobAndGroupIds, @@ -43,7 +43,7 @@ describe('MlEntitySelector', () => { trainedModels: { getTrainedModels, }, - } as unknown as jest.Mocked; + } as unknown as jest.Mocked; }); beforeEach(() => {}); @@ -132,7 +132,7 @@ describe('MlEntitySelector', () => { }); test('provide current selection update on change with duplicates handling', async () => { - (useMlApiContext as jest.MockedFunction).mockImplementationOnce(() => { + (useMlApi as jest.MockedFunction).mockImplementationOnce(() => { return { jobs: { getAllJobAndGroupIds, @@ -149,7 +149,7 @@ describe('MlEntitySelector', () => { trainedModels: { getTrainedModels, }, - } as unknown as jest.Mocked; + } as unknown as jest.Mocked; }); const onChangeSpy = jest.fn(); @@ -182,14 +182,14 @@ describe('MlEntitySelector', () => { const displayErrorToast = jest.fn(); const sampleError = new Error('try a bit later'); - (useMlApiContext as jest.MockedFunction).mockImplementationOnce(() => { + (useMlApi as jest.MockedFunction).mockImplementationOnce(() => { return { jobs: { getAllJobAndGroupIds: jest.fn(() => { throw sampleError; }), }, - } as unknown as jest.Mocked; + } as unknown as jest.Mocked; }); ( useToastNotificationService as jest.MockedFunction diff --git a/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx b/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx index 61a5c540be649..ebafb61cebd71 100644 --- a/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { countBy } from 'lodash'; import useMount from 'react-use/lib/useMount'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { useToastNotificationService } from '../../services/toast_notification_service'; import { useEnabledFeatures } from '../../contexts/ml'; @@ -63,7 +63,7 @@ export const MlEntitySelector: FC = ({ handleDuplicates = false, }) => { const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); - const { jobs: jobsApi, trainedModels, dataFrameAnalytics } = useMlApiContext(); + const { jobs: jobsApi, trainedModels, dataFrameAnalytics } = useMlApi(); const { displayErrorToast } = useToastNotificationService(); const visColorsBehindText = euiPaletteColorBlindBehindText(); diff --git a/x-pack/plugins/ml/public/application/components/ml_inference/add_inference_pipeline_flyout.tsx b/x-pack/plugins/ml/public/application/components/ml_inference/add_inference_pipeline_flyout.tsx index 9cb6e50b8f876..1d58dce866449 100644 --- a/x-pack/plugins/ml/public/application/components/ml_inference/add_inference_pipeline_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_inference/add_inference_pipeline_flyout.tsx @@ -31,7 +31,7 @@ import { ProcessorConfiguration } from './components/processor_configuration'; import { OnFailureConfiguration } from '../shared'; import { TestPipeline } from './components/test_pipeline'; import { ReviewAndCreatePipeline } from '../shared'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { getPipelineConfig } from './get_pipeline_config'; import { validateInferencePipelineConfigurationStep } from './validation'; import { type MlInferenceState, type InferenceModelTypes, TEST_PIPELINE_MODE } from './types'; @@ -54,7 +54,7 @@ export const AddInferencePipelineFlyout: FC = ( const { trainedModels: { createInferencePipeline }, - } = useMlApiContext(); + } = useMlApi(); const modelType = getModelType(model); diff --git a/x-pack/plugins/ml/public/application/components/ml_inference/components/reindex_with_pipeline.tsx b/x-pack/plugins/ml/public/application/components/ml_inference/components/reindex_with_pipeline.tsx index 17128208e7aec..b8cbdb78b20b4 100644 --- a/x-pack/plugins/ml/public/application/components/ml_inference/components/reindex_with_pipeline.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_inference/components/reindex_with_pipeline.tsx @@ -29,7 +29,7 @@ import { extractErrorMessage } from '@kbn/ml-error-utils'; import { i18n } from '@kbn/i18n'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { debounce } from 'lodash'; -import { useMlApiContext, useMlKibana } from '../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../contexts/kibana'; import { isValidIndexName } from '../../../../../common/util/es_utils'; import { createKibanaDataView, checkIndexExists } from '../retry_create_data_view'; import { useToastNotificationService } from '../../../services/toast_notification_service'; @@ -85,8 +85,8 @@ export const ReindexWithPipeline: FC = ({ pipelineName, sourceIndex }) => docLinks: { links }, }, } = useMlKibana(); - const ml = useMlApiContext(); - const { getIndices, reindexWithPipeline, hasPrivileges } = ml; + const mlApi = useMlApi(); + const { getIndices, reindexWithPipeline, hasPrivileges } = mlApi; const { displayErrorToast } = useToastNotificationService(); @@ -123,7 +123,7 @@ export const ReindexWithPipeline: FC = ({ pipelineName, sourceIndex }) => ); const debouncedIndexCheck = debounce(async () => { - const checkResp = await checkIndexExists(destinationIndex, ml); + const checkResp = await checkIndexExists(destinationIndex, mlApi); if (checkResp.errorMessage !== undefined) { displayErrorToast( checkResp.errorMessage, @@ -239,7 +239,7 @@ export const ReindexWithPipeline: FC = ({ pipelineName, sourceIndex }) => const dataViewCreationResult = await createKibanaDataView( destinationIndex, data.dataViews, - ml + mlApi ); if ( dataViewCreationResult?.success === true && diff --git a/x-pack/plugins/ml/public/application/components/ml_inference/components/test_pipeline.tsx b/x-pack/plugins/ml/public/application/components/ml_inference/components/test_pipeline.tsx index 48ae32d615d93..10b02310b39d8 100644 --- a/x-pack/plugins/ml/public/application/components/ml_inference/components/test_pipeline.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_inference/components/test_pipeline.tsx @@ -36,7 +36,7 @@ import { extractErrorProperties } from '@kbn/ml-error-utils'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { CodeEditor } from '@kbn/code-editor'; -import { useMlApiContext, useMlKibana } from '../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../contexts/kibana'; import { getPipelineConfig } from '../get_pipeline_config'; import { isValidJson } from '../../../../../common/util/validation_utils'; import type { MlInferenceState } from '../types'; @@ -67,7 +67,7 @@ export const TestPipeline: FC = memo(({ state, sourceIndex, mode }) => { const [lastFetchedSampleDocsString, setLastFetchedSampleDocsString] = useState(''); const [isValid, setIsValid] = useState(true); const [showCallOut, setShowCallOut] = useState(true); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { notifications: { toasts }, services: { @@ -88,7 +88,7 @@ export const TestPipeline: FC = memo(({ state, sourceIndex, mode }) => { const simulatePipeline = async () => { try { - const result = await ml.trainedModels.trainedModelPipelineSimulate( + const result = await mlApi.trainedModels.trainedModelPipelineSimulate( pipelineConfig, JSON.parse(sampleDocsString) as IngestSimulateDocument[] ); @@ -127,7 +127,7 @@ export const TestPipeline: FC = memo(({ state, sourceIndex, mode }) => { let records: IngestSimulateDocument[] = []; let resp; try { - resp = await ml.esSearch(body); + resp = await mlApi.esSearch(body); if (resp && resp.hits.total.value > 0) { records = resp.hits.hits; @@ -177,7 +177,7 @@ export const TestPipeline: FC = memo(({ state, sourceIndex, mode }) => { useEffect( function checkSourceIndexExists() { async function ensureSourceIndexExists() { - const resp = await checkIndexExists(sourceIndex!, ml); + const resp = await checkIndexExists(sourceIndex!, mlApi); const indexExists = resp.resp && resp.resp[sourceIndex!] && resp.resp[sourceIndex!].exists; if (indexExists === false) { setSourceIndexMissingError(sourceIndexMissingMessage); diff --git a/x-pack/plugins/ml/public/application/components/ml_inference/hooks/use_fetch_pipelines.ts b/x-pack/plugins/ml/public/application/components/ml_inference/hooks/use_fetch_pipelines.ts index 837aef2f92093..e622caf206b2e 100644 --- a/x-pack/plugins/ml/public/application/components/ml_inference/hooks/use_fetch_pipelines.ts +++ b/x-pack/plugins/ml/public/application/components/ml_inference/hooks/use_fetch_pipelines.ts @@ -7,7 +7,7 @@ import { useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { useMlApiContext, useMlKibana } from '../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../contexts/kibana'; export const useFetchPipelines = () => { const [pipelineNames, setPipelineNames] = useState([]); @@ -17,7 +17,7 @@ export const useFetchPipelines = () => { const { trainedModels: { getAllIngestPipelines }, - } = useMlApiContext(); + } = useMlApi(); useEffect(() => { async function fetchPipelines() { diff --git a/x-pack/plugins/ml/public/application/components/ml_inference/retry_create_data_view.ts b/x-pack/plugins/ml/public/application/components/ml_inference/retry_create_data_view.ts index fd270ae70dfd7..a09d0c2568e85 100644 --- a/x-pack/plugins/ml/public/application/components/ml_inference/retry_create_data_view.ts +++ b/x-pack/plugins/ml/public/application/components/ml_inference/retry_create_data_view.ts @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import { extractErrorMessage } from '@kbn/ml-error-utils'; import type { DataViewsContract } from '@kbn/data-views-plugin/public'; import { DuplicateDataViewError } from '@kbn/data-plugin/public'; -import type { MlApiServices } from '../../services/ml_api_service'; +import type { MlApi } from '../../services/ml_api_service'; import type { FormMessage } from '../../data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state'; interface CreateKibanaDataViewResponse { @@ -25,11 +25,11 @@ function delay(ms = 1000) { }); } -export async function checkIndexExists(destIndex: string, ml: MlApiServices) { +export async function checkIndexExists(destIndex: string, mlApi: MlApi) { let resp; let errorMessage; try { - resp = await ml.checkIndicesExists({ indices: [destIndex] }); + resp = await mlApi.checkIndicesExists({ indices: [destIndex] }); } catch (e) { errorMessage = extractErrorMessage(e); } @@ -38,7 +38,7 @@ export async function checkIndexExists(destIndex: string, ml: MlApiServices) { export async function retryIndexExistsCheck( destIndex: string, - ml: MlApiServices + ml: MlApi ): Promise<{ success: boolean; indexExists: boolean; @@ -70,7 +70,7 @@ export async function retryIndexExistsCheck( export const createKibanaDataView = async ( destinationIndex: string, dataViewsService: DataViewsContract, - ml: MlApiServices, + ml: MlApi, timeFieldName?: string, callback?: (response: FormMessage) => void ) => { diff --git a/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx b/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx index 378ae1a00fef6..9da8804d64512 100644 --- a/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx @@ -13,7 +13,7 @@ import { i18n } from '@kbn/i18n'; import type { SpacesPluginStart, ShareToSpaceFlyoutProps } from '@kbn/spaces-plugin/public'; import type { SavedObjectResult, MlSavedObjectType } from '../../../../common/types/saved_objects'; import { ML_JOB_SAVED_OBJECT_TYPE } from '../../../../common/types/saved_objects'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { useToastNotificationService } from '../../services/toast_notification_service'; interface Props { @@ -42,7 +42,7 @@ export const MLSavedObjectsSpacesList: FC = ({ }) => { const { savedObjects: { updateJobsSpaces, updateModelsSpaces }, - } = useMlApiContext(); + } = useMlApi(); const { displayErrorToast } = useToastNotificationService(); const [showFlyout, setShowFlyout] = useState(false); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx index 1be4c7f479ea2..68afdde3470b1 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx @@ -30,7 +30,7 @@ import type { ModelSnapshot, CombinedJobWithStats, } from '../../../../../common/types/anomaly_detection_jobs'; -import { useMlApiContext, useNotifications } from '../../../contexts/kibana'; +import { useMlApi, useNotifications } from '../../../contexts/kibana'; interface Props { snapshot: ModelSnapshot; @@ -39,7 +39,7 @@ interface Props { } export const EditModelSnapshotFlyout: FC = ({ snapshot, job, closeFlyout }) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { toasts } = useNotifications(); const [description, setDescription] = useState(snapshot.description); const [retain, setRetain] = useState(snapshot.retain); @@ -55,7 +55,7 @@ export const EditModelSnapshotFlyout: FC = ({ snapshot, job, closeFlyout const updateSnapshot = useCallback(async () => { try { - await ml.updateModelSnapshot(snapshot.job_id, snapshot.snapshot_id, { + await mlApi.updateModelSnapshot(snapshot.job_id, snapshot.snapshot_id, { description, retain, }); @@ -72,7 +72,7 @@ export const EditModelSnapshotFlyout: FC = ({ snapshot, job, closeFlyout const deleteSnapshot = useCallback(async () => { try { - await ml.deleteModelSnapshot(snapshot.job_id, snapshot.snapshot_id); + await mlApi.deleteModelSnapshot(snapshot.job_id, snapshot.snapshot_id); hideDeleteModal(); closeWithReload(); } catch (error) { diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx index 2c74bb9f67969..81a3e4a8de285 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiInMemoryTable, EuiLoadingSpinner } from '@elastic/eui'; import { timeFormatter } from '@kbn/ml-date-utils'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { usePermissionCheck } from '../../capabilities/check_capabilities'; import { EditModelSnapshotFlyout } from './edit_model_snapshot_flyout'; import { RevertModelSnapshotFlyout } from './revert_model_snapshot_flyout'; @@ -36,7 +36,7 @@ export enum COMBINED_JOB_STATE { } export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [canCreateJob, canStartStopDatafeed] = usePermissionCheck([ 'canCreateJob', @@ -66,14 +66,14 @@ export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { // ensure the table is still visible before attempted to refresh it. return; } - const { model_snapshots: ms } = await ml.getModelSnapshots(job.job_id); + const { model_snapshots: ms } = await mlApi.getModelSnapshots(job.job_id); setSnapshots(ms); setSnapshotsLoaded(true); } const checkJobIsClosed = useCallback( async (snapshot: ModelSnapshot) => { - const jobs = await ml.jobs.jobs([job.job_id]); + const jobs = await mlApi.jobs.jobs([job.job_id]); const state = getCombinedJobState(jobs); if (state === COMBINED_JOB_STATE.UNKNOWN) { // this will only happen if the job has been deleted by another user @@ -93,7 +93,7 @@ export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { setCloseJobModalVisible(snapshot); } }, - // skip mlApiServices from deps + // skip mlApi from deps // eslint-disable-next-line react-hooks/exhaustive-deps [job] ); @@ -104,16 +104,16 @@ export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { } const forceCloseJob = useCallback(async () => { - await ml.jobs.forceStopAndCloseJob(job.job_id); + await mlApi.jobs.forceStopAndCloseJob(job.job_id); if (closeJobModalVisible !== null) { - const jobs = await ml.jobs.jobs([job.job_id]); + const jobs = await mlApi.jobs.jobs([job.job_id]); const state = getCombinedJobState(jobs); if (state === COMBINED_JOB_STATE.CLOSED) { setRevertSnapshot(closeJobModalVisible); } } hideCloseJobModalVisible(); - // skip mlApiServices from deps + // skip mlApi from deps // eslint-disable-next-line react-hooks/exhaustive-deps }, [job, closeJobModalVisible]); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx index c25bcee687e04..639c101e7be6f 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx @@ -36,7 +36,7 @@ import type { ModelSnapshot, CombinedJobWithStats, } from '../../../../../common/types/anomaly_detection_jobs'; -import { useMlApiContext, useNotifications } from '../../../contexts/kibana'; +import { useMlApi, useNotifications } from '../../../contexts/kibana'; import { chartLoaderProvider } from './chart_loader'; import { mlResultsServiceProvider } from '../../../services/results_service'; import type { LineChartPoint } from '../../../jobs/new_job/common/chart_loader'; @@ -63,10 +63,10 @@ export const RevertModelSnapshotFlyout: FC = ({ closeFlyout, refresh, }) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { toasts } = useNotifications(); const { loadAnomalyDataForJob, loadEventRateForJob } = useMemo( - () => chartLoaderProvider(mlResultsServiceProvider(ml)), + () => chartLoaderProvider(mlResultsServiceProvider(mlApi)), // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -139,7 +139,7 @@ export const RevertModelSnapshotFlyout: FC = ({ })) : undefined; - ml.jobs + mlApi.jobs .revertModelSnapshot(job.job_id, currentSnapshot.snapshot_id, replay, end, events) .then(() => { toasts.addSuccess( diff --git a/x-pack/plugins/ml/public/application/components/node_available_warning/hooks.ts b/x-pack/plugins/ml/public/application/components/node_available_warning/hooks.ts index 01b291e4b4f61..a08edd5d576d3 100644 --- a/x-pack/plugins/ml/public/application/components/node_available_warning/hooks.ts +++ b/x-pack/plugins/ml/public/application/components/node_available_warning/hooks.ts @@ -8,7 +8,7 @@ import { useEffect, useMemo, useState, useCallback } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { HttpService } from '../../services/http_service'; -import { mlApiServicesProvider } from '../../services/ml_api_service'; +import { mlApiProvider } from '../../services/ml_api_service'; import { type CloudInfo, extractDeploymentId } from '../../services/ml_server_info'; export function useMlNodeAvailableCheck() { @@ -25,7 +25,7 @@ export function useMlNodeAvailableCheck() { export function useMlNodeCheck() { const { http } = useKibana().services; - const ml = useMemo(() => mlApiServicesProvider(new HttpService(http!)), [http]); + const mlApi = useMemo(() => mlApiProvider(new HttpService(http!)), [http]); const [mlNodeCount, setMlNodeCount] = useState(null); const [lazyMlNodeCount, setLazyMlNodeCount] = useState(null); const [userHasPermissionToViewMlNodeCount, setUserHasPermissionToViewMlNodeCount] = useState< @@ -35,7 +35,7 @@ export function useMlNodeCheck() { const checkNodes = useCallback(async () => { try { - const { count, lazyNodeCount } = await ml.mlNodeCount(); + const { count, lazyNodeCount } = await mlApi.mlNodeCount(); setMlNodeCount(count); setLazyMlNodeCount(lazyNodeCount); setUserHasPermissionToViewMlNodeCount(true); @@ -47,7 +47,7 @@ export function useMlNodeCheck() { setMlNodesAvailable(true); } } - }, [ml]); + }, [mlApi]); useEffect( function checkNodesInit() { @@ -74,12 +74,12 @@ const defaultCloudInfo: CloudInfo = { export function useCloudCheck() { const { http } = useKibana().services; - const ml = useMemo(() => mlApiServicesProvider(new HttpService(http!)), [http]); + const mlApi = useMemo(() => mlApiProvider(new HttpService(http!)), [http]); const [cloudInfo, setCloudInfo] = useState(defaultCloudInfo); const loadInfo = useCallback(async () => { try { - const resp = await ml.mlInfo(); + const resp = await mlApi.mlInfo(); setCloudInfo({ cloudId: resp.cloudId ?? null, isCloud: resp.cloudId !== undefined, @@ -91,7 +91,7 @@ export function useCloudCheck() { setCloudInfo(defaultCloudInfo); } } - }, [ml]); + }, [mlApi]); useEffect( function loadInfoInit() { diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js index 36c7d6cc00a88..59f1fd3d39818 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js @@ -83,7 +83,7 @@ class RuleEditorFlyoutUI extends Component { this.mlJobService = mlJobServiceFactory( toastNotificationServiceProvider(props.kibana.services.notifications.toasts), - props.kibana.services.mlServices.mlApiServices + props.kibana.services.mlServices.mlApi ); } @@ -154,7 +154,7 @@ class RuleEditorFlyoutUI extends Component { if (this.partitioningFieldNames.length > 0 && this.canGetFilters) { // Load the current list of filters. These are used for configuring rule scope. - this.props.kibana.services.mlServices.mlApiServices.filters + this.props.kibana.services.mlServices.mlApi.filters .filters() .then((filters) => { const filterListIds = filters.map((filter) => filter.filter_id); @@ -344,13 +344,13 @@ class RuleEditorFlyoutUI extends Component { updateRuleAtIndex = (ruleIndex, editedRule) => { const mlJobService = this.mlJobService; const { toasts } = this.props.kibana.services.notifications; - const { mlApiServices } = this.props.kibana.services.mlServices; + const { mlApi } = this.props.kibana.services.mlServices; const { job, anomaly } = this.state; const jobId = job.job_id; const detectorIndex = anomaly.detectorIndex; - saveJobRule(mlJobService, job, detectorIndex, ruleIndex, editedRule, mlApiServices) + saveJobRule(mlJobService, job, detectorIndex, ruleIndex, editedRule, mlApi) .then((resp) => { if (resp.success) { toasts.add({ @@ -400,12 +400,12 @@ class RuleEditorFlyoutUI extends Component { deleteRuleAtIndex = (index) => { const mlJobService = this.mlJobService; const { toasts } = this.props.kibana.services.notifications; - const { mlApiServices } = this.props.kibana.services.mlServices; + const { mlApi } = this.props.kibana.services.mlServices; const { job, anomaly } = this.state; const jobId = job.job_id; const detectorIndex = anomaly.detectorIndex; - deleteJobRule(mlJobService, job, detectorIndex, index, mlApiServices) + deleteJobRule(mlJobService, job, detectorIndex, index, mlApi) .then((resp) => { if (resp.success) { toasts.addSuccess( @@ -453,8 +453,8 @@ class RuleEditorFlyoutUI extends Component { addItemToFilterList = (item, filterId, closeFlyoutOnAdd) => { const { toasts } = this.props.kibana.services.notifications; - const { mlApiServices } = this.props.kibana.services.mlServices; - addItemToFilter(item, filterId, mlApiServices) + const { mlApi } = this.props.kibana.services.mlServices; + addItemToFilter(item, filterId, mlApi) .then(() => { if (closeFlyoutOnAdd === true) { toasts.add({ diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js index 8dce7f8f45f78..a711774b0a21d 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js @@ -92,7 +92,7 @@ function prepareTest() { }, }, }, - mlServices: { mlApiServices: {} }, + mlServices: { mlApi: {} }, notifications: { toasts: { addDanger: () => {}, diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.js b/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.js index aeca2d6425fd7..1da606864a1e6 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.js @@ -43,7 +43,7 @@ export class RuleActionPanel extends Component { } componentDidMount() { - const ml = this.context.services.mlServices.mlApiServices; + const mlApi = this.context.services.mlServices.mlApi; // If the rule has a scope section with a single partitioning field key, // load the filter list to check whether to add a link to add the // anomaly partitioning field value to the filter list. @@ -59,7 +59,7 @@ export class RuleActionPanel extends Component { partitionFieldValue[0].length > 0 ) { const filterId = scope[partitionFieldName].filter_id; - ml.filters + mlApi.filters .filters({ filterId }) .then((filter) => { const filterItems = filter.items; diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.test.js b/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.test.js index 79414b02a5e48..0ca4e3d692d09 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.test.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/select_rule_action/rule_action_panel.test.js @@ -31,7 +31,7 @@ const mockTestFilter = { const kibanaReactContextMock = createKibanaReactContext({ mlServices: { - mlApiServices: { + mlApi: { filters: { filters: () => { return Promise.resolve(mockTestFilter); diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/utils.js b/x-pack/plugins/ml/public/application/components/rule_editor/utils.js index a2c8c6d11f8e5..7f0a28a77a98b 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/utils.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/utils.js @@ -68,14 +68,7 @@ export function isValidRule(rule) { return isValid; } -export function saveJobRule( - mlJobService, - job, - detectorIndex, - ruleIndex, - editedRule, - mlApiServices -) { +export function saveJobRule(mlJobService, job, detectorIndex, ruleIndex, editedRule, mlApi) { const detector = job.analysis_config.detectors[detectorIndex]; // Filter out any scope expression where the UI=specific 'enabled' @@ -108,16 +101,16 @@ export function saveJobRule( } } - return updateJobRules(mlJobService, job, detectorIndex, rules, mlApiServices); + return updateJobRules(mlJobService, job, detectorIndex, rules, mlApi); } -export function deleteJobRule(mlJobService, job, detectorIndex, ruleIndex, mlApiServices) { +export function deleteJobRule(mlJobService, job, detectorIndex, ruleIndex, mlApi) { const detector = job.analysis_config.detectors[detectorIndex]; let customRules = []; if (detector.custom_rules !== undefined && ruleIndex < detector.custom_rules.length) { customRules = cloneDeep(detector.custom_rules); customRules.splice(ruleIndex, 1); - return updateJobRules(mlJobService, job, detectorIndex, customRules, mlApiServices); + return updateJobRules(mlJobService, job, detectorIndex, customRules, mlApi); } else { return Promise.reject( new Error( @@ -133,7 +126,7 @@ export function deleteJobRule(mlJobService, job, detectorIndex, ruleIndex, mlApi } } -export function updateJobRules(mlJobService, job, detectorIndex, rules, mlApiServices) { +export function updateJobRules(mlJobService, job, detectorIndex, rules, mlApi) { // Pass just the detector with the edited rule to the updateJob endpoint. const jobId = job.job_id; const jobData = { @@ -152,7 +145,7 @@ export function updateJobRules(mlJobService, job, detectorIndex, rules, mlApiSer jobData.custom_settings = customSettings; } return new Promise((resolve, reject) => { - mlApiServices + mlApi .updateJob({ jobId: jobId, job: jobData }) .then(() => { mlJobService @@ -172,9 +165,9 @@ export function updateJobRules(mlJobService, job, detectorIndex, rules, mlApiSer // Updates an ML filter used in the scope part of a rule, // adding an item to the filter with the specified ID. -export function addItemToFilter(item, filterId, mlApiServices) { +export function addItemToFilter(item, filterId, mlApi) { return new Promise((resolve, reject) => { - mlApiServices.filters + mlApi.filters .updateFilter(filterId, undefined, [item], undefined) .then((updatedFilter) => { resolve(updatedFilter); diff --git a/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx b/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx index 05d0888d1df58..e20bb825f7d79 100644 --- a/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx +++ b/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx @@ -10,7 +10,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { EuiCallOut, EuiLink, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import type { MlSavedObjectType } from '../../../../common/types/saved_objects'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { JobSpacesSyncFlyout } from '../job_spaces_sync'; import { usePermissionCheck } from '../../capabilities/check_capabilities'; @@ -27,7 +27,7 @@ export const SavedObjectsWarning: FC = ({ }) => { const { savedObjects: { syncCheck }, - } = useMlApiContext(); + } = useMlApi(); const mounted = useRef(false); const [showWarning, setShowWarning] = useState(false); diff --git a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.test.tsx b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.test.tsx index 247623d1dcacb..3fd25534134ae 100644 --- a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.test.tsx +++ b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.test.tsx @@ -25,7 +25,7 @@ const mockEsSearch = jest.fn((body) => ({ const mockEuiTheme = euiThemeLight; jest.mock('../../contexts/kibana', () => ({ - useMlApiContext: () => ({ + useMlApi: () => ({ esSearch: mockEsSearch, }), useMlKibana: () => ({ diff --git a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx index cbde25596b60b..dab7dc4117083 100644 --- a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx +++ b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx @@ -36,7 +36,7 @@ import { } from '@kbn/ml-runtime-field-utils'; import { getProcessedFields } from '@kbn/ml-data-grid'; -import { useCurrentThemeVars, useMlApiContext, useMlKibana } from '../../contexts/kibana'; +import { useCurrentThemeVars, useMlApi, useMlKibana } from '../../contexts/kibana'; // Separate imports for lazy loadable VegaChart and related code import { VegaChart } from '../vega_chart'; @@ -117,7 +117,7 @@ export const ScatterplotMatrix: FC = ({ dataView, query, }) => { - const { esSearch } = useMlApiContext(); + const { esSearch } = useMlApi(); const kibana = useMlKibana(); const { services: { application, data }, diff --git a/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.js b/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.js index acc17d6b8c0da..a959208fe0c31 100644 --- a/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.js +++ b/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.js @@ -130,7 +130,7 @@ export class ValidateJobUI extends Component { if (typeof duration === 'object' && duration.start !== null && duration.end !== null) { let shouldShowLoadingIndicator = true; - this.props.kibana.services.mlServices.mlApiServices + this.props.kibana.services.mlServices.mlApi .validateJob({ duration, fields, job }) .then((validationMessages) => { const messages = parseMessages(validationMessages, docLinks); diff --git a/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.test.js b/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.test.js index 5bc57a1a1fd73..265245bcd883f 100644 --- a/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.test.js +++ b/x-pack/plugins/ml/public/application/components/validate_job/validate_job_view.test.js @@ -35,7 +35,7 @@ const mockKibanaContext = { services: { docLinks: { links: { ml: { anomalyDetectionJobTips: 'https://anomalyDetectionJobTips' } } }, notifications: { toasts: { addDanger: jest.fn(), addError: jest.fn() } }, - mlServices: { mlApiServices: { validateJob: mockValidateJob } }, + mlServices: { mlApi: { validateJob: mockValidateJob } }, }, }; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/index.ts b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/index.ts index 991fd607f024e..bd360725fd3c5 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/index.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/index.ts @@ -7,5 +7,5 @@ export { useMlKibana } from './kibana_context'; export { useTimefilter } from './use_timefilter'; -export { useMlApiContext } from './use_ml_api_context'; +export { useMlApi } from './use_ml_api_context'; export { useMlLicenseInfo } from './use_ml_license'; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts index 671df792a9375..c31a7e57c73d5 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/kibana_context.ts @@ -61,7 +61,7 @@ export const kibanaContextMock = { charts: chartsServiceMock, fieldFormats: fieldFormatsServiceMock.createStartContract(), mlServices: { - mlApiServices: mlApiServicesMock, + mlApi: mlApiServicesMock, mlCapabilities: { refreshCapabilities: jest.fn(), }, diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/use_ml_api_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/use_ml_api_context.ts index b50802dd74b93..e257ad2613701 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/use_ml_api_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/__mocks__/use_ml_api_context.ts @@ -5,9 +5,9 @@ * 2.0. */ -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; -export const useMlApiContext: () => jest.Mocked = jest.fn(() => { +export const useMlApi: () => jest.Mocked = jest.fn(() => { return { jobs: { getAllJobAndGroupIds: jest.fn(), @@ -18,5 +18,5 @@ export const useMlApiContext: () => jest.Mocked = jest.fn(() => { dataFrameAnalytics: { getDataFrameAnalytics: jest.fn(), }, - } as unknown as jest.Mocked; + } as unknown as jest.Mocked; }); diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/index.ts b/x-pack/plugins/ml/public/application/contexts/kibana/index.ts index e8696e9b49068..47836e6495c06 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/index.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/index.ts @@ -12,7 +12,7 @@ export { useNavigateToPath } from './use_navigate_to_path'; export { useUiSettings } from './use_ui_settings_context'; export { useNotifications } from './use_notifications_context'; export { useMlLocator, useMlLink } from './use_create_url'; -export { useMlApiContext } from './use_ml_api_context'; +export { useMlApi } from './use_ml_api_context'; export { useFieldFormatter } from './use_field_formatter'; export { useCurrentThemeVars } from './use_current_theme'; export { useMlLicenseInfo } from './use_ml_license'; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_ml_api_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_ml_api_context.ts index f06610df1e4ce..c403bc5036876 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_ml_api_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/use_ml_api_context.ts @@ -7,6 +7,6 @@ import { useMlKibana } from './kibana_context'; -export const useMlApiContext = () => { - return useMlKibana().services.mlServices.mlApiServices; +export const useMlApi = () => { + return useMlKibana().services.mlServices.mlApi; }; diff --git a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx index ad6c05d07d4e1..a2623266712dc 100644 --- a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx +++ b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx @@ -18,7 +18,7 @@ const mockCountMessages = jest.fn(() => { const mockKibana = { services: { mlServices: { - mlApiServices: { + mlApi: { notifications: { countMessages$: mockCountMessages, }, @@ -67,7 +67,7 @@ describe('useMlNotifications', () => { }); test('retries polling on error with 1m delay', () => { - mockKibana.services.mlServices.mlApiServices.notifications.countMessages$.mockReturnValueOnce( + mockKibana.services.mlServices.mlApi.notifications.countMessages$.mockReturnValueOnce( throwError(() => new Error('Cluster is down')) ); @@ -79,24 +79,24 @@ describe('useMlNotifications', () => { jest.advanceTimersByTime(0); }); - expect( - mockKibana.services.mlServices.mlApiServices.notifications.countMessages$ - ).toHaveBeenCalledTimes(1); - expect( - mockKibana.services.mlServices.mlApiServices.notifications.countMessages$ - ).toHaveBeenCalledWith({ lastCheckedAt: 1663340537063 }); + expect(mockKibana.services.mlServices.mlApi.notifications.countMessages$).toHaveBeenCalledTimes( + 1 + ); + expect(mockKibana.services.mlServices.mlApi.notifications.countMessages$).toHaveBeenCalledWith({ + lastCheckedAt: 1663340537063, + }); act(() => { // ticks 4 minutes jest.advanceTimersByTime(60000 * 4); }); - expect( - mockKibana.services.mlServices.mlApiServices.notifications.countMessages$ - ).toHaveBeenCalledTimes(4); - expect( - mockKibana.services.mlServices.mlApiServices.notifications.countMessages$ - ).toHaveBeenCalledWith({ lastCheckedAt: 1663340537063 }); + expect(mockKibana.services.mlServices.mlApi.notifications.countMessages$).toHaveBeenCalledTimes( + 4 + ); + expect(mockKibana.services.mlServices.mlApi.notifications.countMessages$).toHaveBeenCalledWith({ + lastCheckedAt: 1663340537063, + }); }); test('returns the default values', () => { @@ -244,7 +244,7 @@ describe('useMlNotifications', () => { }); expect( - mockKibana.services.mlServices.mlApiServices.notifications.countMessages$ + mockKibana.services.mlServices.mlApi.notifications.countMessages$ ).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx index dc37535517659..d0ffdf528fc7c 100644 --- a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx +++ b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx @@ -42,7 +42,7 @@ export const MlNotificationsContext = React.createContext<{ export const MlNotificationsContextProvider: FC> = ({ children }) => { const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, application: { capabilities }, }, } = useMlKibana(); @@ -75,7 +75,7 @@ export const MlNotificationsContextProvider: FC> = ({ setLatestRequestedAt(lastCheckedAtQuery); }), switchMap((lastCheckedAtQuery) => - mlApiServices.notifications.countMessages$({ + mlApi.notifications.countMessages$({ lastCheckedAt: lastCheckedAtQuery, }) ), @@ -89,7 +89,7 @@ export const MlNotificationsContextProvider: FC> = ({ subscription.unsubscribe(); }; }, - [canGetNotifications, lastCheckedAt$, mlApiServices.notifications] + [canGetNotifications, lastCheckedAt$, mlApi.notifications] ); return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts index a636974e68b94..3264c7cc11f7a 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts @@ -20,7 +20,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { Dictionary } from '../../../../common/types/common'; -import type { MlApiServices } from '../../services/ml_api_service'; +import type { MlApi } from '../../services/ml_api_service'; export type IndexPattern = string; @@ -289,7 +289,7 @@ export enum REGRESSION_STATS { } interface LoadEvalDataConfig { - mlApiServices: MlApiServices; + mlApi: MlApi; isTraining?: boolean; index: string; dependentVariable: string; @@ -304,7 +304,7 @@ interface LoadEvalDataConfig { } export const loadEvalData = async ({ - mlApiServices, + mlApi, isTraining, index, dependentVariable, @@ -362,7 +362,7 @@ export const loadEvalData = async ({ }; try { - const evalResult = await mlApiServices.dataFrameAnalytics.evaluateDataFrameAnalytics(config); + const evalResult = await mlApi.dataFrameAnalytics.evaluateDataFrameAnalytics(config); results.success = true; results.eval = evalResult; return results; @@ -373,7 +373,7 @@ export const loadEvalData = async ({ }; interface LoadDocsCountConfig { - mlApiServices: MlApiServices; + mlApi: MlApi; ignoreDefaultQuery?: boolean; isTraining?: boolean; searchQuery: estypes.QueryDslQueryContainer; @@ -387,7 +387,7 @@ interface LoadDocsCountResponse { } export const loadDocsCount = async ({ - mlApiServices, + mlApi, ignoreDefaultQuery = true, isTraining, searchQuery, @@ -402,7 +402,7 @@ export const loadDocsCount = async ({ query, }; - const resp: TrackTotalHitsSearchResponse = await mlApiServices.esSearch({ + const resp: TrackTotalHitsSearchResponse = await mlApi.esSearch({ index: destIndex, size: 0, body, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts index bd289f3a1cdd7..6e2cb20025e72 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts @@ -12,17 +12,17 @@ import type { EsSorting, UseDataGridReturnType } from '@kbn/ml-data-grid'; import { getProcessedFields, INDEX_STATUS } from '@kbn/ml-data-grid'; import { mlJobCapsServiceAnalyticsFactory } from '../../services/new_job_capabilities/new_job_capabilities_service_analytics'; -import type { MlApiServices } from '../../services/ml_api_service'; +import type { MlApi } from '../../services/ml_api_service'; export const getIndexData = async ( - mlApiServices: MlApiServices, + mlApi: MlApi, jobConfig: DataFrameAnalyticsConfig | undefined, dataGrid: UseDataGridReturnType, searchQuery: estypes.QueryDslQueryContainer, options: { didCancel: boolean } ) => { if (jobConfig !== undefined) { - const newJobCapsServiceAnalytics = mlJobCapsServiceAnalyticsFactory(mlApiServices); + const newJobCapsServiceAnalytics = mlJobCapsServiceAnalyticsFactory(mlApi); const { pagination, @@ -50,7 +50,7 @@ export const getIndexData = async ( const { pageIndex, pageSize } = pagination; // TODO: remove results_field from `fields` when possible - const resp: estypes.SearchResponse = await mlApiServices.esSearch({ + const resp: estypes.SearchResponse = await mlApi.esSearch({ index: jobConfig.dest.index, body: { fields: ['*'], diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_fields.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_fields.ts index 0cc1bb0b587c0..f4bcec71fdcdf 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_fields.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_fields.ts @@ -9,20 +9,20 @@ import type { ES_FIELD_TYPES } from '@kbn/field-types'; import type { DataFrameAnalyticsConfig } from '@kbn/ml-data-frame-analytics-utils'; import { mlJobCapsServiceAnalyticsFactory } from '../../services/new_job_capabilities/new_job_capabilities_service_analytics'; -import type { MlApiServices } from '../../services/ml_api_service'; +import type { MlApi } from '../../services/ml_api_service'; export interface FieldTypes { [key: string]: ES_FIELD_TYPES; } export const getIndexFields = ( - mlApiServices: MlApiServices, + mlApi: MlApi, jobConfig: DataFrameAnalyticsConfig | undefined, needsDestIndexFields: boolean ) => { if (jobConfig !== undefined) { const { selectedFields: defaultSelected, docFields } = mlJobCapsServiceAnalyticsFactory( - mlApiServices + mlApi ).getDefaultFields(jobConfig, needsDestIndexFields); const types: FieldTypes = {}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts index fba862558b766..3ff08a2845c88 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts @@ -19,7 +19,7 @@ import { type TotalFeatureImportance, } from '@kbn/ml-data-frame-analytics-utils'; -import { useMlApiContext, useMlKibana } from '../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../contexts/kibana'; import { useNewJobCapsServiceAnalytics } from '../../services/new_job_capabilities/new_job_capabilities_service_analytics'; import { useMlIndexUtils } from '../../util/index_service'; @@ -35,7 +35,7 @@ export const useResultsViewConfig = (jobId: string) => { }, } = useMlKibana(); const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { getDataViewIdFromName } = useMlIndexUtils(); const trainedModelsApiService = useTrainedModelsApiService(); const newJobCapsServiceAnalytics = useNewJobCapsServiceAnalytics(); @@ -62,9 +62,9 @@ export const useResultsViewConfig = (jobId: string) => { setIsLoadingJobConfig(false); try { - const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); + const analyticsConfigs = await mlApi.dataFrameAnalytics.getDataFrameAnalytics(jobId); - const analyticsStats = await ml.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); + const analyticsStats = await mlApi.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); const stats = isGetDataFrameAnalyticsStatsResponseOk(analyticsStats) ? analyticsStats.data_frame_analytics[0] : undefined; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx index 9b8dec570a5e9..e87201cbb7b11 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx @@ -32,7 +32,7 @@ import { import { HyperParameters } from './hyper_parameters'; import type { CreateAnalyticsStepProps } from '../../../analytics_management/hooks/use_create_analytics_form'; import { getModelMemoryLimitErrors } from '../../../analytics_management/hooks/use_create_analytics_form/reducer'; -import { useMlKibana, useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlKibana, useMlApi } from '../../../../../contexts/kibana'; import { DEFAULT_MODEL_MEMORY_LIMIT } from '../../../analytics_management/hooks/use_create_analytics_form/state'; import { ANALYTICS_STEPS } from '../../page'; import { fetchExplainData } from '../shared'; @@ -134,7 +134,7 @@ export const AdvancedStepForm: FC = ({ const { services: { docLinks }, } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const classAucRocDocLink = docLinks.links.ml.classificationAucRoc; const { setEstimatedModelMemoryLimit, setFormState } = actions; @@ -207,7 +207,7 @@ export const AdvancedStepForm: FC = ({ setFetchingAdvancedParamErrors(true); (async function () { const { success, errorMessage, errorReason, expectedMemory } = await fetchExplainData( - mlApiServices, + mlApi, form ); const paramErrors: AdvancedParamErrors = {}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 4f737c1137663..c0920b39d47fc 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -29,7 +29,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import { DataGrid } from '@kbn/ml-data-grid'; import { SEARCH_QUERY_LANGUAGE } from '@kbn/ml-query-utils'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import { EuiComboBoxWithFieldStats, FieldStatsFlyoutProvider, @@ -116,7 +116,7 @@ export const ConfigurationStepForm: FC = ({ }) => { const { services } = useMlKibana(); const toastNotifications = services.notifications.toasts; - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const newJobCapsServiceAnalytics = useNewJobCapsServiceAnalytics(); const { selectedDataView, selectedSavedSearch } = useDataSource(); const { savedSearchQuery, savedSearchQueryStr } = useSavedSearch(); @@ -288,7 +288,7 @@ export const ConfigurationStepForm: FC = ({ fieldSelection, errorMessage, noDocsContainMappedFields: noDocsWithFields, - } = await fetchExplainData(mlApiServices, formToUse); + } = await fetchExplainData(mlApi, formToUse); if (success) { if (shouldUpdateEstimatedMml) { @@ -444,7 +444,7 @@ export const ConfigurationStepForm: FC = ({ fieldSelection, errorMessage, noDocsContainMappedFields: noDocsWithFields, - } = await fetchExplainData(mlApiServices, formCopy); + } = await fetchExplainData(mlApi, formCopy); if (success) { // update the field selection table const hasRequiredFields = fieldSelection.some( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx index a2a6e965c3e70..2f329be788398 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx @@ -14,7 +14,7 @@ import { i18n } from '@kbn/i18n'; import { extractErrorMessage } from '@kbn/ml-error-utils'; import { dynamic } from '@kbn/shared-ux-utility'; -import { useMlApiContext, useNotifications } from '../../../../../contexts/kibana'; +import { useMlApi, useNotifications } from '../../../../../contexts/kibana'; import type { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; import { CreateStep } from '../create_step'; import { ANALYTICS_STEPS } from '../../page'; @@ -24,7 +24,7 @@ const EditorComponent = dynamic(async () => ({ })); export const CreateAnalyticsAdvancedEditor: FC = (props) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { actions, state } = props; const { setAdvancedEditorRawString, setFormState } = actions; @@ -43,7 +43,7 @@ export const CreateAnalyticsAdvancedEditor: FC = (prop () => debounce(async () => { try { - const results = await ml.dataFrameAnalytics.jobsExist([jobId], true); + const results = await mlApi.dataFrameAnalytics.jobsExist([jobId], true); setFormState({ jobIdExists: results[jobId].exists }); } catch (e) { toasts.addDanger( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx index b7dac69e1226e..715733c163314 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx @@ -16,7 +16,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import { getDataFrameAnalyticsProgressPhase } from '../../../analytics_management/components/analytics_list/common'; import { isGetDataFrameAnalyticsStatsResponseOk } from '../../../analytics_management/services/analytics_service/get_analytics'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import { BackToListPanel } from '../back_to_list_panel'; import { ViewResultsPanel } from '../view_results_panel'; import { ProgressStats } from './progress_stats'; @@ -48,7 +48,7 @@ export const CreateStepFooter: FC = ({ jobId, jobType, showProgress }) => const { services: { notifications }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); useEffect(() => { setInitialized(true); @@ -59,7 +59,7 @@ export const CreateStepFooter: FC = ({ jobId, jobType, showProgress }) => const interval = setInterval(async () => { try { - const analyticsStats = await ml.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); + const analyticsStats = await mlApi.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); const jobStats = isGetDataFrameAnalyticsStatsResponseOk(analyticsStats) ? analyticsStats.data_frame_analytics[0] : undefined; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx index d80c23732dcbd..f43ce7bd2fb9b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx @@ -14,7 +14,7 @@ import { extractErrorMessage } from '@kbn/ml-error-utils'; import { CreateDataViewForm } from '@kbn/ml-data-view-utils/components/create_data_view_form_row'; import { DestinationIndexForm } from '@kbn/ml-creation-wizard-utils/components/destination_index_form'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import type { CreateAnalyticsStepProps } from '../../../analytics_management/hooks/use_create_analytics_form'; import { JOB_ID_MAX_LENGTH } from '../../../../../../../common/constants/validation'; import { ContinueButton } from '../continue_button'; @@ -42,7 +42,7 @@ export const DetailsStepForm: FC = ({ const { services: { docLinks, notifications }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const canCreateDataView = useCanCreateDataView(); const { dataViewAvailableTimeFields, onTimeFieldChanged } = useDataViewTimeFields({ @@ -90,7 +90,7 @@ export const DetailsStepForm: FC = ({ const debouncedIndexCheck = debounce(async () => { try { - const resp = await ml.checkIndicesExists({ indices: [destinationIndex] }); + const resp = await mlApi.checkIndicesExists({ indices: [destinationIndex] }); setFormState({ destinationIndexNameExists: resp[destinationIndex].exists }); } catch (e) { notifications.toasts.addDanger( @@ -106,7 +106,7 @@ export const DetailsStepForm: FC = ({ () => debounce(async () => { try { - const results = await ml.dataFrameAnalytics.jobsExist([jobId], true); + const results = await mlApi.dataFrameAnalytics.jobsExist([jobId], true); setFormState({ jobIdExists: results[jobId].exists }); } catch (e) { notifications.toasts.addDanger( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/shared/fetch_explain_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/shared/fetch_explain_data.ts index 680415e189354..44150ae0e047a 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/shared/fetch_explain_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/shared/fetch_explain_data.ts @@ -13,9 +13,9 @@ import type { } from '@kbn/ml-data-frame-analytics-utils'; import type { State } from '../../../analytics_management/hooks/use_create_analytics_form/state'; import { getJobConfigFromFormState } from '../../../analytics_management/hooks/use_create_analytics_form/state'; -import type { MlApiServices } from '../../../../../services/ml_api_service'; +import type { MlApi } from '../../../../../services/ml_api_service'; -export const fetchExplainData = async (mlApiServices: MlApiServices, formState: State['form']) => { +export const fetchExplainData = async (mlApi: MlApi, formState: State['form']) => { const jobConfig = getJobConfigFromFormState(formState); let errorMessage = ''; let errorReason = ''; @@ -29,7 +29,7 @@ export const fetchExplainData = async (mlApiServices: MlApiServices, formState: delete jobConfig.model_memory_limit; delete jobConfig.analyzed_fields; const resp: DfAnalyticsExplainResponse = - await mlApiServices.dataFrameAnalytics.explainDataFrameAnalytics(jobConfig); + await mlApi.dataFrameAnalytics.explainDataFrameAnalytics(jobConfig); expectedMemory = resp.memory_estimation?.expected_memory_without_disk; fieldSelection = resp.field_selection || []; } catch (error) { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx index d0adffc24ec01..3c8cba36458a2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx @@ -18,7 +18,7 @@ import type { CreateAnalyticsStepProps } from '../../../analytics_management/hoo import { ValidationStep } from './validation_step'; import { ValidationStepDetails } from './validation_step_details'; import { ANALYTICS_STEPS } from '../../page'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import { getJobConfigFromFormState } from '../../../analytics_management/hooks/use_create_analytics_form/state'; import type { CalloutMessage, @@ -53,7 +53,7 @@ export const ValidationStepWrapper: FC = ({ const showDetails = step !== ANALYTICS_STEPS.VALIDATION && stepActivated === true; const { dataFrameAnalytics: { validateDataFrameAnalytics }, - } = useMlApiContext(); + } = useMlApi(); const dataTestSubj = `mlAnalyticsCreateJobWizardValidationStepWrapper${ showValidationStep ? ' active' : '' diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_has_index_permission.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_has_index_permission.ts index 2fc8fb6b85f14..a618d172cbb4c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_has_index_permission.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_has_index_permission.ts @@ -17,7 +17,7 @@ export const useHasRequiredIndicesPermissions = ( const { services: { mlServices: { - mlApiServices: { hasPrivileges }, + mlApi: { hasPrivileges }, }, }, } = useMlKibana(); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts index 80abafecd83ed..a0b995fabffc8 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts @@ -34,7 +34,7 @@ import { INDEX_STATUS, } from '@kbn/ml-data-grid'; -import { useMlApiContext } from '../../../../contexts/kibana'; +import { useMlApi } from '../../../../contexts/kibana'; import { DataLoader } from '../../../../datavisualizer/index_based/data_loader'; type IndexSearchResponse = estypes.SearchResponse; @@ -81,7 +81,7 @@ export const useIndexData = ( toastNotifications: CoreSetup['notifications']['toasts'], runtimeMappings?: RuntimeMappings ): UseIndexDataReturnType => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); // Fetch 500 random documents to determine populated fields. // This is a workaround to avoid passing potentially thousands of unpopulated fields // (for example, as part of filebeat/metricbeat/ECS based indices) @@ -110,7 +110,7 @@ export const useIndexData = ( }; try { - const resp: IndexSearchResponse = await ml.esSearch(esSearchRequest); + const resp: IndexSearchResponse = await mlApi.esSearch(esSearchRequest); const docs = resp.hits.hits.map((d) => getProcessedFields(d.fields ?? {})); // Get all field names for each returned doc and flatten it @@ -216,7 +216,7 @@ export const useIndexData = ( }; try { - const resp: IndexSearchResponse = await ml.esSearch(esSearchRequest); + const resp: IndexSearchResponse = await mlApi.esSearch(esSearchRequest); if ( resp.aggregations && @@ -258,7 +258,7 @@ export const useIndexData = ( ]); const dataLoader = useMemo( - () => new DataLoader(dataView, ml), + () => new DataLoader(dataView, mlApi), // eslint-disable-next-line react-hooks/exhaustive-deps [dataView] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx index 4890ac59ffbe6..aa276e55ba024 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx @@ -21,7 +21,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { DataFrameAnalyticsId } from '@kbn/ml-data-frame-analytics-utils'; import { useDataSource } from '../../../contexts/ml/data_source_context'; -import { useMlApiContext } from '../../../contexts/kibana'; +import { useMlApi } from '../../../contexts/kibana'; import { useCreateAnalyticsForm } from '../analytics_management/hooks/use_create_analytics_form'; import { CreateAnalyticsAdvancedEditor } from './components/create_analytics_advanced_editor'; import { @@ -46,7 +46,7 @@ interface Props { } export const Page: FC = ({ jobId }) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [currentStep, setCurrentStep] = useState(ANALYTICS_STEPS.CONFIGURATION); const [activatedSteps, setActivatedSteps] = useState([ true, @@ -71,7 +71,10 @@ export const Page: FC = ({ jobId }) => { if (selectedDataView) { (async function () { if (jobId !== undefined) { - const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId, true); + const analyticsConfigs = await mlApi.dataFrameAnalytics.getDataFrameAnalytics( + jobId, + true + ); if ( Array.isArray(analyticsConfigs.data_frame_analytics) && analyticsConfigs.data_frame_analytics.length > 0 diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts index 74ca62a874081..132ce9bd12aae 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts @@ -17,7 +17,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import { useNewJobCapsServiceAnalytics } from '../../../../../services/new_job_capabilities/new_job_capabilities_service_analytics'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import type { ResultsSearchQuery, ClassificationMetricItem } from '../../../../common/analytics'; import { isClassificationEvaluateResponse } from '../../../../common/analytics'; @@ -60,7 +60,7 @@ export const useConfusionMatrix = ( jobConfig: DataFrameAnalyticsConfig, searchQuery: ResultsSearchQuery ) => { - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const newJobCapsServiceAnalytics = useNewJobCapsServiceAnalytics(); const [confusionMatrixData, setConfusionMatrixData] = useState([]); const [overallAccuracy, setOverallAccuracy] = useState(null); @@ -89,7 +89,7 @@ export const useConfusionMatrix = ( } const evalData = await loadEvalData({ - mlApiServices, + mlApi, isTraining, index: jobConfig.dest.index, dependentVariable, @@ -101,7 +101,7 @@ export const useConfusionMatrix = ( }); const docsCountResp = await loadDocsCount({ - mlApiServices, + mlApi, isTraining, searchQuery, resultsField, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts index 88dd6f20cd75d..de85a818b6c16 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts @@ -16,7 +16,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import { useNewJobCapsServiceAnalytics } from '../../../../../services/new_job_capabilities/new_job_capabilities_service_analytics'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import type { ResultsSearchQuery } from '../../../../common/analytics'; import { isClassificationEvaluateResponse } from '../../../../common/analytics'; @@ -40,7 +40,7 @@ export const useRocCurve = ( searchQuery: ResultsSearchQuery, columns: string[] ) => { - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const newJobCapsServiceAnalytics = useNewJobCapsServiceAnalytics(); const classificationClasses = columns.filter( (d) => d !== ACTUAL_CLASS_ID && d !== OTHER_CLASS_ID @@ -77,7 +77,7 @@ export const useRocCurve = ( for (let i = 0; i < classificationClasses.length; i++) { const rocCurveClassName = classificationClasses[i]; const evalData = await loadEvalData({ - mlApiServices, + mlApi, isTraining: isTrainingFilter(searchQuery, resultsField), index: jobConfig.dest.index, dependentVariable, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx index 10e302fad2249..2b90712726666 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx @@ -21,7 +21,7 @@ import { isGetDataFrameAnalyticsStatsResponseOk } from '../../../analytics_manag import type { DataFrameAnalyticsListRow } from '../../../analytics_management/components/analytics_list/common'; import { DATA_FRAME_MODE } from '../../../analytics_management/components/analytics_list/common'; import { ExpandedRow } from '../../../analytics_management/components/analytics_list/expanded_row'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import type { ExpandableSectionProps } from './expandable_section'; import { ExpandableSection, HEADER_ITEMS_LOADING } from './expandable_section'; @@ -75,13 +75,13 @@ interface ExpandableSectionAnalyticsProps { } export const ExpandableSectionAnalytics: FC = ({ jobId }) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [expandedRowItem, setExpandedRowItem] = useState(); const fetchStats = async () => { - const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); - const analyticsStats = await ml.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); + const analyticsConfigs = await mlApi.dataFrameAnalytics.getDataFrameAnalytics(jobId); + const analyticsStats = await mlApi.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); const config = analyticsConfigs.data_frame_analytics[0]; const stats = isGetDataFrameAnalyticsStatsResponseOk(analyticsStats) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index 34ad61d02cd3b..8d2d70dd898a4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -34,7 +34,7 @@ import { } from '@kbn/ml-data-grid'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import { DataLoader } from '../../../../../datavisualizer/index_based/data_loader'; import { getIndexData, getIndexFields } from '../../../../common'; @@ -51,7 +51,7 @@ export const useExplorationResults = ( notifications: { toasts }, }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [baseline, setBaseLine] = useState(); const trainedModelsApiService = useTrainedModelsApiService(); @@ -63,7 +63,7 @@ export const useExplorationResults = ( if (jobConfig !== undefined) { const resultsField = jobConfig.dest.results_field!; - const { fieldTypes } = getIndexFields(ml, jobConfig, needsDestIndexFields); + const { fieldTypes } = getIndexFields(mlApi, jobConfig, needsDestIndexFields); columns.push( ...getDataGridSchemasFromFieldTypes(fieldTypes, resultsField).sort((a: any, b: any) => sortExplorationResultsFields(a.id, b.id, jobConfig) @@ -84,7 +84,7 @@ export const useExplorationResults = ( // passed on to `getIndexData`. useEffect(() => { const options = { didCancel: false }; - getIndexData(ml, jobConfig, dataGrid, searchQuery, options); + getIndexData(mlApi, jobConfig, dataGrid, searchQuery, options); return () => { options.didCancel = true; }; @@ -93,7 +93,7 @@ export const useExplorationResults = ( }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( - () => (dataView !== undefined ? new DataLoader(dataView, ml) : undefined), + () => (dataView !== undefined ? new DataLoader(dataView, mlApi) : undefined), // eslint-disable-next-line react-hooks/exhaustive-deps [dataView] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts index 5b9ce4646b9e7..8c362cd1b06b4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts @@ -33,7 +33,7 @@ import { COLOR_RANGE, COLOR_RANGE_SCALE, } from '../../../../../components/color_range_legend'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import { getIndexData, getIndexFields } from '../../../../common'; @@ -50,7 +50,7 @@ export const useOutlierData = ( notifications: { toasts }, }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const needsDestIndexFields = dataView !== undefined && dataView.title === jobConfig?.source.index[0]; @@ -59,7 +59,7 @@ export const useOutlierData = ( if (jobConfig !== undefined && dataView !== undefined) { const resultsField = jobConfig.dest.results_field; - const { fieldTypes } = getIndexFields(ml, jobConfig, needsDestIndexFields); + const { fieldTypes } = getIndexFields(mlApi, jobConfig, needsDestIndexFields); newColumns.push( ...getDataGridSchemasFromFieldTypes(fieldTypes, resultsField!).sort((a: any, b: any) => sortExplorationResultsFields(a.id, b.id, jobConfig) @@ -92,7 +92,7 @@ export const useOutlierData = ( // passed on to `getIndexData`. useEffect(() => { const options = { didCancel: false }; - getIndexData(ml, jobConfig, dataGrid, searchQuery, options); + getIndexData(mlApi, jobConfig, dataGrid, searchQuery, options); return () => { options.didCancel = true; }; @@ -101,7 +101,7 @@ export const useOutlierData = ( }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( - () => (dataView !== undefined ? new DataLoader(dataView, ml) : undefined), + () => (dataView !== undefined ? new DataLoader(dataView, mlApi) : undefined), // skip ml API services from deps check // eslint-disable-next-line react-hooks/exhaustive-deps [dataView] diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx index 398e0ecb61505..935a1eecb8538 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx @@ -28,7 +28,7 @@ import { } from '@kbn/ml-data-frame-analytics-utils'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import type { Eval } from '../../../../common'; import { getValuesFromResponse, loadEvalData, loadDocsCount } from '../../../../common'; @@ -65,7 +65,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) const { services: { docLinks }, } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const docLink = docLinks.links.ml.regressionEvaluation; const [trainingEval, setTrainingEval] = useState(defaultEval); const [generalizationEval, setGeneralizationEval] = useState(defaultEval); @@ -85,7 +85,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) setIsLoadingGeneralization(true); const genErrorEval = await loadEvalData({ - mlApiServices, + mlApi, isTraining: false, index, dependentVariable, @@ -124,7 +124,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) setIsLoadingTraining(true); const trainingErrorEval = await loadEvalData({ - mlApiServices, + mlApi, isTraining: true, index, dependentVariable, @@ -162,7 +162,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) const loadData = async () => { loadGeneralizationData(false); const genDocsCountResp = await loadDocsCount({ - mlApiServices, + mlApi, ignoreDefaultQuery: false, isTraining: false, searchQuery, @@ -177,7 +177,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) loadTrainingData(false); const trainDocsCountResp = await loadDocsCount({ - mlApiServices, + mlApi, ignoreDefaultQuery: false, isTraining: true, searchQuery, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx index d9994a47e6a88..fd7cf90dbb7df 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx @@ -20,7 +20,7 @@ import { RegressionExploration } from './components/regression_exploration'; import { ClassificationExploration } from './components/classification_exploration'; import { HelpMenu } from '../../../components/help_menu'; -import { useMlKibana, useMlApiContext } from '../../../contexts/kibana'; +import { useMlKibana, useMlApi } from '../../../contexts/kibana'; import { MlPageHeader } from '../../../components/page_header'; import type { AnalyticsSelectorIds } from '../components/analytics_selector'; import { AnalyticsIdSelector, AnalyticsIdSelectorControls } from '../components/analytics_selector'; @@ -39,7 +39,7 @@ export const Page: FC<{ } = useMlKibana(); const { dataFrameAnalytics: { getDataFrameAnalytics }, - } = useMlApiContext(); + } = useMlApi(); const helpLink = docLinks.links.ml.dataFrameAnalytics; const jobIdToUse = jobId ?? analyticsId?.job_id; const [analysisTypeToUse, setAnalysisTypeToUse] = useState< diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx index 2ae6a2ae1b265..08abae19d3401 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx @@ -22,7 +22,7 @@ jest.mock('../../../../../capabilities/check_capabilities', () => ({ })); jest.mock('../../../../../contexts/kibana', () => ({ - useMlApiContext: jest.fn(), + useMlApi: jest.fn(), useMlKibana: () => ({ services: { ...mockCoreServices.createStart(), data: { data_view: { find: jest.fn() } } }, }), diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_action_flyout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_action_flyout.tsx index cc66cf0c34dbf..77aa8b669011c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_action_flyout.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_action_flyout.tsx @@ -36,7 +36,7 @@ import { type UpdateDataFrameAnalyticsConfig, } from '@kbn/ml-data-frame-analytics-utils'; -import { useMlKibana, useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlKibana, useMlApi } from '../../../../../contexts/kibana'; import { useToastNotificationService } from '../../../../../services/toast_notification_service'; import type { MemoryInputValidatorResult } from '../../../../../../../common/util/validators'; import { memoryInputValidator } from '../../../../../../../common/util/validators'; @@ -69,10 +69,10 @@ export const EditActionFlyout: FC> = ({ closeFlyout, item } } = useMlKibana(); const { refresh } = useRefreshAnalyticsList(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { dataFrameAnalytics: { getDataFrameAnalytics }, - } = ml; + } = mlApi; const toastNotificationService = useToastNotificationService(); @@ -122,7 +122,7 @@ export const EditActionFlyout: FC> = ({ closeFlyout, item } const updateDataFrameAnalytics = async (updateConfig: UpdateDataFrameAnalyticsConfig) => { try { - await ml.dataFrameAnalytics.updateDataFrameAnalytics(jobId, updateConfig); + await mlApi.dataFrameAnalytics.updateDataFrameAnalytics(jobId, updateConfig); notifications.toasts.addSuccess( i18n.translate('xpack.ml.dataframe.analyticsList.editFlyoutSuccessMessage', { defaultMessage: 'Analytics job {jobId} has been updated.', diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx index cdfd3f00ff3dc..ed16443cff7b1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx @@ -10,7 +10,7 @@ import './expanded_row_messages_pane.scss'; import type { FC } from 'react'; import React, { useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import { useRefreshAnalyticsList } from '../../../../common'; import { JobMessages } from '../../../../../components/job_messages'; import type { JobMessage } from '../../../../../../../common/types/audit_message'; @@ -22,7 +22,7 @@ interface Props { } export const ExpandedRowMessagesPane: FC = ({ analyticsId, dataTestSubj }) => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [messages, setMessages] = useState([]); const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(''); @@ -31,7 +31,7 @@ export const ExpandedRowMessagesPane: FC = ({ analyticsId, dataTestSubj } const getMessages = useCallback(async () => { try { setIsLoading(true); - const messagesResp = await ml.dataFrameAnalytics.getAnalyticsAuditMessages(analyticsId); + const messagesResp = await mlApi.dataFrameAnalytics.getAnalyticsAuditMessages(analyticsId); setIsLoading(false); setMessages(messagesResp); } catch (error) { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts index f458c11551698..07fa5e133d701 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts @@ -13,7 +13,7 @@ import { extractErrorMessage } from '@kbn/ml-error-utils'; import { extractErrorProperties } from '@kbn/ml-error-utils'; import type { DataFrameAnalyticsConfig } from '@kbn/ml-data-frame-analytics-utils'; -import { useMlApiContext, useMlKibana } from '../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../contexts/kibana'; import type { DeepReadonly } from '../../../../../../../common/types/common'; import { useRefreshAnalyticsList } from '../../../../common'; @@ -49,7 +49,7 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { data: { dataViews }, }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [state, dispatch] = useReducer(reducer, getInitialState()); const { refresh } = useRefreshAnalyticsList(); @@ -95,7 +95,7 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { ); try { - const creationResp = await ml.dataFrameAnalytics.createDataFrameAnalytics( + const creationResp = await mlApi.dataFrameAnalytics.createDataFrameAnalytics( jobId, analyticsJobConfig, createDataView, @@ -168,7 +168,7 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const startAnalyticsJob = async () => { try { - const response = await ml.dataFrameAnalytics.startDataFrameAnalytics(jobId); + const response = await mlApi.dataFrameAnalytics.startDataFrameAnalytics(jobId); if (response.acknowledged !== true) { throw new Error(response); } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts index 281ebeccabac9..074f3257580c2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts @@ -8,18 +8,18 @@ import { i18n } from '@kbn/i18n'; import { extractErrorMessage } from '@kbn/ml-error-utils'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import { useToastNotificationService } from '../../../../../services/toast_notification_service'; import { refreshAnalyticsList$, REFRESH_ANALYTICS_LIST_STATE } from '../../../../common'; import type { DataFrameAnalyticsListRow } from '../../components/analytics_list/common'; export const useDeleteAnalytics = () => { const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); return async (analyticsConfig: DataFrameAnalyticsListRow['config']) => { try { - await ml.dataFrameAnalytics.deleteDataFrameAnalytics(analyticsConfig.id); + await mlApi.dataFrameAnalytics.deleteDataFrameAnalytics(analyticsConfig.id); toastNotificationService.displaySuccessToast( i18n.translate('xpack.ml.dataframe.analyticsList.deleteAnalyticsSuccessMessage', { defaultMessage: 'Request to delete data frame analytics job {analyticsId} acknowledged.', @@ -41,7 +41,7 @@ export const useDeleteAnalytics = () => { export const useDeleteAnalyticsAndDestIndex = () => { const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); return async ( analyticsConfig: DataFrameAnalyticsListRow['config'], @@ -50,7 +50,7 @@ export const useDeleteAnalyticsAndDestIndex = () => { ) => { const destinationIndex = analyticsConfig.dest.index; try { - const status = await ml.dataFrameAnalytics.deleteDataFrameAnalyticsAndDestIndex( + const status = await mlApi.dataFrameAnalytics.deleteDataFrameAnalyticsAndDestIndex( analyticsConfig.id, deleteDestIndex, deleteDestDataView @@ -134,11 +134,11 @@ export const useDeleteAnalyticsAndDestIndex = () => { export const useCanDeleteIndex = () => { const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); return async (indexName: string) => { try { - const privilege = await ml.hasPrivileges({ + const privilege = await mlApi.hasPrivileges({ index: [ { names: [indexName], // uses wildcard diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/get_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/get_analytics.ts index 9a7cccc77aa3f..b143271c61cc8 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/get_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/get_analytics.ts @@ -11,7 +11,7 @@ import { type DataFrameAnalysisConfigType, DATA_FRAME_TASK_STATE, } from '@kbn/ml-data-frame-analytics-utils'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import type { GetDataFrameAnalyticsStatsResponseError, GetDataFrameAnalyticsStatsResponseOk, @@ -116,7 +116,7 @@ export const useGetAnalytics = ( setJobsAwaitingNodeCount: React.Dispatch>, blockRefresh: boolean ): GetAnalytics => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); let concurrentLoads = 0; @@ -130,8 +130,8 @@ export const useGetAnalytics = ( } try { - const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(); - const analyticsStats = await ml.dataFrameAnalytics.getDataFrameAnalyticsStats(); + const analyticsConfigs = await mlApi.dataFrameAnalytics.getDataFrameAnalytics(); + const analyticsStats = await mlApi.dataFrameAnalytics.getDataFrameAnalyticsStats(); const analyticsStatsResult = isGetDataFrameAnalyticsStatsResponseOk(analyticsStats) ? getAnalyticsJobsStats(analyticsStats) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/start_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/start_analytics.ts index a5b0dfd32ffa5..b938872c76163 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/start_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/start_analytics.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import { useToastNotificationService } from '../../../../../services/toast_notification_service'; import { refreshAnalyticsList$, REFRESH_ANALYTICS_LIST_STATE } from '../../../../common'; @@ -16,11 +16,11 @@ import type { DataFrameAnalyticsListRow } from '../../components/analytics_list/ export const useStartAnalytics = () => { const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); return async (d: DataFrameAnalyticsListRow) => { try { - await ml.dataFrameAnalytics.startDataFrameAnalytics(d.config.id); + await mlApi.dataFrameAnalytics.startDataFrameAnalytics(d.config.id); toastNotificationService.displaySuccessToast( i18n.translate('xpack.ml.dataframe.analyticsList.startAnalyticsSuccessMessage', { defaultMessage: 'Request to start data frame analytics {analyticsId} acknowledged.', diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/stop_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/stop_analytics.ts index af0b746a17332..af471ab21df21 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/stop_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/stop_analytics.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { useMlApiContext } from '../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../contexts/kibana'; import { useToastNotificationService } from '../../../../../services/toast_notification_service'; import { refreshAnalyticsList$, REFRESH_ANALYTICS_LIST_STATE } from '../../../../common'; @@ -17,11 +17,11 @@ import { isDataFrameAnalyticsFailed } from '../../components/analytics_list/comm export const useStopAnalytics = () => { const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); return async (d: DataFrameAnalyticsListRow) => { try { - await ml.dataFrameAnalytics.stopDataFrameAnalytics( + await mlApi.dataFrameAnalytics.stopDataFrameAnalytics( d.config.id, isDataFrameAnalyticsFailed(d.stats.state) ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx index 7878e58193b89..bf786436919a9 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx @@ -29,7 +29,7 @@ import { useTrainedModelsApiService } from '../../../../services/ml_api_service/ import type { GetDataFrameAnalyticsResponse } from '../../../../services/ml_api_service/data_frame_analytics'; import { useToastNotificationService } from '../../../../services/toast_notification_service'; import { ModelsTableToConfigMapping } from '../../../../model_management/config_mapping'; -import { useMlApiContext } from '../../../../contexts/kibana'; +import { useMlApi } from '../../../../contexts/kibana'; import type { TrainedModelConfigResponse } from '../../../../../../common/types/trained_models'; export interface AnalyticsSelectorIds { @@ -127,7 +127,7 @@ export function AnalyticsIdSelector({ const trainedModelsApiService = useTrainedModelsApiService(); const { dataFrameAnalytics: { getDataFrameAnalytics }, - } = useMlApiContext(); + } = useMlApi(); function renderTabs() { return ; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx index 6cb7532b7bb9a..7afb189cf91f3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx @@ -16,7 +16,7 @@ import { SavedObjectsWarning } from '../../../components/saved_objects_warning'; import { UpgradeWarning } from '../../../components/upgrade'; import { JobMap } from '.'; import { HelpMenu } from '../../../components/help_menu'; -import { useMlKibana, useMlApiContext } from '../../../contexts/kibana'; +import { useMlKibana, useMlApi } from '../../../contexts/kibana'; import { useRefreshAnalyticsList } from '../../common'; import { MlPageHeader } from '../../../components/page_header'; import type { AnalyticsSelectorIds } from '../components/analytics_selector'; @@ -52,7 +52,7 @@ export const Page: FC = () => { } = useMlKibana(); const { dataFrameAnalytics: { getDataFrameAnalytics }, - } = useMlApiContext(); + } = useMlApi(); const helpLink = docLinks.links.ml.dataFrameAnalytics; const checkJobsExist = async () => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/use_fetch_analytics_map_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/use_fetch_analytics_map_data.ts index d56cd4b7c638d..53c144e62ffd0 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/use_fetch_analytics_map_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/use_fetch_analytics_map_data.ts @@ -14,7 +14,7 @@ import { JOB_MAP_NODE_TYPES, type AnalyticsMapReturnType, } from '@kbn/ml-data-frame-analytics-utils'; -import { useMlApiContext } from '../../../contexts/kibana'; +import { useMlApi } from '../../../contexts/kibana'; interface GetDataObjectParameter { analyticsId?: string; id?: string; @@ -23,7 +23,7 @@ interface GetDataObjectParameter { } export const useFetchAnalyticsMapData = () => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [isLoading, setIsLoading] = useState(false); const [elements, setElements] = useState([]); const [error, setError] = useState(); @@ -39,7 +39,7 @@ export const useFetchAnalyticsMapData = () => { } // Pass in treatAsRoot flag - endpoint will take job or index to grab jobs created from it const analyticsMap: AnalyticsMapReturnType = - await ml.dataFrameAnalytics.getDataFrameAnalyticsMap(idToUse, treatAsRoot, type); + await mlApi.dataFrameAnalytics.getDataFrameAnalyticsMap(idToUse, treatAsRoot, type); const { elements: nodeElements, details, error: fetchError } = analyticsMap; diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx b/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx index bc4d204fda223..a4ff83970c9c0 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx @@ -17,7 +17,7 @@ import type { import { useTimefilter } from '@kbn/ml-date-picker'; import type { ResultLinks } from '@kbn/data-visualizer-plugin/common/app'; import { HelpMenu } from '../../components/help_menu'; -import { useMlApiContext, useMlKibana, useMlLocator } from '../../contexts/kibana'; +import { useMlApi, useMlKibana, useMlLocator } from '../../contexts/kibana'; import { ML_PAGES } from '../../../../common/constants/locator'; import { isFullLicense } from '../../license'; @@ -36,9 +36,9 @@ export const FileDataVisualizerPage: FC = () => { }, }, } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const mlLocator = useMlLocator()!; - getMlNodeCount(mlApiServices); + getMlNodeCount(mlApi); const [FileDataVisualizer, setFileDataVisualizer] = useState(null); const [resultLinks, setResultLinks] = useState(null); @@ -105,7 +105,7 @@ export const FileDataVisualizerPage: FC = () => { useEffect(() => { // ML uses this function if (dataVisualizer !== undefined) { - getMlNodeCount(mlApiServices); + getMlNodeCount(mlApi); const { getFileDataVisualizerComponent } = dataVisualizer; getFileDataVisualizerComponent().then((resp) => { const items = resp(); diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/data_loader/data_loader.ts b/x-pack/plugins/ml/public/application/datavisualizer/index_based/data_loader/data_loader.ts index 3ca5acb5a41bc..fcf4e1cb484c4 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/data_loader/data_loader.ts +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/data_loader/data_loader.ts @@ -12,7 +12,7 @@ import { type RuntimeMappings } from '@kbn/ml-runtime-field-utils'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { IndexPatternTitle } from '../../../../../common/types/kibana'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { FieldHistogramRequestConfig } from '../common/request'; @@ -24,7 +24,7 @@ export class DataLoader { private _indexPatternTitle: IndexPatternTitle = ''; private _maxExamples: number = MAX_EXAMPLES_DEFAULT; - constructor(private _indexPattern: DataView, private _mlApiServices: MlApiServices) { + constructor(private _indexPattern: DataView, private _mlApi: MlApi) { this._runtimeMappings = this._indexPattern.getComputedFields().runtimeFields as RuntimeMappings; this._indexPatternTitle = _indexPattern.title; } @@ -35,7 +35,7 @@ export class DataLoader { samplerShardSize = DEFAULT_SAMPLER_SHARD_SIZE, editorRuntimeMappings?: RuntimeMappings ): Promise { - const stats = await this._mlApiServices.getVisualizerFieldHistograms({ + const stats = await this._mlApi.getVisualizerFieldHistograms({ indexPattern: this._indexPatternTitle, query, fields, diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx b/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx index ac980bf21c32c..e85da14ddb808 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx @@ -18,7 +18,7 @@ import type { import { useTimefilter } from '@kbn/ml-date-picker'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import useMountedState from 'react-use/lib/useMountedState'; -import { useMlApiContext, useMlKibana, useMlLocator } from '../../contexts/kibana'; +import { useMlApi, useMlKibana, useMlLocator } from '../../contexts/kibana'; import { HelpMenu } from '../../components/help_menu'; import { ML_PAGES } from '../../../../common/constants/locator'; import { isFullLicense } from '../../license'; @@ -36,15 +36,15 @@ export const IndexDataVisualizerPage: FC<{ esql: boolean }> = ({ esql = false }) dataViews: { get: getDataView }, }, mlServices: { - mlApiServices: { recognizeIndex }, + mlApi: { recognizeIndex }, }, }, } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const { showNodeInfo } = useEnabledFeatures(); const mlLocator = useMlLocator()!; const mlFeaturesDisabled = !isFullLicense(); - getMlNodeCount(mlApiServices); + getMlNodeCount(mlApi); const [IndexDataVisualizer, setIndexDataVisualizer] = useState( null diff --git a/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts b/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts index 80f32a3df82fc..41a3da0586e02 100644 --- a/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts +++ b/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts @@ -32,12 +32,12 @@ import { loadOverallAnnotations, } from '../explorer_utils'; import type { ExplorerState } from '../reducers'; -import { useMlApiContext, useUiSettings } from '../../contexts/kibana'; +import { useMlApi, useUiSettings } from '../../contexts/kibana'; import type { MlResultsService } from '../../services/results_service'; import { mlResultsServiceProvider } from '../../services/results_service'; import type { AnomalyExplorerChartsService } from '../../services/anomaly_explorer_charts_service'; import { useAnomalyExplorerContext } from '../anomaly_explorer_context'; -import type { MlApiServices } from '../../services/ml_api_service'; +import type { MlApi } from '../../services/ml_api_service'; import { useMlJobService, type MlJobService } from '../../services/job_service'; // Memoize the data fetching methods. @@ -97,7 +97,7 @@ export const isLoadExplorerDataConfig = (arg: any): arg is LoadExplorerDataConfi */ const loadExplorerDataProvider = ( uiSettings: IUiSettingsClient, - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, mlResultsService: MlResultsService, anomalyExplorerChartsService: AnomalyExplorerChartsService, @@ -131,15 +131,10 @@ const loadExplorerDataProvider = ( // First get the data where we have all necessary args at hand using forkJoin: // annotationsData, anomalyChartRecords, influencers, overallState, tableData return forkJoin({ - overallAnnotations: memoizedLoadOverallAnnotations( - lastRefresh, - mlApiServices, - selectedJobs, - bounds - ), + overallAnnotations: memoizedLoadOverallAnnotations(lastRefresh, mlApi, selectedJobs, bounds), annotationsData: memoizedLoadAnnotationsTableData( lastRefresh, - mlApiServices, + mlApi, selectedCells, selectedJobs, bounds @@ -167,7 +162,7 @@ const loadExplorerDataProvider = ( : Promise.resolve({}), tableData: memoizedLoadAnomaliesTableData( lastRefresh, - mlApiServices, + mlApi, mlJobService, selectedCells, selectedJobs, @@ -218,16 +213,16 @@ const loadExplorerDataProvider = ( export const useExplorerData = (): [Partial | undefined, (d: any) => void] => { const uiSettings = useUiSettings(); const timefilter = useTimefilter(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const mlJobService = useMlJobService(); const { anomalyExplorerChartsService } = useAnomalyExplorerContext(); const loadExplorerData = useMemo(() => { - const mlResultsService = mlResultsServiceProvider(mlApiServices); + const mlResultsService = mlResultsServiceProvider(mlApi); return loadExplorerDataProvider( uiSettings, - mlApiServices, + mlApi, mlJobService, mlResultsService, anomalyExplorerChartsService, diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx index 35b552a95cac8..2c1fb6dc8c182 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx @@ -61,7 +61,7 @@ export const AnomalyExplorerContextProvider: FC> = ({ const { services: { - mlServices: { mlApiServices, mlFieldFormatService }, + mlServices: { mlApi, mlFieldFormatService }, uiSettings, data, }, @@ -71,7 +71,7 @@ export const AnomalyExplorerContextProvider: FC> = ({ const [, , tableSeverityState] = useTableSeverity(); // eslint-disable-next-line react-hooks/exhaustive-deps - const mlResultsService = useMemo(() => mlResultsServiceProvider(mlApiServices), []); + const mlResultsService = useMemo(() => mlResultsServiceProvider(mlApi), []); const [anomalyExplorerContextValue, setAnomalyExplorerContextValue] = useState< AnomalyExplorerContextValue | undefined @@ -104,7 +104,7 @@ export const AnomalyExplorerContextProvider: FC> = ({ const anomalyExplorerChartsService = new AnomalyExplorerChartsService( timefilter, - mlApiServices, + mlApi, mlResultsService ); diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_utils.ts b/x-pack/plugins/ml/public/application/explorer/explorer_utils.ts index fbfad277ff45f..753e81e8204e0 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_utils.ts +++ b/x-pack/plugins/ml/public/application/explorer/explorer_utils.ts @@ -52,7 +52,7 @@ import { import type { CombinedJob } from '../../../common/types/anomaly_detection_jobs'; import type { MlResultsService } from '../services/results_service'; import type { Annotations, AnnotationsTable } from '../../../common/types/annotations'; -import type { MlApiServices } from '../services/ml_api_service'; +import type { MlApi } from '../services/ml_api_service'; export interface ExplorerJob { id: string; @@ -352,7 +352,7 @@ export function getSelectionJobIds( } export function loadOverallAnnotations( - mlApiServices: MlApiServices, + mlApi: MlApi, selectedJobs: ExplorerJob[], bounds: TimeRangeBounds ): Promise { @@ -361,7 +361,7 @@ export function loadOverallAnnotations( return new Promise((resolve) => { lastValueFrom( - mlApiServices.annotations.getAnnotations$({ + mlApi.annotations.getAnnotations$({ jobIds, earliestMs: timeRange.earliestMs, latestMs: timeRange.latestMs, @@ -407,7 +407,7 @@ export function loadOverallAnnotations( } export function loadAnnotationsTableData( - mlApiServices: MlApiServices, + mlApi: MlApi, selectedCells: AppStateSelectedCells | undefined | null, selectedJobs: ExplorerJob[], bounds: Required @@ -417,7 +417,7 @@ export function loadAnnotationsTableData( return new Promise((resolve) => { lastValueFrom( - mlApiServices.annotations.getAnnotations$({ + mlApi.annotations.getAnnotations$({ jobIds, earliestMs: timeRange.earliestMs, latestMs: timeRange.latestMs, @@ -466,7 +466,7 @@ export function loadAnnotationsTableData( } export async function loadAnomaliesTableData( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, selectedCells: AppStateSelectedCells | undefined | null, selectedJobs: ExplorerJob[], @@ -482,7 +482,7 @@ export async function loadAnomaliesTableData( const timeRange = getSelectionTimeRange(selectedCells, bounds); return new Promise((resolve, reject) => { - mlApiServices.results + mlApi.results .getAnomaliesTableData( jobIds, [], diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx index 510149ada47e6..055b297af893f 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx @@ -60,7 +60,7 @@ import type { import type { JobMessage } from '../../../../../../common/types/audit_message'; import type { LineAnnotationDatumWithModelSnapshot } from '../../../../../../common/types/results'; import { useToastNotificationService } from '../../../../services/toast_notification_service'; -import { useCurrentThemeVars, useMlApiContext } from '../../../../contexts/kibana'; +import { useCurrentThemeVars, useMlApi } from '../../../../contexts/kibana'; import { RevertModelSnapshotFlyout } from '../../../../components/model_snapshots/revert_model_snapshot_flyout'; import { JobMessagesPane } from '../job_details/job_messages_pane'; import { EditQueryDelay } from './edit_query_delay'; @@ -110,7 +110,7 @@ export const DatafeedChartFlyout: FC = ({ onClose, onModelSnapshotAnnotationClick, }) => { - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const [data, setData] = useState<{ datafeedConfig: CombinedJobWithStats['datafeed_config'] | undefined; bucketSpan: string | undefined; @@ -144,7 +144,7 @@ export const DatafeedChartFlyout: FC = ({ const { getModelSnapshots, results: { getDatafeedResultChartData }, - } = useMlApiContext(); + } = useMlApi(); const { displayErrorToast } = useToastNotificationService(); const { euiTheme } = useCurrentThemeVars(); const handleChange = (date: moment.Moment) => setEndDate(date); @@ -213,7 +213,7 @@ export const DatafeedChartFlyout: FC = ({ const getJobAndSnapshotData = useCallback(async () => { try { - const job: CombinedJobWithStats = await loadFullJob(mlApiServices, jobId); + const job: CombinedJobWithStats = await loadFullJob(mlApi, jobId); const modelSnapshotResultsLine: LineAnnotationDatumWithModelSnapshot[] = []; const modelSnapshotsResp = await getModelSnapshots(jobId); const modelSnapshots = modelSnapshotsResp.model_snapshots ?? []; @@ -660,7 +660,7 @@ export const JobListDatafeedChartFlyout: FC = ( unsetShowFunction, refreshJobs, }) => { - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const [isVisible, setIsVisible] = useState(false); const [job, setJob] = useState(); const [jobWithStats, setJobWithStats] = useState(); @@ -677,10 +677,10 @@ export const JobListDatafeedChartFlyout: FC = ( const showRevertModelSnapshot = useCallback(async () => { // Need to load the full job with stats, as the model snapshot // flyout needs the timestamp of the last result. - const fullJob: CombinedJobWithStats = await loadFullJob(mlApiServices, job!.id); + const fullJob: CombinedJobWithStats = await loadFullJob(mlApi, job!.id); setJobWithStats(fullJob); setIsRevertModelSnapshotFlyoutVisible(true); - // exclude mlApiServices from deps + // exclude mlApi from deps // eslint-disable-next-line react-hooks/exhaustive-deps }, [job]); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx index 6d753cd2d3a7f..9b829222ae46a 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx @@ -18,7 +18,7 @@ import { EuiToolTip, } from '@elastic/eui'; -import { useMlApiContext } from '../../../../contexts/kibana'; +import { useMlApi } from '../../../../contexts/kibana'; import { useToastNotificationService } from '../../../../services/toast_notification_service'; import type { Datafeed } from '../../../../../../common/types/anomaly_detection_jobs'; @@ -38,7 +38,7 @@ export const EditQueryDelay: FC<{ const [currentQueryDelay, setCurrentQueryDelay] = useState(queryDelay); const [newQueryDelay, setNewQueryDelay] = useState(); const [isEditing, setIsEditing] = useState(false); - const { updateDatafeed } = useMlApiContext(); + const { updateDatafeed } = useMlApi(); const { displaySuccessToast, displayErrorToast } = useToastNotificationService(); const updateQueryDelay = useCallback(async () => { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_job_flyout.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_job_flyout.js index 03d8745b20ee1..4659121fd8306 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_job_flyout.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_job_flyout.js @@ -120,7 +120,7 @@ export class EditJobFlyoutUI extends Component { showFlyout = (jobLite) => { const hasDatafeed = jobLite.hasDatafeed; - loadFullJob(this.props.kibana.services.mlServices.mlApiServices, jobLite.id) + loadFullJob(this.props.kibana.services.mlServices.mlApi, jobLite.id) .then((job) => { this.extractJob(job, hasDatafeed); this.setState({ @@ -203,12 +203,12 @@ export class EditJobFlyoutUI extends Component { ).message; } - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; if (jobDetails.jobGroups !== undefined) { jobGroupsValidationError = validateGroupNames(jobDetails.jobGroups).message; if (jobGroupsValidationError === '') { - ml.jobs.jobsExist(jobDetails.jobGroups, true).then((resp) => { + mlApi.jobs.jobsExist(jobDetails.jobGroups, true).then((resp) => { const groups = Object.values(resp); const valid = groups.some((g) => g.exists === true && g.isGroup === false) === false; if (valid === false) { @@ -273,11 +273,11 @@ export class EditJobFlyoutUI extends Component { customUrls: this.state.jobCustomUrls, }; - const mlApiServices = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; const { toasts } = this.props.kibana.services.notifications; const toastNotificationService = toastNotificationServiceProvider(toasts); - saveJob(mlApiServices, this.state.job, newJobData) + saveJob(mlApi, this.state.job, newJobData) .then(() => { toasts.addSuccess( i18n.translate('xpack.ml.jobsList.editJobFlyout.changesSavedNotificationMessage', { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_utils.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_utils.js index b3c36304ed381..80680c3da2c44 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_utils.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/edit_utils.js @@ -9,7 +9,7 @@ import { difference } from 'lodash'; import { getNewJobLimits } from '../../../../services/ml_server_info'; import { processCreatedBy } from '../../../../../../common/util/job_utils'; -export function saveJob(mlApiServices, job, newJobData, finish) { +export function saveJob(mlApi, job, newJobData, finish) { return new Promise((resolve, reject) => { const jobData = { ...extractDescription(job, newJobData), @@ -29,7 +29,7 @@ export function saveJob(mlApiServices, job, newJobData, finish) { } const saveDatafeedWrapper = () => { - saveDatafeed(mlApiServices, datafeedData, job, finish) + saveDatafeed(mlApi, datafeedData, job, finish) .then(() => { resolve(); }) @@ -40,7 +40,7 @@ export function saveJob(mlApiServices, job, newJobData, finish) { // if anything has changed, post the changes if (Object.keys(jobData).length) { - mlApiServices + mlApi .updateJob({ jobId: job.job_id, job: jobData }) .then(() => { saveDatafeedWrapper(); @@ -54,11 +54,11 @@ export function saveJob(mlApiServices, job, newJobData, finish) { }); } -function saveDatafeed(mlApiServices, datafeedConfig, job) { +function saveDatafeed(mlApi, datafeedConfig, job) { return new Promise((resolve, reject) => { if (Object.keys(datafeedConfig).length) { const datafeedId = job.datafeed_config.datafeed_id; - mlApiServices + mlApi .updateDatafeed({ datafeedId, datafeedConfig }) .then(() => { resolve(); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js index 01fe676a4133b..daf9e7996b5c8 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js @@ -25,7 +25,7 @@ export class Detectors extends Component { const mlJobService = mlJobServiceFactory( toastNotificationServiceProvider(constructorContext.services.notifications.toasts), - constructorContext.services.mlServices.mlApiServices + constructorContext.services.mlServices.mlApi ); this.detectors = mlJobService.getJobGroups().map((g) => ({ label: g.id })); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/job_details.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/job_details.js index 5cb7b9edd607e..322221045b652 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/job_details.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/job_details.js @@ -42,9 +42,9 @@ export class JobDetailsUI extends Component { } componentDidMount() { - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; // load groups to populate the select options - ml.jobs + mlApi.jobs .groups() .then((resp) => { const groups = resp.map((g) => ({ label: g.id, color: tabColor(g.id) })); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/management.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/management.js index 1734182ff3ebc..eac225f2db990 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/management.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/management.js @@ -24,7 +24,7 @@ import { isManagedJob } from '../../../jobs_utils'; export function actionsMenuContent( toastNotifications, application, - mlApiServices, + mlApi, mlJobService, showEditJobFlyout, showDatafeedChartFlyout, @@ -153,7 +153,7 @@ export function actionsMenuContent( return isJobBlocked(item) === false && canCreateJob; }, onClick: (item) => { - cloneJob(toastNotifications, application, mlApiServices, mlJobService, item.id); + cloneJob(toastNotifications, application, mlApi, mlJobService, item.id); closeMenu(true); }, 'data-test-subj': 'mlActionButtonCloneJob', diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/datafeed_preview_tab.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/datafeed_preview_tab.tsx index b9813ece905f4..38ac41983f489 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/datafeed_preview_tab.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/datafeed_preview_tab.tsx @@ -11,7 +11,7 @@ import { EuiCallOut, EuiLoadingSpinner } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { useEnabledFeatures } from '../../../../contexts/ml'; import { ML_DATA_PREVIEW_COUNT } from '../../../../../../common/util/job_utils'; -import { useMlApiContext } from '../../../../contexts/kibana'; +import { useMlApi } from '../../../../contexts/kibana'; import { usePermissionCheck } from '../../../../capabilities/check_capabilities'; import { MLJobEditor } from '../ml_job_editor'; import type { CombinedJob } from '../../../../../../common/types/anomaly_detection_jobs'; @@ -23,7 +23,7 @@ interface Props { export const DatafeedPreviewPane: FC = ({ job }) => { const { jobs: { datafeedPreview }, - } = useMlApiContext(); + } = useMlApi(); const { showNodeInfo } = useEnabledFeatures(); const canPreviewDatafeed = usePermissionCheck('canPreviewDatafeed'); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js index 0db362a094c1e..976ea8bc9968b 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js @@ -45,9 +45,7 @@ export class ForecastsTable extends Component { isLoading: props.job.data_counts.processed_record_count !== 0, forecasts: [], }; - this.mlForecastService = forecastServiceFactory( - constructorContext.services.mlServices.mlApiServices - ); + this.mlForecastService = forecastServiceFactory(constructorContext.services.mlServices.mlApi); } /** diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx index eb0ce2d6be817..c4ba5c3c7d5d8 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx @@ -14,7 +14,7 @@ import { extractErrorMessage } from '@kbn/ml-error-utils'; import { JobMessages } from '../../../../components/job_messages'; import type { JobMessage } from '../../../../../../common/types/audit_message'; import { useToastNotificationService } from '../../../../services/toast_notification_service'; -import { useMlApiContext } from '../../../../contexts/kibana'; +import { useMlApi } from '../../../../contexts/kibana'; import { checkPermission } from '../../../../capabilities/check_capabilities'; import { blurButtonOnClick } from '../../../../util/component_utils'; interface JobMessagesPaneProps { @@ -37,12 +37,12 @@ export const JobMessagesPane: FC = React.memo( const [isClearing, setIsClearing] = useState(false); const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const fetchMessages = async () => { setIsLoading(true); try { - const messagesResp = await ml.jobs.jobAuditMessages({ jobId, start, end }); + const messagesResp = await mlApi.jobs.jobAuditMessages({ jobId, start, end }); setMessages(messagesResp.messages); setNotificationIndices(messagesResp.notificationIndices); @@ -67,7 +67,7 @@ export const JobMessagesPane: FC = React.memo( const clearMessages = useCallback(async () => { setIsClearing(true); try { - await ml.jobs.clearJobAuditMessages(jobId, notificationIndices); + await mlApi.jobs.clearJobAuditMessages(jobId, notificationIndices); setIsClearing(false); if (typeof refreshJobList === 'function') { refreshJobList(); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx index 4e819f093a2e2..c326761a7e3ff 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx @@ -24,13 +24,13 @@ export const JobFilterBar: FC = ({ queryText, setFilters }) = const [error, setError] = useState(null); const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); const loadGroups = useCallback(async () => { try { - const response = await mlApiServices.jobs.groups(); + const response = await mlApi.jobs.groups(); return response.map((g) => ({ value: g.id, view: ( diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js index e6fd50d96a65d..f6deecc3ba309 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js @@ -46,10 +46,10 @@ export class JobsListUI extends Component { itemIdToExpandedRowMap: {}, }; - this.mlApiServices = props.kibana.services.mlServices.mlApiServices; + this.mlApi = props.kibana.services.mlServices.mlApi; this.mlJobService = mlJobServiceFactory( toastNotificationServiceProvider(props.kibana.services.notifications.toasts), - this.mlApiServices + this.mlApi ); } @@ -340,7 +340,7 @@ export class JobsListUI extends Component { actions: actionsMenuContent( this.props.kibana.services.notifications.toasts, this.props.kibana.services.application, - this.mlApiServices, + this.mlApi, this.mlJobService, this.props.showEditJobFlyout, this.props.showDatafeedChartFlyout, diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js index efb9211e99c0e..6693f9bc22ab1 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js @@ -83,7 +83,7 @@ export class JobsListViewUI extends Component { this.mlJobService = mlJobServiceFactory( toastNotificationServiceProvider(props.kibana.services.notifications.toasts), - props.kibana.services.mlServices.mlApiServices + props.kibana.services.mlServices.mlApi ); } @@ -147,7 +147,7 @@ export class JobsListViewUI extends Component { } this.setState({ itemIdToExpandedRowMap }, () => { - loadFullJob(this.props.kibana.services.mlServices.mlApiServices, jobId) + loadFullJob(this.props.kibana.services.mlServices.mlApi, jobId) .then((job) => { const fullJobsList = { ...this.state.fullJobsList }; if (this.props.showNodeInfo === false) { @@ -324,11 +324,11 @@ export class JobsListViewUI extends Component { this.setState({ loading: true }); } - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; const expandedJobsIds = Object.keys(this.state.itemIdToExpandedRowMap); try { let jobsAwaitingNodeCount = 0; - const jobs = await ml.jobs.jobsSummary(expandedJobsIds); + const jobs = await mlApi.jobs.jobsSummary(expandedJobsIds); const fullJobsList = {}; const jobsSummaryList = jobs.map((job) => { if (job.fullJob !== undefined) { @@ -387,8 +387,8 @@ export class JobsListViewUI extends Component { return; } - const ml = this.props.kibana.services.mlServices.mlApiServices; - const { jobs } = await ml.jobs.blockingJobTasks(); + const mlApi = this.props.kibana.services.mlServices.mlApi; + const { jobs } = await mlApi.jobs.blockingJobTasks(); const blockingJobIds = jobs.map((j) => Object.keys(j)[0]).sort(); const taskListHasChanged = blockingJobIds.join() !== this.state.blockingJobIds.join(); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/actions_menu.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/actions_menu.js index e12b770039b8d..a8bd2789e5433 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/actions_menu.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/actions_menu.js @@ -47,11 +47,11 @@ class MultiJobActionsMenuUI extends Component { this.canCreateMlAlerts = checkPermission('canCreateMlAlerts'); this.toastNoticiations = constructorContext.services.notifications.toasts; - const mlApiServices = constructorContext.services.mlServices.mlApiServices; + const mlApi = constructorContext.services.mlServices.mlApi; const toastNotificationService = toastNotificationServiceProvider( constructorContext.services.notifications.toasts ); - this.mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); + this.mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); } onButtonClick = () => { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/group_selector/group_selector.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/group_selector/group_selector.js index 9fe8bbf230322..6248915b87d4b 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/group_selector/group_selector.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/multi_job_actions/group_selector/group_selector.js @@ -91,8 +91,8 @@ export class GroupSelectorUI extends Component { if (this.state.isPopoverOpen) { this.closePopover(); } else { - const ml = this.props.kibana.services.mlServices.mlApiServices; - ml.jobs + const mlApi = this.props.kibana.services.mlServices.mlApi; + mlApi.jobs .groups() .then((groups) => { const selectedGroups = createSelectedGroups(this.props.jobs, groups); @@ -158,7 +158,7 @@ export class GroupSelectorUI extends Component { } const tempJobs = newJobs.map((j) => ({ jobId: j.id, groups: j.newGroups })); - const ml = this.props.kibana.services.mlServices.mlApiServices; + const ml = this.props.kibana.services.mlServices.mlApi; ml.jobs .updateGroups(tempJobs) .then((resp) => { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/start_datafeed_modal.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/start_datafeed_modal.js index d56fc973a0249..db5f28a5e242b 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/start_datafeed_modal.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/start_datafeed_modal.js @@ -59,7 +59,7 @@ export class StartDatafeedModal extends Component { this.toastNotifications = constructorContext.services.notifications.toasts; this.mlJobService = mlJobServiceFactory( toastNotificationServiceProvider(this.toastNotifications), - constructorContext.services.mlServices.mlApiServices + constructorContext.services.mlServices.mlApi ); } diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts index a4c20309129f3..bd6f60a050047 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts @@ -13,13 +13,10 @@ import type { MlSummaryJob, } from '../../../../../common/types/anomaly_detection_jobs'; import type { MlJobService } from '../../../services/job_service'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; -export function loadFullJob( - mlApiServices: MlApiServices, - jobId: string -): Promise; -export function loadJobForCloning(mlApiServices: MlApiServices, jobId: string): Promise; +export function loadFullJob(mlApi: MlApi, jobId: string): Promise; +export function loadJobForCloning(mlApi: MlApi, jobId: string): Promise; export function isStartable(jobs: CombinedJobWithStats[]): boolean; export function isClosable(jobs: CombinedJobWithStats[]): boolean; export function isResettable(jobs: CombinedJobWithStats[]): boolean; @@ -45,7 +42,7 @@ export function showResults( export function cloneJob( toastNotifications: ToastsStart, application: ApplicationStart, - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, jobId: string ): Promise; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js index 471e56be7a840..36a070b851147 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js @@ -19,9 +19,9 @@ import { ML_PAGES } from '../../../../../common/constants/locator'; import { PLUGIN_ID } from '../../../../../common/constants/app'; import { CREATED_BY_LABEL } from '../../../../../common/constants/new_job'; -export function loadFullJob(mlApiServices, jobId) { +export function loadFullJob(mlApi, jobId) { return new Promise((resolve, reject) => { - mlApiServices.jobs + mlApi.jobs .jobs([jobId]) .then((jobs) => { if (jobs.length) { @@ -36,9 +36,9 @@ export function loadFullJob(mlApiServices, jobId) { }); } -export function loadJobForCloning(mlApiServices, jobId) { +export function loadJobForCloning(mlApi, jobId) { return new Promise((resolve, reject) => { - mlApiServices.jobs + mlApi.jobs .jobForCloning(jobId) .then((resp) => { if (resp) { @@ -214,17 +214,11 @@ function showResults(toastNotifications, resp, action) { } } -export async function cloneJob( - toastNotifications, - application, - mlApiServices, - mlJobService, - jobId -) { +export async function cloneJob(toastNotifications, application, mlApi, mlJobService, jobId) { try { const [{ job: cloneableJob, datafeed }, originalJob] = await Promise.all([ - loadJobForCloning(mlApiServices, jobId), - loadFullJob(mlApiServices, jobId), + loadJobForCloning(mlApi, jobId), + loadFullJob(mlApi, jobId), ]); const createdBy = originalJob?.custom_settings?.created_by; @@ -277,7 +271,7 @@ export async function cloneJob( if (originalJob.calendars) { mlJobService.tempJobCloningObjects.calendars = await mlCalendarService.fetchCalendarsByIds( - mlApiServices, + mlApi, originalJob.calendars ); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/chart_loader.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/chart_loader.ts index 68ddfe1b83b44..983fa2f352016 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/chart_loader.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/chart_loader.ts @@ -14,7 +14,7 @@ import type { IndicesOptions } from '../../../../../../common/types/anomaly_dete import { mlResultsServiceProvider } from '../../../../services/results_service'; import { getCategoryFields as getCategoryFieldsOrig } from './searches'; import { aggFieldPairsCanBeCharted } from '../job_creator/util/general'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; type DetectorIndex = number; export interface LineChartPoint { @@ -28,7 +28,7 @@ const eq = (newArgs: any[], lastArgs: any[]) => isEqual(newArgs, lastArgs); export class ChartLoader { protected _dataView: DataView; - protected _mlApiServices: MlApiServices; + protected _mlApi: MlApi; private _timeFieldName: string = ''; private _query: object = {}; @@ -38,17 +38,14 @@ export class ChartLoader { private _getEventRateData; private _getCategoryFields; - constructor(mlApiServices: MlApiServices, indexPattern: DataView, query: object) { - this._mlApiServices = mlApiServices; + constructor(mlApi: MlApi, indexPattern: DataView, query: object) { + this._mlApi = mlApi; this._dataView = indexPattern; this._query = query; - this._newJobLineChart = memoizeOne(mlApiServices.jobs.newJobLineChart, eq); - this._newJobPopulationsChart = memoizeOne(mlApiServices.jobs.newJobPopulationsChart, eq); - this._getEventRateData = memoizeOne( - mlResultsServiceProvider(mlApiServices).getEventRateData, - eq - ); + this._newJobLineChart = memoizeOne(mlApi.jobs.newJobLineChart, eq); + this._newJobPopulationsChart = memoizeOne(mlApi.jobs.newJobPopulationsChart, eq); + this._getEventRateData = memoizeOne(mlResultsServiceProvider(mlApi).getEventRateData, eq); this._getCategoryFields = memoizeOne(getCategoryFieldsOrig, eq); if (typeof indexPattern.timeFieldName === 'string') { @@ -166,7 +163,7 @@ export class ChartLoader { indicesOptions?: IndicesOptions ): Promise { const { results } = await this._getCategoryFields( - this._mlApiServices, + this._mlApi, this._dataView.getIndexPattern(), field.name, 10, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/searches.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/searches.ts index 3c4ca1c5f54d7..f36dd70d42194 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/searches.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/chart_loader/searches.ts @@ -8,7 +8,7 @@ import { get } from 'lodash'; import type { RuntimeMappings } from '@kbn/ml-runtime-field-utils'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { IndicesOptions } from '../../../../../../common/types/anomaly_detection_jobs'; interface CategoryResults { @@ -17,7 +17,7 @@ interface CategoryResults { } export function getCategoryFields( - mlApiServices: MlApiServices, + mlApi: MlApi, indexPatternName: string, fieldName: string, size: number, @@ -26,7 +26,7 @@ export function getCategoryFields( indicesOptions?: IndicesOptions ): Promise { return new Promise((resolve, reject) => { - mlApiServices + mlApi .esSearch({ index: indexPatternName, size: 0, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts index 30a472348d587..04f99a6f7895b 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts @@ -11,7 +11,7 @@ import type { Field, Aggregation, SplitField } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import { JobCreator } from './job_creator'; import type { Job, @@ -43,14 +43,14 @@ export class AdvancedJobCreator extends JobCreator { private _queryString: string; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.ADVANCED; this._queryString = JSON.stringify(this._datafeed_config.query); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts index a12266e556e73..cb79defa16302 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts @@ -35,7 +35,7 @@ import { DEFAULT_RARE_BUCKET_SPAN, } from '../../../../../../common/constants/new_job'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { NewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; import { getRichDetectors } from './util/general'; @@ -65,14 +65,14 @@ export class CategorizationJobCreator extends JobCreator { private _ccsVersionFailure: boolean = false; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.CATEGORIZATION; this._examplesLoader = new CategorizationExamplesLoader(this, indexPattern, query); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts index 76fda339afa44..986f1480e7bf3 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts @@ -9,7 +9,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { Field, Aggregation, SplitField, AggFieldPair } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { NewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; import { JobCreator } from './job_creator'; import type { @@ -31,14 +31,14 @@ export class GeoJobCreator extends JobCreator { protected _type: JOB_TYPE = JOB_TYPE.GEO; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.GEO; this._wizardInitialized$.next(true); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts index 82e5fe1209a13..2346ff863e489 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts @@ -22,7 +22,7 @@ import { import type { RuntimeMappings } from '@kbn/ml-runtime-field-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { IndexPatternTitle } from '../../../../../../common/types/kibana'; import { getQueryFromSavedSearchObject } from '../../../../util/index_utils'; import type { @@ -79,19 +79,19 @@ export class JobCreator { protected _wizardInitialized$ = new BehaviorSubject(false); public wizardInitialized$ = this._wizardInitialized$.asObservable(); - public mlApiServices: MlApiServices; + public mlApi: MlApi; public mlJobService: MlJobService; public newJobCapsService: NewJobCapsService; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - this.mlApiServices = mlApiServices; + this.mlApi = mlApi; this.mlJobService = mlJobService; this.newJobCapsService = newJobCapsService; this._indexPattern = indexPattern; @@ -492,7 +492,7 @@ export class JobCreator { } for (const calendar of this._calendars) { - await mlCalendarService.assignNewJobId(this.mlApiServices, calendar, this.jobId); + await mlCalendarService.assignNewJobId(this.mlApi, calendar, this.jobId); } } @@ -845,7 +845,7 @@ export class JobCreator { // load the start and end times for the selected index // and apply them to the job creator public async autoSetTimeRange(excludeFrozenData = true) { - const { start, end } = await this.mlApiServices.getTimeFieldRange({ + const { start, end } = await this.mlApi.getTimeFieldRange({ index: this._indexPatternTitle, timeFieldName: this.timeFieldName, query: excludeFrozenData ? addExcludeFrozenToQuery(this.query) : this.query, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts index 9e5f9988b292f..07424b709d5b6 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts @@ -8,7 +8,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { NewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; import { SingleMetricJobCreator } from './single_metric_job_creator'; import { MultiMetricJobCreator } from './multi_metric_job_creator'; @@ -23,7 +23,7 @@ import { JOB_TYPE } from '../../../../../../common/constants/new_job'; export const jobCreatorFactory = (jobType: JOB_TYPE) => ( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, @@ -57,5 +57,5 @@ export const jobCreatorFactory = jc = SingleMetricJobCreator; break; } - return new jc(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + return new jc(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); }; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts index 69ca14a40c4e4..cb734c84e3d23 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts @@ -9,7 +9,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { Field, Aggregation, SplitField, AggFieldPair } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { NewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; import { JobCreator } from './job_creator'; import type { @@ -30,14 +30,14 @@ export class MultiMetricJobCreator extends JobCreator { protected _type: JOB_TYPE = JOB_TYPE.MULTI_METRIC; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.MULTI_METRIC; this._wizardInitialized$.next(true); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts index 342583636d37f..36e4e8f6f5659 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts @@ -9,7 +9,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { Field, Aggregation, SplitField, AggFieldPair } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { NewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; import { JobCreator } from './job_creator'; import type { @@ -29,14 +29,14 @@ export class PopulationJobCreator extends JobCreator { protected _type: JOB_TYPE = JOB_TYPE.POPULATION; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.POPULATION; this._wizardInitialized$.next(true); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts index aaaa7d101c09a..e142a35ba380d 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts @@ -14,7 +14,7 @@ import { } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { NewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; import { JobCreator } from './job_creator'; import type { @@ -37,14 +37,14 @@ export class RareJobCreator extends JobCreator { private _freqRareAgg: Aggregation; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.RARE; this._wizardInitialized$.next(true); this._rareAgg = {} as Aggregation; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts index 2b7a1133c1d1f..10a55e5210d60 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts @@ -16,7 +16,7 @@ import { } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { MlJobService } from '../../../../services/job_service'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import { parseInterval } from '../../../../../../common/util/parse_interval'; import { JobCreator } from './job_creator'; import type { @@ -35,14 +35,14 @@ export class SingleMetricJobCreator extends JobCreator { protected _type: JOB_TYPE = JOB_TYPE.SINGLE_METRIC; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService, newJobCapsService: NewJobCapsService, indexPattern: DataView, savedSearch: SavedSearch | null, query: object ) { - super(mlApiServices, mlJobService, newJobCapsService, indexPattern, savedSearch, query); + super(mlApi, mlJobService, newJobCapsService, indexPattern, savedSearch, query); this.createdBy = CREATED_BY_LABEL.SINGLE_METRIC; this._wizardInitialized$.next(true); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts index f73c54653f93b..77030455fb3bf 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.test.ts @@ -10,7 +10,7 @@ import { useFakeTimers } from 'sinon'; import type { CalculatePayload } from './model_memory_estimator'; import { modelMemoryEstimatorProvider } from './model_memory_estimator'; import type { JobValidator } from '../../job_validator'; -import type { MlApiServices } from '../../../../../services/ml_api_service'; +import type { MlApi } from '../../../../../services/ml_api_service'; import type { JobCreator } from '../job_creator'; import { BehaviorSubject } from 'rxjs'; @@ -20,7 +20,7 @@ describe('delay', () => { let mockJobCreator: JobCreator; let wizardInitialized$: BehaviorSubject; let mockJobValidator: JobValidator; - let mockMlApiServices: MlApiServices; + let mockMlApiServices: MlApi; beforeEach(() => { clock = useFakeTimers(); @@ -37,7 +37,7 @@ describe('delay', () => { const { of } = require('rxjs'); return of({ modelMemoryLimit: '15MB' }); }), - } as unknown as MlApiServices; + } as unknown as MlApi; modelMemoryEstimator = modelMemoryEstimatorProvider( mockJobCreator, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts index b3550b039a862..4fae97ed3e3a2 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts @@ -30,16 +30,16 @@ import type { JobValidator } from '../../job_validator/job_validator'; import { VALIDATION_DELAY_MS } from '../../job_validator/job_validator'; import { useMlKibana } from '../../../../../contexts/kibana'; import type { JobCreator } from '../job_creator'; -import type { MlApiServices } from '../../../../../services/ml_api_service'; +import type { MlApi } from '../../../../../services/ml_api_service'; -export type CalculatePayload = Parameters[0]; +export type CalculatePayload = Parameters[0]; type ModelMemoryEstimator = ReturnType; export const modelMemoryEstimatorProvider = ( jobCreator: JobCreator, jobValidator: JobValidator, - mlApiServices: MlApiServices + mlApi: MlApi ) => { const modelMemoryCheck$ = new Subject(); const error$ = new Subject(); @@ -65,7 +65,7 @@ export const modelMemoryEstimatorProvider = ( // don't call the endpoint with invalid payload filter(() => jobValidator.isModelMemoryEstimationPayloadValid), switchMap((payload) => { - return mlApiServices.calculateModelMemoryLimit$(payload).pipe( + return mlApi.calculateModelMemoryLimit$(payload).pipe( pluck('modelMemoryLimit'), catchError((error) => { // eslint-disable-next-line no-console @@ -93,14 +93,14 @@ export const useModelMemoryEstimator = ( const { services: { notifications, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); // Initialize model memory estimator only once const modelMemoryEstimator = useMemo( - () => modelMemoryEstimatorProvider(jobCreator, jobValidator, mlApiServices), - [jobCreator, jobValidator, mlApiServices] + () => modelMemoryEstimatorProvider(jobCreator, jobValidator, mlApi), + [jobCreator, jobValidator, mlApi] ); // Listen for estimation results and errors diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_runner/job_runner.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_runner/job_runner.ts index bd3d68afdc6d0..335d952929741 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_runner/job_runner.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_runner/job_runner.ts @@ -6,7 +6,7 @@ */ import { BehaviorSubject } from 'rxjs'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; import type { MlJobService } from '../../../../services/job_service'; import type { JobCreator } from '../job_creator'; import type { DatafeedId, JobId } from '../../../../../../common/types/anomaly_detection_jobs'; @@ -22,7 +22,7 @@ export type ProgressSubscriber = (progress: number) => void; export type JobAssignmentSubscriber = (assigned: boolean) => void; export class JobRunner { - private _mlApiServices: MlApiServices; + private _mlApi: MlApi; private _mlJobService: MlJobService; private _jobId: JobId; private _datafeedId: DatafeedId; @@ -44,7 +44,7 @@ export class JobRunner { private _jobAssignedToNode$: BehaviorSubject; constructor(jobCreator: JobCreator) { - this._mlApiServices = jobCreator.mlApiServices; + this._mlApi = jobCreator.mlApi; this._mlJobService = jobCreator.mlJobService; this._jobId = jobCreator.jobId; this._datafeedId = jobCreator.datafeedId; @@ -193,7 +193,7 @@ export class JobRunner { } private async _isJobAssigned(): Promise { - const { jobs } = await this._mlApiServices.getJobStats({ jobId: this._jobId }); + const { jobs } = await this._mlApi.getJobStats({ jobId: this._jobId }); return jobs.length > 0 && jobs[0].node !== undefined; } @@ -212,7 +212,7 @@ export class JobRunner { isRunning: boolean; isJobClosed: boolean; }> { - return await this._mlApiServices.jobs.getLookBackProgress(this._jobId, this._start, this._end); + return await this._mlApi.jobs.getLookBackProgress(this._jobId, this._start, this._end); } public subscribeToProgress(func: ProgressSubscriber) { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/validators.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/validators.ts index 0ec37e612a3fa..0bd0731b6dbe2 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/validators.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_validator/validators.ts @@ -81,7 +81,7 @@ export function cardinalityValidator( }), switchMap(({ jobCreator }) => { // Perform a cardinality check only with enabled model plot. - return jobCreator.mlApiServices + return jobCreator.mlApi .validateCardinality$({ ...jobCreator.jobConfig, datafeed_config: jobCreator.datafeedConfig, @@ -117,7 +117,7 @@ export function jobIdValidator(jobCreator$: Subject): Observable prevJobCreator.jobId === currJobCreator.jobId ), - switchMap((jobCreator) => jobCreator.mlApiServices.jobs.jobsExist$([jobCreator.jobId], true)), + switchMap((jobCreator) => jobCreator.mlApi.jobs.jobsExist$([jobCreator.jobId], true)), map((jobExistsResults) => { const jobs = Object.values(jobExistsResults); const valid = jobs?.[0].exists === false; @@ -139,7 +139,7 @@ export function groupIdsValidator(jobCreator$: Subject): Observable< JSON.stringify(prevJobCreator.groups) === JSON.stringify(currJobCreator.groups) ), switchMap((jobCreator) => { - return jobCreator.mlApiServices.jobs.jobsExist$(jobCreator.groups, true); + return jobCreator.mlApi.jobs.jobsExist$(jobCreator.groups, true); }), map((jobExistsResults) => { const groups = Object.values(jobExistsResults); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts index a75152e93bd88..e6a54aaa66880 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts @@ -13,7 +13,7 @@ import type { CreateLayerDescriptorParams, MapsStartApi } from '@kbn/maps-plugin import type { Query } from '@kbn/es-query'; import type { Field, SplitField } from '@kbn/ml-anomaly-utils'; import { ChartLoader } from '../chart_loader'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; const eq = (newArgs: any[], lastArgs: any[]) => isEqual(newArgs, lastArgs); @@ -21,12 +21,12 @@ export class MapLoader extends ChartLoader { private _getMapData; constructor( - mlApiServices: MlApiServices, + mlApi: MlApi, indexPattern: DataView, query: object, mapsPlugin: MapsStartApi | undefined ) { - super(mlApiServices, indexPattern, query); + super(mlApi, indexPattern, query); this._getMapData = mapsPlugin ? memoizeOne(mapsPlugin.createLayerDescriptors.createESSearchSourceLayerDescriptor, eq) diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/categorization_examples_loader.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/categorization_examples_loader.ts index de24a7cff2995..96512c8540111 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/categorization_examples_loader.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/categorization_examples_loader.ts @@ -39,7 +39,7 @@ export class CategorizationExamplesLoader { }; } - const resp = await this._jobCreator.mlApiServices.jobs.categorizationFieldExamples( + const resp = await this._jobCreator.mlApi.jobs.categorizationFieldExamples( this._indexPatternTitle, this._query, NUMBER_OF_CATEGORY_EXAMPLES, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/results_loader.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/results_loader.ts index 742d0b476ebac..0492cb49ebedd 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/results_loader.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/results_loader.ts @@ -85,7 +85,7 @@ export class ResultsLoader { this._chartInterval = chartInterval; this._results$ = new BehaviorSubject(this._results); this._chartLoader = chartLoader; - this._mlResultsService = mlResultsServiceProvider(jobCreator.mlApiServices); + this._mlResultsService = mlResultsServiceProvider(jobCreator.mlApi); jobCreator.subscribeToProgress(this.progressSubscriber); } @@ -242,7 +242,7 @@ export class ResultsLoader { private async _loadDetectorsAnomalyData(): Promise> { const resp = await getScoresByRecord( - this._jobCreator.mlApiServices, + this._jobCreator.mlApi, this._jobCreator.jobId, this._jobCreator.start, this._jobCreator.end, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/searches.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/searches.ts index 738bb880bd700..f9aaa56f59c06 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/searches.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/searches.ts @@ -8,7 +8,7 @@ import { get } from 'lodash'; import { escapeForElasticsearchQuery } from '../../../../util/string_utils'; -import type { MlApiServices } from '../../../../services/ml_api_service'; +import type { MlApi } from '../../../../services/ml_api_service'; interface SplitFieldWithValue { name: string; @@ -30,7 +30,7 @@ interface ProcessedResults { // detector swimlane search export function getScoresByRecord( - mlApiServices: MlApiServices, + mlApi: MlApi, jobId: string, earliestMs: number, latestMs: number, @@ -54,7 +54,7 @@ export function getScoresByRecord( jobIdFilterStr += `"${String(firstSplitField.value).replace(/\\/g, '\\\\')}"`; } - mlApiServices.results + mlApi.results .anomalySearch( { body: { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts index b685bb181f7c6..98c2a74baf543 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts @@ -21,7 +21,7 @@ import type { Filter, Query, DataViewBase } from '@kbn/es-query'; import { FilterStateStore } from '@kbn/es-query'; import type { ErrorType } from '@kbn/ml-error-utils'; import type { DataViewsContract } from '@kbn/data-views-plugin/public'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import type { Job, Datafeed } from '../../../../../common/types/anomaly_detection_jobs'; import { getFiltersForDSLQuery } from '../../../../../common/util/job_utils'; @@ -57,7 +57,7 @@ export class QuickJobCreatorBase { protected readonly kibanaConfig: IUiSettingsClient, protected readonly timeFilter: TimefilterContract, protected readonly dashboardService: DashboardStart, - protected readonly mlApiServices: MlApiServices, + protected readonly mlApi: MlApi, protected readonly mlJobService: MlJobService ) {} @@ -110,7 +110,7 @@ export class QuickJobCreatorBase { datafeedConfig.indices.length > 0 ) { const { modelMemoryLimit } = await firstValueFrom( - this.mlApiServices.calculateModelMemoryLimit$({ + this.mlApi.calculateModelMemoryLimit$({ datafeedConfig: datafeed, analysisConfig: job.analysis_config, indexPattern: datafeedConfig.indices[0], @@ -133,7 +133,7 @@ export class QuickJobCreatorBase { // put job try { - await this.mlApiServices.addJob({ jobId: job.job_id, job }); + await this.mlApi.addJob({ jobId: job.job_id, job }); } catch (error) { result.jobCreated.error = error; return result; @@ -142,7 +142,7 @@ export class QuickJobCreatorBase { // put datafeed try { - await this.mlApiServices.addDatafeed({ datafeedId, datafeedConfig: datafeed }); + await this.mlApi.addDatafeed({ datafeedId, datafeedConfig: datafeed }); } catch (error) { result.datafeedCreated.error = error; return result; @@ -152,7 +152,7 @@ export class QuickJobCreatorBase { if (startJob) { // open job, ignore error if already open try { - await this.mlApiServices.openJob({ jobId }); + await this.mlApi.openJob({ jobId }); } catch (error) { // job may already be open, so ignore 409 error. if (error.body.statusCode !== 409) { @@ -164,7 +164,7 @@ export class QuickJobCreatorBase { // start datafeed try { - await this.mlApiServices.startDatafeed({ + await this.mlApi.startDatafeed({ datafeedId, start, ...(runInRealTime ? {} : { end }), diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts index 3ce3289a424b8..db1e025406538 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts @@ -19,7 +19,7 @@ import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { LensApi } from '@kbn/lens-plugin/public'; import type { JobCreatorType } from '../common/job_creator'; import { createEmptyJob, createEmptyDatafeed } from '../common/job_creator/util/default_configs'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import { CREATED_BY_LABEL, @@ -42,10 +42,10 @@ export class QuickLensJobCreator extends QuickJobCreatorBase { kibanaConfig: IUiSettingsClient, timeFilter: TimefilterContract, dashboardService: DashboardStart, - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService ) { - super(dataViews, kibanaConfig, timeFilter, dashboardService, mlApiServices, mlJobService); + super(dataViews, kibanaConfig, timeFilter, dashboardService, mlApi, mlJobService); } public async createAndSaveJob( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts index dd6fb765e158b..0f5c102859bb8 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts @@ -14,7 +14,7 @@ import type { TimefilterContract } from '@kbn/data-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { DataViewsContract } from '@kbn/data-views-plugin/public'; import { QuickLensJobCreator } from './quick_create_job'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import { getDefaultQuery, getRisonValue } from '../utils/new_job_utils'; @@ -25,7 +25,7 @@ interface Dependencies { kibanaConfig: IUiSettingsClient; timeFilter: TimefilterContract; dashboardService: DashboardStart; - mlApiServices: MlApiServices; + mlApi: MlApi; mlJobService: MlJobService; } export async function resolver( @@ -37,15 +37,7 @@ export async function resolver( filtersRisonString: string, layerIndexRisonString: string ) { - const { - dataViews, - lens, - mlApiServices, - mlJobService, - timeFilter, - kibanaConfig, - dashboardService, - } = deps; + const { dataViews, lens, mlApi, mlJobService, timeFilter, kibanaConfig, dashboardService } = deps; if (lensSavedObjectRisonString === undefined) { throw new Error('Cannot create visualization'); } @@ -67,7 +59,7 @@ export async function resolver( kibanaConfig, timeFilter, dashboardService, - mlApiServices, + mlApi, mlJobService ); await jobCreator.createAndStashADJob(vis, from, to, query, filters, layerIndex); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts index 0f14eaaf515fe..cc36762162e2a 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts @@ -12,7 +12,7 @@ import type { Filter, Query } from '@kbn/es-query'; import type { DataView, DataViewsContract } from '@kbn/data-views-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { MapApi } from '@kbn/maps-plugin/public'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import { CREATED_BY_LABEL, @@ -43,10 +43,10 @@ export class QuickGeoJobCreator extends QuickJobCreatorBase { kibanaConfig: IUiSettingsClient, timeFilter: TimefilterContract, dashboardService: DashboardStart, - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService ) { - super(dataViews, kibanaConfig, timeFilter, dashboardService, mlApiServices, mlJobService); + super(dataViews, kibanaConfig, timeFilter, dashboardService, mlApi, mlJobService); } public async createAndSaveGeoJob({ diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts index 455802fcc3f4a..d3a9b8641ca75 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts @@ -9,7 +9,7 @@ import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { TimefilterContract } from '@kbn/data-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { DataViewsContract } from '@kbn/data-views-plugin/public'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import { QuickGeoJobCreator } from './quick_create_job'; @@ -20,7 +20,7 @@ interface Dependencies { kibanaConfig: IUiSettingsClient; timeFilter: TimefilterContract; dashboardService: DashboardStart; - mlApiServices: MlApiServices; + mlApi: MlApi; mlJobService: MlJobService; } export async function resolver( @@ -34,8 +34,7 @@ export async function resolver( toRisonString: string, layerRisonString?: string ) { - const { dataViews, kibanaConfig, timeFilter, dashboardService, mlApiServices, mlJobService } = - deps; + const { dataViews, kibanaConfig, timeFilter, dashboardService, mlApi, mlJobService } = deps; const defaultLayer = { query: getDefaultQuery(), filters: [] }; const dashboard = getRisonValue(dashboardRisonString, defaultLayer); @@ -58,7 +57,7 @@ export async function resolver( kibanaConfig, timeFilter, dashboardService, - mlApiServices, + mlApi, mlJobService ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts index 0b81525f4013d..92dbbced01a3c 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts @@ -16,7 +16,7 @@ import { MLCATEGORY, ML_JOB_AGGREGATION } from '@kbn/ml-anomaly-utils'; import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { CREATED_BY_LABEL, DEFAULT_BUCKET_SPAN } from '../../../../../common/constants/new_job'; import { type CreateState, QuickJobCreatorBase } from '../job_from_dashboard/quick_create_job_base'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import { createEmptyDatafeed, createEmptyJob } from '../common/job_creator/util/default_configs'; import type { JobCreatorType } from '../common/job_creator'; @@ -36,10 +36,10 @@ export class QuickCategorizationJobCreator extends QuickJobCreatorBase { timeFilter: TimefilterContract, dashboardService: DashboardStart, private data: DataPublicPluginStart, - mlApiServices: MlApiServices, + mlApi: MlApi, mlJobService: MlJobService ) { - super(dataViews, kibanaConfig, timeFilter, dashboardService, mlApiServices, mlJobService); + super(dataViews, kibanaConfig, timeFilter, dashboardService, mlApi, mlJobService); } public async createAndSaveJob( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts index a2277babcc195..d950c631f6bb6 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts @@ -14,7 +14,7 @@ import { QuickCategorizationJobCreator, CATEGORIZATION_TYPE, } from './quick_create_job'; -import type { MlApiServices } from '../../../services/ml_api_service'; +import type { MlApi } from '../../../services/ml_api_service'; import type { MlJobService } from '../../../services/job_service'; import { getDefaultDatafeedQuery, getRisonValue } from '../utils/new_job_utils'; @@ -24,7 +24,7 @@ interface Dependencies { timeFilter: TimefilterContract; dashboardService: DashboardStart; data: DataPublicPluginStart; - mlApiServices: MlApiServices; + mlApi: MlApi; mlJobService: MlJobService; } export async function resolver( @@ -38,7 +38,7 @@ export async function resolver( toRisonString: string, queryRisonString: string ) { - const { mlApiServices, mlJobService, timeFilter, kibanaConfig, dashboardService, data } = deps; + const { mlApi, mlJobService, timeFilter, kibanaConfig, dashboardService, data } = deps; const query = getRisonValue(queryRisonString, getDefaultDatafeedQuery()); const from = getRisonValue(fromRisonString, ''); @@ -59,7 +59,7 @@ export async function resolver( timeFilter, dashboardService, data, - mlApiServices, + mlApi, mlJobService ); await jobCreator.createAndStashADJob( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx index ed9fdc22b9954..dc5bfc6003dd3 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx @@ -20,7 +20,7 @@ import { import type { CombinedJob } from '../../../../../../../../common/types/anomaly_detection_jobs'; import { MLJobEditor } from '../../../../../jobs_list/components/ml_job_editor'; -import { useMlApiContext } from '../../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../../contexts/kibana'; export const DatafeedPreview: FC<{ combinedJob: CombinedJob | null; @@ -28,7 +28,7 @@ export const DatafeedPreview: FC<{ }> = ({ combinedJob, heightOffset = 0 }) => { const { jobs: { datafeedPreview }, - } = useMlApiContext(); + } = useMlApi(); // the ace editor requires a fixed height const editorHeight = useMemo( () => `${window.innerHeight - 230 - heightOffset}px`, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx index cb6a636a8c296..a45022a615be0 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx @@ -37,11 +37,7 @@ import type { } from '../../../../../../../../../common/types/anomaly_detection_jobs'; import type { DatafeedValidationResponse } from '../../../../../../../../../common/types/job_validation'; -import { - useMlKibana, - useMlApiContext, - useNavigateToPath, -} from '../../../../../../../contexts/kibana'; +import { useMlKibana, useMlApi, useNavigateToPath } from '../../../../../../../contexts/kibana'; const fixedPageSize: number = 8; @@ -63,7 +59,7 @@ export const ChangeDataViewModal: FC = ({ onClose }) => { }, } = useMlKibana(); const navigateToPath = useNavigateToPath(); - const { validateDatafeedPreview } = useMlApiContext(); + const { validateDatafeedPreview } = useMlApi(); const { jobCreator: jc } = useContext(JobCreatorContext); const jobCreator = jc as AdvancedJobCreator; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx index bd3b52f5bb003..06718f175b266 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx @@ -24,7 +24,7 @@ import { JobCreatorContext } from '../../../../../job_creator_context'; import { Description } from './description'; import { PLUGIN_ID } from '../../../../../../../../../../../common/constants/app'; import type { Calendar } from '../../../../../../../../../../../common/types/calendars'; -import { useMlApiContext, useMlKibana } from '../../../../../../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../../../../../../contexts/kibana'; import { GLOBAL_CALENDAR } from '../../../../../../../../../../../common/constants/calendars'; import { ML_PAGES } from '../../../../../../../../../../../common/constants/locator'; @@ -34,7 +34,7 @@ export const CalendarsSelection: FC = () => { application: { getUrlForApp }, }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { jobCreator, jobCreatorUpdate } = useContext(JobCreatorContext); const [selectedCalendars, setSelectedCalendars] = useState(jobCreator.calendars); @@ -46,7 +46,7 @@ export const CalendarsSelection: FC = () => { async function loadCalendars() { setIsLoading(true); - const calendars = (await ml.calendars()).filter( + const calendars = (await mlApi.calendars()).filter( (c) => c.job_ids.includes(GLOBAL_CALENDAR) === false ); setOptions(calendars.map((c) => ({ label: c.calendar_id, value: c }))); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts index de279236d8755..71bdad4aadf14 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts @@ -8,7 +8,7 @@ import { useContext, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EVENT_RATE_FIELD_ID } from '@kbn/ml-anomaly-utils'; -import { useMlApiContext } from '../../../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../../../contexts/kibana'; import { JobCreatorContext } from '../../../job_creator_context'; import type { BucketSpanEstimatorData } from '../../../../../../../../../common/types/job_service'; import { @@ -27,7 +27,7 @@ export enum ESTIMATE_STATUS { export function useEstimateBucketSpan() { const toastNotificationService = useToastNotificationService(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { jobCreator, jobCreatorUpdate } = useContext(JobCreatorContext); const dataSourceContext = useDataSource(); @@ -78,7 +78,7 @@ export function useEstimateBucketSpan() { async function estimateBucketSpan() { setStatus(ESTIMATE_STATUS.RUNNING); - const { name, error, message: text } = await ml.estimateBucketSpan(data); + const { name, error, message: text } = await mlApi.estimateBucketSpan(data); setStatus(ESTIMATE_STATUS.NOT_RUNNING); if (error === true) { const title = i18n.translate( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx index 912bc1af40e12..bf770601ae0c3 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx @@ -13,13 +13,13 @@ import { i18n } from '@kbn/i18n'; import { from } from 'rxjs'; import { switchMap, takeWhile, tap } from 'rxjs'; import { extractErrorProperties } from '@kbn/ml-error-utils'; -import { useMlApiContext } from '../../../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../../../contexts/kibana'; import { JobCreatorContext } from '../../../job_creator_context'; import type { CategorizationJobCreator } from '../../../../../common/job_creator'; const NUMBER_OF_PREVIEW = 5; export const CategoryStoppedPartitions: FC = () => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { jobCreator: jc, resultsLoader } = useContext(JobCreatorContext); const jobCreator = jc as CategorizationJobCreator; const [tableRow, setTableRow] = useState>([]); @@ -47,7 +47,7 @@ export const CategoryStoppedPartitions: FC = () => { const loadCategoryStoppedPartitions = useCallback(async () => { try { - const { jobs } = await ml.results.getCategoryStoppedPartitions([jobCreator.jobId]); + const { jobs } = await mlApi.results.getCategoryStoppedPartitions([jobCreator.jobId]); if ( !Array.isArray(jobs) && // if jobs is object of jobId: [partitions] diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx index 1a9db2f5c67fb..f69ba6f1ee9f0 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx @@ -10,7 +10,7 @@ import React, { useContext, useEffect, useState } from 'react'; import { EuiBasicTable, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { extractErrorProperties } from '@kbn/ml-error-utils'; -import { useMlApiContext } from '../../../../../../../contexts/kibana'; +import { useMlApi } from '../../../../../../../contexts/kibana'; import { NUMBER_OF_CATEGORY_EXAMPLES } from '../../../../../../../../../common/constants/new_job'; import { JobCreatorContext } from '../../../job_creator_context'; import type { CategorizationJobCreator } from '../../../../../common/job_creator'; @@ -18,7 +18,7 @@ import type { Results } from '../../../../../common/results_loader'; import { useToastNotificationService } from '../../../../../../../services/toast_notification_service'; export const TopCategories: FC = () => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { displayErrorToast } = useToastNotificationService(); const { jobCreator: jc, resultsLoader } = useContext(JobCreatorContext); @@ -33,7 +33,7 @@ export const TopCategories: FC = () => { async function loadTopCats() { try { - const results = await ml.jobs.topCategories(jobCreator.jobId, NUMBER_OF_CATEGORY_EXAMPLES); + const results = await mlApi.jobs.topCategories(jobCreator.jobId, NUMBER_OF_CATEGORY_EXAMPLES); setTableRow( results.categories.map((c) => ({ count: c.count, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx index e4cc4dd88a4e2..cd90f4f552eff 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx @@ -33,7 +33,7 @@ import { MapLoader } from '../../common/map_loader'; import { ResultsLoader } from '../../common/results_loader'; import { JobValidator } from '../../common/job_validator'; import { useDataSource } from '../../../../contexts/ml'; -import { useMlApiContext, useMlKibana } from '../../../../contexts/kibana'; +import { useMlApi, useMlKibana } from '../../../../contexts/kibana'; import type { ExistingJobsAndGroups } from '../../../../services/job_service'; import { useMlJobService } from '../../../../services/job_service'; import { useNewJobCapsService } from '../../../../services/new_job_capabilities/new_job_capabilities_service'; @@ -56,7 +56,7 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { const { services: { maps: mapsPlugin, uiSettings }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const mlJobService = useMlJobService(); const newJobCapsService = useNewJobCapsService(); @@ -65,7 +65,7 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { const jobCreator = useMemo( () => jobCreatorFactory(jobType)( - ml, + mlApi, mlJobService, newJobCapsService, dataSourceContext.selectedDataView, @@ -208,13 +208,13 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { chartInterval.setInterval('auto'); const chartLoader = useMemo( - () => new ChartLoader(ml, dataSourceContext.selectedDataView, jobCreator.query), - [ml, dataSourceContext.selectedDataView, jobCreator.query] + () => new ChartLoader(mlApi, dataSourceContext.selectedDataView, jobCreator.query), + [mlApi, dataSourceContext.selectedDataView, jobCreator.query] ); const mapLoader = useMemo( - () => new MapLoader(ml, dataSourceContext.selectedDataView, jobCreator.query, mapsPlugin), - [ml, dataSourceContext.selectedDataView, jobCreator.query, mapsPlugin] + () => new MapLoader(mlApi, dataSourceContext.selectedDataView, jobCreator.query, mapsPlugin), + [mlApi, dataSourceContext.selectedDataView, jobCreator.query, mapsPlugin] ); const resultsLoader = useMemo( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx index f12a870d8d448..f664db9800de0 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx @@ -73,7 +73,7 @@ export const Page: FC = ({ moduleId, existingGroupIds }) => { services: { notifications, mlServices: { - mlApiServices: { getTimeFieldRange, setupDataRecognizerConfig, getDataRecognizerModule }, + mlApi: { getTimeFieldRange, setupDataRecognizerConfig, getDataRecognizerModule }, }, }, } = useMlKibana(); diff --git a/x-pack/plugins/ml/public/application/ml_nodes_check/check_ml_nodes.ts b/x-pack/plugins/ml/public/application/ml_nodes_check/check_ml_nodes.ts index 78afdd80fcc24..3fd19b2b810ae 100644 --- a/x-pack/plugins/ml/public/application/ml_nodes_check/check_ml_nodes.ts +++ b/x-pack/plugins/ml/public/application/ml_nodes_check/check_ml_nodes.ts @@ -5,16 +5,16 @@ * 2.0. */ -import type { MlApiServices } from '../services/ml_api_service'; +import type { MlApi } from '../services/ml_api_service'; import type { MlNodeCount } from '../../../common/types/ml_server_info'; let mlNodeCount: number = 0; let lazyMlNodeCount: number = 0; let userHasPermissionToViewMlNodeCount: boolean = false; -export async function getMlNodeCount(mlApiServices: MlApiServices): Promise { +export async function getMlNodeCount(mlApi: MlApi): Promise { try { - const nodes = await mlApiServices.mlNodeCount(); + const nodes = await mlApi.mlNodeCount(); mlNodeCount = nodes.count; lazyMlNodeCount = nodes.lazyNodeCount; userHasPermissionToViewMlNodeCount = true; diff --git a/x-pack/plugins/ml/public/application/model_management/create_pipeline_for_model/create_pipeline_for_model_flyout.tsx b/x-pack/plugins/ml/public/application/model_management/create_pipeline_for_model/create_pipeline_for_model_flyout.tsx index 991e085384c3d..21fac6f6a28f8 100644 --- a/x-pack/plugins/ml/public/application/model_management/create_pipeline_for_model/create_pipeline_for_model_flyout.tsx +++ b/x-pack/plugins/ml/public/application/model_management/create_pipeline_for_model/create_pipeline_for_model_flyout.tsx @@ -31,7 +31,7 @@ import { PipelineDetails } from './pipeline_details'; import { TestTrainedModel } from './test_trained_model'; import { OnFailureConfiguration } from '../../components/shared'; import { ReviewAndCreatePipeline } from '../../components/shared'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { getPipelineConfig } from './get_pipeline_config'; import { validateInferencePipelineConfigurationStep } from '../../components/ml_inference/validation'; import { type InferecePipelineCreationState } from './state'; @@ -67,7 +67,7 @@ export const CreatePipelineForModelFlyout: FC const { trainedModels: { createInferencePipeline }, - } = useMlApiContext(); + } = useMlApi(); const createPipeline = async () => { setFormState({ ...formState, creatingPipeline: true }); diff --git a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx index 9bcf348f45189..e9d323a8f6407 100644 --- a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx +++ b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx @@ -56,7 +56,7 @@ export function useModelActions({ application: { navigateToUrl }, overlays, docLinks, - mlServices: { mlApiServices }, + mlServices: { mlApi }, ...startServices }, } = useMlKibana(); @@ -87,7 +87,7 @@ export function useModelActions({ useEffect(() => { let isMounted = true; - mlApiServices + mlApi .hasPrivileges({ cluster: ['manage_ingest_pipelines'], }) @@ -102,7 +102,7 @@ export function useModelActions({ return () => { isMounted = false; }; - }, [mlApiServices]); + }, [mlApi]); const getUserConfirmation = useMemo( () => getUserConfirmationProvider(overlays, startServices), diff --git a/x-pack/plugins/ml/public/application/model_management/test_models/selected_model.tsx b/x-pack/plugins/ml/public/application/model_management/test_models/selected_model.tsx index d75c910e9a40e..598bd206608c6 100644 --- a/x-pack/plugins/ml/public/application/model_management/test_models/selected_model.tsx +++ b/x-pack/plugins/ml/public/application/model_management/test_models/selected_model.tsx @@ -23,7 +23,7 @@ import { import { TextEmbeddingInference } from './models/text_embedding'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { type TestTrainedModelsContextType } from './test_trained_models_context'; import { InferenceInputForm } from './models/inference_input_form'; import type { InferrerType } from './models'; @@ -53,7 +53,7 @@ export const SelectedModel: FC = ({ externalPipelineConfig, setCurrentContext, }) => { - const { trainedModels } = useMlApiContext(); + const { trainedModels } = useMlApi(); const inferrer = useMemo(() => { const taskType = Object.keys(model.inference_config ?? {})[0]; diff --git a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.test.tsx b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.test.tsx index dac36551377be..fb4256636135b 100644 --- a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.test.tsx +++ b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.test.tsx @@ -82,10 +82,10 @@ describe('NotificationsList', () => { await waitFor(() => { expect( - useMlKibana().services.mlServices.mlApiServices.notifications.findMessages + useMlKibana().services.mlServices.mlApi.notifications.findMessages ).toHaveBeenCalledTimes(1); expect( - useMlKibana().services.mlServices.mlApiServices.notifications.findMessages + useMlKibana().services.mlServices.mlApi.notifications.findMessages ).toHaveBeenCalledWith({ earliest: '', latest: '', 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 1ebba13d1f520..399b880c6a331 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 @@ -56,7 +56,7 @@ export const getDefaultNotificationsListState = (): ListingPageUrlState => ({ export const NotificationsList: FC = () => { const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); @@ -116,7 +116,7 @@ export const NotificationsList: FC = () => { try { setIsLoading(true); - const response = await mlApiServices.notifications.findMessages({ + const response = await mlApi.notifications.findMessages({ sortField: sorting.sort!.field, sortDirection: sorting.sort!.direction, earliest: timeRange.from, @@ -135,7 +135,7 @@ export const NotificationsList: FC = () => { } setIsLoading(false); - }, [sorting, queryInstance, mlApiServices.notifications, displayErrorToast, timeRange]); + }, [sorting, queryInstance, mlApi.notifications, displayErrorToast, timeRange]); useEffect( function updateLastCheckedAt() { diff --git a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx index c33681f69f76a..5e17304fff1c4 100644 --- a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx @@ -17,7 +17,7 @@ import { ML_OVERVIEW_PANELS } from '../../../../../common/types/storage'; import { ML_PAGES } from '../../../../../common/constants/locator'; import { OverviewStatsBar } from '../../../components/collapsible_panel/collapsible_panel'; import { CollapsiblePanel } from '../../../components/collapsible_panel'; -import { useMlApiContext, useMlKibana, useMlLink } from '../../../contexts/kibana'; +import { useMlApi, useMlKibana, useMlLink } from '../../../contexts/kibana'; import { AnomalyDetectionTable } from './table'; import { getGroupsFromJobs, getStatsBarData } from './utils'; import type { Dictionary } from '../../../../../common/types/common'; @@ -56,7 +56,7 @@ export const AnomalyDetectionPanel: FC = ({ anomalyTimelineService, setLa const { services: { charts: chartsService }, } = useMlKibana(); - const ml = useMlApiContext(); + const mlApi = useMlApi(); const { displayErrorToast } = useToastNotificationService(); const { showNodeInfo } = useEnabledFeatures(); @@ -85,7 +85,7 @@ export const AnomalyDetectionPanel: FC = ({ anomalyTimelineService, setLa let lazyJobCount = 0; try { - const jobsResult: MlSummaryJobs = await ml.jobs.jobsSummary([]); + const jobsResult: MlSummaryJobs = await mlApi.jobs.jobsSummary([]); const jobsSummaryList = jobsResult.map((job: MlSummaryJob) => { job.latestTimestampSortValue = job.latestTimestampMs || 0; if (job.awaitingNodeAssignment) { diff --git a/x-pack/plugins/ml/public/application/overview/components/content.tsx b/x-pack/plugins/ml/public/application/overview/components/content.tsx index 1d0db5c6b9632..d70d590784e3e 100644 --- a/x-pack/plugins/ml/public/application/overview/components/content.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/content.tsx @@ -29,7 +29,7 @@ export const OverviewContent: FC = ({ const { services: { uiSettings, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); @@ -41,7 +41,7 @@ export const OverviewContent: FC = ({ useEffect(() => { setAnomalyTimelineService( - new AnomalyTimelineService(timefilter, uiSettings, mlResultsServiceProvider(mlApiServices)) + new AnomalyTimelineService(timefilter, uiSettings, mlResultsServiceProvider(mlApi)) ); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/x-pack/plugins/ml/public/application/routing/resolvers.ts b/x-pack/plugins/ml/public/application/routing/resolvers.ts index e94f4e189f63c..7d7ca41ebf9c3 100644 --- a/x-pack/plugins/ml/public/application/routing/resolvers.ts +++ b/x-pack/plugins/ml/public/application/routing/resolvers.ts @@ -7,10 +7,10 @@ import { getMlNodeCount } from '../ml_nodes_check/check_ml_nodes'; import { loadMlServerInfo } from '../services/ml_server_info'; -import type { MlApiServices } from '../services/ml_api_service'; +import type { MlApi } from '../services/ml_api_service'; export interface Resolvers { - [name: string]: (mlApiServices: MlApiServices) => Promise; + [name: string]: (mlApi: MlApi) => Promise; } export type ResolverResults = | { diff --git a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx index ffbcb0b8564ae..d48efb079af34 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx @@ -13,7 +13,7 @@ import { dynamic } from '@kbn/shared-ux-utility'; import { DataSourceContextProvider } from '../../../contexts/ml'; import { ML_PAGES } from '../../../../locator'; import type { NavigateToPath } from '../../../contexts/kibana'; -import { useMlApiContext } from '../../../contexts/kibana'; +import { useMlApi } from '../../../contexts/kibana'; import { useMlKibana } from '../../../contexts/kibana'; import type { MlRoute, PageProps } from '../../router'; import { createPath, PageLoader } from '../../router'; @@ -58,7 +58,7 @@ const PageWrapper: FC = ({ location }) => { savedSearch: savedSearchService, }, } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const { context } = useRouteResolver( 'full', @@ -69,7 +69,7 @@ const PageWrapper: FC = ({ location }) => { loadNewJobCapabilities( index, savedSearchId, - mlApiServices, + mlApi, dataViewsService, savedSearchService, DATA_FRAME_ANALYTICS diff --git a/x-pack/plugins/ml/public/application/routing/routes/explorer/explorer.tsx b/x-pack/plugins/ml/public/application/routing/routes/explorer/explorer.tsx index 04cd415527ace..648cceee7ce3b 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/explorer/explorer.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/explorer/explorer.tsx @@ -56,7 +56,7 @@ export const explorerRouteFactory = ( const PageWrapper: FC = () => { const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, uiSettings, }, } = useMlKibana(); @@ -65,7 +65,7 @@ const PageWrapper: FC = () => { const { context, results } = useRouteResolver('full', ['canGetJobs'], { ...basicResolvers(), jobs: mlJobService.loadJobsWrapper, - jobsWithTimeRange: () => mlApiServices.jobs.jobsWithTimerange(getDateFormatTz(uiSettings)), + jobsWithTimeRange: () => mlApi.jobs.jobsWithTimerange(getDateFormatTz(uiSettings)), }); const annotationUpdatesService = useMemo(() => new AnnotationUpdatesService(), []); diff --git a/x-pack/plugins/ml/public/application/routing/routes/explorer/state_manager.tsx b/x-pack/plugins/ml/public/application/routing/routes/explorer/state_manager.tsx index 1aa59116be935..d61849436c73d 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/explorer/state_manager.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/explorer/state_manager.tsx @@ -41,7 +41,7 @@ export const ExplorerUrlStateManager: FC = ({ const { services: { cases, presentationUtil, uiSettings, mlServices }, } = useMlKibana(); - const { mlApiServices: ml } = mlServices; + const { mlApi } = mlServices; const [globalState] = useUrlState('_g'); const [stoppedPartitions, setStoppedPartitions] = useState(); @@ -77,7 +77,7 @@ export const ExplorerUrlStateManager: FC = ({ const getJobsWithStoppedPartitions = useCallback(async (selectedJobIds: string[]) => { try { - const fetchedStoppedPartitions = await ml.results.getCategoryStoppedPartitions( + const fetchedStoppedPartitions = await mlApi.results.getCategoryStoppedPartitions( selectedJobIds, ML_JOB_ID ); diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_lens.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_lens.tsx index 210198b54afbb..bc5e1f23b31bc 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_lens.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_lens.tsx @@ -40,7 +40,7 @@ const PageWrapper: FC = ({ location }) => { }, dashboard: dashboardService, uiSettings: kibanaConfig, - mlServices: { mlApiServices }, + mlServices: { mlApi }, lens, }, } = useMlKibana(); @@ -52,7 +52,7 @@ const PageWrapper: FC = ({ location }) => { { dataViews, lens, - mlApiServices, + mlApi, mlJobService, timeFilter, kibanaConfig, diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_map.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_map.tsx index 0ba538ec24348..730dbb4cf1e26 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_map.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_map.tsx @@ -47,7 +47,7 @@ const PageWrapper: FC = ({ location }) => { }, dashboard: dashboardService, uiSettings: kibanaConfig, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); const mlJobService = useMlJobService(); @@ -55,7 +55,7 @@ const PageWrapper: FC = ({ location }) => { const { context } = useRouteResolver('full', ['canCreateJob'], { redirect: () => resolver( - { dataViews, mlApiServices, mlJobService, timeFilter, kibanaConfig, dashboardService }, + { dataViews, mlApi, mlJobService, timeFilter, kibanaConfig, dashboardService }, dashboard, dataViewId, embeddable, diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx index e6bc8f046a97b..d1dfcb2e21ed4 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx @@ -41,7 +41,7 @@ const PageWrapper: FC = ({ location }) => { data, dashboard: dashboardService, uiSettings: kibanaConfig, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); const mlJobService = useMlJobService(); @@ -50,7 +50,7 @@ const PageWrapper: FC = ({ location }) => { redirect: () => resolver( { - mlApiServices, + mlApi, mlJobService, timeFilter: data.query.timefilter.timefilter, kibanaConfig, diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx index 0a6166c3ff3b0..fb6c2aa15b651 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx @@ -13,7 +13,7 @@ import { dynamic } from '@kbn/shared-ux-utility'; import { basicResolvers } from '../../resolvers'; import { ML_PAGES } from '../../../../locator'; import type { NavigateToPath } from '../../../contexts/kibana'; -import { useMlApiContext, useMlKibana, useNavigateToPath } from '../../../contexts/kibana'; +import { useMlApi, useMlKibana, useNavigateToPath } from '../../../contexts/kibana'; import type { MlRoute, PageProps } from '../../router'; import { createPath, PageLoader } from '../../router'; import { useRouteResolver } from '../../use_resolver'; @@ -55,13 +55,13 @@ export const checkViewOrCreateRouteFactory = (): MlRoute => ({ const PageWrapper: FC = ({ location }) => { const { id } = parse(location.search, { sort: false }); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const toastNotificationService = useToastNotificationService(); const { context, results } = useRouteResolver('full', ['canGetJobs'], { ...basicResolvers(), existingJobsAndGroups: () => - mlJobServiceFactory(toastNotificationService, mlApiServices).getJobAndGroupIds(), + mlJobServiceFactory(toastNotificationService, mlApi).getJobAndGroupIds(), }); return ( @@ -79,7 +79,7 @@ const CheckViewOrCreateWrapper: FC = ({ location }) => { const { services: { notifications: { toasts }, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); @@ -102,7 +102,7 @@ const CheckViewOrCreateWrapper: FC = ({ location }) => { // If so, load the jobs in the Anomaly Explorer. // Otherwise open the data recognizer wizard for the module. // Always want to call reject() so as not to load original page. - mlApiServices + mlApi .dataRecognizerModuleJobsExist({ moduleId }) .then(async (resp: any) => { if (resp.jobsExist === true) { diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx index 66ef374b4879e..d5f43fab97f45 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx @@ -207,7 +207,7 @@ const PageWrapper: FC = ({ location, jobType }) => { services: { data: { dataViews: dataViewsService }, savedSearch: savedSearchService, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); const toastNotificationService = useToastNotificationService(); @@ -215,19 +215,18 @@ const PageWrapper: FC = ({ location, jobType }) => { const { context, results } = useRouteResolver('full', ['canGetJobs', 'canCreateJob'], { ...basicResolvers(), // TODO useRouteResolver should be responsible for the redirect - privileges: () => - checkCreateJobsCapabilitiesResolver(mlApiServices, redirectToJobsManagementPage), + privileges: () => checkCreateJobsCapabilitiesResolver(mlApi, redirectToJobsManagementPage), jobCaps: () => loadNewJobCapabilities( index, savedSearchId, - mlApiServices, + mlApi, dataViewsService, savedSearchService, ANOMALY_DETECTOR ), existingJobsAndGroups: () => - mlJobServiceFactory(toastNotificationService, mlApiServices).getJobAndGroupIds(), + mlJobServiceFactory(toastNotificationService, mlApi).getJobAndGroupIds(), }); return ( diff --git a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.test.tsx b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.test.tsx index 8119c7305c0fd..5bf60c8b41779 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.test.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.test.tsx @@ -113,7 +113,7 @@ jest.mock('../../../contexts/kibana/kibana_context', () => { timefilter: getMockedTimefilter(), }, }, - mlServices: { mlApiServices: {} }, + mlServices: { mlApi: {} }, notifications: { toasts: { addDanger: () => {}, diff --git a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.tsx b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.tsx index b7e7c7a4332c0..14abe1b8029b7 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer/timeseriesexplorer.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { dynamic } from '@kbn/shared-ux-utility'; import { ML_PAGES } from '../../../../locator'; import type { NavigateToPath } from '../../../contexts/kibana'; -import { useMlApiContext, useUiSettings } from '../../../contexts/kibana'; +import { useMlApi, useUiSettings } from '../../../contexts/kibana'; import { getDateFormatTz } from '../../../explorer/explorer_utils'; import { useMlJobService } from '../../../services/job_service'; import type { MlRoute, PageProps } from '../../router'; @@ -49,7 +49,7 @@ export const timeSeriesExplorerRouteFactory = ( }); const PageWrapper: FC = ({ deps }) => { - const mlApi = useMlApiContext(); + const mlApi = useMlApi(); const mlJobService = useMlJobService(); const uiSettings = useUiSettings(); const { context, results } = useRouteResolver('full', ['canGetJobs'], { diff --git a/x-pack/plugins/ml/public/application/routing/use_resolver.tsx b/x-pack/plugins/ml/public/application/routing/use_resolver.tsx index d7e7e8762caaf..d65107410012b 100644 --- a/x-pack/plugins/ml/public/application/routing/use_resolver.tsx +++ b/x-pack/plugins/ml/public/application/routing/use_resolver.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import useMount from 'react-use/lib/useMount'; import { AccessDeniedCallout } from '../access_denied'; import { PLUGIN_ID } from '../../../common/constants/app'; -import { useMlApiContext, useMlKibana, useMlLicenseInfo } from '../contexts/kibana'; +import { useMlApi, useMlKibana, useMlLicenseInfo } from '../contexts/kibana'; import { type MlCapabilitiesKey } from '../../../common/types/capabilities'; import { usePermissionCheck } from '../capabilities/check_capabilities'; import type { ResolverResults, Resolvers } from './resolvers'; @@ -54,7 +54,7 @@ export const useRouteResolver = ( }, }, } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const mlLicenseInfo = useMlLicenseInfo(); useMount(function refreshCapabilitiesOnMount() { @@ -119,11 +119,11 @@ export const useRouteResolver = ( p[c] = {}; return p; }, {} as Exclude); - const res = await Promise.all(funcs.map((r) => r(mlApiServices))); + const res = await Promise.all(funcs.map((r) => r(mlApi))); res.forEach((r, i) => (tempResults[funcNames[i]] = r)); return tempResults; - // skip mlApiServices from deps + // skip mlApi from deps // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/x-pack/plugins/ml/public/application/services/anomaly_detector_service.ts b/x-pack/plugins/ml/public/application/services/anomaly_detector_service.ts index 040753af178b2..972a0d7bb3963 100644 --- a/x-pack/plugins/ml/public/application/services/anomaly_detector_service.ts +++ b/x-pack/plugins/ml/public/application/services/anomaly_detector_service.ts @@ -9,13 +9,13 @@ import type { Observable } from 'rxjs'; import { map } from 'rxjs'; import type { Job, JobId } from '../../../common/types/anomaly_detection_jobs'; import type { HttpService } from './http_service'; -import { type MlApiServices, mlApiServicesProvider } from './ml_api_service'; +import { type MlApi, mlApiProvider } from './ml_api_service'; export class AnomalyDetectorService { - private mlApiServices: MlApiServices; + private mlApi: MlApi; constructor(httpService: HttpService) { - this.mlApiServices = mlApiServicesProvider(httpService); + this.mlApi = mlApiProvider(httpService); } /** @@ -31,8 +31,6 @@ export class AnomalyDetectorService { * @param jobIds */ getJobs$(jobIds: JobId[]): Observable { - return this.mlApiServices - .getJobs$({ jobId: jobIds.join(',') }) - .pipe(map((response) => response.jobs)); + return this.mlApi.getJobs$({ jobId: jobIds.join(',') }).pipe(map((response) => response.jobs)); } } diff --git a/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.test.ts b/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.test.ts index 1efaddabe1a34..9b1f41c6aa04a 100644 --- a/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.test.ts +++ b/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.test.ts @@ -7,7 +7,7 @@ import { AnomalyExplorerChartsService } from './anomaly_explorer_charts_service'; import { of } from 'rxjs'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import type { MlResultsService } from './results_service'; import { createTimefilterMock } from '../contexts/kibana/__mocks__/use_timefilter'; import moment from 'moment'; @@ -56,7 +56,7 @@ describe('AnomalyExplorerChartsService', () => { anomalyExplorerService = new AnomalyExplorerChartsService( timefilterMock, - mlApiServicesMock as unknown as MlApiServices, + mlApiServicesMock as unknown as MlApi, mlResultsServiceMock as unknown as MlResultsService ) as jest.Mocked; }); diff --git a/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.ts b/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.ts index 1eb752c28ce5d..8be72301a9613 100644 --- a/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.ts +++ b/x-pack/plugins/ml/public/application/services/anomaly_explorer_charts_service.ts @@ -25,7 +25,7 @@ import type { ExplorerChartsData } from '../explorer/explorer_charts/explorer_ch import type { AppStateSelectedCells } from '../explorer/explorer_utils'; import { SWIM_LANE_LABEL_WIDTH } from '../explorer/constants'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import type { MlResultsService } from './results_service'; const MAX_CHARTS_PER_ROW = 4; @@ -45,7 +45,7 @@ export class AnomalyExplorerChartsService { constructor( private timeFilter: TimefilterContract, - private mlApiServices: MlApiServices, + private mlApi: MlApi, private mlResultsService: MlResultsService ) { this.timeFilter.enableTimeRangeSelector(); @@ -64,7 +64,7 @@ export class AnomalyExplorerChartsService { public async getCombinedJobs(jobIds: string[]): Promise { const combinedResults = await Promise.all( // Getting only necessary job config and datafeed config without the stats - jobIds.map((jobId) => this.mlApiServices.jobs.jobForCloning(jobId)) + jobIds.map((jobId) => this.mlApi.jobs.jobForCloning(jobId)) ); return combinedResults .filter(isDefined) @@ -139,7 +139,7 @@ export class AnomalyExplorerChartsService { const maxSeriesToPlot = maxSeries ?? Math.max(chartsPerRow * 2, DEFAULT_MAX_SERIES_TO_PLOT); - return this.mlApiServices.results + return this.mlApi.results .getAnomalyCharts$( jobIds, influencers ?? [], diff --git a/x-pack/plugins/ml/public/application/services/calendar_service.ts b/x-pack/plugins/ml/public/application/services/calendar_service.ts index d44653e5ee86b..ada2cbce43f6c 100644 --- a/x-pack/plugins/ml/public/application/services/calendar_service.ts +++ b/x-pack/plugins/ml/public/application/services/calendar_service.ts @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import type { Calendar, CalendarId } from '../../../common/types/calendars'; import type { JobId } from '../../../common/types/anomaly_detection_jobs'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; class CalendarService { /** @@ -16,10 +16,10 @@ class CalendarService { * @param calendar * @param jobId */ - async assignNewJobId(mlApiServices: MlApiServices, calendar: Calendar, jobId: JobId) { + async assignNewJobId(mlApi: MlApi, calendar: Calendar, jobId: JobId) { const { calendar_id: calendarId } = calendar; try { - await mlApiServices.updateCalendar({ + await mlApi.updateCalendar({ ...calendar, calendarId, job_ids: [...calendar.job_ids, jobId], @@ -38,12 +38,9 @@ class CalendarService { * Fetches calendars by the list of ids. * @param calendarIds */ - async fetchCalendarsByIds( - mlApiServices: MlApiServices, - calendarIds: CalendarId[] - ): Promise { + async fetchCalendarsByIds(mlApi: MlApi, calendarIds: CalendarId[]): Promise { try { - const calendars = await mlApiServices.calendars({ calendarIds }); + const calendars = await mlApi.calendars({ calendarIds }); return Array.isArray(calendars) ? calendars : [calendars]; } catch (e) { throw new Error( diff --git a/x-pack/plugins/ml/public/application/services/field_format_service.ts b/x-pack/plugins/ml/public/application/services/field_format_service.ts index 509e791cc75a4..8d21c368a7303 100644 --- a/x-pack/plugins/ml/public/application/services/field_format_service.ts +++ b/x-pack/plugins/ml/public/application/services/field_format_service.ts @@ -8,7 +8,7 @@ import { mlFunctionToESAggregation } from '../../../common/util/job_utils'; import type { MlJobService } from './job_service'; import type { MlIndexUtils } from '../util/index_service'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; type FormatsByJobId = Record; type IndexPatternIdsByJob = Record; @@ -20,7 +20,7 @@ export class FieldFormatService { formatsByJob: FormatsByJobId = {}; constructor( - private mlApiServices: MlApiServices, + private mlApi: MlApi, private mlIndexUtils: MlIndexUtils, private mlJobService: MlJobService ) {} @@ -40,8 +40,8 @@ export class FieldFormatService { await Promise.all( jobIds.map(async (jobId) => { let jobObj; - if (this.mlApiServices) { - const { jobs } = await this.mlApiServices.getJobs({ jobId }); + if (this.mlApi) { + const { jobs } = await this.mlApi.getJobs({ jobId }); jobObj = jobs[0]; } else { jobObj = this.mlJobService.getJob(jobId); @@ -85,8 +85,8 @@ export class FieldFormatService { async getFormatsForJob(jobId: string): Promise { let jobObj; - if (this.mlApiServices) { - const { jobs } = await this.mlApiServices.getJobs({ jobId }); + if (this.mlApi) { + const { jobs } = await this.mlApi.getJobs({ jobId }); jobObj = jobs[0]; } else { jobObj = this.mlJobService.getJob(jobId); diff --git a/x-pack/plugins/ml/public/application/services/field_format_service_factory.ts b/x-pack/plugins/ml/public/application/services/field_format_service_factory.ts index fc59dbdf03ce4..1b40579cc74c3 100644 --- a/x-pack/plugins/ml/public/application/services/field_format_service_factory.ts +++ b/x-pack/plugins/ml/public/application/services/field_format_service_factory.ts @@ -7,13 +7,13 @@ import { type MlFieldFormatService, FieldFormatService } from './field_format_service'; import type { MlIndexUtils } from '../util/index_service'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import type { MlJobService } from './job_service'; export function fieldFormatServiceFactory( - mlApiServices: MlApiServices, + mlApi: MlApi, mlIndexUtils: MlIndexUtils, mlJobService: MlJobService ): MlFieldFormatService { - return new FieldFormatService(mlApiServices, mlIndexUtils, mlJobService); + return new FieldFormatService(mlApi, mlIndexUtils, mlJobService); } diff --git a/x-pack/plugins/ml/public/application/services/forecast_service.ts b/x-pack/plugins/ml/public/application/services/forecast_service.ts index 316577d98dd44..d1778dbf948f6 100644 --- a/x-pack/plugins/ml/public/application/services/forecast_service.ts +++ b/x-pack/plugins/ml/public/application/services/forecast_service.ts @@ -11,7 +11,7 @@ import { useMemo } from 'react'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { get, find, each } from 'lodash'; import { map } from 'rxjs'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import type { Job } from '../../../common/types/anomaly_detection_jobs'; import { useMlKibana } from '../contexts/kibana'; @@ -21,7 +21,7 @@ export interface AggType { min: string; } -export function forecastServiceFactory(mlApiServices: MlApiServices) { +export function forecastServiceFactory(mlApi: MlApi) { // Gets a basic summary of the most recently run forecasts for the specified // job, with results at or later than the supplied timestamp. // Extra query object can be supplied, or pass null if no additional query. @@ -58,7 +58,7 @@ export function forecastServiceFactory(mlApiServices: MlApiServices) { filterCriteria.push(query); } - mlApiServices.results + mlApi.results .anomalySearch( { // @ts-expect-error SearchRequest type has not been updated to include size @@ -121,7 +121,7 @@ export function forecastServiceFactory(mlApiServices: MlApiServices) { // TODO - add in criteria for detector index and entity fields (by, over, partition) // once forecasting with these parameters is supported. - mlApiServices.results + mlApi.results .anomalySearch( { // @ts-expect-error SearchRequest type has not been updated to include size @@ -261,7 +261,7 @@ export function forecastServiceFactory(mlApiServices: MlApiServices) { min: aggType.min, }; - return mlApiServices.results + return mlApi.results .anomalySearch$( { // @ts-expect-error SearchRequest type has not been updated to include size @@ -323,7 +323,7 @@ export function forecastServiceFactory(mlApiServices: MlApiServices) { // eslint-disable-next-line no-console console.log('ML forecast service run forecast with duration:', duration); return new Promise((resolve, reject) => { - mlApiServices + mlApi .forecast({ jobId, duration, @@ -364,7 +364,7 @@ export function forecastServiceFactory(mlApiServices: MlApiServices) { }, ]; - mlApiServices.results + mlApi.results .anomalySearch( { // @ts-expect-error SearchRequest type has not been updated to include size @@ -405,10 +405,10 @@ export type MlForecastService = ReturnType; export function useForecastService(): MlForecastService { const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); - const mlForecastService = useMemo(() => forecastServiceFactory(mlApiServices), [mlApiServices]); + const mlForecastService = useMemo(() => forecastServiceFactory(mlApi), [mlApi]); return mlForecastService; } diff --git a/x-pack/plugins/ml/public/application/services/get_shared_ml_services.ts b/x-pack/plugins/ml/public/application/services/get_shared_ml_services.ts index 44e6a5e5746e8..ac003ea078219 100644 --- a/x-pack/plugins/ml/public/application/services/get_shared_ml_services.ts +++ b/x-pack/plugins/ml/public/application/services/get_shared_ml_services.ts @@ -8,7 +8,7 @@ import { type HttpStart } from '@kbn/core-http-browser'; import { ElasticModels } from './elastic_models_service'; import { HttpService } from './http_service'; -import { mlApiServicesProvider } from './ml_api_service'; +import { mlApiProvider } from './ml_api_service'; export type MlSharedServices = ReturnType; @@ -17,10 +17,10 @@ export type MlSharedServices = ReturnType; */ export function getMlSharedServices(httpStart: HttpStart) { const httpService = new HttpService(httpStart); - const mlApiServices = mlApiServicesProvider(httpService); + const mlApi = mlApiProvider(httpService); return { - elasticModels: new ElasticModels(mlApiServices.trainedModels), - mlApiServices, + elasticModels: new ElasticModels(mlApi.trainedModels), + mlApi, }; } diff --git a/x-pack/plugins/ml/public/application/services/job_service.d.ts b/x-pack/plugins/ml/public/application/services/job_service.d.ts index 685a0cf86cf9a..54a1fb3170918 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.d.ts +++ b/x-pack/plugins/ml/public/application/services/job_service.d.ts @@ -9,7 +9,7 @@ import type { TimeRange } from '@kbn/data-plugin/common/query/timefilter/types'; import type { CombinedJob, Datafeed, Job } from '../../../common/types/anomaly_detection_jobs'; import type { Calendar } from '../../../common/types/calendars'; import type { ToastNotificationService } from './toast_notification_service'; -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import type { JobCreatorType } from '../jobs/new_job/common/job_creator'; export interface ExistingJobsAndGroups { @@ -62,7 +62,7 @@ export declare interface MlJobService { export const mlJobServiceFactory: ( toastNotificationService: ToastNotificationService, - mlApiServices: MlApiServices + mlApi: MlApi ) => MlJobService; export const useMlJobService: () => MlJobService; diff --git a/x-pack/plugins/ml/public/application/services/job_service.js b/x-pack/plugins/ml/public/application/services/job_service.js index c37502ab570ac..dc7d96f4e3236 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.js +++ b/x-pack/plugins/ml/public/application/services/job_service.js @@ -13,7 +13,7 @@ import { validateTimeRange, TIME_FORMAT } from '@kbn/ml-date-utils'; import { parseInterval } from '../../../common/util/parse_interval'; import { isWebUrl } from '../util/url_utils'; -import { useMlApiContext } from '../contexts/kibana'; +import { useMlApi } from '../contexts/kibana'; import { useToastNotificationService } from './toast_notification_service'; @@ -596,15 +596,15 @@ function createResultsUrl(jobIds, start, end, resultsPage, mode = 'absolute') { // This is to retain the singleton behavior of the previous direct instantiation and export. let mlJobService; -export const mlJobServiceFactory = (toastNotificationService, mlApiServices) => { +export const mlJobServiceFactory = (toastNotificationService, mlApi) => { if (mlJobService) return mlJobService; - mlJobService = new JobService(toastNotificationService, mlApiServices); + mlJobService = new JobService(toastNotificationService, mlApi); return mlJobService; }; export const useMlJobService = () => { const toastNotificationService = useToastNotificationService(); - const mlApiServices = useMlApiContext(); - return mlJobServiceFactory(toastNotificationService, mlApiServices); + const mlApi = useMlApi(); + return mlJobServiceFactory(toastNotificationService, mlApi); }; diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts index 77c074a97bec4..f185a6452d654 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts @@ -99,7 +99,7 @@ export interface GetModelSnapshotsResponse { model_snapshots: ModelSnapshot[]; } -export function mlApiServicesProvider(httpService: HttpService) { +export function mlApiProvider(httpService: HttpService) { return { getJobs(obj?: { jobId?: string }) { const jobId = obj && obj.jobId ? `/${obj.jobId}` : ''; @@ -785,4 +785,4 @@ export function mlApiServicesProvider(httpService: HttpService) { }; } -export type MlApiServices = ReturnType; +export type MlApi = ReturnType; diff --git a/x-pack/plugins/ml/public/application/services/ml_server_info.test.ts b/x-pack/plugins/ml/public/application/services/ml_server_info.test.ts index bb10e9b466f6e..38f3a196a9baf 100644 --- a/x-pack/plugins/ml/public/application/services/ml_server_info.test.ts +++ b/x-pack/plugins/ml/public/application/services/ml_server_info.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import { loadMlServerInfo, getCloudDeploymentId, @@ -19,7 +19,7 @@ import mockMlInfoResponse from './__mocks__/ml_info_response.json'; const mlApiServicesMock = { mlInfo: jest.fn(() => Promise.resolve(mockMlInfoResponse)), -} as unknown as MlApiServices; +} as unknown as MlApi; describe('ml_server_info initial state', () => { it('should fail to get server info ', () => { diff --git a/x-pack/plugins/ml/public/application/services/ml_server_info.ts b/x-pack/plugins/ml/public/application/services/ml_server_info.ts index 101cb33264502..e01236534f2c4 100644 --- a/x-pack/plugins/ml/public/application/services/ml_server_info.ts +++ b/x-pack/plugins/ml/public/application/services/ml_server_info.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { MlApiServices } from './ml_api_service'; +import type { MlApi } from './ml_api_service'; import type { MlServerDefaults, MlServerLimits } from '../../../common/types/ml_server_info'; export interface CloudInfo { @@ -28,9 +28,9 @@ const cloudInfo: CloudInfo = { deploymentId: null, }; -export async function loadMlServerInfo(mlApiServices: MlApiServices) { +export async function loadMlServerInfo(mlApi: MlApi) { try { - const resp = await mlApiServices.mlInfo(); + const resp = await mlApi.mlInfo(); defaults = resp.defaults; limits = resp.limits; cloudInfo.cloudId = resp.cloudId ?? null; diff --git a/x-pack/plugins/ml/public/application/services/new_job_capabilities/load_new_job_capabilities.ts b/x-pack/plugins/ml/public/application/services/new_job_capabilities/load_new_job_capabilities.ts index 6c25d43020d52..f1e02597e3795 100644 --- a/x-pack/plugins/ml/public/application/services/new_job_capabilities/load_new_job_capabilities.ts +++ b/x-pack/plugins/ml/public/application/services/new_job_capabilities/load_new_job_capabilities.ts @@ -9,7 +9,7 @@ import type { DataView, DataViewsContract } from '@kbn/data-views-plugin/public' import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import { getDataViewAndSavedSearchCallback } from '../../util/index_utils'; import type { JobType } from '../../../../common/types/saved_objects'; -import type { MlApiServices } from '../ml_api_service'; +import type { MlApi } from '../ml_api_service'; import { mlJobCapsServiceAnalyticsFactory } from './new_job_capabilities_service_analytics'; import { mlJobCapsServiceFactory } from './new_job_capabilities_service'; @@ -21,7 +21,7 @@ export const DATA_FRAME_ANALYTICS = 'data-frame-analytics'; export function loadNewJobCapabilities( dataViewId: string, savedSearchId: string, - mlApiServices: MlApiServices, + mlApi: MlApi, dataViewsService: DataViewsContract, savedSearchService: SavedSearchPublicPluginStart, jobType: JobType @@ -30,8 +30,8 @@ export function loadNewJobCapabilities( try { const serviceToUse = jobType === ANOMALY_DETECTOR - ? mlJobCapsServiceFactory(mlApiServices) - : mlJobCapsServiceAnalyticsFactory(mlApiServices); + ? mlJobCapsServiceFactory(mlApi) + : mlJobCapsServiceAnalyticsFactory(mlApi); if (dataViewId !== undefined) { // index pattern is being used diff --git a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.test.ts b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.test.ts index ed257199db16b..057b558485729 100644 --- a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.test.ts +++ b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.test.ts @@ -8,7 +8,7 @@ import { mlJobCapsServiceFactory } from './new_job_capabilities_service'; import type { DataView } from '@kbn/data-views-plugin/public'; -import type { MlApiServices } from '../ml_api_service'; +import type { MlApi } from '../ml_api_service'; // there is magic happening here. starting the include name with `mock..` // ensures it can be lazily loaded by the jest.mock function below. @@ -18,7 +18,7 @@ const mlApiServicesMock = { jobs: { newJobCaps: jest.fn(() => Promise.resolve(mockCloudwatchResponse)), }, -} as unknown as MlApiServices; +} as unknown as MlApi; const dataView = { id: 'cloudwatch-*', diff --git a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts index 990d411779a6f..59f2e74b9ca36 100644 --- a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts +++ b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts @@ -15,9 +15,9 @@ import { EVENT_RATE_FIELD_ID, } from '@kbn/ml-anomaly-utils'; import { DataViewType } from '@kbn/data-views-plugin/public'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { getGeoFields, filterCategoryFields } from '../../../../common/util/fields_utils'; -import type { MlApiServices } from '../ml_api_service'; +import type { MlApi } from '../ml_api_service'; import { processTextAndKeywordFields, NewJobCapabilitiesServiceBase } from './new_job_capabilities'; export class NewJobCapsService extends NewJobCapabilitiesServiceBase { @@ -26,9 +26,9 @@ export class NewJobCapsService extends NewJobCapabilitiesServiceBase { private _geoFields: Field[] = []; private _includeEventRateField: boolean = true; private _removeTextFields: boolean = true; - private _mlApiService: MlApiServices; + private _mlApiService: MlApi; - constructor(mlApiService: MlApiServices) { + constructor(mlApiService: MlApi) { super(); this._mlApiService = mlApiService; } @@ -189,14 +189,14 @@ function addEventRateField(aggs: Aggregation[], fields: Field[]) { // This is to retain the singleton behavior of the previous direct instantiation and export. let newJobCapsService: NewJobCapsService; -export const mlJobCapsServiceFactory = (mlApiServices: MlApiServices) => { +export const mlJobCapsServiceFactory = (mlApi: MlApi) => { if (newJobCapsService) return newJobCapsService; - newJobCapsService = new NewJobCapsService(mlApiServices); + newJobCapsService = new NewJobCapsService(mlApi); return newJobCapsService; }; export const useNewJobCapsService = () => { - const mlApiServices = useMlApiContext(); - return mlJobCapsServiceFactory(mlApiServices); + const mlApi = useMlApi(); + return mlJobCapsServiceFactory(mlApi); }; diff --git a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service_analytics.ts b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service_analytics.ts index c2b7a4dc24906..f3ea32f42565d 100644 --- a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service_analytics.ts +++ b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service_analytics.ts @@ -25,9 +25,9 @@ import { TOP_CLASSES, type DataFrameAnalyticsConfig, } from '@kbn/ml-data-frame-analytics-utils'; -import { useMlApiContext } from '../../contexts/kibana'; +import { useMlApi } from '../../contexts/kibana'; import { processTextAndKeywordFields, NewJobCapabilitiesServiceBase } from './new_job_capabilities'; -import type { MlApiServices } from '../ml_api_service'; +import type { MlApi } from '../ml_api_service'; // Keep top nested field and remove all .* fields export function removeNestedFieldChildren(resp: NewJobCapsResponse, indexPatternTitle: string) { @@ -61,9 +61,9 @@ export function removeNestedFieldChildren(resp: NewJobCapsResponse, indexPattern } export class NewJobCapsServiceAnalytics extends NewJobCapabilitiesServiceBase { - private _mlApiService: MlApiServices; + private _mlApiService: MlApi; - constructor(mlApiService: MlApiServices) { + constructor(mlApiService: MlApi) { super(); this._mlApiService = mlApiService; } @@ -227,14 +227,14 @@ export class NewJobCapsServiceAnalytics extends NewJobCapabilitiesServiceBase { // This is to retain the singleton behavior of the previous direct instantiation and export. let newJobCapsServiceAnalytics: NewJobCapsServiceAnalytics; -export const mlJobCapsServiceAnalyticsFactory = (mlApiServices: MlApiServices) => { +export const mlJobCapsServiceAnalyticsFactory = (mlApi: MlApi) => { if (newJobCapsServiceAnalytics) return newJobCapsServiceAnalytics; - newJobCapsServiceAnalytics = new NewJobCapsServiceAnalytics(mlApiServices); + newJobCapsServiceAnalytics = new NewJobCapsServiceAnalytics(mlApi); return newJobCapsServiceAnalytics; }; export const useNewJobCapsServiceAnalytics = () => { - const mlApiServices = useMlApiContext(); - return mlJobCapsServiceAnalyticsFactory(mlApiServices); + const mlApi = useMlApi(); + return mlJobCapsServiceAnalyticsFactory(mlApi); }; diff --git a/x-pack/plugins/ml/public/application/services/results_service/index.ts b/x-pack/plugins/ml/public/application/services/results_service/index.ts index d8621eff633a4..6ee762511d280 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/index.ts +++ b/x-pack/plugins/ml/public/application/services/results_service/index.ts @@ -7,8 +7,8 @@ import { resultsServiceRxProvider } from './result_service_rx'; import { resultsServiceProvider } from './results_service'; -import type { MlApiServices } from '../ml_api_service'; -import { useMlApiContext } from '../../contexts/kibana'; +import type { MlApi } from '../ml_api_service'; +import { useMlApi } from '../../contexts/kibana'; export type MlResultsService = ReturnType & ReturnType; @@ -25,18 +25,18 @@ export interface CriteriaField { // This is to retain the singleton behavior of the previous direct instantiation and export. let mlResultsService: MlResultsService; -export function mlResultsServiceProvider(mlApiServices: MlApiServices) { +export function mlResultsServiceProvider(mlApi: MlApi) { if (mlResultsService) return mlResultsService; mlResultsService = { - ...resultsServiceProvider(mlApiServices), - ...resultsServiceRxProvider(mlApiServices), + ...resultsServiceProvider(mlApi), + ...resultsServiceRxProvider(mlApi), }; return mlResultsService; } export function useMlResultsService(): MlResultsService { - const mlApiServices = useMlApiContext(); - return mlResultsServiceProvider(mlApiServices); + const mlApi = useMlApi(); + return mlResultsServiceProvider(mlApi); } diff --git a/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts b/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts index 281139160bee5..0f6e31ea96e95 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts +++ b/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts @@ -30,7 +30,7 @@ import { ML_MEDIAN_PERCENTS } from '../../../../common/util/job_utils'; import type { Datafeed, JobId } from '../../../../common/types/anomaly_detection_jobs'; import { findAggField } from '../../../../common/util/validation_utils'; import { getDatafeedAggregations } from '../../../../common/util/datafeed_utils'; -import type { MlApiServices } from '../ml_api_service'; +import type { MlApi } from '../ml_api_service'; import type { CriteriaField } from '.'; export interface ResultResponse { @@ -71,7 +71,7 @@ export interface ScheduledEventsByBucket extends ResultResponse { events: Record; } -export function resultsServiceRxProvider(mlApiServices: MlApiServices) { +export function resultsServiceRxProvider(mlApi: MlApi) { return { getMetricData( index: string, @@ -216,7 +216,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { } } } - return mlApiServices.esSearch$({ index, body }).pipe( + return mlApi.esSearch$({ index, body }).pipe( map((resp: any) => { const obj: MetricData = { success: true, results: {} }; const dataByTime = resp?.aggregations?.byTime?.buckets ?? []; @@ -316,7 +316,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }, ]; - return mlApiServices.results + return mlApi.results .anomalySearch$( { body: { @@ -469,7 +469,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }); } - return mlApiServices.results + return mlApi.results .anomalySearch$( { body: { @@ -555,7 +555,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }); } - return mlApiServices.results + return mlApi.results .anomalySearch$( { body: { @@ -634,7 +634,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { earliestMs: number, latestMs: number ) { - return mlApiServices.results.fetchPartitionFieldsValues( + return mlApi.results.fetchPartitionFieldsValues( jobId, searchTerm, criteriaFields, @@ -734,7 +734,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }); } - return mlApiServices.results + return mlApi.results .anomalySearch$( { body: { diff --git a/x-pack/plugins/ml/public/application/services/results_service/results_service.d.ts b/x-pack/plugins/ml/public/application/services/results_service/results_service.d.ts index aff49acc3b853..a55c56d795d86 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/results_service.d.ts +++ b/x-pack/plugins/ml/public/application/services/results_service/results_service.d.ts @@ -8,9 +8,9 @@ import type { InfluencersFilterQuery, EntityField } from '@kbn/ml-anomaly-utils'; import type { RuntimeMappings } from '@kbn/ml-runtime-field-utils'; import type { IndicesOptions } from '../../../../common/types/anomaly_detection_jobs'; -import type { MlApiServices } from '../ml_api_service'; +import type { MlApi } from '../ml_api_service'; -export function resultsServiceProvider(mlApiServices: MlApiServices): { +export function resultsServiceProvider(mlApi: MlApi): { getScoresByBucket( jobIds: string[], earliestMs: number, diff --git a/x-pack/plugins/ml/public/application/services/results_service/results_service.js b/x-pack/plugins/ml/public/application/services/results_service/results_service.js index f7074a3498b75..5b6df89e52249 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/results_service.js +++ b/x-pack/plugins/ml/public/application/services/results_service/results_service.js @@ -20,7 +20,7 @@ import { aggregationTypeTransform } from '@kbn/ml-anomaly-utils'; /** * Service for carrying out Elasticsearch queries to obtain data for the Ml Results dashboards. */ -export function resultsServiceProvider(mlApiServices) { +export function resultsServiceProvider(mlApi) { const SAMPLER_TOP_TERMS_SHARD_SIZE = 20000; const ENTITY_AGGREGATION_SIZE = 10; const AGGREGATION_MIN_DOC_COUNT = 1; @@ -84,7 +84,7 @@ export function resultsServiceProvider(mlApiServices) { }); } - mlApiServices.results + mlApi.results .anomalySearch( { size: 0, @@ -264,7 +264,7 @@ export function resultsServiceProvider(mlApiServices) { }); } - mlApiServices.results + mlApi.results .anomalySearch( { size: 0, @@ -406,7 +406,7 @@ export function resultsServiceProvider(mlApiServices) { }); } - mlApiServices.results + mlApi.results .anomalySearch( { size: 0, @@ -483,7 +483,7 @@ export function resultsServiceProvider(mlApiServices) { return new Promise((resolve, reject) => { const obj = { success: true, results: {} }; - mlApiServices + mlApi .overallBuckets({ jobId: jobIds, topN: topN, @@ -592,7 +592,7 @@ export function resultsServiceProvider(mlApiServices) { }); } - mlApiServices.results + mlApi.results .anomalySearch( { size: 0, @@ -755,7 +755,7 @@ export function resultsServiceProvider(mlApiServices) { }); } - mlApiServices.results + mlApi.results .anomalySearch( { size: maxResults !== undefined ? maxResults : 100, @@ -883,7 +883,7 @@ export function resultsServiceProvider(mlApiServices) { } } - mlApiServices.results + mlApi.results .anomalySearch( { size: maxResults !== undefined ? maxResults : 100, @@ -962,7 +962,7 @@ export function resultsServiceProvider(mlApiServices) { mustCriteria.push(query); } - mlApiServices + mlApi .esSearch({ index, size: 0, @@ -1140,7 +1140,7 @@ export function resultsServiceProvider(mlApiServices) { body.aggs.sample.aggs.byTime.aggs.entities.aggs.metric = metricAgg; } - mlApiServices + mlApi .esSearch({ index, body, @@ -1240,7 +1240,7 @@ export function resultsServiceProvider(mlApiServices) { }, }); } - mlApiServices.results + mlApi.results .anomalySearch( { size: 0, diff --git a/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx b/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx index 5161963e90a46..e5fce41df2e18 100644 --- a/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx +++ b/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx @@ -22,14 +22,14 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useMlApiContext } from '../contexts/kibana'; +import { useMlApi } from '../contexts/kibana'; import { AnomalyDetectionSettingsContext } from './anomaly_detection_settings_context'; import { useToastNotificationService } from '../services/toast_notification_service'; import { ML_PAGES } from '../../../common/constants/locator'; import { useCreateAndNavigateToMlLink } from '../contexts/kibana/use_create_url'; export const AnomalyDetectionSettings: FC = () => { - const ml = useMlApiContext(); + const mlApi = useMlApi(); const [calendarsCount, setCalendarsCount] = useState(0); const [filterListsCount, setFilterListsCount] = useState(0); @@ -53,7 +53,7 @@ export const AnomalyDetectionSettings: FC = () => { // Obtain the counts of calendars and filter lists. if (canGetCalendars === true) { try { - const calendars = await ml.calendars(); + const calendars = await mlApi.calendars(); setCalendarsCount(calendars.length); } catch (e) { displayErrorToast( @@ -67,7 +67,7 @@ export const AnomalyDetectionSettings: FC = () => { if (canGetFilters === true) { try { - const filterLists = await ml.filters.filtersStats(); + const filterLists = await mlApi.filters.filtersStats(); setFilterListsCount(filterLists.length); } catch (e) { displayErrorToast( diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js index 79f4d82093f21..51939aaba639a 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js @@ -72,7 +72,7 @@ class NewCalendarUI extends Component { async formSetup() { try { const { jobIds, groupIds, calendars } = await getCalendarSettingsData( - this.props.kibana.services.mlServices.mlApiServices + this.props.kibana.services.mlServices.mlApi ); const jobIdOptions = jobIds.map((jobId) => ({ label: jobId })); @@ -145,7 +145,7 @@ class NewCalendarUI extends Component { }; onCreate = async () => { - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; const { formCalendarId } = this.state; if (this.isDuplicateId()) { @@ -161,7 +161,7 @@ class NewCalendarUI extends Component { this.setState({ saving: true }); try { - await ml.addCalendar(calendar); + await mlApi.addCalendar(calendar); await this.returnToCalendarsManagementPage(); } catch (error) { this.setState({ saving: false }); @@ -177,12 +177,12 @@ class NewCalendarUI extends Component { }; onEdit = async () => { - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; const calendar = this.setUpCalendarForApi(); this.setState({ saving: true }); try { - await ml.updateCalendar(calendar); + await mlApi.updateCalendar(calendar); await this.returnToCalendarsManagementPage(); } catch (error) { this.setState({ saving: false }); diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js index 1e538668d9ac3..1ec652475e3a3 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js @@ -84,7 +84,7 @@ const mockKibanaContext = { docLinks: { links: { ml: { calendars: 'test' } } }, notifications: { toasts: { addDanger: mockAddDanger, addError: jest.fn() } }, mlServices: { - mlApiServices: { + mlApi: { calendars: () => { return Promise.resolve([]); }, diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/utils.js b/x-pack/plugins/ml/public/application/settings/calendars/edit/utils.js index 34fa2f5292f62..b4c655b755b99 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/utils.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/utils.js @@ -8,9 +8,9 @@ import { isJobIdValid } from '../../../../../common/util/job_utils'; import { i18n } from '@kbn/i18n'; -function getJobIds(mlApiServices) { +function getJobIds(mlApi) { return new Promise((resolve, reject) => { - mlApiServices.jobs + mlApi.jobs .jobsSummary() .then((resp) => { resolve(resp.map((job) => job.id)); @@ -29,9 +29,9 @@ function getJobIds(mlApiServices) { }); } -function getGroupIds(mlApiServices) { +function getGroupIds(mlApi) { return new Promise((resolve, reject) => { - mlApiServices.jobs + mlApi.jobs .groups() .then((resp) => { resolve(resp.map((group) => group.id)); @@ -50,9 +50,9 @@ function getGroupIds(mlApiServices) { }); } -function getCalendars(mlApiServices) { +function getCalendars(mlApi) { return new Promise((resolve, reject) => { - mlApiServices + mlApi .calendars() .then((resp) => { resolve(resp); @@ -71,13 +71,13 @@ function getCalendars(mlApiServices) { }); } -export function getCalendarSettingsData(mlApiServices) { +export function getCalendarSettingsData(mlApi) { return new Promise(async (resolve, reject) => { try { const [jobIds, groupIds, calendars] = await Promise.all([ - getJobIds(mlApiServices), - getGroupIds(mlApiServices), - getCalendars(mlApiServices), + getJobIds(mlApi), + getGroupIds(mlApi), + getCalendars(mlApi), ]); resolve({ diff --git a/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js b/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js index 413aae794fc15..f49ed3bdac194 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js @@ -38,11 +38,11 @@ export class CalendarsListUI extends Component { } loadCalendars = async () => { - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; this.setState({ loading: true }); try { - const calendars = await ml.calendars(); + const calendars = await mlApi.calendars(); this.setState({ calendars, @@ -81,12 +81,12 @@ export class CalendarsListUI extends Component { }; deleteCalendars = () => { - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; const toasts = this.props.kibana.services.notifications.toasts; const { selectedForDeletion } = this.state; this.closeDestroyModal(); - deleteCalendars(ml, toasts, selectedForDeletion, this.loadCalendars); + deleteCalendars(mlApi, toasts, selectedForDeletion, this.loadCalendars); }; addRequiredFieldsToList = (calendarsList = []) => { diff --git a/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.test.js b/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.test.js index 970c1afbe4fbc..c00b86cf8b231 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.test.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.test.js @@ -12,7 +12,7 @@ import { cloneDeep } from 'lodash'; import { CalendarsList } from './calendars_list'; // Mocking the child components to just assert that they get the data -// received via the async call using mlApiServices in the main component. +// received via the async call using mlApi in the main component. jest.mock('../../../components/help_menu', () => ({ HelpMenu: ({ docLink }) =>
, })); @@ -79,7 +79,7 @@ const mockCalendarsFn = jest.fn(() => Promise.resolve(cloneDeep(mockCalendars))) const mockKibanaProp = { services: { docLinks: { links: { ml: { calendars: 'https://calendars' } } }, - mlServices: { mlApiServices: { calendars: mockCalendarsFn } }, + mlServices: { mlApi: { calendars: mockCalendarsFn } }, data: { query: { timefilter: { diff --git a/x-pack/plugins/ml/public/application/settings/calendars/list/delete_calendars.js b/x-pack/plugins/ml/public/application/settings/calendars/list/delete_calendars.js index 13de491f10825..a88ba97c55b8c 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/list/delete_calendars.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/list/delete_calendars.js @@ -8,12 +8,7 @@ import { i18n } from '@kbn/i18n'; import { extractErrorMessage } from '@kbn/ml-error-utils'; -export async function deleteCalendars( - mlApiServices, - toastNotifications, - calendarsToDelete, - callback -) { +export async function deleteCalendars(mlApi, toastNotifications, calendarsToDelete, callback) { if (calendarsToDelete === undefined || calendarsToDelete.length === 0) { return; } @@ -37,7 +32,7 @@ export async function deleteCalendars( for (const calendar of calendarsToDelete) { const calendarId = calendar.calendar_id; try { - await mlApiServices.deleteCalendar({ calendarId }); + await mlApi.deleteCalendar({ calendarId }); } catch (error) { console.log('Error deleting calendar:', error); toastNotifications.addDanger({ diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_list_modal.js b/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_list_modal.js index ba68b1ef94453..d8cff2e08ab89 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_list_modal.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_list_modal.js @@ -51,7 +51,7 @@ export class DeleteFilterListModal extends Component { const { selectedFilterLists, refreshFilterLists } = this.props; await deleteFilterLists( this.context.services.notifications.toasts, - this.context.services.mlServices.mlApiServices, + this.context.services.mlServices.mlApi, selectedFilterLists ); diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_lists.js b/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_lists.js index 6334442a8e14f..67701701736ef 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_lists.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/components/delete_filter_list_modal/delete_filter_lists.js @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -export async function deleteFilterLists(toastNotifications, mlApiServices, filterListsToDelete) { +export async function deleteFilterLists(toastNotifications, mlApi, filterListsToDelete) { if (filterListsToDelete === undefined || filterListsToDelete.length === 0) { return; } @@ -28,7 +28,7 @@ export async function deleteFilterLists(toastNotifications, mlApiServices, filte for (const filterList of filterListsToDelete) { const filterId = filterList.filter_id; try { - await mlApiServices.filters.deleteFilter(filterId); + await mlApi.filters.deleteFilter(filterId); } catch (resp) { console.log('Error deleting filter list:', resp); toastNotifications.addDanger( diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js index 2f53963a5b3f2..c203da50ce0bd 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js @@ -114,8 +114,8 @@ export class EditFilterListUI extends Component { }; loadFilterList = (filterId) => { - const ml = this.props.kibana.services.mlServices.mlApiServices; - ml.filters + const mlApi = this.props.kibana.services.mlServices.mlApi; + mlApi.filters .filters({ filterId }) .then((filter) => { this.setLoadedFilterState(filter); @@ -286,7 +286,7 @@ export class EditFilterListUI extends Component { const filterId = this.props.filterId !== undefined ? this.props.filterId : newFilterId; saveFilterList( this.props.kibana.services.notifications.toasts, - this.props.kibana.services.mlServices.mlApiServices, + this.props.kibana.services.mlServices.mlApi, filterId, description, items, diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js index a277457151fa7..16dd5f67dbd67 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js @@ -35,7 +35,7 @@ const mockKibanaContext = { docLinks: { links: { ml: { customRules: 'test' } } }, notifications: { toasts: { addDanger: jest.fn(), addError: jest.fn() } }, mlServices: { - mlApiServices: { + mlApi: { filters: { filters: mockFilters, }, diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/utils.js b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/utils.js index e1f42e2e636ad..721f472827b98 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/utils.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/utils.js @@ -17,7 +17,7 @@ export function isValidFilterListId(id) { // original filter list to which edits are being applied, is defined with a filter_id property. export function saveFilterList( toastNotifications, - mlApiServices, + mlApi, filterId, description, items, @@ -26,7 +26,7 @@ export function saveFilterList( return new Promise((resolve, reject) => { if (loadedFilterList === undefined || loadedFilterList.filter_id === undefined) { // Create a new filter. - addFilterList(toastNotifications, mlApiServices, filterId, description, items) + addFilterList(toastNotifications, mlApi, filterId, description, items) .then((newFilter) => { resolve(newFilter); }) @@ -35,7 +35,7 @@ export function saveFilterList( }); } else { // Edit to existing filter. - updateFilterList(mlApiServices, loadedFilterList, description, items) + updateFilterList(mlApi, loadedFilterList, description, items) .then((updatedFilter) => { resolve(updatedFilter); }) @@ -46,7 +46,7 @@ export function saveFilterList( }); } -export function addFilterList(toastNotifications, mlApiServices, filterId, description, items) { +export function addFilterList(toastNotifications, mlApi, filterId, description, items) { const filterWithIdExistsErrorMessage = i18n.translate( 'xpack.ml.settings.filterLists.filterWithIdExistsErrorMessage', { @@ -59,13 +59,13 @@ export function addFilterList(toastNotifications, mlApiServices, filterId, descr return new Promise((resolve, reject) => { // First check the filterId isn't already in use by loading the current list of filters. - mlApiServices.filters + mlApi.filters .filtersStats() .then((filterLists) => { const savedFilterIds = filterLists.map((filterList) => filterList.filter_id); if (savedFilterIds.indexOf(filterId) === -1) { // Save the new filter. - mlApiServices.filters + mlApi.filters .addFilter(filterId, description, items) .then((newFilter) => { resolve(newFilter); @@ -84,14 +84,14 @@ export function addFilterList(toastNotifications, mlApiServices, filterId, descr }); } -export function updateFilterList(mlApiServices, loadedFilterList, description, items) { +export function updateFilterList(mlApi, loadedFilterList, description, items) { return new Promise((resolve, reject) => { // Get items added and removed from loaded filter. const loadedItems = loadedFilterList.items; const addItems = items.filter((item) => loadedItems.includes(item) === false); const removeItems = loadedItems.filter((item) => items.includes(item) === false); - mlApiServices.filters + mlApi.filters .updateFilter(loadedFilterList.filter_id, description, addItems, removeItems) .then((updatedFilter) => { resolve(updatedFilter); diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js b/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js index c955cce8f79d4..fdf3597a2fcfa 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js @@ -62,9 +62,9 @@ export class FilterListsUI extends Component { }; refreshFilterLists = () => { - const ml = this.props.kibana.services.mlServices.mlApiServices; + const mlApi = this.props.kibana.services.mlServices.mlApi; // Load the list of filters. - ml.filters + mlApi.filters .filtersStats() .then((filterLists) => { this.setFilterLists(filterLists); diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.test.js b/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.test.js index e4a27809019b5..a4c49a79b89dd 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.test.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.test.js @@ -12,7 +12,7 @@ import '@testing-library/jest-dom/extend-expect'; import { FilterLists } from './filter_lists'; // Mocking the child components to just assert that they get the data -// received via the async call using mlApiServices in the main component. +// received via the async call using mlApi in the main component. jest.mock('../../../components/help_menu', () => ({ HelpMenu: ({ docLink }) =>
, })); @@ -46,7 +46,7 @@ const mockKibanaProp = { services: { docLinks: { links: { ml: { customRules: 'https://customRules' } } }, mlServices: { - mlApiServices: { + mlApi: { filters: { filtersStats: () => { return Promise.resolve([mockTestFilter]); diff --git a/x-pack/plugins/ml/public/application/settings/settings.test.tsx b/x-pack/plugins/ml/public/application/settings/settings.test.tsx index 38ef8c784c114..2344455beb348 100644 --- a/x-pack/plugins/ml/public/application/settings/settings.test.tsx +++ b/x-pack/plugins/ml/public/application/settings/settings.test.tsx @@ -19,7 +19,7 @@ jest.mock('../contexts/kibana', () => ({ useNotifications: () => ({ toasts: { addDanger: jest.fn(), addError: jest.fn() }, }), - useMlApiContext: jest.fn(), + useMlApi: jest.fn(), useMlKibana: () => ({ services: { docLinks: { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js index 8402f2cc1e410..fe6b132635301 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js @@ -82,7 +82,7 @@ export class ForecastingModal extends Component { static contextType = context; componentDidMount() { - this.mlForecastService = forecastServiceFactory(this.context.services.mlServices.mlApiServices); + this.mlForecastService = forecastServiceFactory(this.context.services.mlServices.mlApi); } addMessage = (message, status, clearFirst = false) => { @@ -170,7 +170,7 @@ export class ForecastingModal extends Component { jobOpeningState: PROGRESS_STATES.WAITING, }); - this.context.services.mlServices.mlApiServices + this.context.services.mlServices.mlApi .openJob({ jobId: this.props.job.job_id }) .then(() => { // If open was successful run the forecast, then close the job again. @@ -227,7 +227,7 @@ export class ForecastingModal extends Component { if (closeJob === true) { this.setState({ jobClosingState: PROGRESS_STATES.WAITING }); - this.context.services.mlServices.mlApiServices + this.context.services.mlServices.mlApi .closeJob({ jobId: this.props.job.job_id }) .then(() => { this.setState({ jobClosingState: PROGRESS_STATES.DONE }); @@ -308,7 +308,7 @@ export class ForecastingModal extends Component { if (closeJobAfterRunning === true) { this.setState({ jobClosingState: PROGRESS_STATES.WAITING }); - this.context.services.mlServices.mlApiServices + this.context.services.mlServices.mlApi .closeJob({ jobId: this.props.job.job_id }) .then(() => { this.setState({ @@ -434,7 +434,7 @@ export class ForecastingModal extends Component { // of partitioning fields. const entityFieldNames = entities.map((entity) => entity.fieldName); if (entityFieldNames.length > 0) { - this.context.services.mlServices.mlApiServices + this.context.services.mlServices.mlApi .getCardinalityOfFields({ index: job.datafeed_config.indices, fieldNames: entityFieldNames, diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/modal.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/modal.js index 9e9a525031b8a..465373a928cf5 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/modal.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/modal.js @@ -34,19 +34,19 @@ export function Modal(props) { const [mlNodesAvailable, setMlNodesAvailable] = useState(false); const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); useEffect( function prepMlNodeCheck() { - getMlNodeCount(mlApiServices) + getMlNodeCount(mlApi) .then(({ count, lazyNodeCount }) => { setMlNodesAvailable(count !== 0 || lazyNodeCount !== 0); }) .catch(console.error); }, - [mlApiServices] + [mlApi] ); return ( diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx index 1d9d61e3ddc32..4c6d2356f3e6c 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx @@ -101,7 +101,7 @@ export const SeriesControls: FC> = ({ const { services: { mlServices: { - mlApiServices: { results: mlResultsService }, + mlApi: { results: mlResultsService }, }, }, } = useMlKibana(); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 7882fdfc21513..20d94aaabc3bb 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -167,7 +167,7 @@ class TimeseriesChartIntl extends Component { this.mlTimeSeriesExplorer = timeSeriesExplorerServiceFactory( constructorContext.services.uiSettings, - constructorContext.services.mlServices.mlApiServices, + constructorContext.services.mlServices.mlApi, constructorContext.services.mlServices.mlResultsService ); this.getTimeBuckets = timeBucketsServiceFactory( diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.test.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.test.js index 1e9da4aa72787..d9ec6dea88497 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.test.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.test.js @@ -53,7 +53,7 @@ function getTimeseriesChartPropsMock() { const kibanaReactContextMock = createKibanaReactContext({ mlServices: { - mlApiServices: {}, + mlApi: {}, mlResultsService: {}, }, notifications: { toasts: { addDanger: jest.fn(), addSuccess: jest.fn() } }, diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx index 14c57cbb6c20e..f69632033b702 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx @@ -61,7 +61,7 @@ export const TimeSeriesChartWithTooltips: FC = const { toasts: toastNotifications } = useNotifications(); const { services: { - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlKibana(); @@ -103,7 +103,7 @@ export const TimeSeriesChartWithTooltips: FC = */ const loadAnnotations = async (jobId: string) => { try { - const resp = await mlApiServices.annotations.getAnnotations({ + const resp = await mlApi.annotations.getAnnotations({ jobIds: [jobId], earliestMs: searchBounds.min.valueOf(), latestMs: searchBounds.max.valueOf(), diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js index 4bfcb8e7fd98c..c4951b9041fc1 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js @@ -143,7 +143,7 @@ export class TimeSeriesExplorer extends React.Component { dataViewsService; toastNotificationService; - mlApiServices; + mlApi; mlForecastService; mlIndexUtils; mlJobService; @@ -157,19 +157,19 @@ export class TimeSeriesExplorer extends React.Component { this.toastNotificationService = toastNotificationServiceProvider( constructorContext.services.notifications.toasts ); - this.mlApiServices = constructorContext.services.mlServices.mlApiServices; - this.mlForecastService = forecastServiceFactory(this.mlApiServices); + this.mlApi = constructorContext.services.mlServices.mlApi; + this.mlForecastService = forecastServiceFactory(this.mlApi); this.mlIndexUtils = indexServiceFactory(this.dataViewsService); - this.mlJobService = mlJobServiceFactory(this.toastNotificationService, this.mlApiServices); - this.mlResultsService = mlResultsServiceProvider(this.mlApiServices); + this.mlJobService = mlJobServiceFactory(this.toastNotificationService, this.mlApi); + this.mlResultsService = mlResultsServiceProvider(this.mlApi); this.mlTimeSeriesExplorer = timeSeriesExplorerServiceFactory( constructorContext.services.uiSettings, - this.mlApiServices, + this.mlApi, this.mlResultsService ); this.mlTimeSeriesSearchService = timeSeriesSearchServiceFactory( this.mlResultsService, - this.mlApiServices + this.mlApi ); } @@ -331,8 +331,8 @@ export class TimeSeriesExplorer extends React.Component { const selectedJob = mlJobService.getJob(selectedJobId); const entityControls = this.getControlsForDetector(); - const ml = this.mlApiServices; - return ml.results + const mlApi = this.mlApi; + return mlApi.results .getAnomaliesTableData( [selectedJob.job_id], this.getCriteriaFields(selectedDetectorIndex, entityControls), diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js index c574e5d1ce741..3839c9831c86b 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js @@ -272,7 +272,7 @@ export class TimeSeriesExplorerEmbeddableChart extends React.Component { } = this.props; const entityControls = this.getControlsForDetector(); - return this.context.services.mlServices.mlApiServices.results + return this.context.services.mlServices.mlApi.results .getAnomaliesTableData( [selectedJob.job_id], this.getCriteriaFields(selectedDetectorIndex, entityControls), @@ -641,10 +641,10 @@ export class TimeSeriesExplorerEmbeddableChart extends React.Component { this.mlTimeSeriesExplorer = timeSeriesExplorerServiceFactory( this.context.services.uiSettings, - this.context.services.mlServices.mlApiServices, + this.context.services.mlServices.mlApi, this.context.services.mlServices.mlResultsService ); - this.mlForecastService = forecastServiceFactory(this.context.services.mlServices.mlApiServices); + this.mlForecastService = forecastServiceFactory(this.context.services.mlServices.mlApi); // Listen for context chart updates. this.subscriptions.add( diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service.ts b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service.ts index 929ff04656a18..213d5e0bff575 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service.ts +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service.ts @@ -12,7 +12,7 @@ import { map } from 'rxjs'; import type { MlEntityField, ES_AGGREGATION } from '@kbn/ml-anomaly-utils'; import type { Job } from '../../../../common/types/anomaly_detection_jobs'; import type { ModelPlotOutput } from '../../services/results_service/result_service_rx'; -import type { MlApiServices } from '../../services/ml_api_service'; +import type { MlApi } from '../../services/ml_api_service'; import { type MlResultsService, mlResultsServiceProvider } from '../../services/results_service'; import { buildConfigFromDetector } from '../../util/chart_config_builder'; import { @@ -29,10 +29,7 @@ interface TimeSeriesExplorerChartDetails { }; } -export function timeSeriesSearchServiceFactory( - mlResultsService: MlResultsService, - mlApiServices: MlApiServices -) { +export function timeSeriesSearchServiceFactory(mlResultsService: MlResultsService, mlApi: MlApi) { function getMetricData( job: Job, detectorIndex: number, @@ -172,7 +169,7 @@ export function timeSeriesSearchServiceFactory( resolve(obj); } else { const entityFieldNames: string[] = blankEntityFields.map((f) => f.fieldName); - mlApiServices + mlApi .getCardinalityOfFields({ index: chartConfig.datafeedConfig.indices.join(','), fieldNames: entityFieldNames, @@ -211,15 +208,15 @@ export type MlTimeSeriesSearchService = ReturnType timeSeriesSearchServiceFactory(mlResultsService, mlApiServices), - [mlApiServices, mlResultsService] + () => timeSeriesSearchServiceFactory(mlResultsService, mlApi), + [mlApi, mlResultsService] ); return mlForecastService; } diff --git a/x-pack/plugins/ml/public/application/util/get_services.ts b/x-pack/plugins/ml/public/application/util/get_services.ts index 330bdc17c8fe9..031504509dff7 100644 --- a/x-pack/plugins/ml/public/application/util/get_services.ts +++ b/x-pack/plugins/ml/public/application/util/get_services.ts @@ -14,7 +14,7 @@ import { MlLicense } from '../../../common/license'; import { MlCapabilitiesService } from '../capabilities/check_capabilities'; import { fieldFormatServiceFactory } from '../services/field_format_service_factory'; import { HttpService } from '../services/http_service'; -import { mlApiServicesProvider } from '../services/ml_api_service'; +import { mlApiProvider } from '../services/ml_api_service'; import { mlUsageCollectionProvider } from '../services/usage_collection'; import { mlJobServiceFactory } from '../services/job_service'; import { toastNotificationServiceProvider } from '../services/toast_notification_service'; @@ -29,9 +29,9 @@ export function getMlGlobalServices( usageCollection?: UsageCollectionSetup ) { const httpService = new HttpService(coreStart.http); - const mlApiServices = mlApiServicesProvider(httpService); + const mlApi = mlApiProvider(httpService); const toastNotificationService = toastNotificationServiceProvider(coreStart.notifications.toasts); - const mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); + const mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); // Note on the following services: // - `mlIndexUtils` is just instantiated here to be passed on to `mlFieldFormatService`, // but it's not being made available as part of global services. Since it's just @@ -42,14 +42,14 @@ export function getMlGlobalServices( // its own context or possibly without having a singleton like state at all, since the // way this manages its own state right now doesn't consider React component lifecycles. const mlIndexUtils = indexServiceFactory(dataViews); - const mlFieldFormatService = fieldFormatServiceFactory(mlApiServices, mlIndexUtils, mlJobService); + const mlFieldFormatService = fieldFormatServiceFactory(mlApi, mlIndexUtils, mlJobService); return { httpService, - mlApiServices, + mlApi, mlFieldFormatService, mlUsageCollection: mlUsageCollectionProvider(usageCollection), - mlCapabilities: new MlCapabilitiesService(mlApiServices), + mlCapabilities: new MlCapabilitiesService(mlApi), mlLicense: new MlLicense(), }; } diff --git a/x-pack/plugins/ml/public/application/util/time_series_explorer_service.ts b/x-pack/plugins/ml/public/application/util/time_series_explorer_service.ts index 05763f62d082c..c0c7995f1b310 100644 --- a/x-pack/plugins/ml/public/application/util/time_series_explorer_service.ts +++ b/x-pack/plugins/ml/public/application/util/time_series_explorer_service.ts @@ -29,11 +29,11 @@ import { MAX_SCHEDULED_EVENTS, TIME_FIELD_NAME, } from '../timeseriesexplorer/timeseriesexplorer_constants'; -import type { MlApiServices } from '../services/ml_api_service'; +import type { MlApi } from '../services/ml_api_service'; import { useMlResultsService, type MlResultsService } from '../services/results_service'; import { forecastServiceFactory } from '../services/forecast_service'; import { timeSeriesSearchServiceFactory } from '../timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service'; -import { useMlApiContext, useMlKibana } from '../contexts/kibana'; +import { useMlApi, useMlKibana } from '../contexts/kibana'; export interface Interval { asMilliseconds: () => number; @@ -59,12 +59,12 @@ export interface FocusData { export function timeSeriesExplorerServiceFactory( uiSettings: IUiSettingsClient, - mlApiServices: MlApiServices, + mlApi: MlApi, mlResultsService: MlResultsService ) { const timeBuckets = timeBucketsServiceFactory(uiSettings); - const mlForecastService = forecastServiceFactory(mlApiServices); - const mlTimeSeriesSearchService = timeSeriesSearchServiceFactory(mlResultsService, mlApiServices); + const mlForecastService = forecastServiceFactory(mlApi); + const mlTimeSeriesSearchService = timeSeriesSearchServiceFactory(mlResultsService, mlApi); function getAutoZoomDuration(bucketSpan: Job['analysis_config']['bucket_span']) { // function getAutoZoomDuration(selectedJob: Job) { @@ -511,7 +511,7 @@ export function timeSeriesExplorerServiceFactory( esFunctionToPlotIfMetric ), // Query 2 - load all the records across selected time range for the chart anomaly markers. - mlApiServices.results.getAnomalyRecords$( + mlApi.results.getAnomalyRecords$( [selectedJob.job_id], criteriaFields, 0, @@ -530,7 +530,7 @@ export function timeSeriesExplorerServiceFactory( MAX_SCHEDULED_EVENTS ), // Query 4 - load any annotations for the selected job. - mlApiServices.annotations + mlApi.annotations .getAnnotations$({ jobIds: [selectedJob.job_id], earliestMs: searchBounds.min.valueOf(), @@ -647,10 +647,10 @@ export function timeSeriesExplorerServiceFactory( export function useTimeSeriesExplorerService(): TimeSeriesExplorerService { const { services } = useMlKibana(); - const mlApiServices = useMlApiContext(); + const mlApi = useMlApi(); const mlResultsService = useMlResultsService(); return useMemo( - () => timeSeriesExplorerServiceFactory(services.uiSettings, mlApiServices, mlResultsService), + () => timeSeriesExplorerServiceFactory(services.uiSettings, mlApi, mlResultsService), // initialize only once // eslint-disable-next-line react-hooks/exhaustive-deps [] diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.test.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.test.tsx index 4c68437933175..c5dc902ed5264 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.test.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.test.tsx @@ -7,7 +7,7 @@ import { render, screen, act } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import type { MlApiServices } from '../../application/services/ml_api_service'; +import type { MlApi } from '../../application/services/ml_api_service'; import { AnomalyChartsInitializer } from './anomaly_charts_initializer'; import { I18nProvider } from '@kbn/i18n-react'; @@ -44,7 +44,7 @@ describe('AnomalyChartsInitializer', () => { initialInput={input} onCreate={(params) => onCreate(params)} onCancel={onCancel} - adJobsApiService={adJobsApiService as unknown as MlApiServices['jobs']} + adJobsApiService={adJobsApiService as unknown as MlApi['jobs']} /> , defaultOptions diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.tsx index 93bf3110b3776..862d0425523aa 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_initializer.tsx @@ -29,7 +29,7 @@ import { ML_PAGES } from '../../../common/constants/locator'; import { getDefaultExplorerChartsPanelTitle } from './utils'; import { useMlLink } from '../../application/contexts/kibana'; import { getJobSelectionErrors } from '../utils'; -import type { MlApiServices } from '../../application/services/ml_api_service'; +import type { MlApi } from '../../application/services/ml_api_service'; export const MAX_ANOMALY_CHARTS_ALLOWED = 50; export interface AnomalyChartsInitializerProps { @@ -42,7 +42,7 @@ export interface AnomalyChartsInitializerProps { maxSeriesToPlot?: number; }) => void; onCancel: () => void; - adJobsApiService: MlApiServices['jobs']; + adJobsApiService: MlApi['jobs']; } export const AnomalyChartsInitializer: FC = ({ diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts b/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts index b7eec6ab24f5f..f5270ab01ef9f 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/get_anomaly_charts_services_dependencies.ts @@ -19,7 +19,7 @@ export const getAnomalyChartsServiceDependencies = async ( { AnomalyDetectorService }, { fieldFormatServiceFactory }, { indexServiceFactory }, - { mlApiServicesProvider }, + { mlApiProvider }, { mlJobServiceFactory }, { mlResultsServiceProvider }, { toastNotificationServiceProvider }, @@ -34,13 +34,13 @@ export const getAnomalyChartsServiceDependencies = async ( ]); const httpService = new HttpService(coreStart.http); const anomalyDetectorService = new AnomalyDetectorService(httpService); - const mlApiServices = mlApiServicesProvider(httpService); + const mlApi = mlApiProvider(httpService); const toastNotificationService = toastNotificationServiceProvider(coreStart.notifications.toasts); - const mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); - const mlResultsService = mlResultsServiceProvider(mlApiServices); + const mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); + const mlResultsService = mlResultsServiceProvider(mlApi); const anomalyExplorerService = new AnomalyExplorerChartsService( pluginsStart.data.query.timefilter.timefilter, - mlApiServices, + mlApi, mlResultsService ); @@ -54,7 +54,7 @@ export const getAnomalyChartsServiceDependencies = async ( // its own context or possibly without having a singleton like state at all, since the // way this manages its own state right now doesn't consider React component lifecycles. const mlIndexUtils = indexServiceFactory(pluginsStart.data.dataViews); - const mlFieldFormatService = fieldFormatServiceFactory(mlApiServices, mlIndexUtils, mlJobService); + const mlFieldFormatService = fieldFormatServiceFactory(mlApi, mlIndexUtils, mlJobService); const anomalyChartsEmbeddableServices: AnomalyChartsEmbeddableServices = [ coreStart, diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx index 6de07c5db851e..34390075f927b 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx @@ -59,7 +59,7 @@ export const getServices = async ( [coreStart, pluginsStart], { AnomalyDetectorService }, { AnomalyTimelineService }, - { mlApiServicesProvider }, + { mlApiProvider }, { mlResultsServiceProvider }, ] = await Promise.all([ getStartServices(), @@ -74,7 +74,7 @@ export const getServices = async ( const anomalyTimelineService = new AnomalyTimelineService( pluginsStart.data.query.timefilter.timefilter, coreStart.uiSettings, - mlResultsServiceProvider(mlApiServicesProvider(httpService)) + mlResultsServiceProvider(mlApiProvider(httpService)) ); return [ diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx index ceb22e0172c8d..21df1ad4f18bb 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx @@ -26,7 +26,7 @@ import { i18n } from '@kbn/i18n'; import useMountedState from 'react-use/lib/useMountedState'; import { useMlLink } from '../../application/contexts/kibana'; import { ML_PAGES } from '../../../common/constants/locator'; -import type { MlApiServices } from '../../application/services/ml_api_service'; +import type { MlApi } from '../../application/services/ml_api_service'; import { extractInfluencers } from '../../../common/util/job_utils'; import { JobSelectorControl } from '../../alerting/job_selector'; import type { SwimlaneType } from '../../application/explorer/explorer_constants'; @@ -43,7 +43,7 @@ export interface AnomalySwimlaneInitializerProps { >; onCreate: (swimlaneProps: ExplicitInput) => void; onCancel: () => void; - adJobsApiService: MlApiServices['jobs']; + adJobsApiService: MlApi['jobs']; } export const AnomalySwimlaneInitializer: FC = ({ diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx index d52aed02d88a3..e4a3e0d05cbde 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx @@ -52,11 +52,11 @@ export const CreateJob: FC = ({ dataView, field, query, timeRange }) => { uiSettings, dashboardService, notifications: { toasts }, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlFromLensKibanaContext(); const toastNotificationService = toastNotificationServiceProvider(toasts); - const mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); + const mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); const [categorizationType, setCategorizationType] = useState( CATEGORIZATION_TYPE.COUNT @@ -77,7 +77,7 @@ export const CreateJob: FC = ({ dataView, field, query, timeRange }) => { const toggleStopOnWarn = useCallback(() => setStopOnWarn(!stopOnWarn), [stopOnWarn]); useMemo(() => { - const newJobCapsService = new NewJobCapsService(mlApiServices); + const newJobCapsService = new NewJobCapsService(mlApi); newJobCapsService.initializeFromDataVIew(dataView).then(() => { const options: EuiComboBoxOptionOption[] = [ ...createFieldOptions(newJobCapsService.categoryFields, []), @@ -86,7 +86,7 @@ export const CreateJob: FC = ({ dataView, field, query, timeRange }) => { })); setCategoryFieldsOptions(options); }); - }, [dataView, mlApiServices]); + }, [dataView, mlApi]); const quickJobCreator = useMemo( () => @@ -96,10 +96,10 @@ export const CreateJob: FC = ({ dataView, field, query, timeRange }) => { data.query.timefilter.timefilter, dashboardService, data, - mlApiServices, + mlApi, mlJobService ), - [dashboardService, data, mlApiServices, mlJobService, uiSettings] + [dashboardService, data, mlApi, mlJobService, uiSettings] ); function createADJobInWizard() { diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx index 9c3ba23b57382..3bfa1a0caf799 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx @@ -80,7 +80,7 @@ export const JobDetails: FC> = ({ services: { share, application, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlFromLensKibanaContext(); @@ -185,7 +185,7 @@ export const JobDetails: FC> = ({ }) ); } else { - mlApiServices.jobs + mlApi.jobs .jobsExist([jobId]) .then((resp) => { if (resp[jobId].exists) { diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx index 47a410c2e6360..967a9dbb84304 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx @@ -37,11 +37,11 @@ export const CompatibleLayer: FC = ({ layer, layerIndex, embeddable }) => lens, dashboardService, notifications: { toasts }, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlFromLensKibanaContext(); const toastNotificationService = toastNotificationServiceProvider(toasts); - const mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); + const mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); const quickJobCreator = useMemo( () => @@ -51,7 +51,7 @@ export const CompatibleLayer: FC = ({ layer, layerIndex, embeddable }) => uiSettings, data.query.timefilter.timefilter, dashboardService, - mlApiServices, + mlApi, mlJobService ), // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx index 76beaa6788f13..c91785e91573a 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx @@ -54,11 +54,11 @@ export const CompatibleLayer: FC = ({ embeddable, layer, layerIndex }) => uiSettings, dashboardService, notifications: { toasts }, - mlServices: { mlApiServices }, + mlServices: { mlApi }, }, } = useMlFromLensKibanaContext(); const toastNotificationService = toastNotificationServiceProvider(toasts); - const mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); + const mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); const quickJobCreator = useMemo( () => @@ -67,7 +67,7 @@ export const CompatibleLayer: FC = ({ embeddable, layer, layerIndex }) => uiSettings, data.query.timefilter.timefilter, dashboardService, - mlApiServices, + mlApi, mlJobService ), // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts index f4460331e6256..180b29dbd0d99 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts @@ -25,7 +25,7 @@ export const getMlServices = async ( { fieldFormatServiceFactory }, { indexServiceFactory }, { timeSeriesExplorerServiceFactory }, - { mlApiServicesProvider }, + { mlApiProvider }, { mlJobServiceFactory }, { mlResultsServiceProvider }, { MlCapabilitiesService }, @@ -48,20 +48,20 @@ export const getMlServices = async ( const httpService = new HttpService(coreStart.http); const anomalyDetectorService = new AnomalyDetectorService(httpService); - const mlApiServices = mlApiServicesProvider(httpService); + const mlApi = mlApiProvider(httpService); const toastNotificationService = toastNotificationServiceProvider(coreStart.notifications.toasts); - const mlJobService = mlJobServiceFactory(toastNotificationService, mlApiServices); - const mlResultsService = mlResultsServiceProvider(mlApiServices); - const mlTimeSeriesSearchService = timeSeriesSearchServiceFactory(mlResultsService, mlApiServices); + const mlJobService = mlJobServiceFactory(toastNotificationService, mlApi); + const mlResultsService = mlResultsServiceProvider(mlApi); + const mlTimeSeriesSearchService = timeSeriesSearchServiceFactory(mlResultsService, mlApi); const mlTimeSeriesExplorerService = timeSeriesExplorerServiceFactory( coreStart.uiSettings, - mlApiServices, + mlApi, mlResultsService ); - const mlCapabilities = new MlCapabilitiesService(mlApiServices); + const mlCapabilities = new MlCapabilitiesService(mlApi); const anomalyExplorerService = new AnomalyExplorerChartsService( pluginsStart.data.query.timefilter.timefilter, - mlApiServices, + mlApi, mlResultsService ); // Note on the following services: @@ -74,11 +74,11 @@ export const getMlServices = async ( // its own context or possibly without having a singleton like state at all, since the // way this manages its own state right now doesn't consider React component lifecycles. const mlIndexUtils = indexServiceFactory(pluginsStart.data.dataViews); - const mlFieldFormatService = fieldFormatServiceFactory(mlApiServices, mlIndexUtils, mlJobService); + const mlFieldFormatService = fieldFormatServiceFactory(mlApi, mlIndexUtils, mlJobService); return { anomalyDetectorService, anomalyExplorerService, - mlApiServices, + mlApi, mlCapabilities, mlFieldFormatService, mlJobService, diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx index 2655e78222746..8f81be21a8ccb 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx @@ -74,13 +74,13 @@ export const getSingleMetricViewerEmbeddableFactory = ( const { resolveEmbeddableSingleMetricViewerUserInput } = await import( './single_metric_viewer_setup_flyout' ); - const [coreStart, { data, share }, { mlApiServices }] = services; + const [coreStart, { data, share }, { mlApi }] = services; const result = await resolveEmbeddableSingleMetricViewerUserInput( coreStart, parentApi, uuid, { data, share }, - mlApiServices, + mlApi, { ...serializeTitles(), ...serializeSingleMetricViewerState(), diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx index 9f21ca3f4af75..c14bfc1cb1744 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx @@ -26,7 +26,7 @@ import useMountedState from 'react-use/lib/useMountedState'; import { extractErrorMessage } from '@kbn/ml-error-utils'; import type { MlJob } from '@elastic/elasticsearch/lib/api/types'; import type { TimeRangeBounds } from '@kbn/ml-time-buckets'; -import type { MlApiServices } from '../../application/services/ml_api_service'; +import type { MlApi } from '../../application/services/ml_api_service'; import type { SingleMetricViewerEmbeddableInput } from '..'; import { ML_PAGES } from '../../../common/constants/locator'; import { SeriesControls } from '../../application/timeseriesexplorer/components/series_controls'; @@ -42,7 +42,7 @@ import { getDefaultSingleMetricViewerPanelTitle } from './get_default_panel_titl export interface SingleMetricViewerInitializerProps { bounds: TimeRangeBounds; initialInput?: Partial; - mlApiServices: MlApiServices; + mlApi: MlApi; onCreate: (props: SingleMetricViewerEmbeddableUserInput) => void; onCancel: () => void; } @@ -52,7 +52,7 @@ export const SingleMetricViewerInitializer: FC { const isMounted = useMountedState(); const newJobUrl = useMlLink({ page: ML_PAGES.ANOMALY_DETECTION_CREATE_JOB }); @@ -79,7 +79,7 @@ export const SingleMetricViewerInitializer: FC { const errorMsg = extractErrorMessage(error); setErrorMessage(errorMsg); @@ -100,7 +100,7 @@ export const SingleMetricViewerInitializer: FC { diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx index 292ec390eb974..9fbb6fbd2b162 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx @@ -14,14 +14,14 @@ import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { SingleMetricViewerEmbeddableUserInput, SingleMetricViewerEmbeddableInput } from '..'; import { SingleMetricViewerInitializer } from './single_metric_viewer_initializer'; -import type { MlApiServices } from '../../application/services/ml_api_service'; +import type { MlApi } from '../../application/services/ml_api_service'; export async function resolveEmbeddableSingleMetricViewerUserInput( coreStart: CoreStart, parentApi: unknown, focusedPanelId: string, services: { data: DataPublicPluginStart; share?: SharePluginStart }, - mlApiServices: MlApiServices, + mlApi: MlApi, input?: Partial ): Promise { const { http, overlays, ...startServices } = coreStart; @@ -35,7 +35,7 @@ export async function resolveEmbeddableSingleMetricViewerUserInput( toMountPoint( { diff --git a/x-pack/plugins/ml/public/embeddables/types.ts b/x-pack/plugins/ml/public/embeddables/types.ts index 3a3353c24b4dd..b7d7dea505f0b 100644 --- a/x-pack/plugins/ml/public/embeddables/types.ts +++ b/x-pack/plugins/ml/public/embeddables/types.ts @@ -33,7 +33,7 @@ import type { AnomalyExplorerChartsService } from '../application/services/anoma import type { AnomalyTimelineService } from '../application/services/anomaly_timeline_service'; import type { MlFieldFormatService } from '../application/services/field_format_service'; import type { MlJobService } from '../application/services/job_service'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; import type { MlResultsService } from '../application/services/results_service'; import type { MlTimeSeriesSearchService } from '../application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service'; import type { TimeSeriesExplorerService } from '../application/util/time_series_explorer_service'; @@ -235,13 +235,13 @@ export interface AnomalyChartsServices { anomalyExplorerService: AnomalyExplorerChartsService; mlFieldFormatService: MlFieldFormatService; mlResultsService: MlResultsService; - mlApiServices?: MlApiServices; + mlApi?: MlApi; } export interface SingleMetricViewerServices { anomalyExplorerService: AnomalyExplorerChartsService; anomalyDetectorService: AnomalyDetectorService; - mlApiServices: MlApiServices; + mlApi: MlApi; mlCapabilities: MlCapabilitiesService; mlFieldFormatService: MlFieldFormatService; mlJobService: MlJobService; diff --git a/x-pack/plugins/ml/public/maps/anomaly_job_selector.tsx b/x-pack/plugins/ml/public/maps/anomaly_job_selector.tsx index 0b842d6c38b1f..75cd10b322fc8 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_job_selector.tsx +++ b/x-pack/plugins/ml/public/maps/anomaly_job_selector.tsx @@ -11,12 +11,12 @@ import type { EuiComboBoxOptionOption } from '@elastic/eui'; import { EuiComboBox, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isEqual } from 'lodash'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; import { AnomalyJobSelectorEmptyState } from './anomaly_job_selector_empty_state'; interface Props { onJobChange: (jobId: string) => void; - mlJobsService: MlApiServices['jobs']; + mlJobsService: MlApi['jobs']; jobsManagementPath?: string; canCreateJobs: boolean; } diff --git a/x-pack/plugins/ml/public/maps/anomaly_layer_wizard_factory.tsx b/x-pack/plugins/ml/public/maps/anomaly_layer_wizard_factory.tsx index f9cb8ba97fbb5..fdc4f532b8a4f 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_layer_wizard_factory.tsx +++ b/x-pack/plugins/ml/public/maps/anomaly_layer_wizard_factory.tsx @@ -24,7 +24,7 @@ import { AnomalySource } from './anomaly_source'; import { HttpService } from '../application/services/http_service'; import type { MlPluginStart, MlStartDependencies } from '../plugin'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; export const ML_ANOMALY = 'ML_ANOMALIES'; @@ -41,7 +41,7 @@ export class AnomalyLayerWizardFactory { } private async getServices(): Promise<{ - mlJobsService: MlApiServices['jobs']; + mlJobsService: MlApi['jobs']; mlLocator?: LocatorPublic; }> { const [coreStart, pluginStart] = await this.getStartServices(); diff --git a/x-pack/plugins/ml/public/maps/anomaly_source.tsx b/x-pack/plugins/ml/public/maps/anomaly_source.tsx index 780ecd3cc7352..c426cdcd78919 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_source.tsx +++ b/x-pack/plugins/ml/public/maps/anomaly_source.tsx @@ -35,7 +35,7 @@ import { ML_PAGES } from '../../common/constants/locator'; import type { MlAnomalyLayersType } from './util'; import { getResultsForJobId, ML_ANOMALY_LAYERS } from './util'; import { UpdateAnomalySourceEditor } from './update_anomaly_source_editor'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; const RESULT_LIMIT = 1000; @@ -45,7 +45,7 @@ export interface AnomalySourceDescriptor extends AbstractSourceDescriptor { } export class AnomalySource implements IVectorSource { - static mlResultsService: MlApiServices['results']; + static mlResultsService: MlApi['results']; static mlLocator?: LocatorPublic; static createDescriptor(descriptor: Partial) { diff --git a/x-pack/plugins/ml/public/maps/anomaly_source_factory.ts b/x-pack/plugins/ml/public/maps/anomaly_source_factory.ts index 6edd7839fbfae..60390e030a61b 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_source_factory.ts +++ b/x-pack/plugins/ml/public/maps/anomaly_source_factory.ts @@ -12,7 +12,7 @@ import type { SerializableRecord } from '@kbn/utility-types'; import { HttpService } from '../application/services/http_service'; import type { MlPluginStart, MlStartDependencies } from '../plugin'; import { ML_APP_LOCATOR } from '../../common/constants/locator'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; export class AnomalySourceFactory { public readonly type = SOURCE_TYPES.ES_ML_ANOMALIES; @@ -22,15 +22,15 @@ export class AnomalySourceFactory { ) {} private async getServices(): Promise<{ - mlResultsService: MlApiServices['results']; + mlResultsService: MlApi['results']; mlLocator?: LocatorPublic; }> { const [coreStart, pluginStart] = await this.getStartServices(); - const { mlApiServicesProvider } = await import('../application/services/ml_api_service'); + const { mlApiProvider } = await import('../application/services/ml_api_service'); const mlLocator = pluginStart.share.url.locators.get(ML_APP_LOCATOR); const httpService = new HttpService(coreStart.http); - const mlResultsService = mlApiServicesProvider(httpService).results; + const mlResultsService = mlApiProvider(httpService).results; return { mlResultsService, mlLocator }; } diff --git a/x-pack/plugins/ml/public/maps/create_anomaly_source_editor.tsx b/x-pack/plugins/ml/public/maps/create_anomaly_source_editor.tsx index b57afdcfcb2db..48107a2ba3d3f 100644 --- a/x-pack/plugins/ml/public/maps/create_anomaly_source_editor.tsx +++ b/x-pack/plugins/ml/public/maps/create_anomaly_source_editor.tsx @@ -13,11 +13,11 @@ import { AnomalyJobSelector } from './anomaly_job_selector'; import { LayerSelector } from './layer_selector'; import type { MlAnomalyLayersType } from './util'; import { ML_ANOMALY_LAYERS } from './util'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; interface Props { onSourceConfigChange: (sourceConfig: Partial | null) => void; - mlJobsService: MlApiServices['jobs']; + mlJobsService: MlApi['jobs']; jobsManagementPath?: string; canCreateJobs: boolean; } diff --git a/x-pack/plugins/ml/public/maps/util.ts b/x-pack/plugins/ml/public/maps/util.ts index 7666552e40e93..f661c08b6c5f6 100644 --- a/x-pack/plugins/ml/public/maps/util.ts +++ b/x-pack/plugins/ml/public/maps/util.ts @@ -22,7 +22,7 @@ import { LAYER_TYPE, SOURCE_TYPES, SCALING_TYPES } from '@kbn/maps-plugin/common import { type MLAnomalyDoc, ML_SEVERITY_COLOR_RAMP } from '@kbn/ml-anomaly-utils'; import { formatHumanReadableDateTimeSeconds } from '@kbn/ml-date-utils'; import { SEARCH_QUERY_LANGUAGE } from '@kbn/ml-query-utils'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; import { tabColor } from '../../common/util/group_color_utils'; import { getIndexPattern } from '../application/explorer/reducers/explorer_reducer/get_index_pattern'; import { AnomalySource } from './anomaly_source'; @@ -162,7 +162,7 @@ export function getInitialSourceIndexFieldLayers(sourceIndexWithGeoFields: Sourc } export async function getResultsForJobId( - mlResultsService: MlApiServices['results'], + mlResultsService: MlApi['results'], jobId: string, locationType: MlAnomalyLayersType, searchFilters: VectorSourceRequestMeta diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index 456259fd6d28d..7246f60337dd9 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -70,7 +70,7 @@ import { initExperimentalFeatures, } from '../common/constants/app'; import type { ElasticModels } from './application/services/elastic_models_service'; -import type { MlApiServices } from './application/services/ml_api_service'; +import type { MlApi } from './application/services/ml_api_service'; import type { MlCapabilities } from '../common/types/capabilities'; import { AnomalySwimLane } from './shared_components'; import { getMlServices } from './embeddables/single_metric_viewer/get_services'; @@ -314,13 +314,13 @@ export class MlPlugin implements Plugin { ): { locator?: LocatorPublic; elasticModels?: ElasticModels; - mlApi?: MlApiServices; + mlApi?: MlApi; components: { AnomalySwimLane: typeof AnomalySwimLane }; } { return { locator: this.locator, elasticModels: this.sharedMlServices?.elasticModels, - mlApi: this.sharedMlServices?.mlApiServices, + mlApi: this.sharedMlServices?.mlApi, components: { AnomalySwimLane, }, diff --git a/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx index 2cf5edfd0608d..96e678407f626 100644 --- a/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx +++ b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx @@ -102,7 +102,7 @@ const SingleMetricViewerWrapper: FC = ({ >(); const isMounted = useMountedState(); - const { mlApiServices, mlTimeSeriesExplorerService, toastNotificationService } = mlServices; + const { mlApi, mlTimeSeriesExplorerService, toastNotificationService } = mlServices; const startServices = pick(coreStart, 'analytics', 'i18n', 'theme'); const datePickerDeps: DatePickerDependencies = { ...pick(coreStart, ['http', 'notifications', 'theme', 'uiSettings', 'i18n']), @@ -116,11 +116,11 @@ const SingleMetricViewerWrapper: FC = ({ useEffect( function setUpSelectedJob() { async function fetchSelectedJob() { - if (mlApiServices && selectedJobId !== undefined) { + if (mlApi && selectedJobId !== undefined) { try { const [{ jobs }, { jobs: jobStats }] = await Promise.all([ - mlApiServices.getJobs({ jobId: selectedJobId }), - mlApiServices.getJobStats({ jobId: selectedJobId }), + mlApi.getJobs({ jobId: selectedJobId }), + mlApi.getJobStats({ jobId: selectedJobId }), ]); setSelectedJobWrapper({ job: jobs[0], stats: jobStats[0] }); } catch (e) { @@ -135,7 +135,7 @@ const SingleMetricViewerWrapper: FC = ({ } fetchSelectedJob(); }, - [selectedJobId, mlApiServices, isMounted, onError] + [selectedJobId, mlApi, isMounted, onError] ); // eslint-disable-next-line react-hooks/exhaustive-deps const resizeHandler = useCallback( diff --git a/x-pack/plugins/ml/public/ui_actions/create_single_metric_viewer.tsx b/x-pack/plugins/ml/public/ui_actions/create_single_metric_viewer.tsx index ceae89e121fb7..721f830e01627 100644 --- a/x-pack/plugins/ml/public/ui_actions/create_single_metric_viewer.tsx +++ b/x-pack/plugins/ml/public/ui_actions/create_single_metric_viewer.tsx @@ -11,7 +11,7 @@ import type { EmbeddableApiContext } from '@kbn/presentation-publishing'; import type { UiActionsActionDefinition } from '@kbn/ui-actions-plugin/public'; import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; import { HttpService } from '../application/services/http_service'; -import type { MlApiServices } from '../application/services/ml_api_service'; +import type { MlApi } from '../application/services/ml_api_service'; import { ML_APP_NAME, PLUGIN_ICON, PLUGIN_ID } from '../../common/constants/app'; import { ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE } from '../embeddables'; import type { SingleMetricViewerEmbeddableApi } from '../embeddables/types'; @@ -66,16 +66,16 @@ export function createAddSingleMetricViewerPanelAction( const { resolveEmbeddableSingleMetricViewerUserInput } = await import( '../embeddables/single_metric_viewer/single_metric_viewer_setup_flyout' ); - const { mlApiServicesProvider } = await import('../application/services/ml_api_service'); + const { mlApiProvider } = await import('../application/services/ml_api_service'); const httpService = new HttpService(coreStart.http); - const mlApiServices: MlApiServices = mlApiServicesProvider(httpService); + const mlApi: MlApi = mlApiProvider(httpService); const initialState = await resolveEmbeddableSingleMetricViewerUserInput( coreStart, context.embeddable, context.embeddable.uuid, { data, share }, - mlApiServices + mlApi ); presentationContainerParent.addNewPanel({ From 3e47faff40b3b686ba71dc01fac36be660658971 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Wed, 4 Sep 2024 07:47:17 -0500 Subject: [PATCH 22/28] [ES|QL] Add named time system suggestions for date expressions (#192012) ## Summary This PR fixes a regression where named time system suggestions like (?t_start, ?t_end or Choose from time picker) were not being suggested for date expressions https://github.com/user-attachments/assets/cef899d8-b432-49a9-b09c-0fb5f719a721 This might have been introduced in https://github.com/elastic/kibana/pull/189941/files#diff-2a96c81cce17aff8cb8f0254f313903c2312b770ae08b3f4b938af0824d2e0fcL1149 ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Elastic Machine --- .../src/autocomplete/autocomplete.test.ts | 14 ++++++++++++++ .../src/autocomplete/autocomplete.ts | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 9f558c7c17470..3e5171d37c49c 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -12,6 +12,7 @@ import { timeUnitsToSuggest } from '../definitions/literals'; import { commandDefinitions as unmodifiedCommandDefinitions } from '../definitions/commands'; import { ADD_DATE_HISTOGRAM_SNIPPET, + getDateLiterals, getSafeInsertText, TIME_SYSTEM_PARAMS, TRIGGER_SUGGESTION_COMMAND, @@ -141,6 +142,19 @@ describe('autocomplete', () => { ['and', 'or', 'not'] ), ]); + + const expectedComparisonWithDateSuggestions = [ + ...getDateLiterals(), + ...getFieldNamesByType(['date']), + // all functions compatible with a keywordField type + ...getFunctionSignaturesByReturnType('where', ['date'], { scalar: true }), + ]; + testSuggestions('from a | where dateField == /', expectedComparisonWithDateSuggestions); + + testSuggestions('from a | where dateField < /', expectedComparisonWithDateSuggestions); + + testSuggestions('from a | where dateField >= /', expectedComparisonWithDateSuggestions); + const expectedComparisonWithTextFieldSuggestions = [ ...getFieldNamesByType(['text', 'keyword', 'ip', 'version']), ...getFunctionSignaturesByReturnType('where', ['text', 'keyword', 'ip', 'version'], { diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index b2808ee2c1156..9346e093c7eb9 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -1102,6 +1102,7 @@ async function getBuiltinFunctionNextArgument( } else { const finalType = nestedType || nodeArgType || 'any'; const supportedTypes = getSupportedTypesForBinaryOperators(fnDef, finalType as string); + suggestions.push( ...(await getFieldsOrFunctionsSuggestions( // this is a special case with AND/OR @@ -1232,8 +1233,11 @@ async function getFieldsOrFunctionsSuggestions( } } } + // could also be in stats (bucket) but our autocomplete is not great yet + const displayDateSuggestions = types.includes('date') && ['where', 'eval'].includes(commandName); const suggestions = filteredFieldsByType.concat( + displayDateSuggestions ? getDateLiterals() : [], functions ? getCompatibleFunctionDefinition(commandName, optionName, types, ignoreFn) : [], variables ? pushItUpInTheList(buildVariablesDefinitions(filteredVariablesByType), functions) From 4ca6f1d77d6290a743ae56f4775c6e0267982e1b Mon Sep 17 00:00:00 2001 From: Robert Jaszczurek <92210485+rbrtj@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:47:58 +0200 Subject: [PATCH 23/28] [ML] Trained models - fix download state responsiveness (#191900) ## Summary Fix for [#1284](https://github.com/elastic/ml-team/issues/1284) https://github.com/user-attachments/assets/3b829777-4ff9-4272-80dd-d27bccdb9fb5 ### Checklist Delete any items that are not applicable to this PR. - [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)) --- .../ml/public/application/model_management/models_list.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index c7622501d072b..a7d969d013a25 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -707,7 +707,7 @@ export const ModelsList: FC = ({ ); return ( - + {isDownloadInProgress ? ( Date: Wed, 4 Sep 2024 15:21:17 +0200 Subject: [PATCH 24/28] [Dataset quality] Enable page for synthetics (#191846) Closes https://github.com/elastic/observability-dev/issues/3457. This PR enables Dataset quality for being used for synthetics datasets. ### Changes - Added `synthetics` to `KNOWN_TYPES` array. - Permissions were updated in `Data_quality` plugin. https://github.com/user-attachments/assets/e9945012-166b-4704-bb73-11e6fe6eed76 --- packages/kbn-apm-synthtrace-client/index.ts | 1 + .../src/lib/synthetics/index.ts | 103 ++++++++++++ packages/kbn-apm-synthtrace/README.md | 1 + packages/kbn-apm-synthtrace/index.ts | 1 + .../kbn-apm-synthtrace/src/cli/scenario.ts | 8 +- .../src/cli/utils/bootstrap.ts | 9 + .../src/cli/utils/get_synthetics_es_client.ts | 33 ++++ .../src/cli/utils/start_live_data_upload.ts | 7 +- .../src/cli/utils/synthtrace_worker.ts | 10 +- .../src/lib/logs/logs_synthtrace_es_client.ts | 25 +-- .../data_stream_get_routing_transform.ts | 25 +++ .../synthetics_synthtrace_es_client.ts | 42 +++++ .../scenarios/degraded_synthetics_monitors.ts | 159 ++++++++++++++++++ .../helpers/get_at_index_or_random.ts | 13 ++ .../src/scenarios/helpers/logs_mock_data.ts | 5 +- x-pack/plugins/data_quality/server/plugin.ts | 7 + .../dataset_quality/common/constants.ts | 2 +- .../authentication.ts | 12 +- .../common/config.ts | 22 ++- .../data_streams/data_stream_details.spec.ts | 14 +- .../data_streams/data_stream_settings.spec.ts | 16 +- .../tests/data_streams/degraded_docs.spec.ts | 6 +- .../degraded_field_values.spec.ts | 4 +- .../data_streams/degraded_fields.spec.ts | 9 +- .../tests/data_streams/stats.spec.ts | 81 +++++++-- .../integration_dashboards.spec.ts | 2 +- .../tests/integrations/integrations.spec.ts | 2 +- 27 files changed, 542 insertions(+), 77 deletions(-) create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/synthetics/index.ts create mode 100644 packages/kbn-apm-synthtrace/src/cli/utils/get_synthetics_es_client.ts create mode 100644 packages/kbn-apm-synthtrace/src/lib/shared/data_stream_get_routing_transform.ts create mode 100644 packages/kbn-apm-synthtrace/src/lib/synthetics/synthetics_synthtrace_es_client.ts create mode 100644 packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts create mode 100644 packages/kbn-apm-synthtrace/src/scenarios/helpers/get_at_index_or_random.ts diff --git a/packages/kbn-apm-synthtrace-client/index.ts b/packages/kbn-apm-synthtrace-client/index.ts index 71321a8f3c67a..2553d3b08bfab 100644 --- a/packages/kbn-apm-synthtrace-client/index.ts +++ b/packages/kbn-apm-synthtrace-client/index.ts @@ -35,3 +35,4 @@ export { appendHash, hashKeysOf } from './src/lib/utils/hash'; export type { ESDocumentWithOperation, SynthtraceESAction, SynthtraceGenerator } from './src/types'; export { log, type LogDocument, LONG_FIELD_NAME } from './src/lib/logs'; export { type AssetDocument } from './src/lib/assets'; +export { syntheticsMonitor, type SyntheticsMonitorDocument } from './src/lib/synthetics'; diff --git a/packages/kbn-apm-synthtrace-client/src/lib/synthetics/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/synthetics/index.ts new file mode 100644 index 0000000000000..381c171ba5e02 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/synthetics/index.ts @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Fields } from '../entity'; +import { Serializable } from '../serializable'; + +export type SyntheticsMonitorDocument = Fields & + Partial<{ + 'data_stream.namespace': string; + 'data_stream.type': string; + 'data_stream.dataset': string; + 'monitor.id': string; + 'monitor.origin': string; + 'monitor.name': string; + 'monitor.type': string; + 'monitor.check_group': string; + 'monitor.timespan.lt': string; + 'monitor.timespan.gte': string; + 'monitor.duration.us'?: number; + 'monitor.ip'?: string; + 'monitor.project.name'?: string; + 'monitor.project.id'?: string; + 'monitor.fleet_managed'?: boolean; + 'monitor.status'?: string; + 'synthetics.type'?: string; + 'synthetics.step.index'?: number; + 'observer.os.name'?: string; + 'observer.product'?: string; + }>; + +type MonitorDataStream = + | 'http' + | 'tcp' + | 'icmp' + | 'browser' + | 'browser.screenshot' + | 'browser.network'; + +class SyntheticsMonitor extends Serializable { + constructor(fields: SyntheticsMonitorDocument) { + super({ + ...fields, + }); + } + + namespace(value: string) { + this.fields['data_stream.namespace'] = value; + return this; + } + + dataset(value: MonitorDataStream) { + this.fields['data_stream.dataset'] = value; + + if (value === 'browser.screenshot' || value === 'browser.network') { + this.fields['monitor.type'] = 'browser'; + return this; + } + + this.fields['monitor.type'] = value; + return this; + } + + name(value: string) { + this.fields['monitor.name'] = value; + return this; + } + + origin(value: string) { + this.fields['monitor.origin'] = value; + return this; + } + + ip(value: string) { + this.fields['monitor.ip'] = value; + return this; + } + + status(value: string) { + this.fields['monitor.status'] = value; + return this; + } + + timestamp(time: number) { + super.timestamp(time); + return this; + } +} + +function create(): SyntheticsMonitor { + return new SyntheticsMonitor({ + 'data_stream.namespace': 'default', + 'data_stream.type': 'synthetics', + }).dataset('http'); +} + +export const syntheticsMonitor = { + create, +}; diff --git a/packages/kbn-apm-synthtrace/README.md b/packages/kbn-apm-synthtrace/README.md index 6daad014ff0e5..a9704b1905d1b 100644 --- a/packages/kbn-apm-synthtrace/README.md +++ b/packages/kbn-apm-synthtrace/README.md @@ -22,6 +22,7 @@ This library can currently be used in two ways: - `Timerange`: an object that will return an array of timestamps based on an interval and a rate. These timestamps can be used to generate events/metricsets. - `Transaction`, `Span`, `APMError` and `Metricset`: events/metricsets that occur on an instance. For more background, see the [explanation of the APM data model](https://www.elastic.co/guide/en/apm/get-started/7.15/apm-data-model.html) - `Log`: An instance of Log generating Service which supports additional helpers to customise fields like `messages`, `logLevel` +- `SyntheticsMonitor`: An instance of Synthetic monitor. For more information see [Synthetic monitoring](https://www.elastic.co/guide/en/observability/current/monitor-uptime-synthetics.html). #### Example diff --git a/packages/kbn-apm-synthtrace/index.ts b/packages/kbn-apm-synthtrace/index.ts index 459e3802ae660..22b947cd1bbf3 100644 --- a/packages/kbn-apm-synthtrace/index.ts +++ b/packages/kbn-apm-synthtrace/index.ts @@ -15,6 +15,7 @@ export { InfraSynthtraceKibanaClient } from './src/lib/infra/infra_synthtrace_ki export { MonitoringSynthtraceEsClient } from './src/lib/monitoring/monitoring_synthtrace_es_client'; export { LogsSynthtraceEsClient } from './src/lib/logs/logs_synthtrace_es_client'; export { AssetsSynthtraceEsClient } from './src/lib/assets/assets_synthtrace_es_client'; +export { SyntheticsSynthtraceEsClient } from './src/lib/synthetics/synthetics_synthtrace_es_client'; export { addObserverVersionTransform, deleteSummaryFieldTransform, diff --git a/packages/kbn-apm-synthtrace/src/cli/scenario.ts b/packages/kbn-apm-synthtrace/src/cli/scenario.ts index c12d8333071c6..ba5e17deb1c18 100644 --- a/packages/kbn-apm-synthtrace/src/cli/scenario.ts +++ b/packages/kbn-apm-synthtrace/src/cli/scenario.ts @@ -7,7 +7,12 @@ */ import { Timerange } from '@kbn/apm-synthtrace-client'; -import { ApmSynthtraceEsClient, InfraSynthtraceEsClient, LogsSynthtraceEsClient } from '../..'; +import { + ApmSynthtraceEsClient, + InfraSynthtraceEsClient, + LogsSynthtraceEsClient, + SyntheticsSynthtraceEsClient, +} from '../..'; import { AssetsSynthtraceEsClient } from '../lib/assets/assets_synthtrace_es_client'; import { Logger } from '../lib/utils/create_logger'; import { ScenarioReturnType } from '../lib/utils/with_client'; @@ -18,6 +23,7 @@ interface EsClients { logsEsClient: LogsSynthtraceEsClient; infraEsClient: InfraSynthtraceEsClient; assetsEsClient: AssetsSynthtraceEsClient; + syntheticsEsClient: SyntheticsSynthtraceEsClient; } type Generate = (options: { diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts b/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts index be9f0a313fe0a..5119625b7f261 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts @@ -14,6 +14,7 @@ import { getKibanaClient } from './get_kibana_client'; import { getServiceUrls } from './get_service_urls'; import { RunOptions } from './parse_run_cli_flags'; import { getAssetsEsClient } from './get_assets_es_client'; +import { getSyntheticsEsClient } from './get_synthetics_es_client'; export async function bootstrap(runOptions: RunOptions) { const logger = createLogger(runOptions.logLevel); @@ -61,11 +62,18 @@ export async function bootstrap(runOptions: RunOptions) { concurrency: runOptions.concurrency, }); + const syntheticsEsClient = getSyntheticsEsClient({ + target: esUrl, + logger, + concurrency: runOptions.concurrency, + }); + if (runOptions.clean) { await apmEsClient.clean(); await logsEsClient.clean(); await infraEsClient.clean(); await assetsEsClient.clean(); + await syntheticsEsClient.clean(); } return { @@ -74,6 +82,7 @@ export async function bootstrap(runOptions: RunOptions) { logsEsClient, infraEsClient, assetsEsClient, + syntheticsEsClient, version, kibanaUrl, esUrl, diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/get_synthetics_es_client.ts b/packages/kbn-apm-synthtrace/src/cli/utils/get_synthetics_es_client.ts new file mode 100644 index 0000000000000..0310dfc40dd74 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/cli/utils/get_synthetics_es_client.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Client } from '@elastic/elasticsearch'; +import { Logger } from '../../lib/utils/create_logger'; +import { RunOptions } from './parse_run_cli_flags'; +import { getEsClientTlsSettings } from './ssl'; +import { SyntheticsSynthtraceEsClient } from '../../lib/synthetics/synthetics_synthtrace_es_client'; + +export function getSyntheticsEsClient({ + target, + logger, + concurrency, +}: Pick & { + target: string; + logger: Logger; +}) { + const client = new Client({ + node: target, + tls: getEsClientTlsSettings(target), + }); + + return new SyntheticsSynthtraceEsClient({ + client, + logger, + concurrency, + }); +} diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts b/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts index fd7ddc6b42b36..253113532795d 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts @@ -25,9 +25,8 @@ export async function startLiveDataUpload({ }) { const file = runOptions.file; - const { logger, apmEsClient, logsEsClient, infraEsClient, assetsEsClient } = await bootstrap( - runOptions - ); + const { logger, apmEsClient, logsEsClient, infraEsClient, assetsEsClient, syntheticsEsClient } = + await bootstrap(runOptions); const scenario = await getScenario({ file, logger }); const { generate } = await scenario({ ...runOptions, logger }); @@ -65,7 +64,7 @@ export async function startLiveDataUpload({ const generatorsAndClients = generate({ range: timerange(bucketFrom.getTime(), bucketTo.getTime()), - clients: { logsEsClient, apmEsClient, infraEsClient, assetsEsClient }, + clients: { logsEsClient, apmEsClient, infraEsClient, assetsEsClient, syntheticsEsClient }, }); const generatorsAndClientsArray = castArray(generatorsAndClients); diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts b/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts index fc7c70b0d6bc7..784931b5f6139 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts @@ -17,6 +17,7 @@ import { RunOptions } from './parse_run_cli_flags'; import { getLogsEsClient } from './get_logs_es_client'; import { getInfraEsClient } from './get_infra_es_client'; import { getAssetsEsClient } from './get_assets_es_client'; +import { getSyntheticsEsClient } from './get_synthetics_es_client'; export interface WorkerData { bucketFrom: Date; @@ -56,6 +57,12 @@ async function start() { logger, }); + const syntheticsEsClient = getSyntheticsEsClient({ + concurrency: runOptions.concurrency, + target: esUrl, + logger, + }); + const file = runOptions.file; const scenario = await logger.perf('get_scenario', () => getScenario({ file, logger })); @@ -70,6 +77,7 @@ async function start() { logsEsClient, infraEsClient, assetsEsClient, + syntheticsEsClient, }); } @@ -78,7 +86,7 @@ async function start() { const generatorsAndClients = logger.perf('generate_scenario', () => generate({ range: timerange(bucketFrom, bucketTo), - clients: { logsEsClient, apmEsClient, infraEsClient, assetsEsClient }, + clients: { logsEsClient, apmEsClient, infraEsClient, assetsEsClient, syntheticsEsClient }, }) ); diff --git a/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts b/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts index 95f8917c26658..3f1d5ea418026 100644 --- a/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts +++ b/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts @@ -7,14 +7,14 @@ */ import { Client } from '@elastic/elasticsearch'; -import { ESDocumentWithOperation } from '@kbn/apm-synthtrace-client'; -import { pipeline, Readable, Transform } from 'stream'; +import { pipeline, Readable } from 'stream'; import { LogDocument } from '@kbn/apm-synthtrace-client/src/lib/logs'; import { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/types'; import { SynthtraceEsClient, SynthtraceEsClientOptions } from '../shared/base_client'; import { getSerializeTransform } from '../shared/get_serialize_transform'; import { Logger } from '../utils/create_logger'; import { indexTemplates, IndexTemplateName } from './custom_logsdb_index_templates'; +import { getRoutingTransform } from '../shared/data_stream_get_routing_transform'; export type LogsSynthtraceEsClientOptions = Omit; @@ -66,7 +66,7 @@ function logsPipeline() { return pipeline( base, getSerializeTransform(), - getRoutingTransform(), + getRoutingTransform('logs'), (err: unknown) => { if (err) { throw err; @@ -75,22 +75,3 @@ function logsPipeline() { ); }; } - -function getRoutingTransform() { - return new Transform({ - objectMode: true, - transform(document: ESDocumentWithOperation, encoding, callback) { - if ( - 'data_stream.type' in document && - 'data_stream.dataset' in document && - 'data_stream.namespace' in document - ) { - document._index = `${document['data_stream.type']}-${document['data_stream.dataset']}-${document['data_stream.namespace']}`; - } else { - throw new Error('Cannot determine index for event'); - } - - callback(null, document); - }, - }); -} diff --git a/packages/kbn-apm-synthtrace/src/lib/shared/data_stream_get_routing_transform.ts b/packages/kbn-apm-synthtrace/src/lib/shared/data_stream_get_routing_transform.ts new file mode 100644 index 0000000000000..3e653e71b9862 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/lib/shared/data_stream_get_routing_transform.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ESDocumentWithOperation, Fields } from '@kbn/apm-synthtrace-client'; +import { Transform } from 'stream'; + +export function getRoutingTransform(dataStreamType: string) { + return new Transform({ + objectMode: true, + transform(document: ESDocumentWithOperation, encoding, callback) { + if ('data_stream.dataset' in document && 'data_stream.namespace' in document) { + document._index = `${dataStreamType}-${document['data_stream.dataset']}-${document['data_stream.namespace']}`; + } else { + throw new Error('Cannot determine index for event'); + } + + callback(null, document); + }, + }); +} diff --git a/packages/kbn-apm-synthtrace/src/lib/synthetics/synthetics_synthtrace_es_client.ts b/packages/kbn-apm-synthtrace/src/lib/synthetics/synthetics_synthtrace_es_client.ts new file mode 100644 index 0000000000000..65fd66538a757 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/lib/synthetics/synthetics_synthtrace_es_client.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Client } from '@elastic/elasticsearch'; +import { SyntheticsMonitorDocument } from '@kbn/apm-synthtrace-client'; +import { pipeline, Readable } from 'stream'; +import { SynthtraceEsClient, SynthtraceEsClientOptions } from '../shared/base_client'; +import { getSerializeTransform } from '../shared/get_serialize_transform'; +import { Logger } from '../utils/create_logger'; +import { getRoutingTransform } from '../shared/data_stream_get_routing_transform'; + +export type SyntheticsSynthtraceEsClientOptions = Omit; + +export class SyntheticsSynthtraceEsClient extends SynthtraceEsClient { + constructor(options: { client: Client; logger: Logger } & SyntheticsSynthtraceEsClientOptions) { + super({ + ...options, + pipeline: syntheticsPipeline(), + }); + this.dataStreams = ['synthetics-*-*']; + } +} + +function syntheticsPipeline() { + return (base: Readable) => { + return pipeline( + base, + getSerializeTransform(), + getRoutingTransform('synthetics'), + (err: unknown) => { + if (err) { + throw err; + } + } + ); + }; +} diff --git a/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts b/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts new file mode 100644 index 0000000000000..3be1ac53a6518 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { + generateShortId, + SyntheticsMonitorDocument, + syntheticsMonitor, +} from '@kbn/apm-synthtrace-client'; +import { Scenario } from '../cli/scenario'; +import { withClient } from '../lib/utils/with_client'; +import { getIpAddress } from './helpers/logs_mock_data'; +import { getAtIndexOrRandom } from './helpers/get_at_index_or_random'; + +const MORE_THAN_1024_CHARS = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; + +const MONITOR_NAMES = Array(4) + .fill(null) + .map((_, idx) => `synth-monitor-${idx}`); + +const ORIGINS = Array(4) + .fill(null) + .map((_, idx) => `synth-origin-${idx}`); + +const STATUS = ['up', 'down', 'disabled']; + +const OS = ['linux', 'windows', 'mac']; + +const scenario: Scenario = async (runOptions) => { + return { + generate: ({ range, clients: { syntheticsEsClient } }) => { + const { logger } = runOptions; + + const constructSyntheticsMonitorCommonData = (isMalformed?: boolean) => { + const index = Math.floor(Math.random() * 4); + const monitorName = getAtIndexOrRandom(MONITOR_NAMES, index); + const origin = getAtIndexOrRandom(ORIGINS, index); + const ip = getIpAddress(index); + const status = getAtIndexOrRandom(STATUS, index); + const os = getAtIndexOrRandom(OS, index); + + const commonSyntheticsMonitorEntryFields: SyntheticsMonitorDocument = { + 'monitor.id': generateShortId(), + 'monitor.check_group': generateShortId(), + 'monitor.timespan.lt': '2024-08-30T11:03:33.594Z', + 'monitor.timespan.gte': '2024-08-30T11:02:33.594Z', + }; + + return { + index, + monitorName, + origin, + ip, + status, + os, + commonLongEntryFields: commonSyntheticsMonitorEntryFields, + }; + }; + + const datasetSynth1Monitors = (timestamp: number) => { + const { monitorName, origin, ip, status, commonLongEntryFields } = + constructSyntheticsMonitorCommonData(); + + return syntheticsMonitor + .create() + .dataset('http') + .name(monitorName) + .origin(origin) + .ip(ip) + .defaults(commonLongEntryFields) + .timestamp(timestamp) + .status(status); + }; + + const datasetSynth2Monitors = (i: number, timestamp: number) => { + const { monitorName, origin, commonLongEntryFields } = + constructSyntheticsMonitorCommonData(); + const isMalformed = i % 90 === 0; + return syntheticsMonitor + .create() + .dataset('browser') + .name(monitorName) + .origin(origin) + .defaults({ + ...commonLongEntryFields, + 'synthetics.type': isMalformed + ? MORE_THAN_1024_CHARS // "ignore_above": 1024 in mapping + : 'step/metrics', + }) + .timestamp(timestamp); + }; + + const datasetSynth3Monitors = (i: number, timestamp: number) => { + const { monitorName, origin, os, commonLongEntryFields } = + constructSyntheticsMonitorCommonData(); + const isMalformed = i % 60 === 0; + return syntheticsMonitor + .create() + .dataset('browser.screenshot') + .name(monitorName) + .origin(origin) + .defaults({ + ...commonLongEntryFields, + 'synthetics.type': 'step/screenshot_ref', + 'observer.os.name': isMalformed + ? MORE_THAN_1024_CHARS // "ignore_above": 1024 in mapping + : os, + }) + .timestamp(timestamp); + }; + + const datasetSynth4Monitors = (i: number, timestamp: number) => { + const { monitorName, origin, commonLongEntryFields } = + constructSyntheticsMonitorCommonData(); + const isMalformed = i % 30 === 0; + return syntheticsMonitor + .create() + .dataset('browser.network') + .name(monitorName) + .origin(origin) + .defaults({ + ...commonLongEntryFields, + 'synthetics.type': isMalformed + ? MORE_THAN_1024_CHARS // "ignore_above": 1024 in mapping + : 'journey/network_info', + 'observer.product': isMalformed + ? MORE_THAN_1024_CHARS // "ignore_above": 1024 in mapping + : `synth-product-${i}`, + }) + .timestamp(timestamp); + }; + + const monitors = range + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(200) + .fill(0) + .flatMap((_, index) => [ + datasetSynth1Monitors(timestamp), + datasetSynth2Monitors(index, timestamp), + datasetSynth3Monitors(index, timestamp), + datasetSynth4Monitors(index, timestamp), + ]); + }); + + return withClient( + syntheticsEsClient, + logger.perf('generating_synthetics_monitors', () => monitors) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/helpers/get_at_index_or_random.ts b/packages/kbn-apm-synthtrace/src/scenarios/helpers/get_at_index_or_random.ts new file mode 100644 index 0000000000000..2a8e1d60062e3 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/helpers/get_at_index_or_random.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { randomInt } from 'crypto'; + +// Utility function to get a random element from an array +export const getAtIndexOrRandom = (values: T[], index?: number) => + values[index ?? randomInt(values.length)]; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts b/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts index 052ccce76499f..894f72b7d317d 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts @@ -10,16 +10,13 @@ import { generateShortId } from '@kbn/apm-synthtrace-client'; import { faker } from '@faker-js/faker'; import { randomInt } from 'crypto'; import moment from 'moment'; +import { getAtIndexOrRandom } from './get_at_index_or_random'; const { internet: { ipv4, userAgent, httpMethod, httpStatusCode }, word: { noun, verb }, } = faker; -// Utility function to get a random element from an array -const getAtIndexOrRandom = (values: T[], index?: number) => - values[index ?? randomInt(values.length)]; - // Arrays for data const LOG_LEVELS: string[] = ['FATAL', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE']; diff --git a/x-pack/plugins/data_quality/server/plugin.ts b/x-pack/plugins/data_quality/server/plugin.ts index 088905b8975d4..1b7e9cface597 100644 --- a/x-pack/plugins/data_quality/server/plugin.ts +++ b/x-pack/plugins/data_quality/server/plugin.ts @@ -39,6 +39,13 @@ export class DataQualityPlugin implements Plugin { ['metrics-*-*']: ['read'], }, }, + { + ui: [], + requiredClusterPrivileges: [], + requiredIndexPrivileges: { + ['synthetics-*-*']: ['read'], + }, + }, ], }); } diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts index 895381703742e..1b822c6c111d9 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts @@ -42,4 +42,4 @@ export const MAX_DEGRADED_FIELDS = 1000; export const MASKED_FIELD_PLACEHOLDER = ''; export const UNKOWN_FIELD_PLACEHOLDER = ''; -export const KNOWN_TYPES: DataStreamType[] = ['logs', 'metrics', 'traces']; +export const KNOWN_TYPES: DataStreamType[] = ['logs', 'metrics', 'traces', 'synthetics']; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts b/x-pack/plugins/observability_solution/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts index b5b177c644f59..bca3556b63771 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts @@ -10,20 +10,20 @@ export enum DatasetQualityUsername { viewerUser = 'viewer', readUser = 'readUser', editorUser = 'editor', - datasetQualityLogsUser = 'dataset_quality_logs_user', + datasetQualityMonitorUser = 'dataset_quality_monitor_user', } export enum DatasetQualityCustomRolename { - datasetQualityLogsUser = 'dataset_quality_logs_user', + datasetQualityMonitorUser = 'dataset_quality_monitor_user', datasetQualityReadUser = 'dataset_quality_read_user', } export const customRoles = { - [DatasetQualityCustomRolename.datasetQualityLogsUser]: { + [DatasetQualityCustomRolename.datasetQualityMonitorUser]: { elasticsearch: { indices: [ { - names: ['logs-*-*'], + names: ['logs-*-*', 'metrics-*-*', 'traces-*-*', 'synthetics-*-*'], privileges: ['monitor', 'view_index_metadata'], }, ], @@ -55,9 +55,9 @@ export const users: Record< [DatasetQualityUsername.editorUser]: { builtInRoleNames: ['editor'], }, - [DatasetQualityUsername.datasetQualityLogsUser]: { + [DatasetQualityUsername.datasetQualityMonitorUser]: { builtInRoleNames: ['editor'], - customRoleNames: [DatasetQualityCustomRolename.datasetQualityLogsUser], + customRoleNames: [DatasetQualityCustomRolename.datasetQualityMonitorUser], }, [DatasetQualityUsername.readUser]: { customRoleNames: [DatasetQualityCustomRolename.datasetQualityReadUser], diff --git a/x-pack/test/dataset_quality_api_integration/common/config.ts b/x-pack/test/dataset_quality_api_integration/common/config.ts index 3807addecbc71..f8e3fdc92016a 100644 --- a/x-pack/test/dataset_quality_api_integration/common/config.ts +++ b/x-pack/test/dataset_quality_api_integration/common/config.ts @@ -5,7 +5,12 @@ * 2.0. */ -import { LogLevel, LogsSynthtraceEsClient, createLogger } from '@kbn/apm-synthtrace'; +import { + LogLevel, + LogsSynthtraceEsClient, + SyntheticsSynthtraceEsClient, + createLogger, +} from '@kbn/apm-synthtrace'; import { createDatasetQualityUsers } from '@kbn/dataset-quality-plugin/server/test_helpers/create_dataset_quality_users'; import { DATASET_QUALITY_TEST_PASSWORD, @@ -55,7 +60,7 @@ export type DatasetQualityApiClientKey = | 'readUser' | 'adminUser' | 'writeUser' - | 'datasetQualityLogsUser'; + | 'datasetQualityMonitorUser'; export type DatasetQualityApiClient = Record< DatasetQualityApiClientKey, @@ -72,6 +77,9 @@ export interface CreateTest { logSynthtraceEsClient: ( context: InheritedFtrProviderContext ) => Promise; + syntheticsSynthtraceEsClient: ( + context: InheritedFtrProviderContext + ) => SyntheticsSynthtraceEsClient; datasetQualityApiClient: (context: InheritedFtrProviderContext) => DatasetQualityApiClient; packageService: ({ getService }: FtrProviderContext) => ReturnType; }; @@ -133,6 +141,12 @@ export function createTestConfig( logger: createLogger(LogLevel.info), refreshAfterIndex: true, }), + syntheticsSynthtraceEsClient: (context: InheritedFtrProviderContext) => + new SyntheticsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }), datasetQualityApiClient: async (_: InheritedFtrProviderContext) => { const { username, password } = servers.kibana; const esUrl = format(esServer); @@ -164,9 +178,9 @@ export function createTestConfig( kibanaServer, username: DatasetQualityUsername.editorUser, }), - datasetQualityLogsUser: await getDatasetQualityApiClient({ + datasetQualityMonitorUser: await getDatasetQualityApiClient({ kibanaServer, - username: DatasetQualityUsername.datasetQualityLogsUser, + username: DatasetQualityUsername.datasetQualityMonitorUser, }), }; }, diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts index dd34769fe717e..44e1dc08689b2 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts @@ -73,7 +73,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns error when dataStream param is not provided', async () => { const expectedMessage = 'Data Stream name cannot be empty'; const err = await expectToReject(() => - callApiAs('datasetQualityLogsUser', encodeURIComponent(' ')) + callApiAs('datasetQualityMonitorUser', encodeURIComponent(' ')) ); expect(err.res.status).to.be(400); expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); @@ -82,18 +82,24 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns {} if matching data stream is not available', async () => { const nonExistentDataSet = 'Non-existent'; const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; - const resp = await callApiAs('datasetQualityLogsUser', nonExistentDataStream); + const resp = await callApiAs('datasetQualityMonitorUser', nonExistentDataStream); expect(resp.body).empty(); }); it('returns "sizeBytes" correctly', async () => { - const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + const resp = await callApiAs( + 'datasetQualityMonitorUser', + `${type}-${dataset}-${namespace}` + ); expect(isNaN(resp.body.sizeBytes as number)).to.be(false); expect(resp.body.sizeBytes).to.be.greaterThan(0); }); it('returns service.name and host.name correctly', async () => { - const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + const resp = await callApiAs( + 'datasetQualityMonitorUser', + `${type}-${dataset}-${namespace}` + ); expect(resp.body.services).to.eql({ ['service.name']: [serviceName] }); expect(resp.body.hosts?.['host.name']).to.eql([hostName]); }); diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts index 3ba9965d980a4..eafc966dc4bda 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts @@ -97,7 +97,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns error when dataStream param is not provided', async () => { const expectedMessage = 'Data Stream name cannot be empty'; const err = await expectToReject(() => - callApiAs('datasetQualityLogsUser', encodeURIComponent(' ')) + callApiAs('datasetQualityMonitorUser', encodeURIComponent(' ')) ); expect(err.res.status).to.be(400); expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); @@ -106,7 +106,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns only privileges if matching data stream is not available', async () => { const nonExistentDataSet = 'Non-existent'; const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; - const resp = await callApiAs('datasetQualityLogsUser', nonExistentDataStream); + const resp = await callApiAs('datasetQualityMonitorUser', nonExistentDataStream); expect(resp.body).eql(defaultDataStreamPrivileges); }); @@ -115,7 +115,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { esClient, `${type}-${dataset}-${namespace}` ); - const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + const resp = await callApiAs( + 'datasetQualityMonitorUser', + `${type}-${dataset}-${namespace}` + ); expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); }); @@ -125,7 +128,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { esClient, `${type}-${dataset}-${namespace}` ); - const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + const resp = await callApiAs( + 'datasetQualityMonitorUser', + `${type}-${dataset}-${namespace}` + ); expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); }); @@ -135,7 +141,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { `${type}-${integrationDataset}-${namespace}` ); const resp = await callApiAs( - 'datasetQualityLogsUser', + 'datasetQualityMonitorUser', `${type}-${integrationDataset}-${namespace}` ); expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_docs.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_docs.spec.ts index 149f07a98a2f3..92aa69610a66d 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_docs.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_docs.spec.ts @@ -74,7 +74,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns stats correctly', async () => { - const stats = await callApiAs('datasetQualityLogsUser'); + const stats = await callApiAs('datasetQualityMonitorUser'); expect(stats.body.degradedDocs.length).to.be(2); const degradedDocsStats = stats.body.degradedDocs.reduce( @@ -105,7 +105,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('and there are not log documents', () => { it('returns stats correctly', async () => { - const stats = await callApiAs('datasetQualityLogsUser'); + const stats = await callApiAs('datasetQualityMonitorUser'); expect(stats.body.degradedDocs.length).to.be(0); }); @@ -154,7 +154,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns counts and list of datasets correctly', async () => { - const stats = await callApiAs('datasetQualityLogsUser'); + const stats = await callApiAs('datasetQualityMonitorUser'); expect(stats.body.degradedDocs.length).to.be(18); const expected = { diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts index a9f676cde946a..6eae916116e5c 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_field_values.spec.ts @@ -79,7 +79,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns no values when provided field has no degraded values', async () => { const resp = await callApiAs({ - user: 'datasetQualityLogsUser', + user: 'datasetQualityMonitorUser', dataStream: degradedFieldsDatastream, degradedField: regularFieldName, }); @@ -88,7 +88,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns values when provided field has degraded values', async () => { const resp = await callApiAs({ - user: 'datasetQualityLogsUser', + user: 'datasetQualityMonitorUser', dataStream: degradedFieldsDatastream, degradedField: degradedFieldName, }); diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts index 1f00722f57e15..fe6022067776f 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts @@ -87,14 +87,17 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns no results when dataStream does not have any degraded fields', async () => { - const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + const resp = await callApiAs( + 'datasetQualityMonitorUser', + `${type}-${dataset}-${namespace}` + ); expect(resp.body.degradedFields.length).to.be(0); }); it('returns results when dataStream do have degraded fields', async () => { const expectedDegradedFields = ['log.level', 'trace.id']; const resp = await callApiAs( - 'datasetQualityLogsUser', + 'datasetQualityMonitorUser', `${type}-${degradedFieldDataset}-${namespace}` ); const degradedFields = resp.body.degradedFields.map((field: DegradedField) => field.name); @@ -117,7 +120,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]; const resp = await callApiAs( - 'datasetQualityLogsUser', + 'datasetQualityMonitorUser', `${type}-${degradedFieldDataset}-${namespace}` ); diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/stats.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/stats.spec.ts index 25a7f419f2746..c7d44c26b230b 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/stats.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/stats.spec.ts @@ -5,24 +5,29 @@ * 2.0. */ -import { log, timerange } from '@kbn/apm-synthtrace-client'; +import { log, syntheticsMonitor, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; +import rison from '@kbn/rison'; import { DatasetQualityApiClientKey } from '../../common/config'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { cleanLogIndexTemplate, addIntegrationToLogIndexTemplate } from './es_utils'; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); - const synthtrace = getService('logSynthtraceEsClient'); + const logsSynthtrace = getService('logSynthtraceEsClient'); + const syntheticsSynthrace = getService('syntheticsSynthtraceEsClient'); const datasetQualityApiClient = getService('datasetQualityApiClient'); const es = getService('es'); - async function callApiAs(user: DatasetQualityApiClientKey) { + async function callApiAs( + user: DatasetQualityApiClientKey, + types: Array<'logs' | 'metrics' | 'traces' | 'synthetics'> = ['logs'] + ) { return await datasetQualityApiClient[user]({ endpoint: 'GET /internal/dataset_quality/data_streams/stats', params: { query: { - types: ['logs'], + types: rison.encodeArray(types), }, }, }); @@ -35,7 +40,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { rate = 1, dataset = 'synth.1', }: { from?: string; to?: string; interval?: string; rate?: number; dataset?: string } = {}) { - await synthtrace.index([ + await logsSynthtrace.index([ timerange(from, to) .interval(interval) .rate(rate) @@ -84,18 +89,18 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns non empty stats for an authorized user', async () => { await ingestDocuments(); - const stats = await callApiAs('datasetQualityLogsUser'); + const stats = await callApiAs('datasetQualityMonitorUser'); expect(stats.body.dataStreamsStats[0].size).not.empty(); expect(stats.body.dataStreamsStats[0].sizeBytes).greaterThan(0); expect(stats.body.dataStreamsStats[0].lastActivity).greaterThan(0); }); - it('get list of privileged data streams for datasetQualityLogsUser', async () => { + it('get list of privileged data streams for datasetQualityMonitorUser', async () => { // Index only one document to logs-test-1-default and logs-test-1-default data stream using synthtrace await ingestDocuments({ dataset: 'test.1' }); await ingestDocuments({ dataset: 'test.2' }); - const resp = await callApiAs('datasetQualityLogsUser'); + const resp = await callApiAs('datasetQualityMonitorUser'); expect(resp.body.datasetUserPrivileges.canMonitor).to.be(true); expect( @@ -112,7 +117,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await synthtrace.clean(); + await logsSynthtrace.clean(); await cleanLogIndexTemplate({ esClient: es }); }); }); @@ -124,7 +129,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { before(async () => { await addIntegrationToLogIndexTemplate({ esClient: es, name: integration }); - await synthtrace.index([ + await logsSynthtrace.index([ timerange('2023-11-20T15:00:00.000Z', '2023-11-20T15:01:00.000Z') .interval('1m') .rate(1) @@ -137,7 +142,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns stats correctly', async () => { - const stats = await callApiAs('datasetQualityLogsUser'); + const stats = await callApiAs('datasetQualityMonitorUser'); expect(stats.body.dataStreamsStats.length).to.be(1); expect(stats.body.dataStreamsStats[0].integration).to.be(integration); @@ -148,14 +153,14 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await synthtrace.clean(); + await logsSynthtrace.clean(); await cleanLogIndexTemplate({ esClient: es }); }); }); describe('and uncategorized datastreams', () => { before(async () => { - await synthtrace.index([ + await logsSynthtrace.index([ timerange('2023-11-20T15:00:00.000Z', '2023-11-20T15:01:00.000Z') .interval('1m') .rate(1) @@ -168,7 +173,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns stats correctly', async () => { - const stats = await callApiAs('datasetQualityLogsUser'); + const stats = await callApiAs('datasetQualityMonitorUser'); expect(stats.body.dataStreamsStats.length).to.be(1); expect(stats.body.dataStreamsStats[0].integration).not.ok(); @@ -179,7 +184,53 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await synthtrace.clean(); + await logsSynthtrace.clean(); + }); + }); + + describe('and multiple dataStream types are requested', () => { + before(async () => { + await logsSynthtrace.index([ + timerange('2023-11-20T15:00:00.000Z', '2023-11-20T15:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => [ + log.create().message('This is a log message').timestamp(timestamp).defaults({ + 'log.file.path': '/my-service.log', + }), + ]), + ]); + await syntheticsSynthrace.index([ + timerange('2023-11-20T15:00:00.000Z', '2023-11-20T15:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => [ + syntheticsMonitor.create().dataset('http').timestamp(timestamp), + ]), + ]); + }); + + it('returns stats correctly', async () => { + const stats = await callApiAs('datasetQualityMonitorUser', ['logs', 'synthetics']); + + expect(stats.body.dataStreamsStats.length).to.be(2); + expect(stats.body.dataStreamsStats[0].size).not.empty(); + expect(stats.body.dataStreamsStats[0].sizeBytes).greaterThan(0); + expect(stats.body.dataStreamsStats[0].lastActivity).greaterThan(0); + expect(stats.body.dataStreamsStats[0].totalDocs).greaterThan(0); + expect(stats.body.dataStreamsStats[0].name).match(new RegExp(/^logs-[\w.]+-[\w.]+/)); + expect(stats.body.dataStreamsStats[1].size).not.empty(); + expect(stats.body.dataStreamsStats[1].sizeBytes).greaterThan(0); + expect(stats.body.dataStreamsStats[1].lastActivity).greaterThan(0); + expect(stats.body.dataStreamsStats[1].totalDocs).greaterThan(0); + expect(stats.body.dataStreamsStats[1].name).match( + new RegExp(/^synthetics-[\w.]+-[\w.]+/) + ); + }); + + after(async () => { + await logsSynthtrace.clean(); + await syntheticsSynthrace.clean(); }); }); }); diff --git a/x-pack/test/dataset_quality_api_integration/tests/integrations/integration_dashboards.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/integrations/integration_dashboards.spec.ts index 63b1b029acdeb..70567202c4341 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/integrations/integration_dashboards.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/integrations/integration_dashboards.spec.ts @@ -18,7 +18,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const integrationPackages = ['nginx', 'apm']; async function callApiAs(integration: string) { - const user = 'datasetQualityLogsUser' as DatasetQualityApiClientKey; + const user = 'datasetQualityMonitorUser' as DatasetQualityApiClientKey; return await datasetQualityApiClient[user]({ endpoint: 'GET /internal/dataset_quality/integrations/{integration}/dashboards', params: { diff --git a/x-pack/test/dataset_quality_api_integration/tests/integrations/integrations.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/integrations/integrations.spec.ts index 2176dbd1fa95d..909e15ee60461 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/integrations/integrations.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/integrations/integrations.spec.ts @@ -35,7 +35,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]; async function callApiAs() { - const user = 'datasetQualityLogsUser' as DatasetQualityApiClientKey; + const user = 'datasetQualityMonitorUser' as DatasetQualityApiClientKey; return await datasetQualityApiClient[user]({ endpoint: 'GET /internal/dataset_quality/integrations', From e88499a27c7ae1ec668d6b4fe0e11ce9a487d0be Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 4 Sep 2024 15:37:51 +0200 Subject: [PATCH 25/28] [Uptime] Remove unnecessary queries !! (#191722) ## Summary We added these clauses 4 years ago in a follow up to https://github.com/elastic/beats/pull/14778 !! Since monitor.timespan is now always present in docs , we don't need these queries !! I found these sometimes to be very slow while investigating slow performance of queries in a trace !! ### Autorefresh interval !! Also updated auto refresh interval to 5 minutes, based on multiple customers feedback, default 1 minute is too aggressive !! --- .../common/constants/client_defaults.ts | 4 +- .../use_url_params.test.tsx.snap | 4 +- .../get_supported_url_params.test.ts.snap | 8 +- .../lib/requests/search/query_context.test.ts | 95 ------------------- .../lib/requests/search/query_context.ts | 34 ------- 5 files changed, 8 insertions(+), 137 deletions(-) delete mode 100644 x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/requests/search/query_context.test.ts diff --git a/x-pack/plugins/observability_solution/uptime/common/constants/client_defaults.ts b/x-pack/plugins/observability_solution/uptime/common/constants/client_defaults.ts index 41a5f7c64abed..f627180991025 100644 --- a/x-pack/plugins/observability_solution/uptime/common/constants/client_defaults.ts +++ b/x-pack/plugins/observability_solution/uptime/common/constants/client_defaults.ts @@ -12,9 +12,9 @@ export const CLIENT_DEFAULTS = { // 15 minutes ABSOLUTE_DATE_RANGE_END: 1000 * 60 * 15, /** - * The application auto refreshes every 60s by default. + * The application auto refreshes every 5mins by default. */ - AUTOREFRESH_INTERVAL: 60 * 1000, + AUTOREFRESH_INTERVAL: 5 * 60 * 1000, /** * The application's autorefresh feature is enabled. */ diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/hooks/__snapshots__/use_url_params.test.tsx.snap b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/hooks/__snapshots__/use_url_params.test.tsx.snap index 8cc0e164a7e48..9ac11e14be2a7 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/hooks/__snapshots__/use_url_params.test.tsx.snap +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/hooks/__snapshots__/use_url_params.test.tsx.snap @@ -81,7 +81,7 @@ exports[`useUrlParams deletes keys that do not have truthy values 1`] = ` } >
- {"pagination":"foo","absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-12","dateRangeEnd":"now","filters":"","excludedFilters":"","search":"","statusFilter":"","focusConnectorField":false,"query":""} + {"pagination":"foo","absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":300000,"autorefreshIsPaused":false,"dateRangeStart":"now-12","dateRangeEnd":"now","filters":"","excludedFilters":"","search":"","statusFilter":"","focusConnectorField":false,"query":""}

u=De(W#H-WS%>!i5IQxadK3kQU0*>#qW1~ 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 diff --git a/test/functional/screenshots/baseline/dashboard_controls_dark.png b/test/functional/screenshots/baseline/dashboard_controls_dark.png index 8cd3d27384c3df5491e178e97ffc5c2f5acc765f..510532befc60b1b920fc4e720f0abe93ea4ec540 100644 GIT binary patch literal 52560 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 literal 95445 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 diff --git a/test/functional/screenshots/baseline/dashboard_controls_light.png b/test/functional/screenshots/baseline/dashboard_controls_light.png index df1cf54bdbe20653be610b0c6dcd423838d949de..05b9897d3a6e3b3bb35ab9b00e8d52e363b18bb9 100644 GIT binary patch literal 51893 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