diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 28380549c751c..c179dbadac533 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -39,7 +39,6 @@
#CC# /src/legacy/core_plugins/vis_type_vislib/ @elastic/kibana-app
#CC# /src/legacy/server/url_shortening/ @elastic/kibana-app
#CC# /src/legacy/ui/public/state_management @elastic/kibana-app
-#CC# /src/plugins/index_pattern_management/public @elastic/kibana-app
# App Architecture
/examples/bfetch_explorer/ @elastic/kibana-app-arch
@@ -70,23 +69,10 @@
/x-pack/plugins/data_enhanced/ @elastic/kibana-app-arch
/x-pack/plugins/embeddable_enhanced/ @elastic/kibana-app-arch
/x-pack/plugins/ui_actions_enhanced/ @elastic/kibana-app-arch
-#CC# /src/legacy/core_plugins/kibana/public/management/ @elastic/kibana-app-arch
-#CC# /src/legacy/core_plugins/kibana/server/routes/api/management/ @elastic/kibana-app-arch
-#CC# /src/legacy/core_plugins/embeddable_api/ @elastic/kibana-app-arch
-#CC# /src/legacy/core_plugins/interpreter/ @elastic/kibana-app-arch
-#CC# /src/legacy/core_plugins/kibana_react/ @elastic/kibana-app-arch
-#CC# /src/legacy/core_plugins/status_page/public @elastic/kibana-app-arch
-#CC# /src/legacy/server/index_patterns/ @elastic/kibana-app-arch
-#CC# /src/legacy/ui/public/field_editor @elastic/kibana-app-arch
-#CC# /src/legacy/ui/public/management @elastic/kibana-app-arch
-#CC# /src/plugins/advanced_settings/ @elastic/kibana-app-arch
#CC# /src/plugins/bfetch/ @elastic/kibana-app-arch
-#CC# /src/plugins/charts/ @elastic/kibana-app-arch
-#CC# /src/plugins/index_pattern_management/public/service @elastic/kibana-app-arch
+#CC# /src/plugins/index_pattern_management/ @elastic/kibana-app-arch
#CC# /src/plugins/inspector/ @elastic/kibana-app-arch
-#CC# /src/plugins/saved_objects/ @elastic/kibana-app-arch
#CC# /src/plugins/share/ @elastic/kibana-app-arch
-#CC# /src/plugins/vis_default_editor @elastic/kibana-app-arch
#CC# /x-pack/plugins/advanced_ui_actions/ @elastic/kibana-app-arch
#CC# /x-pack/plugins/drilldowns/ @elastic/kibana-app-arch
#CC# /packages/kbn-interpreter/ @elastic/kibana-app-arch
@@ -243,6 +229,7 @@
#CC# /src/legacy/ui/public/documentation_links @elastic/kibana-platform
#CC# /src/legacy/ui/public/autoload @elastic/kibana-platform
#CC# /src/plugins/legacy_export/ @elastic/kibana-platform
+#CC# /src/plugins/saved_objects/ @elastic/kibana-platform
#CC# /src/plugins/status_page/ @elastic/kibana-platform
#CC# /src/plugins/testbed/server/ @elastic/kibana-platform
#CC# /x-pack/legacy/plugins/xpack_main/server/ @elastic/kibana-platform
diff --git a/docs/api/saved-objects/rotate_encryption_key.asciidoc b/docs/api/saved-objects/rotate_encryption_key.asciidoc
index 0a66ed2b4b361..efc57ddb4308d 100644
--- a/docs/api/saved-objects/rotate_encryption_key.asciidoc
+++ b/docs/api/saved-objects/rotate_encryption_key.asciidoc
@@ -25,7 +25,7 @@ Bulk key rotation can consume a considerable amount of resources and hence only
`type`::
(Optional, string) Limits encryption key rotation only to the saved objects with the specified type. By default, {kib} tries to rotate the encryption key for all saved object types that may contain encrypted attributes.
-`batchSize`::
+`batch_size`::
(Optional, number) Specifies a maximum number of saved objects that {kib} can process in a single batch. Bulk key rotation is an iterative process since {kib} may not be able to fetch and process all required saved objects in one go and splits processing into consequent batches. By default, the batch size is 10000, which is also a maximum allowed value.
[[saved-objects-api-rotate-encryption-key-response-body]]
@@ -91,7 +91,7 @@ In this example, key rotation is performed for all saved objects with the `alert
[source,sh]
--------------------------------------------------
-$ curl -X POST /api/encrypted_saved_objects/_rotate_key?type=alert&batchSize=5000
+$ curl -X POST /api/encrypted_saved_objects/_rotate_key?type=alert&batch_size=5000
--------------------------------------------------
// KIBANA
diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc
index dee6e4777884c..d0808d73151b0 100644
--- a/docs/developer/plugin-list.asciidoc
+++ b/docs/developer/plugin-list.asciidoc
@@ -22,8 +22,10 @@ NOTE:
|Description
-|{kib-repo}blob/{branch}/src/plugins/advanced_settings[advancedSettings]
-|WARNING: Missing README.
+|{kib-repo}blob/{branch}/src/plugins/advanced_settings/README.md[advancedSettings]
+|This plugin contains the advanced settings management section
+allowing users to configure their advanced settings, also known
+as uiSettings within the code.
|{kib-repo}blob/{branch}/src/plugins/apm_oss[apmOss]
@@ -130,8 +132,10 @@ in Kibana, e.g. visualizations. It has the form of a flyout panel.
|WARNING: Missing README.
-|{kib-repo}blob/{branch}/src/plugins/management[management]
-|WARNING: Missing README.
+|{kib-repo}blob/{branch}/src/plugins/management/README.md[management]
+|This plugins contains the "Stack Management" page framework. It offers navigation and an API
+to link individual managment section into it. This plugin does not contain any individual
+management section itself.
|{kib-repo}blob/{branch}/src/plugins/maps_legacy/README.md[mapsLegacy]
@@ -323,8 +327,8 @@ Failure to have auth enabled in Kibana will make for a broken UI. UI-based error
|The deprecated dashboard only mode.
-|{kib-repo}blob/{branch}/x-pack/plugins/data_enhanced[dataEnhanced]
-|WARNING: Missing README.
+|{kib-repo}blob/{branch}/x-pack/plugins/data_enhanced/README.md[dataEnhanced]
+|The data_enhanced plugin is the x-pack counterpart to the OSS data plugin.
|{kib-repo}blob/{branch}/x-pack/plugins/discover_enhanced/README.md[discoverEnhanced]
diff --git a/docs/development/core/public/kibana-plugin-core-public.chromestart.getbreadcrumbsappendextension_.md b/docs/development/core/public/kibana-plugin-core-public.chromestart.getbreadcrumbsappendextension_.md
new file mode 100644
index 0000000000000..dfe25c5c9e42d
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.chromestart.getbreadcrumbsappendextension_.md
@@ -0,0 +1,17 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ChromeStart](./kibana-plugin-core-public.chromestart.md) > [getBreadcrumbsAppendExtension$](./kibana-plugin-core-public.chromestart.getbreadcrumbsappendextension_.md)
+
+## ChromeStart.getBreadcrumbsAppendExtension$() method
+
+Get an observable of the current extension appended to breadcrumbs
+
+Signature:
+
+```typescript
+getBreadcrumbsAppendExtension$(): Observable;
+```
+Returns:
+
+`Observable`
+
diff --git a/docs/development/core/public/kibana-plugin-core-public.chromestart.md b/docs/development/core/public/kibana-plugin-core-public.chromestart.md
index 2594848ef0847..663b326193de5 100644
--- a/docs/development/core/public/kibana-plugin-core-public.chromestart.md
+++ b/docs/development/core/public/kibana-plugin-core-public.chromestart.md
@@ -55,6 +55,7 @@ core.chrome.setHelpExtension(elem => {
| [getBadge$()](./kibana-plugin-core-public.chromestart.getbadge_.md) | Get an observable of the current badge |
| [getBrand$()](./kibana-plugin-core-public.chromestart.getbrand_.md) | Get an observable of the current brand information. |
| [getBreadcrumbs$()](./kibana-plugin-core-public.chromestart.getbreadcrumbs_.md) | Get an observable of the current list of breadcrumbs |
+| [getBreadcrumbsAppendExtension$()](./kibana-plugin-core-public.chromestart.getbreadcrumbsappendextension_.md) | Get an observable of the current extension appended to breadcrumbs |
| [getCustomNavLink$()](./kibana-plugin-core-public.chromestart.getcustomnavlink_.md) | Get an observable of the current custom nav link |
| [getHelpExtension$()](./kibana-plugin-core-public.chromestart.gethelpextension_.md) | Get an observable of the current custom help conttent |
| [getIsNavDrawerLocked$()](./kibana-plugin-core-public.chromestart.getisnavdrawerlocked_.md) | Get an observable of the current locked state of the nav drawer. |
@@ -64,6 +65,7 @@ core.chrome.setHelpExtension(elem => {
| [setBadge(badge)](./kibana-plugin-core-public.chromestart.setbadge.md) | Override the current badge |
| [setBrand(brand)](./kibana-plugin-core-public.chromestart.setbrand.md) | Set the brand configuration. |
| [setBreadcrumbs(newBreadcrumbs)](./kibana-plugin-core-public.chromestart.setbreadcrumbs.md) | Override the current set of breadcrumbs |
+| [setBreadcrumbsAppendExtension(breadcrumbsAppendExtension)](./kibana-plugin-core-public.chromestart.setbreadcrumbsappendextension.md) | Mount an element next to the last breadcrumb |
| [setCustomNavLink(newCustomNavLink)](./kibana-plugin-core-public.chromestart.setcustomnavlink.md) | Override the current set of custom nav link |
| [setHelpExtension(helpExtension)](./kibana-plugin-core-public.chromestart.sethelpextension.md) | Override the current set of custom help content |
| [setHelpSupportUrl(url)](./kibana-plugin-core-public.chromestart.sethelpsupporturl.md) | Override the default support URL shown in the help menu |
diff --git a/docs/development/core/public/kibana-plugin-core-public.chromestart.setbreadcrumbsappendextension.md b/docs/development/core/public/kibana-plugin-core-public.chromestart.setbreadcrumbsappendextension.md
new file mode 100644
index 0000000000000..02adb9b4d325d
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-core-public.chromestart.setbreadcrumbsappendextension.md
@@ -0,0 +1,24 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ChromeStart](./kibana-plugin-core-public.chromestart.md) > [setBreadcrumbsAppendExtension](./kibana-plugin-core-public.chromestart.setbreadcrumbsappendextension.md)
+
+## ChromeStart.setBreadcrumbsAppendExtension() method
+
+Mount an element next to the last breadcrumb
+
+Signature:
+
+```typescript
+setBreadcrumbsAppendExtension(breadcrumbsAppendExtension?: ChromeBreadcrumbsAppendExtension): void;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| breadcrumbsAppendExtension | ChromeBreadcrumbsAppendExtension | |
+
+Returns:
+
+`void`
+
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.md
index bbf856480aedd..b2f8e83d8e654 100644
--- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.md
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.md
@@ -17,6 +17,6 @@ export interface ISearchSetup
| Property | Type | Description |
| --- | --- | --- |
| [aggs](./kibana-plugin-plugins-data-public.isearchsetup.aggs.md) | AggsSetup | |
-| [session](./kibana-plugin-plugins-data-public.isearchsetup.session.md) | ISessionService | session management |
+| [session](./kibana-plugin-plugins-data-public.isearchsetup.session.md) | ISessionService | session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) |
| [usageCollector](./kibana-plugin-plugins-data-public.isearchsetup.usagecollector.md) | SearchUsageCollector | |
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.session.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.session.md
index 7f39d9714a3a3..739fdfdeb5fc3 100644
--- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.session.md
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchsetup.session.md
@@ -4,7 +4,7 @@
## ISearchSetup.session property
-session management
+session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md)
Signature:
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.md
index 4a69e94dd6f58..dba60c7bdf147 100644
--- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.md
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.md
@@ -19,6 +19,6 @@ export interface ISearchStart
| [aggs](./kibana-plugin-plugins-data-public.isearchstart.aggs.md) | AggsStart | agg config sub service [AggsStart](./kibana-plugin-plugins-data-public.aggsstart.md) |
| [search](./kibana-plugin-plugins-data-public.isearchstart.search.md) | ISearchGeneric | low level search [ISearchGeneric](./kibana-plugin-plugins-data-public.isearchgeneric.md) |
| [searchSource](./kibana-plugin-plugins-data-public.isearchstart.searchsource.md) | ISearchStartSearchSource | high level search [ISearchStartSearchSource](./kibana-plugin-plugins-data-public.isearchstartsearchsource.md) |
-| [session](./kibana-plugin-plugins-data-public.isearchstart.session.md) | ISessionService | session management |
+| [session](./kibana-plugin-plugins-data-public.isearchstart.session.md) | ISessionService | session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) |
| [showError](./kibana-plugin-plugins-data-public.isearchstart.showerror.md) | (e: Error) => void | |
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.session.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.session.md
index de25cccd6d27a..1ad194a9bec86 100644
--- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.session.md
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstart.session.md
@@ -4,7 +4,7 @@
## ISearchStart.session property
-session management
+session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md)
Signature:
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.clear.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.clear.md
new file mode 100644
index 0000000000000..fc3d214eb4cad
--- /dev/null
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.clear.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) > [clear](./kibana-plugin-plugins-data-public.isessionservice.clear.md)
+
+## ISessionService.clear property
+
+Clears the active session.
+
+Signature:
+
+```typescript
+clear: () => void;
+```
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.getsession_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.getsession_.md
new file mode 100644
index 0000000000000..e30c89fb1a9fd
--- /dev/null
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.getsession_.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) > [getSession$](./kibana-plugin-plugins-data-public.isessionservice.getsession_.md)
+
+## ISessionService.getSession$ property
+
+Returns the observable that emits an update every time the session ID changes
+
+Signature:
+
+```typescript
+getSession$: () => Observable;
+```
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.getsessionid.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.getsessionid.md
new file mode 100644
index 0000000000000..838023ff1d8b9
--- /dev/null
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.getsessionid.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) > [getSessionId](./kibana-plugin-plugins-data-public.isessionservice.getsessionid.md)
+
+## ISessionService.getSessionId property
+
+Returns the active session ID
+
+Signature:
+
+```typescript
+getSessionId: () => string | undefined;
+```
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.md
new file mode 100644
index 0000000000000..174f9dbe66bf4
--- /dev/null
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.md
@@ -0,0 +1,22 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md)
+
+## ISessionService interface
+
+Signature:
+
+```typescript
+export interface ISessionService
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [clear](./kibana-plugin-plugins-data-public.isessionservice.clear.md) | () => void | Clears the active session. |
+| [getSession$](./kibana-plugin-plugins-data-public.isessionservice.getsession_.md) | () => Observable<string | undefined> | Returns the observable that emits an update every time the session ID changes |
+| [getSessionId](./kibana-plugin-plugins-data-public.isessionservice.getsessionid.md) | () => string | undefined | Returns the active session ID |
+| [restore](./kibana-plugin-plugins-data-public.isessionservice.restore.md) | (sessionId: string) => void | Restores existing session |
+| [start](./kibana-plugin-plugins-data-public.isessionservice.start.md) | () => string | Starts a new session |
+
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.restore.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.restore.md
new file mode 100644
index 0000000000000..857e85bbd30eb
--- /dev/null
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.restore.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) > [restore](./kibana-plugin-plugins-data-public.isessionservice.restore.md)
+
+## ISessionService.restore property
+
+Restores existing session
+
+Signature:
+
+```typescript
+restore: (sessionId: string) => void;
+```
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.start.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.start.md
new file mode 100644
index 0000000000000..9e14c5ed26765
--- /dev/null
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isessionservice.start.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) > [start](./kibana-plugin-plugins-data-public.isessionservice.start.md)
+
+## ISessionService.start property
+
+Starts a new session
+
+Signature:
+
+```typescript
+start: () => string;
+```
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md
index 6a3c437305cc8..ac6923fd12f96 100644
--- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md
@@ -74,6 +74,7 @@
| [ISearchSetup](./kibana-plugin-plugins-data-public.isearchsetup.md) | The setup contract exposed by the Search plugin exposes the search strategy extension point. |
| [ISearchStart](./kibana-plugin-plugins-data-public.isearchstart.md) | search service |
| [ISearchStartSearchSource](./kibana-plugin-plugins-data-public.isearchstartsearchsource.md) | high level search service |
+| [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) | |
| [KueryNode](./kibana-plugin-plugins-data-public.kuerynode.md) | |
| [OptionedValueProp](./kibana-plugin-plugins-data-public.optionedvalueprop.md) | |
| [QueryState](./kibana-plugin-plugins-data-public.querystate.md) | All query state service state |
diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md
new file mode 100644
index 0000000000000..62610624655a1
--- /dev/null
+++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-embeddable-public](./kibana-plugin-plugins-embeddable-public.md) > [isContextMenuTriggerContext](./kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md)
+
+## isContextMenuTriggerContext variable
+
+Signature:
+
+```typescript
+isContextMenuTriggerContext: (context: unknown) => context is EmbeddableContext
+```
diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md
index df67eda5074b9..06f792837e4fe 100644
--- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md
+++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.md
@@ -77,6 +77,7 @@
| [contextMenuTrigger](./kibana-plugin-plugins-embeddable-public.contextmenutrigger.md) | |
| [defaultEmbeddableFactoryProvider](./kibana-plugin-plugins-embeddable-public.defaultembeddablefactoryprovider.md) | |
| [EmbeddableRenderer](./kibana-plugin-plugins-embeddable-public.embeddablerenderer.md) | Helper react component to render an embeddable Can be used if you have an embeddable object or an embeddable factory Supports updating input by passing input prop |
+| [isContextMenuTriggerContext](./kibana-plugin-plugins-embeddable-public.iscontextmenutriggercontext.md) | |
| [isRangeSelectTriggerContext](./kibana-plugin-plugins-embeddable-public.israngeselecttriggercontext.md) | |
| [isValueClickTriggerContext](./kibana-plugin-plugins-embeddable-public.isvalueclicktriggercontext.md) | |
| [PANEL\_BADGE\_TRIGGER](./kibana-plugin-plugins-embeddable-public.panel_badge_trigger.md) | |
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md
index aefd04112dc1c..3cc38a0cbdc0f 100644
--- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md
@@ -39,6 +39,8 @@ export declare class Executor = Record
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [Executor](./kibana-plugin-plugins-expressions-public.executor.md) > [migrate](./kibana-plugin-plugins-expressions-public.executor.migrate.md)
+
+## Executor.migrate() method
+
+Signature:
+
+```typescript
+migrate(ast: SerializableState, version: string): ExpressionAstExpression;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| ast | SerializableState | |
+| version | string | |
+
+Returns:
+
+`ExpressionAstExpression`
+
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.migratetolatest.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.migratetolatest.md
new file mode 100644
index 0000000000000..23b7e6035a0ae
--- /dev/null
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.migratetolatest.md
@@ -0,0 +1,23 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [Executor](./kibana-plugin-plugins-expressions-public.executor.md) > [migrateToLatest](./kibana-plugin-plugins-expressions-public.executor.migratetolatest.md)
+
+## Executor.migrateToLatest() method
+
+Signature:
+
+```typescript
+migrateToLatest(ast: unknown, version: string): ExpressionAstExpression;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| ast | unknown | |
+| version | string | |
+
+Returns:
+
+`ExpressionAstExpression`
+
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md
index 1815d63d804b1..3e75e9ab3ef6f 100644
--- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md
@@ -29,6 +29,7 @@ export declare class ExpressionFunction implements PersistableStatestring | A short help text. |
| [inject](./kibana-plugin-plugins-expressions-public.expressionfunction.inject.md) | | (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments'] | |
| [inputTypes](./kibana-plugin-plugins-expressions-public.expressionfunction.inputtypes.md) | | string[] | undefined | Type of inputs that this function supports. |
+| [migrations](./kibana-plugin-plugins-expressions-public.expressionfunction.migrations.md) | | { [key: string]: (state: SerializableState) => SerializableState; } | |
| [name](./kibana-plugin-plugins-expressions-public.expressionfunction.name.md) | | string | Name of function |
| [telemetry](./kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md) | | (state: ExpressionAstFunction['arguments'], telemetryData: Record<string, any>) => Record<string, any> | |
| [type](./kibana-plugin-plugins-expressions-public.expressionfunction.type.md) | | string | Return type of function. This SHOULD be supplied. We use it for UI and autocomplete hinting. We may also use it for optimizations in the future. |
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.migrations.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.migrations.md
new file mode 100644
index 0000000000000..28d521f4b3fe1
--- /dev/null
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.migrations.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-public.expressionfunction.md) > [migrations](./kibana-plugin-plugins-expressions-public.expressionfunction.migrations.md)
+
+## ExpressionFunction.migrations property
+
+Signature:
+
+```typescript
+migrations: {
+ [key: string]: (state: SerializableState) => SerializableState;
+ };
+```
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.derivative.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.derivative.md
new file mode 100644
index 0000000000000..cce7a463d1561
--- /dev/null
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.derivative.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunctionDefinitions](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.md) > [derivative](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.derivative.md)
+
+## ExpressionFunctionDefinitions.derivative property
+
+Signature:
+
+```typescript
+derivative: ExpressionFunctionDerivative;
+```
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.md
index d1703a1e019e6..0e180d1fabe39 100644
--- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.md
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.md
@@ -18,6 +18,7 @@ export interface ExpressionFunctionDefinitions
| --- | --- | --- |
| [clog](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.clog.md) | ExpressionFunctionClog | |
| [cumulative\_sum](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.cumulative_sum.md) | ExpressionFunctionCumulativeSum | |
+| [derivative](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.derivative.md) | ExpressionFunctionDerivative | |
| [font](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.font.md) | ExpressionFunctionFont | |
| [kibana\_context](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.kibana_context.md) | ExpressionFunctionKibanaContext | |
| [kibana](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinitions.kibana.md) | ExpressionFunctionKibana | |
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md
index 041d66b22dd50..307fc73ec6e9c 100644
--- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md
@@ -39,6 +39,8 @@ export declare class ExpressionsService implements PersistableStateExpressionsServiceStart['getType'] | |
| [getTypes](./kibana-plugin-plugins-expressions-public.expressionsservice.gettypes.md) | | () => ReturnType<Executor['getTypes']> | Returns POJO map of all registered expression types, where keys are names of the types and values are ExpressionType instances. |
| [inject](./kibana-plugin-plugins-expressions-public.expressionsservice.inject.md) | | (state: ExpressionAstExpression, references: SavedObjectReference[]) => ExpressionAstExpression | Injects saved object references into expression AST |
+| [migrate](./kibana-plugin-plugins-expressions-public.expressionsservice.migrate.md) | | (state: SerializableState, version: string) => ExpressionAstExpression | Injects saved object references into expression AST |
+| [migrateToLatest](./kibana-plugin-plugins-expressions-public.expressionsservice.migratetolatest.md) | | (state: unknown, version: string) => ExpressionAstExpression | Injects saved object references into expression AST |
| [registerFunction](./kibana-plugin-plugins-expressions-public.expressionsservice.registerfunction.md) | | (functionDefinition: AnyExpressionFunctionDefinition | (() => AnyExpressionFunctionDefinition)) => void | Register an expression function, which will be possible to execute as part of the expression pipeline.Below we register a function which simply sleeps for given number of milliseconds to delay the execution and outputs its input as-is.
```ts
expressions.registerFunction({
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.migrate.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.migrate.md
new file mode 100644
index 0000000000000..88a6bda4ee3f5
--- /dev/null
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.migrate.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionsService](./kibana-plugin-plugins-expressions-public.expressionsservice.md) > [migrate](./kibana-plugin-plugins-expressions-public.expressionsservice.migrate.md)
+
+## ExpressionsService.migrate property
+
+Injects saved object references into expression AST
+
+Signature:
+
+```typescript
+readonly migrate: (state: SerializableState, version: string) => ExpressionAstExpression;
+```
diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.migratetolatest.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.migratetolatest.md
new file mode 100644
index 0000000000000..e6860df19fd3f
--- /dev/null
+++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.migratetolatest.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionsService](./kibana-plugin-plugins-expressions-public.expressionsservice.md) > [migrateToLatest](./kibana-plugin-plugins-expressions-public.expressionsservice.migratetolatest.md)
+
+## ExpressionsService.migrateToLatest property
+
+Injects saved object references into expression AST
+
+Signature:
+
+```typescript
+readonly migrateToLatest: (state: unknown, version: string) => ExpressionAstExpression;
+```
diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md
index 97bb3ac895084..da20ae4aa892e 100644
--- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md
+++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md
@@ -39,6 +39,8 @@ export declare class Executor = Record
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [Executor](./kibana-plugin-plugins-expressions-server.executor.md) > [migrate](./kibana-plugin-plugins-expressions-server.executor.migrate.md)
+
+## Executor.migrate() method
+
+Signature:
+
+```typescript
+migrate(ast: SerializableState, version: string): ExpressionAstExpression;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| ast | SerializableState | |
+| version | string | |
+
+Returns:
+
+`ExpressionAstExpression`
+
diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.migratetolatest.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.migratetolatest.md
new file mode 100644
index 0000000000000..72e3f8d8b7edc
--- /dev/null
+++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.migratetolatest.md
@@ -0,0 +1,23 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [Executor](./kibana-plugin-plugins-expressions-server.executor.md) > [migrateToLatest](./kibana-plugin-plugins-expressions-server.executor.migratetolatest.md)
+
+## Executor.migrateToLatest() method
+
+Signature:
+
+```typescript
+migrateToLatest(ast: unknown, version: string): ExpressionAstExpression;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| ast | unknown | |
+| version | string | |
+
+Returns:
+
+`ExpressionAstExpression`
+
diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md
index 7fcda94968d13..00c8aa63bfbd8 100644
--- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md
+++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md
@@ -29,6 +29,7 @@ export declare class ExpressionFunction implements PersistableStatestring | A short help text. |
| [inject](./kibana-plugin-plugins-expressions-server.expressionfunction.inject.md) | | (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments'] | |
| [inputTypes](./kibana-plugin-plugins-expressions-server.expressionfunction.inputtypes.md) | | string[] | undefined | Type of inputs that this function supports. |
+| [migrations](./kibana-plugin-plugins-expressions-server.expressionfunction.migrations.md) | | { [key: string]: (state: SerializableState) => SerializableState; } | |
| [name](./kibana-plugin-plugins-expressions-server.expressionfunction.name.md) | | string | Name of function |
| [telemetry](./kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md) | | (state: ExpressionAstFunction['arguments'], telemetryData: Record<string, any>) => Record<string, any> | |
| [type](./kibana-plugin-plugins-expressions-server.expressionfunction.type.md) | | string | Return type of function. This SHOULD be supplied. We use it for UI and autocomplete hinting. We may also use it for optimizations in the future. |
diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.migrations.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.migrations.md
new file mode 100644
index 0000000000000..29031a9306b2f
--- /dev/null
+++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.migrations.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-server.expressionfunction.md) > [migrations](./kibana-plugin-plugins-expressions-server.expressionfunction.migrations.md)
+
+## ExpressionFunction.migrations property
+
+Signature:
+
+```typescript
+migrations: {
+ [key: string]: (state: SerializableState) => SerializableState;
+ };
+```
diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.derivative.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.derivative.md
new file mode 100644
index 0000000000000..6c51f1eb97750
--- /dev/null
+++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.derivative.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunctionDefinitions](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.md) > [derivative](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.derivative.md)
+
+## ExpressionFunctionDefinitions.derivative property
+
+Signature:
+
+```typescript
+derivative: ExpressionFunctionDerivative;
+```
diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.md
index 05b4ddce4ccde..d4b71a36e0de1 100644
--- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.md
+++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.md
@@ -18,6 +18,7 @@ export interface ExpressionFunctionDefinitions
| --- | --- | --- |
| [clog](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.clog.md) | ExpressionFunctionClog | |
| [cumulative\_sum](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.cumulative_sum.md) | ExpressionFunctionCumulativeSum | |
+| [derivative](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.derivative.md) | ExpressionFunctionDerivative | |
| [font](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.font.md) | ExpressionFunctionFont | |
| [kibana\_context](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.kibana_context.md) | ExpressionFunctionKibanaContext | |
| [kibana](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.kibana.md) | ExpressionFunctionKibana | |
diff --git a/docs/management/images/management-index-templates-mappings.png b/docs/management/images/management-index-templates-mappings.png
deleted file mode 100644
index beb964b348171..0000000000000
Binary files a/docs/management/images/management-index-templates-mappings.png and /dev/null differ
diff --git a/docs/management/images/management-index-templates.png b/docs/management/images/management-index-templates.png
deleted file mode 100644
index 07f1fb9a7add1..0000000000000
Binary files a/docs/management/images/management-index-templates.png and /dev/null differ
diff --git a/docs/management/images/management_index_component_template.png b/docs/management/images/management_index_component_template.png
deleted file mode 100644
index c03029fd172f0..0000000000000
Binary files a/docs/management/images/management_index_component_template.png and /dev/null differ
diff --git a/docs/management/images/management_index_create_wizard.png b/docs/management/images/management_index_create_wizard.png
deleted file mode 100644
index bff1dd4cd0e7a..0000000000000
Binary files a/docs/management/images/management_index_create_wizard.png and /dev/null differ
diff --git a/docs/management/images/management_index_data_stream_backing_index.png b/docs/management/images/management_index_data_stream_backing_index.png
deleted file mode 100644
index a5c577affbbb2..0000000000000
Binary files a/docs/management/images/management_index_data_stream_backing_index.png and /dev/null differ
diff --git a/docs/management/images/management_index_data_stream_stats.png b/docs/management/images/management_index_data_stream_stats.png
deleted file mode 100644
index a67ab4a7deb32..0000000000000
Binary files a/docs/management/images/management_index_data_stream_stats.png and /dev/null differ
diff --git a/docs/management/images/management_index_details.png b/docs/management/images/management_index_details.png
deleted file mode 100644
index b199d13218f5a..0000000000000
Binary files a/docs/management/images/management_index_details.png and /dev/null differ
diff --git a/docs/management/images/management_index_labels.png b/docs/management/images/management_index_labels.png
deleted file mode 100644
index a89c32e08beff..0000000000000
Binary files a/docs/management/images/management_index_labels.png and /dev/null differ
diff --git a/docs/management/managing-indices.asciidoc b/docs/management/managing-indices.asciidoc
deleted file mode 100644
index 8416c164c6c51..0000000000000
--- a/docs/management/managing-indices.asciidoc
+++ /dev/null
@@ -1,258 +0,0 @@
-[role="xpack"]
-[[managing-indices]]
-== Index Management
-
-*Index Management* features are an easy, convenient way to manage your
-{es} cluster's indices, data streams, and index templates. Practicing good index
-management ensures your data is stored correctly and in the most cost-effective
-way possible.
-
-[float]
-=== What you'll learn
-
-This page shows you how to use *Index Management* features to:
-
-To manage your indices, open the main menu, then click *Stack Management > Index Management*.
-
-[role="screenshot"]
-image::images/management_index_labels.png[Index Management UI]
-
-[float]
-=== Before you start
-
-Before using this feature, you should be familiar with index management
-operations. Refer to the {ref}/indices.html[index management APIs], the
-{ref}/indices-templates.html[index template APIs], and the
-{ref}/data-streams.html[data streams documentation].
-
-[float]
-=== Required permissions
-
-The minimum required permissions to access *Index Management* are
-the `monitor` cluster privilege and the `view_index_metadata`
-and `manage` index privileges to view the data.
-For index templates, you must have the `manage_index_templates` cluster privilege.
-See {ref}/security-privileges.html[Security privileges] for more
-information.
-
-You can add these privileges in *Stack Management > Security > Roles*.
-
-[float]
-=== View and edit indices
-
-When you open *Index Management*, you’re presented an overview of your configured indices.
-Badges indicate if an index is {ref}/frozen-indices.html[frozen],
-a {ref}/ccr-put-follow.html[follower index],
-or a {ref}/rollup-get-rollup-index-caps.html[rollup index].
-
-Clicking a badge narrows the list to only indices of that type.
-You can also filter your indices using the search bar.
-
-You can drill down into each index to investigate the index
-{ref}/index-modules.html#index-modules-settings[settings], {ref}/mapping.html[mapping], and statistics.
-From this view, you can also edit the index settings.
-
-[role="screenshot"]
-image::images/management_index_details.png[Index Management UI]
-
-[float]
-=== Perform index-level operations
-
-Use the *Manage* menu to perform index-level operations. This menu
-is available in the index details view, or when you select the checkbox of one or more
-indices on the overview page. The menu includes the following actions:
-
-* *Close index*. Blocks the index from read/write operations.
-A closed index exists in the cluster, but doesn't consume resources
-other than disk space. If you reopen a closed index, it goes through the
-normal recovery process.
-
-* *Force merge index*. Reduces the number of segments in your shard by
-merging smaller files and clearing deleted ones. Only force merge a read-only index.
-
-* *Refresh index*. Writes the operations in the indexing buffer to the
-filesystem cache. This action is automatically performed once per second. Forcing a manual
-refresh is useful during testing, but should not be routinely done in
-production because it has a performance impact.
-
-* *Clear index cache*. Clears all caches associated with the index.
-
-* *Flush index*. Frees memory by syncing the filesystem cache to disk and
-clearing the cache. Once the sync is complete, the internal transaction log is reset.
-
-* *Freeze index*. Makes the index read-only and reduces its memory footprint
-by moving shards to disk. Frozen indices remain
-searchable, but queries take longer.
-
-* *Delete index*. Permanently removes the index and all of its documents.
-
-* *Add lifecycle policy*. Specifies a policy for managing the lifecycle of the
-index.
-
-[float]
-[[manage-data-streams]]
-=== Manage data streams
-
-A {ref}/data-streams.html[data stream] lets you store time series data across
-multiple backing indices while giving you a single named resource to use in
-requests. The *Data Streams* view lists your data streams and lets you examine
-or delete them.
-
-To view more information about a data stream, such as its generation or its
-current index lifecycle policy, click the stream's name.
-
-[role="screenshot"]
-image::images/management_index_data_stream_stats.png[Data stream details]
-
-To view information about the stream's backing indices, click the number in the
-*Indices* column.
-
-[role="screenshot"]
-image::images/management_index_data_stream_backing_index.png[Backing index]
-
-[float]
-[[manage-index-templates]]
-=== Manage index templates
-
-An index template defines {ref}/index-modules.html#index-modules-settings[settings],
-{ref}/mapping.html[mappings], and {ref}/indices-add-alias.html[aliases]
-that you can automatically apply when creating a new index. {es} applies a
-template to a new index based on an index pattern that matches the index name.
-
-The *Index Templates* view lists your templates and enables you to examine, edit, clone, and
-delete them. Changes you make to an index template
-do not affect existing indices.
-
-[role="screenshot"]
-image::images/management-index-templates.png[Index templates]
-
-If you don't have any templates, you can create one using the *Create template* wizard.
-Index templates are applied during index creation,
-so you must create the
-template before you create the indices.
-
-[float]
-==== Try it: Create an index template
-
-In this tutorial, you’ll create an index template for randomly generated log
-files. You'll then use the template to configure two new indices.
-
-*Step 1. Add a name and index pattern*
-
-. In the *Index Templates* view, open the *Create template* wizard.
-+
-[role="screenshot"]
-image::images/management_index_create_wizard.png[Create wizard]
-
-. In the *Name* field, enter `my-index-template`.
-
-. Set *Index pattern* to `my-index-*` so the template matches any index
-with that index pattern.
-
-. Leave *Data Stream*, *Priority*, *Version*, and *_meta field* as-is or blank.
-
-. Click *Next*.
-
-*Step 2. Add settings, mappings, and index aliases*
-
-. Add component templates to your index template.
-+
-{ref}/indices-component-template.html[Component templates] are pre-configured
-sets of mappings, index settings, and index aliases you can reuse across
-multiple index templates. Badges indicate whether a component template contains
-mappings (*M*), index settings (*S*), index aliases (*A*), or a combination of
-the three.
-+
-Component templates are optional. For this tutorial, do not add any component
-templates.
-+
-[role="screenshot"]
-image::images/management_index_component_template.png[Component templates page]
-
-. Define index settings. These are optional. For this tutorial, leave this
-section blank.
-
-. Define a mapping that contains an object field named `geo` with a child
-geo-point field named `coordinates`:
-+
-[role="screenshot"]
-image::images/management-index-templates-mappings.png[Mapped fields page]
-+
-Alternatively, you can click the *Load JSON* link and define the mapping as JSON:
-+
-[source,js]
-----
-{
- "properties": {
- "geo": {
- "properties": {
- "coordinates": {
- "type": "geo_point"
- }
- }
- }
- }
-}
-----
-+
-You can create additional mapping configurations in the *Dynamic templates* and
-*Advanced options* tabs. No additional mappings are required for this tutorial.
-
-. Define an index alias named `my-index`:
-+
-[source,js]
-----
-{
- "my-index": {}
-}
-----
-
-. On the review page, check the summary. If everything looks right, click
-*Create template*.
-
-*Step 3. Create new indices*
-
-You’re now ready to load the logs data and create new indices using your index
-template.
-
-. In the {kib} *Console*, index the following documents:
-+
-[source,js]
-----
-POST /my-index-000001/_doc
-{
- "@timestamp": "2019-05-18T15:57:27.541Z",
- "ip": "225.44.217.191",
- "extension": "jpg",
- "response": "200",
- "geo": {
- "coordinates": {
- "lat": 38.53146222,
- "lon": -121.7864906
- }
- },
- "url": "https://media-for-the-masses.theacademyofperformingartsandscience.org/uploads/charles-fullerton.jpg"
-}
-
-POST /my-index-000002/_doc
-{
- "@timestamp": "2019-05-20T03:44:20.844Z",
- "ip": "198.247.165.49",
- "extension": "php",
- "response": "200",
- "geo": {
- "coordinates": {
- "lat": 37.13189556,
- "lon": -76.4929875
- }
- },
- "memory": 241720,
- "url": "https://theacademyofperformingartsandscience.org/people/type:astronauts/name:laurel-b-clark/profile"
-}
-----
-+
-These requests create two indices: `my-index-000001` and `my-index-000002`.
-
-. Use the {es} {ref}/indices-get-index.html#indices-get-index[get index API] to
-view one of the newly created indices. The index's mappings and alias are
-configured automatically based on the template.
diff --git a/docs/management/watcher-ui/index.asciidoc b/docs/management/watcher-ui/index.asciidoc
index 69c33aa7a1dac..aded7a45022db 100644
--- a/docs/management/watcher-ui/index.asciidoc
+++ b/docs/management/watcher-ui/index.asciidoc
@@ -46,7 +46,7 @@ To manage roles, open then main menu, then click *Stack Management > Roles*, or
all users with the same role.
NOTE: If you are creating a threshold watch, you must also have the `view_index_metadata` index privilege. See
-<> for detailed information.
+{ref}/index-mgmt.html[Index management] for detailed information.
[float]
[[watcher-create-threshold-alert]]
diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc
index 7fc8fe5114e1e..833273c7b3ef0 100644
--- a/docs/redirects.asciidoc
+++ b/docs/redirects.asciidoc
@@ -143,3 +143,8 @@ This content has moved. See
This content has moved. See
<>.
+[role="exclude",id="managing-indices"]
+== Index management
+
+This content has moved. See {ref}/index-mgmt.html[Index management].
+
diff --git a/docs/settings/apm-settings.asciidoc b/docs/settings/apm-settings.asciidoc
index 9054a97c90496..aa680720fc8ff 100644
--- a/docs/settings/apm-settings.asciidoc
+++ b/docs/settings/apm-settings.asciidoc
@@ -43,6 +43,12 @@ Changing these settings may disable features of the APM App.
| `xpack.apm.enabled`
| Set to `false` to disable the APM app. Defaults to `true`.
+| `xpack.apm.serviceMapFingerprintBucketSize`
+ | Maximum number of unique transaction combinations sampled for generating service map focused on a specific service. Defaults to `100`.
+
+| `xpack.apm.serviceMapFingerprintGlobalBucketSize`
+ | Maximum number of unique transaction combinations sampled for generating the global service map. Defaults to `100`.
+
| `xpack.apm.ui.enabled` {ess-icon}
| Set to `false` to hide the APM app from the main menu. Defaults to `true`.
diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc
index c968ca6f35029..03a728a15351e 100644
--- a/docs/setup/connect-to-elasticsearch.asciidoc
+++ b/docs/setup/connect-to-elasticsearch.asciidoc
@@ -1,108 +1,73 @@
[[connect-to-elasticsearch]]
-== Add data to {kib}
+== Add data
+++++
+Add data
+++++
-To start working with your data in {kib}, you can:
+To start working with your data in {kib}, use one of the many ingest options,
+available from the home page.
+You can collect data from an app or service
+or upload a file that contains your data. If you're not ready to use your own data,
+add a sample data set and give {kib} a test drive.
-* Upload a CSV, JSON, or log file with the File Data Visualizer.
-
-* Upload geospatial data with the GeoJSON Upload feature.
-
-* Index logs, metrics, events, or application data by setting up a Beats module.
+[role="screenshot"]
+image::images/add-data-home.png[Built-in options for adding data to Kibana: Add data, Add Elastic Agent, Upload a file]
-* Connect {kib} with existing {es} indices.
+[float]
+[[add-data-tutorial-kibana]]
+=== Add data
-If you're not ready to use your own data, you can add a <>
-to see all that you can do in {kib}.
+Want to ingest logs, metrics, security, or application data?
+Install and configure a Beats data shipper or other module to periodically collect the data
+and send it to {es}. You can then use the pre-built dashboards to explore and analyze the data.
-[float]
-[[upload-data-kibana]]
-=== Upload a CSV, JSON, or log file
+[role="screenshot"]
+image::images/add-data-tutorials.png[Add Data tutorials]
-experimental[]
+[discrete]
+=== Add Elastic Agent
-To visualize data in a CSV, JSON, or log file, you can upload it using the File
-Data Visualizer. On the home page, click *Upload a file*, and
-then drag your file onto the *File Data Visualizer*. Alternatively, you can open
-it by navigating to *Machine Learning* from the side navigation and selecting
+beta[] *Elastic Agent* is a sneak peek at the next generation of
+data integration modules, offering
+a centralized way to set up your integrations.
+With *Fleet*, you can add
+and manage integrations for popular services and platforms, providing
+an easy way to collect your data. The integrations
+ship with dashboards and visualizations,
+so you can quickly get insights into your data.
-*Data Visualizer*.
+To get started, refer to
+{ingest-guide}/ingest-management-getting-started.html[Quick start: Get logs and metrics into the Elastic Stack].
[role="screenshot"]
-image::images/ingest-data.png[File Data Visualizer on the home page]
+image::images/add-data-fleet.png[Add data using Fleet]
+
+[discrete]
+[[upload-data-kibana]]
+=== Upload a file
-You can upload a file up to 100 MB. This value is configurable up to 1 GB in
-<>.
+experimental[] If your data is in a CSV, JSON, or log file, you can upload it using the File
+Data Visualizer. You can upload a file up to 100 MB. This value is configurable up to 1 GB in
+<>. To upload a file with geospatial data,
+refer to <>.
[role="screenshot"]
image::images/add-data-fv.png[File Data Visualizer]
-The File Data Visualizer uses the {ref}/ml-find-file-structure.html[find_file_structure API] to analyze
-the uploaded file and to suggest ingest pipelines and mappings for your data.
+
NOTE: This feature is not intended for use as part of a
repeated production process, but rather for the initial exploration of your data.
-[float]
-[[upload-geoipdata-kibana]]
-=== Upload geospatial data
-
-To visualize geospatial data in a point or shape file, you can upload it using the <>
-feature in Maps, and then use that data as a layer in a map.
-The data is also available for use in the broader Kibana ecosystem, for example,
-in visualizations and Canvas workpads.
-With GeoJSON Upload, you can upload a file up to 50 MB.
-
-[float]
-[[add-data-tutorial-kibana]]
-=== Index metrics, log, security, and application data
-The built-in data tutorials can help you quickly get up and running with
-metrics data, log analytics, security events, and application data.
-These tutorials walk you through installing and configuring a
-Beats data shipper to periodically collect and send data to {es}.
-You can then use the pre-built dashboards to explore and analyze the data.
+[discrete]
+=== Additional options for loading your data
-You access the tutorials from the home page.
-If a tutorial doesn’t exist for your data, go to the {beats-ref}/beats-reference.html[Beats overview]
-to learn about other data shippers in the Beats family.
+If the {kib} ingest options don't work for you, you can index your
+data into Elasticsearch with {ref}/getting-started-index.html[REST APIs]
+or https://www.elastic.co/guide/en/elasticsearch/client/index.html[client libraries].
+After you add your data, you're required to create an <> to tell
+{kib} where to find the data.
-[role="screenshot"]
-image::images/add-data-tutorials.png[Add Data tutorials]
-
-
-[float]
-[[connect-to-es]]
-=== Connect with {es} indices
-
-To visualize data in existing {es} indices, you must
-create an index pattern that matches the names of the indices that you want to explore.
-When you add data with the File Data Visualizer, GeoJSON Upload feature,
-or built-in tutorial, an index pattern is created for you.
-
-. Open the main menu, then click *Stack Management > Index Patterns*.
-
-. Click *Create index pattern*.
-
-. Specify an index pattern that matches the name of one or more of your Elasticsearch indices.
-+
-For example, an index pattern can point to your Apache data from yesterday,
-`filebeat-apache-4-3-2022`, or any index that matches the pattern, `filebeat-*`.
-Using a wildcard is the more popular approach.
-
-
-. Click *Next Step*, and then select the index field that contains the timestamp you want to use to perform time-based
-comparisons.
-+
-Kibana reads the index mapping and lists all fields that contain a timestamp. If your
-index doesn't have time-based data, choose *I don't want to use the time filter*.
-+
-You must select a time field to use global time filters on your dashboards.
-
-. Click *Create index pattern*.
-+
-{kib} is now configured to access your {es} indices.
-You’ll see a list of fields configured for the matching index.
-You can designate your index pattern as the default by clicking the star icon on this page.
-+
-When searching in *Discover* and creating visualizations, you choose a pattern
-from the index pattern menu to specify the {es} indices that contain the data you want to explore.
+* To add data for Elastic Observability, refer to {observability-guide}/add-observability-data.html[Send data to Elasticsearch].
+* To add data for Elastic Security, refer to https://www.elastic.co/guide/en/security/current/ingest-data.html[Ingest data to Elastic Security].
diff --git a/docs/setup/images/add-data-fleet.png b/docs/setup/images/add-data-fleet.png
new file mode 100644
index 0000000000000..b6d49cfaf8d3a
Binary files /dev/null and b/docs/setup/images/add-data-fleet.png differ
diff --git a/docs/setup/images/add-data-home-page.png b/docs/setup/images/add-data-home-page.png
new file mode 100644
index 0000000000000..a3373757683be
Binary files /dev/null and b/docs/setup/images/add-data-home-page.png differ
diff --git a/docs/setup/images/add-data-home.png b/docs/setup/images/add-data-home.png
new file mode 100644
index 0000000000000..3a844b1c40de9
Binary files /dev/null and b/docs/setup/images/add-data-home.png differ
diff --git a/docs/user/introduction.asciidoc b/docs/user/introduction.asciidoc
index 91f149d5cdb3c..9d580187edff4 100644
--- a/docs/user/introduction.asciidoc
+++ b/docs/user/introduction.asciidoc
@@ -26,30 +26,16 @@ image::images/intro-kibana.png[Kibana home page]
[[get-data-into-kibana]]
=== Ingest data
-{kib} is designed to use {es} as a data source. Think of {es} as the engine that stores
+{kib} is designed to use {es} as a data source. Think of Elasticsearch as the engine that stores
and processes the data, with {kib} sitting on top.
-From the home page, {kib} provides these options for ingesting data:
-
-* Import data using the
-https://www.elastic.co/blog/importing-csv-and-log-data-into-elasticsearch-with-file-data-visualizer[File Data visualizer].
-* Set up a data flow to Elasticsearch using our built-in tutorials.
-If a tutorial doesn’t exist for your data, go to the
-{beats-ref}/beats-reference.html[Beats overview] to learn about other data shippers
-in the {beats} family.
-* <> and take {kib} for a test drive without loading data yourself.
-* Index your data into Elasticsearch with {ref}/getting-started-index.html[REST APIs]
- or https://www.elastic.co/guide/en/elasticsearch/client/index.html[client libraries].
-+
-[role="screenshot"]
-image::images/intro-data-tutorial.png[Ways to get data in from the home page]
-
+To start working with your data in Kibana, use one of the many ingest options,
+available from the home page. You can collect data from an app or service or upload a file that contains your data.
+If you're not ready to use your own data, you can add a sample data set
+to give {kib} a test drive.
-{kib} uses an
-<> to tell it which {es} indices to explore.
-If you add upload a file, run a built-in tutorial, or add sample data, you get an index pattern for free,
-and are good to start exploring. If you load your own data, you can create
-an index pattern in <>.
+[role="screenshot"]
+image::setup/images/add-data-home.png[Built-in options for adding data to Kibana: Add data, Add Elastic Agent, Upload a file]
[float]
[[explore-and-query]]
@@ -94,7 +80,7 @@ and dynamic client-side styling.
* <> allows you to combine
an infinite number of aggregations to display complex data.
-With TSVB, you can analyze multiple index patterns and customize
+With TSVB, you can customize
every aspect of your visualization. Choose your own date format and color
gradients, and easily switch your data view between time series, metric,
top N, gauge, and markdown.
@@ -124,7 +110,7 @@ dashboards in one space, but full access to all of Kibana’s features in anothe
=== Manage all things Elastic Stack
<> provides guided processes for managing all
-things Elastic Stack — indices, clusters, licenses, UI settings, index patterns,
+things Elastic Stack — indices, clusters, licenses, UI settings,
and more. Want to update your {es} indices? Set user roles and privileges?
Turn on dark mode? Kibana has UIs for all that.
diff --git a/docs/user/management.asciidoc b/docs/user/management.asciidoc
index ee85819b4fd98..503f97aabd13f 100644
--- a/docs/user/management.asciidoc
+++ b/docs/user/management.asciidoc
@@ -39,7 +39,7 @@ quickly deploy configuration changes to all Beats running across your enterprise
[cols="50, 50"]
|===
-a| <>
+a| {ref}/index-mgmt.html[Index Management]
| View index settings, mappings, and statistics and perform operations, such as refreshing,
flushing, and clearing the cache. Practicing good index management ensures
that your data is stored cost effectively.
@@ -184,8 +184,6 @@ include::{kib-repo-dir}/management/alerting/connector-management.asciidoc[]
include::{kib-repo-dir}/management/managing-beats.asciidoc[]
-include::{kib-repo-dir}/management/managing-indices.asciidoc[]
-
include::{kib-repo-dir}/management/ingest-pipelines/ingest-pipelines.asciidoc[]
include::{kib-repo-dir}/management/managing-fields.asciidoc[]
diff --git a/docs/user/monitoring/beats-details.asciidoc b/docs/user/monitoring/beats-details.asciidoc
index 3d7a726d2f8a2..dbd9aecd04768 100644
--- a/docs/user/monitoring/beats-details.asciidoc
+++ b/docs/user/monitoring/beats-details.asciidoc
@@ -9,7 +9,7 @@ If you are monitoring Beats, the *Stack Monitoring* page in {kib} contains a
panel for Beats in the cluster overview.
[role="screenshot"]
-image::user/monitoring/images/monitoring-beats.jpg["Monitoring Beats",link="images/monitoring-beats.jpg"]
+image::user/monitoring/images/monitoring-beats.jpg["Monitoring Beats",link="user/monitoring/images/monitoring-beats.jpg"]
To view an overview of the Beats data in the cluster, click *Overview*. The
overview page has a section for activity in the last day, which is a real-time
@@ -24,7 +24,7 @@ cluster. All columns are sortable. Clicking a Beat name takes you to the detail
page. For example:
[role="screenshot"]
-image::user/monitoring/images/monitoring-beats-detail.jpg["Monitoring details for Filebeat",link="images/monitoring-beats-detail.jpg"]
+image::user/monitoring/images/monitoring-beats-detail.jpg["Monitoring details for Filebeat",link="user/monitoring/images/monitoring-beats-detail.jpg"]
The detail page contains a summary bar and charts. There are more charts on this
page than the overview page and they are specific to a single Beat instance.
diff --git a/examples/bfetch_explorer/README.md b/examples/bfetch_explorer/README.md
new file mode 100644
index 0000000000000..33723e7cabe07
--- /dev/null
+++ b/examples/bfetch_explorer/README.md
@@ -0,0 +1,11 @@
+## bfetch explorer
+
+bfetch is a service that allows you to batch HTTP requests and stream responses
+back.
+
+This example app demonstrates:
+ - How you can create a streaming response route and consume it from the
+ client
+ - How you can create a batch processing route and consume it from the client
+
+To run this example, use the command `yarn start --run-examples`.
diff --git a/examples/embeddable_examples/README.md b/examples/embeddable_examples/README.md
new file mode 100644
index 0000000000000..d05c315d31817
--- /dev/null
+++ b/examples/embeddable_examples/README.md
@@ -0,0 +1,4 @@
+## Embeddable examples
+
+This example plugin exists to support the `embeddable_explorer` app.
+
diff --git a/examples/embeddable_explorer/README.md b/examples/embeddable_explorer/README.md
new file mode 100644
index 0000000000000..0425790f07487
--- /dev/null
+++ b/examples/embeddable_explorer/README.md
@@ -0,0 +1,10 @@
+## Embeddable explorer
+
+This example app shows how to:
+ - Create a basic "hello world" embeddable
+ - Create embeddables that accept inputs and use an EmbeddableRenderer
+ - Nest embeddables inside a container
+ - Dynamically add children to embeddable containers
+ - Work with the EmbeddablePanel component
+
+To run this example, use the command `yarn start --run-examples`.
diff --git a/examples/state_containers_examples/README.md b/examples/state_containers_examples/README.md
new file mode 100644
index 0000000000000..c4c6642789bd9
--- /dev/null
+++ b/examples/state_containers_examples/README.md
@@ -0,0 +1,8 @@
+## State containers examples
+
+This example app shows how to:
+ - Use state containers to manage your application state
+ - Integrate with browser history and hash history routing
+ - Sync your state container with the URL
+
+To run this example, use the command `yarn start --run-examples`.
diff --git a/package.json b/package.json
index 3a2d13fd5ef3b..a613a7a9337bd 100644
--- a/package.json
+++ b/package.json
@@ -77,6 +77,10 @@
"url": "https://github.com/elastic/kibana.git"
},
"resolutions": {
+ "**/@hapi/iron": "^5.1.4",
+ "**/@types/hapi__boom": "^7.4.1",
+ "**/@types/hapi__hapi": "^18.2.6",
+ "**/@types/hapi__mimos": "4.1.0",
"**/@types/node": ">=10.17.17 <10.20.0",
"**/cross-fetch/node-fetch": "^2.6.1",
"**/deepmerge": "^4.2.2",
@@ -110,19 +114,30 @@
"**/grunt-*/**",
"x-pack/typescript",
"@elastic/eui/rehype-react",
+ "@elastic/eui/remark-parse",
"@elastic/eui/remark-rehype",
- "@elastic/eui/remark-rehype/**"
+ "@elastic/eui/remark-rehype/**",
+ "@elastic/eui/unified"
]
},
"dependencies": {
"@elastic/datemath": "5.0.3",
"@elastic/elasticsearch": "7.10.0-rc.1",
- "@elastic/eui": "29.5.0",
+ "@elastic/eui": "30.1.1",
"@elastic/good": "8.1.1-kibana2",
"@elastic/numeral": "^2.5.0",
"@elastic/request-crypto": "1.1.4",
"@elastic/safer-lodash-set": "0.0.0",
+ "@hapi/boom": "^7.4.11",
+ "@hapi/cookie": "^10.1.2",
"@hapi/good-squeeze": "5.2.1",
+ "@hapi/h2o2": "^8.3.2",
+ "@hapi/hapi": "^18.4.1",
+ "@hapi/hoek": "^8.5.1",
+ "@hapi/inert": "^5.2.2",
+ "@hapi/podium": "^3.4.3",
+ "@hapi/statehood": "^6.1.2",
+ "@hapi/vision": "^5.5.4",
"@hapi/wreck": "^15.0.2",
"@kbn/ace": "1.0.0",
"@kbn/analytics": "1.0.0",
@@ -145,7 +160,6 @@
"angular-elastic": "^2.5.1",
"angular-sanitize": "^1.8.0",
"bluebird": "3.5.5",
- "boom": "^7.2.0",
"chalk": "^4.1.0",
"check-disk-space": "^2.1.0",
"chokidar": "^3.4.2",
@@ -165,15 +179,10 @@
"glob": "^7.1.2",
"glob-all": "^3.2.1",
"globby": "^8.0.1",
- "h2o2": "^8.1.2",
"handlebars": "4.7.6",
- "hapi": "^17.5.3",
- "hapi-auth-cookie": "^9.0.0",
"hjson": "3.2.1",
- "hoek": "^5.0.4",
"http-proxy-agent": "^2.1.0",
"https-proxy-agent": "^5.0.0",
- "inert": "^5.1.0",
"inline-style": "^2.0.0",
"joi": "^13.5.2",
"js-yaml": "^3.14.0",
@@ -218,7 +227,6 @@
"tslib": "^2.0.0",
"type-detect": "^4.0.8",
"uuid": "3.3.2",
- "vision": "^5.3.3",
"whatwg-fetch": "^3.0.0",
"yauzl": "^2.10.0"
},
@@ -272,7 +280,6 @@
"@types/archiver": "^3.1.0",
"@types/babel__core": "^7.1.10",
"@types/bluebird": "^3.1.1",
- "@types/boom": "^7.2.0",
"@types/chance": "^1.0.0",
"@types/cheerio": "^0.22.10",
"@types/chromedriver": "^81.0.0",
@@ -292,14 +299,16 @@
"@types/glob": "^7.1.2",
"@types/globby": "^8.0.0",
"@types/graphql": "^0.13.2",
- "@types/h2o2": "^8.1.1",
- "@types/hapi": "^17.0.18",
- "@types/hapi-auth-cookie": "^9.1.0",
+ "@types/hapi__boom": "^7.4.1",
+ "@types/hapi__cookie": "^10.1.1",
+ "@types/hapi__h2o2": "8.3.0",
+ "@types/hapi__hapi": "^18.2.6",
+ "@types/hapi__hoek": "^6.2.0",
+ "@types/hapi__inert": "^5.2.1",
+ "@types/hapi__podium": "^3.4.1",
"@types/has-ansi": "^3.0.0",
"@types/history": "^4.7.3",
"@types/hjson": "^2.4.2",
- "@types/hoek": "^4.1.3",
- "@types/inert": "^5.1.2",
"@types/jest": "^26.0.14",
"@types/jest-when": "^2.7.1",
"@types/joi": "^13.4.2",
@@ -324,7 +333,6 @@
"@types/opn": "^5.1.0",
"@types/pegjs": "^0.10.1",
"@types/pngjs": "^3.4.0",
- "@types/podium": "^1.0.0",
"@types/prop-types": "^15.7.3",
"@types/reach__router": "^1.2.6",
"@types/react": "^16.9.36",
diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml
index 3f9fdb164e759..770bb4f510301 100644
--- a/packages/kbn-optimizer/limits.yml
+++ b/packages/kbn-optimizer/limits.yml
@@ -54,7 +54,7 @@ pageLoadAssetSize:
mapsLegacy: 116817
mapsLegacyLicensing: 20214
ml: 82187
- monitoring: 268612
+ monitoring: 50000
navigation: 37269
newsfeed: 42228
observability: 89709
diff --git a/packages/kbn-telemetry-tools/GUIDELINE.md b/packages/kbn-telemetry-tools/GUIDELINE.md
index e7d09babbf9e2..a22196bb5dc74 100644
--- a/packages/kbn-telemetry-tools/GUIDELINE.md
+++ b/packages/kbn-telemetry-tools/GUIDELINE.md
@@ -148,14 +148,7 @@ usageCollection.makeUsageCollector({
Any field property in the schema accepts a `type` field. By default the type is `object` which accepts nested properties under it. Currently we accept the following property types:
```
-AllowedSchemaTypes =
- | 'keyword'
- | 'text'
- | 'number'
- | 'boolean'
- | 'long'
- | 'date'
- | 'float';
+'long', 'integer', 'short', 'byte', 'double', 'float', 'keyword', 'text', 'boolean', 'date'
```
diff --git a/packages/kbn-telemetry-tools/src/tools/__fixture__/mock_schema.json b/packages/kbn-telemetry-tools/src/tools/__fixture__/mock_schema.json
index 51e5df9bf7dc0..a385cd6798365 100644
--- a/packages/kbn-telemetry-tools/src/tools/__fixture__/mock_schema.json
+++ b/packages/kbn-telemetry-tools/src/tools/__fixture__/mock_schema.json
@@ -8,16 +8,16 @@
"my_index_signature_prop": {
"properties": {
"avg": {
- "type": "number"
+ "type": "float"
},
"count": {
- "type": "number"
+ "type": "long"
},
"max": {
- "type": "number"
+ "type": "long"
},
"min": {
- "type": "number"
+ "type": "long"
}
}
},
@@ -27,7 +27,7 @@
"my_objects": {
"properties": {
"total": {
- "type": "number"
+ "type": "long"
},
"type": {
"type": "boolean"
@@ -39,7 +39,7 @@
"items": {
"properties": {
"total": {
- "type": "number"
+ "type": "long"
},
"type": {
"type": "boolean"
diff --git a/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_indexed_interface_with_not_matching_schema.ts b/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_indexed_interface_with_not_matching_schema.ts
index 83866a2b6afec..109fc045b6ee0 100644
--- a/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_indexed_interface_with_not_matching_schema.ts
+++ b/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_indexed_interface_with_not_matching_schema.ts
@@ -28,7 +28,7 @@ export const parsedIndexedInterfaceWithNoMatchingSchema: ParsedUsageCollection =
value: {
something: {
count_1: {
- type: 'number',
+ type: 'long',
},
},
},
diff --git a/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_schema_defined_with_spreads_collector.ts b/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_schema_defined_with_spreads_collector.ts
index 833344fa368b0..4a1a622e23f36 100644
--- a/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_schema_defined_with_spreads_collector.ts
+++ b/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_schema_defined_with_spreads_collector.ts
@@ -34,7 +34,7 @@ export const parsedSchemaDefinedWithSpreadsCollector: ParsedUsageCollection = [
},
my_objects: {
total: {
- type: 'number',
+ type: 'long',
},
type: {
type: 'boolean',
diff --git a/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_working_collector.ts b/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_working_collector.ts
index acf984b7d10ee..ef6227cf35c37 100644
--- a/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_working_collector.ts
+++ b/packages/kbn-telemetry-tools/src/tools/__fixture__/parsed_working_collector.ts
@@ -34,21 +34,21 @@ export const parsedWorkingCollector: ParsedUsageCollection = [
},
my_index_signature_prop: {
avg: {
- type: 'number',
+ type: 'float',
},
count: {
- type: 'number',
+ type: 'long',
},
max: {
- type: 'number',
+ type: 'long',
},
min: {
- type: 'number',
+ type: 'long',
},
},
my_objects: {
total: {
- type: 'number',
+ type: 'long',
},
type: {
type: 'boolean',
@@ -58,7 +58,7 @@ export const parsedWorkingCollector: ParsedUsageCollection = [
type: 'array',
items: {
total: {
- type: 'number',
+ type: 'long',
},
type: { type: 'boolean' },
},
diff --git a/packages/kbn-telemetry-tools/src/tools/__snapshots__/extract_collectors.test.ts.snap b/packages/kbn-telemetry-tools/src/tools/__snapshots__/extract_collectors.test.ts.snap
index 4725be77533af..fe589be7993d0 100644
--- a/packages/kbn-telemetry-tools/src/tools/__snapshots__/extract_collectors.test.ts.snap
+++ b/packages/kbn-telemetry-tools/src/tools/__snapshots__/extract_collectors.test.ts.snap
@@ -176,7 +176,7 @@ Array [
},
"my_objects": Object {
"total": Object {
- "type": "number",
+ "type": "long",
},
"type": Object {
"type": "boolean",
@@ -248,7 +248,7 @@ Array [
"my_array": Object {
"items": Object {
"total": Object {
- "type": "number",
+ "type": "long",
},
"type": Object {
"type": "boolean",
@@ -258,21 +258,21 @@ Array [
},
"my_index_signature_prop": Object {
"avg": Object {
- "type": "number",
+ "type": "float",
},
"count": Object {
- "type": "number",
+ "type": "long",
},
"max": Object {
- "type": "number",
+ "type": "long",
},
"min": Object {
- "type": "number",
+ "type": "long",
},
},
"my_objects": Object {
"total": Object {
- "type": "number",
+ "type": "long",
},
"type": Object {
"type": "boolean",
diff --git a/packages/kbn-telemetry-tools/src/tools/check_collector__integrity.test.ts b/packages/kbn-telemetry-tools/src/tools/check_collector__integrity.test.ts
index a101210185a63..b6ea9d49cf6d0 100644
--- a/packages/kbn-telemetry-tools/src/tools/check_collector__integrity.test.ts
+++ b/packages/kbn-telemetry-tools/src/tools/check_collector__integrity.test.ts
@@ -44,7 +44,7 @@ describe('checkMatchingMapping', () => {
it('returns diff on mismatching parsedCollections and stored mapping', async () => {
const mockSchema = await parseJsonFile('mock_schema.json');
const malformedParsedCollector = cloneDeep(parsedWorkingCollector);
- const fieldMapping = { type: 'number' };
+ const fieldMapping = { type: 'long' };
malformedParsedCollector[1].schema.value.flat = fieldMapping;
const diffs = checkMatchingMapping([malformedParsedCollector], mockSchema);
@@ -61,9 +61,9 @@ describe('checkMatchingMapping', () => {
const mockSchema = await parseJsonFile('mock_schema.json');
const malformedParsedCollector = cloneDeep(parsedWorkingCollector);
const collectorName = 'New Collector in town!';
- const collectorMapping = { some_usage: { type: 'number' } };
+ const collectorMapping = { some_usage: { type: 'long' } };
malformedParsedCollector[1].collectorName = collectorName;
- malformedParsedCollector[1].schema.value = { some_usage: { type: 'number' } };
+ malformedParsedCollector[1].schema.value = { some_usage: { type: 'long' } };
const diffs = checkMatchingMapping([malformedParsedCollector], mockSchema);
expect(diffs).toEqual({
diff --git a/packages/kbn-telemetry-tools/src/tools/manage_schema.ts b/packages/kbn-telemetry-tools/src/tools/manage_schema.ts
index 7721492fdb691..e2bfca34a6487 100644
--- a/packages/kbn-telemetry-tools/src/tools/manage_schema.ts
+++ b/packages/kbn-telemetry-tools/src/tools/manage_schema.ts
@@ -19,14 +19,9 @@
import { ParsedUsageCollection } from './ts_parser';
-export type AllowedSchemaTypes =
- | 'keyword'
- | 'text'
- | 'number'
- | 'boolean'
- | 'long'
- | 'date'
- | 'float';
+export type AllowedSchemaNumberTypes = 'long' | 'integer' | 'short' | 'byte' | 'double' | 'float';
+
+export type AllowedSchemaTypes = AllowedSchemaNumberTypes | 'keyword' | 'text' | 'boolean' | 'date';
export function compatibleSchemaTypes(type: AllowedSchemaTypes | 'array') {
switch (type) {
@@ -36,9 +31,12 @@ export function compatibleSchemaTypes(type: AllowedSchemaTypes | 'array') {
return 'string';
case 'boolean':
return 'boolean';
- case 'number':
- case 'float':
case 'long':
+ case 'integer':
+ case 'short':
+ case 'byte':
+ case 'double':
+ case 'float':
return 'number';
case 'array':
return 'array';
diff --git a/packages/kbn-ui-framework/package.json b/packages/kbn-ui-framework/package.json
index d954ae0823caf..b47adb29f1e68 100644
--- a/packages/kbn-ui-framework/package.json
+++ b/packages/kbn-ui-framework/package.json
@@ -31,7 +31,7 @@
},
"devDependencies": {
"@babel/core": "^7.11.6",
- "@elastic/eui": "29.5.0",
+ "@elastic/eui": "30.1.1",
"@kbn/babel-preset": "1.0.0",
"@kbn/optimizer": "1.0.0",
"babel-loader": "^8.0.6",
diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json
index b1b5d6e2b419e..e6883be307bb2 100644
--- a/packages/kbn-ui-shared-deps/package.json
+++ b/packages/kbn-ui-shared-deps/package.json
@@ -10,7 +10,7 @@
},
"dependencies": {
"@elastic/charts": "24.0.0",
- "@elastic/eui": "29.5.0",
+ "@elastic/eui": "30.1.1",
"@elastic/numeral": "^2.5.0",
"@kbn/i18n": "1.0.0",
"@kbn/monaco": "1.0.0",
diff --git a/src/core/public/chrome/chrome_service.mock.ts b/src/core/public/chrome/chrome_service.mock.ts
index cbcd23615d34c..6df8d57c8c574 100644
--- a/src/core/public/chrome/chrome_service.mock.ts
+++ b/src/core/public/chrome/chrome_service.mock.ts
@@ -63,6 +63,8 @@ const createStartContractMock = () => {
setBadge: jest.fn(),
getBreadcrumbs$: jest.fn(),
setBreadcrumbs: jest.fn(),
+ getBreadcrumbsAppendExtension$: jest.fn(),
+ setBreadcrumbsAppendExtension: jest.fn(),
getHelpExtension$: jest.fn(),
setHelpExtension: jest.fn(),
setHelpSupportUrl: jest.fn(),
@@ -76,6 +78,7 @@ const createStartContractMock = () => {
startContract.getApplicationClasses$.mockReturnValue(new BehaviorSubject(['class-name']));
startContract.getBadge$.mockReturnValue(new BehaviorSubject({} as ChromeBadge));
startContract.getBreadcrumbs$.mockReturnValue(new BehaviorSubject([{} as ChromeBreadcrumb]));
+ startContract.getBreadcrumbsAppendExtension$.mockReturnValue(new BehaviorSubject(undefined));
startContract.getCustomNavLink$.mockReturnValue(new BehaviorSubject(undefined));
startContract.getHelpExtension$.mockReturnValue(new BehaviorSubject(undefined));
startContract.getIsNavDrawerLocked$.mockReturnValue(new BehaviorSubject(false));
diff --git a/src/core/public/chrome/chrome_service.test.ts b/src/core/public/chrome/chrome_service.test.ts
index 0150554a60906..3783f3bd9b65e 100644
--- a/src/core/public/chrome/chrome_service.test.ts
+++ b/src/core/public/chrome/chrome_service.test.ts
@@ -363,6 +363,25 @@ describe('start', () => {
});
});
+ describe('breadcrumbsAppendExtension$', () => {
+ it('updates the breadcrumbsAppendExtension$', async () => {
+ const { chrome, service } = await start();
+ const promise = chrome.getBreadcrumbsAppendExtension$().pipe(toArray()).toPromise();
+
+ chrome.setBreadcrumbsAppendExtension({ content: (element) => () => {} });
+ service.stop();
+
+ await expect(promise).resolves.toMatchInlineSnapshot(`
+ Array [
+ undefined,
+ Object {
+ "content": [Function],
+ },
+ ]
+ `);
+ });
+ });
+
describe('custom nav link', () => {
it('updates/emits the current custom nav link', async () => {
const { chrome, service } = await start();
@@ -429,33 +448,33 @@ describe('start', () => {
expect(docTitleResetSpy).toBeCalledTimes(1);
await expect(promises).resolves.toMatchInlineSnapshot(`
- Array [
- Array [
- undefined,
- Object {
- "appName": "App name",
- },
- undefined,
- ],
- Array [
- Array [],
- Array [
- Object {
- "text": "App breadcrumb",
- },
- ],
- Array [],
- ],
- Array [
- undefined,
- Object {
- "text": "App badge",
- "tooltip": "App tooltip",
- },
- undefined,
- ],
- ]
- `);
+ Array [
+ Array [
+ undefined,
+ Object {
+ "appName": "App name",
+ },
+ undefined,
+ ],
+ Array [
+ Array [],
+ Array [
+ Object {
+ "text": "App breadcrumb",
+ },
+ ],
+ Array [],
+ ],
+ Array [
+ undefined,
+ Object {
+ "text": "App badge",
+ "tooltip": "App tooltip",
+ },
+ undefined,
+ ],
+ ]
+ `);
});
});
});
diff --git a/src/core/public/chrome/chrome_service.tsx b/src/core/public/chrome/chrome_service.tsx
index b01f120b81305..b39c83498859c 100644
--- a/src/core/public/chrome/chrome_service.tsx
+++ b/src/core/public/chrome/chrome_service.tsx
@@ -24,6 +24,7 @@ import { BehaviorSubject, combineLatest, merge, Observable, of, ReplaySubject }
import { flatMap, map, takeUntil } from 'rxjs/operators';
import { parse } from 'url';
import { EuiLink } from '@elastic/eui';
+import { MountPoint } from '../types';
import { mountReactNode } from '../utils/mount';
import { InternalApplicationStart } from '../application';
import { DocLinksStart } from '../doc_links';
@@ -58,6 +59,11 @@ export interface ChromeBrand {
/** @public */
export type ChromeBreadcrumb = EuiBreadcrumb;
+/** @public */
+export interface ChromeBreadcrumbsAppendExtension {
+ content: MountPoint;
+}
+
/** @public */
export interface ChromeHelpExtension {
/**
@@ -146,6 +152,9 @@ export class ChromeService {
const applicationClasses$ = new BehaviorSubject>(new Set());
const helpExtension$ = new BehaviorSubject(undefined);
const breadcrumbs$ = new BehaviorSubject([]);
+ const breadcrumbsAppendExtension$ = new BehaviorSubject<
+ ChromeBreadcrumbsAppendExtension | undefined
+ >(undefined);
const badge$ = new BehaviorSubject(undefined);
const customNavLink$ = new BehaviorSubject(undefined);
const helpSupportUrl$ = new BehaviorSubject(KIBANA_ASK_ELASTIC_LINK);
@@ -225,6 +234,7 @@ export class ChromeService {
badge$={badge$.pipe(takeUntil(this.stop$))}
basePath={http.basePath}
breadcrumbs$={breadcrumbs$.pipe(takeUntil(this.stop$))}
+ breadcrumbsAppendExtension$={breadcrumbsAppendExtension$.pipe(takeUntil(this.stop$))}
customNavLink$={customNavLink$.pipe(takeUntil(this.stop$))}
kibanaDocLink={docLinks.links.kibana}
forceAppSwitcherNavigation$={navLinks.getForceAppSwitcherNavigation$()}
@@ -290,6 +300,14 @@ export class ChromeService {
breadcrumbs$.next(newBreadcrumbs);
},
+ getBreadcrumbsAppendExtension$: () => breadcrumbsAppendExtension$.pipe(takeUntil(this.stop$)),
+
+ setBreadcrumbsAppendExtension: (
+ breadcrumbsAppendExtension?: ChromeBreadcrumbsAppendExtension
+ ) => {
+ breadcrumbsAppendExtension$.next(breadcrumbsAppendExtension);
+ },
+
getHelpExtension$: () => helpExtension$.pipe(takeUntil(this.stop$)),
setHelpExtension: (helpExtension?: ChromeHelpExtension) => {
@@ -431,6 +449,18 @@ export interface ChromeStart {
*/
setBreadcrumbs(newBreadcrumbs: ChromeBreadcrumb[]): void;
+ /**
+ * Get an observable of the current extension appended to breadcrumbs
+ */
+ getBreadcrumbsAppendExtension$(): Observable;
+
+ /**
+ * Mount an element next to the last breadcrumb
+ */
+ setBreadcrumbsAppendExtension(
+ breadcrumbsAppendExtension?: ChromeBreadcrumbsAppendExtension
+ ): void;
+
/**
* Get an observable of the current custom nav link
*/
diff --git a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap
index 34c5f213a7221..ee2fcbd5078af 100644
--- a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap
+++ b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap
@@ -300,6 +300,55 @@ exports[`Header renders 1`] = `
"thrownError": null,
}
}
+ breadcrumbsAppendExtension$={
+ BehaviorSubject {
+ "_isScalar": false,
+ "_value": undefined,
+ "closed": false,
+ "hasError": false,
+ "isStopped": false,
+ "observers": Array [
+ Subscriber {
+ "_parentOrParents": null,
+ "_subscriptions": Array [
+ SubjectSubscription {
+ "_parentOrParents": [Circular],
+ "_subscriptions": null,
+ "closed": false,
+ "subject": [Circular],
+ "subscriber": [Circular],
+ },
+ ],
+ "closed": false,
+ "destination": SafeSubscriber {
+ "_complete": undefined,
+ "_context": [Circular],
+ "_error": undefined,
+ "_next": [Function],
+ "_parentOrParents": null,
+ "_parentSubscriber": [Circular],
+ "_subscriptions": null,
+ "closed": false,
+ "destination": Object {
+ "closed": true,
+ "complete": [Function],
+ "error": [Function],
+ "next": [Function],
+ },
+ "isStopped": false,
+ "syncErrorThrowable": false,
+ "syncErrorThrown": false,
+ "syncErrorValue": null,
+ },
+ "isStopped": false,
+ "syncErrorThrowable": true,
+ "syncErrorThrown": false,
+ "syncErrorValue": null,
+ },
+ ],
+ "thrownError": null,
+ }
+ }
customNavLink$={
BehaviorSubject {
"_isScalar": false,
@@ -5029,6 +5078,55 @@ exports[`Header renders 1`] = `
"thrownError": null,
}
}
+ breadcrumbsAppendExtension$={
+ BehaviorSubject {
+ "_isScalar": false,
+ "_value": undefined,
+ "closed": false,
+ "hasError": false,
+ "isStopped": false,
+ "observers": Array [
+ Subscriber {
+ "_parentOrParents": null,
+ "_subscriptions": Array [
+ SubjectSubscription {
+ "_parentOrParents": [Circular],
+ "_subscriptions": null,
+ "closed": false,
+ "subject": [Circular],
+ "subscriber": [Circular],
+ },
+ ],
+ "closed": false,
+ "destination": SafeSubscriber {
+ "_complete": undefined,
+ "_context": [Circular],
+ "_error": undefined,
+ "_next": [Function],
+ "_parentOrParents": null,
+ "_parentSubscriber": [Circular],
+ "_subscriptions": null,
+ "closed": false,
+ "destination": Object {
+ "closed": true,
+ "complete": [Function],
+ "error": [Function],
+ "next": [Function],
+ },
+ "isStopped": false,
+ "syncErrorThrowable": false,
+ "syncErrorThrown": false,
+ "syncErrorValue": null,
+ },
+ "isStopped": false,
+ "syncErrorThrowable": true,
+ "syncErrorThrown": false,
+ "syncErrorValue": null,
+ },
+ ],
+ "thrownError": null,
+ }
+ }
>
;
badge$: Observable;
breadcrumbs$: Observable;
+ breadcrumbsAppendExtension$: Observable;
customNavLink$: Observable;
homeHref: string;
isVisible$: Observable;
@@ -169,6 +170,7 @@ export function Header({
diff --git a/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx b/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx
index 7fe2c91087090..64401171d142a 100644
--- a/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx
+++ b/src/core/public/chrome/ui/header/header_breadcrumbs.test.tsx
@@ -22,12 +22,17 @@ import React from 'react';
import { act } from 'react-dom/test-utils';
import { BehaviorSubject } from 'rxjs';
import { HeaderBreadcrumbs } from './header_breadcrumbs';
+import { ChromeBreadcrumbsAppendExtension } from '../../chrome_service';
describe('HeaderBreadcrumbs', () => {
it('renders updates to the breadcrumbs$ observable', () => {
const breadcrumbs$ = new BehaviorSubject([{ text: 'First' }]);
const wrapper = mount(
-
+
);
expect(wrapper.find('.euiBreadcrumb')).toMatchSnapshot();
@@ -39,4 +44,29 @@ describe('HeaderBreadcrumbs', () => {
wrapper.update();
expect(wrapper.find('.euiBreadcrumb')).toMatchSnapshot();
});
+
+ it('renders breadcrumbs extension', () => {
+ const breadcrumbs$ = new BehaviorSubject([{ text: 'First' }]);
+ const breadcrumbsAppendExtension$ = new BehaviorSubject<
+ undefined | ChromeBreadcrumbsAppendExtension
+ >({
+ content: (root: HTMLDivElement) => {
+ root.innerHTML = '
__render__
';
+ return () => (root.innerHTML = '');
+ },
+ });
+
+ const wrapper = mount(
+
+ );
+
+ expect(wrapper.find('.euiBreadcrumb').getDOMNode().querySelector('my-extension')).toBeDefined();
+ act(() => breadcrumbsAppendExtension$.next(undefined));
+ wrapper.update();
+ expect(wrapper.find('.euiBreadcrumb').getDOMNode().querySelector('my-extension')).toBeNull();
+ });
});
diff --git a/src/core/public/chrome/ui/header/header_breadcrumbs.tsx b/src/core/public/chrome/ui/header/header_breadcrumbs.tsx
index 52412f8990c7a..d52faa87cfecd 100644
--- a/src/core/public/chrome/ui/header/header_breadcrumbs.tsx
+++ b/src/core/public/chrome/ui/header/header_breadcrumbs.tsx
@@ -22,16 +22,19 @@ import classNames from 'classnames';
import React from 'react';
import useObservable from 'react-use/lib/useObservable';
import { Observable } from 'rxjs';
-import { ChromeBreadcrumb } from '../../chrome_service';
+import { ChromeBreadcrumb, ChromeBreadcrumbsAppendExtension } from '../../chrome_service';
+import { HeaderExtension } from './header_extension';
interface Props {
appTitle$: Observable;
breadcrumbs$: Observable;
+ breadcrumbsAppendExtension$: Observable;
}
-export function HeaderBreadcrumbs({ appTitle$, breadcrumbs$ }: Props) {
+export function HeaderBreadcrumbs({ appTitle$, breadcrumbs$, breadcrumbsAppendExtension$ }: Props) {
const appTitle = useObservable(appTitle$, 'Kibana');
const breadcrumbs = useObservable(breadcrumbs$, []);
+ const breadcrumbsAppendExtension = useObservable(breadcrumbsAppendExtension$);
let crumbs = breadcrumbs;
if (breadcrumbs.length === 0 && appTitle) {
@@ -48,5 +51,15 @@ export function HeaderBreadcrumbs({ appTitle$, breadcrumbs$ }: Props) {
),
}));
+ if (breadcrumbsAppendExtension) {
+ const lastCrumb = crumbs[crumbs.length - 1];
+ lastCrumb.text = (
+ <>
+ {lastCrumb.text}
+
+ >
+ );
+ }
+
return ;
}
diff --git a/src/core/public/chrome/ui/header/header_extension.test.tsx b/src/core/public/chrome/ui/header/header_extension.test.tsx
index 3d5678b8bb7ef..ba00c74b81cfa 100644
--- a/src/core/public/chrome/ui/header/header_extension.test.tsx
+++ b/src/core/public/chrome/ui/header/header_extension.test.tsx
@@ -32,6 +32,14 @@ describe('HeaderExtension', () => {
expect(divNode).toBeInstanceOf(HTMLElement);
});
+ it('calls navControl.render with div node as inlineBlock', () => {
+ const renderSpy = jest.fn();
+ mount();
+
+ const [divNode] = renderSpy.mock.calls[0];
+ expect(divNode).toHaveAttribute('style', 'display: inline-block;');
+ });
+
it('calls unrender callback when unmounted', () => {
const unrenderSpy = jest.fn();
const render = () => unrenderSpy;
diff --git a/src/core/public/chrome/ui/header/header_extension.tsx b/src/core/public/chrome/ui/header/header_extension.tsx
index 76413a0ea0317..97cf38f44c3f1 100644
--- a/src/core/public/chrome/ui/header/header_extension.tsx
+++ b/src/core/public/chrome/ui/header/header_extension.tsx
@@ -22,6 +22,7 @@ import { MountPoint } from '../../../types';
interface Props {
extension?: MountPoint;
+ display?: 'block' | 'inlineBlock';
}
export class HeaderExtension extends React.Component {
@@ -46,7 +47,12 @@ export class HeaderExtension extends React.Component {
}
public render() {
- return ;
+ return (
+
+ );
}
private renderExtension() {
diff --git a/src/core/public/chrome/ui/header/recent_links.tsx b/src/core/public/chrome/ui/header/recent_links.tsx
deleted file mode 100644
index 0e068a3465b0e..0000000000000
--- a/src/core/public/chrome/ui/header/recent_links.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import React from 'react';
-import { i18n } from '@kbn/i18n';
-import { EuiNavDrawerGroup } from '@elastic/eui';
-import { RecentNavLink } from './nav_link';
-
-interface Props {
- recentNavLinks: RecentNavLink[];
-}
-
-export function RecentLinks({ recentNavLinks }: Props) {
- return (
-
- );
-}
diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md
index f52d5b6fbd6a5..da4a7f446add7 100644
--- a/src/core/public/public.api.md
+++ b/src/core/public/public.api.md
@@ -6,7 +6,7 @@
import { Action } from 'history';
import { ApiResponse } from '@elastic/elasticsearch/lib/Transport';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { ConfigPath } from '@kbn/config';
import { EnvironmentMode } from '@kbn/config';
import { EuiBreadcrumb } from '@elastic/eui';
@@ -343,6 +343,8 @@ export interface ChromeStart {
getBadge$(): Observable;
getBrand$(): Observable;
getBreadcrumbs$(): Observable;
+ // Warning: (ae-forgotten-export) The symbol "ChromeBreadcrumbsAppendExtension" needs to be exported by the entry point index.d.ts
+ getBreadcrumbsAppendExtension$(): Observable;
getCustomNavLink$(): Observable | undefined>;
getHelpExtension$(): Observable;
getIsNavDrawerLocked$(): Observable;
@@ -355,6 +357,7 @@ export interface ChromeStart {
setBadge(badge?: ChromeBadge): void;
setBrand(brand: ChromeBrand): void;
setBreadcrumbs(newBreadcrumbs: ChromeBreadcrumb[]): void;
+ setBreadcrumbsAppendExtension(breadcrumbsAppendExtension?: ChromeBreadcrumbsAppendExtension): void;
setCustomNavLink(newCustomNavLink?: Partial): void;
setHelpExtension(helpExtension?: ChromeHelpExtension): void;
setHelpSupportUrl(url: string): void;
diff --git a/src/core/server/elasticsearch/legacy/errors.test.ts b/src/core/server/elasticsearch/legacy/errors.test.ts
index 85e5eba721b34..4b315bf8aff45 100644
--- a/src/core/server/elasticsearch/legacy/errors.test.ts
+++ b/src/core/server/elasticsearch/legacy/errors.test.ts
@@ -17,7 +17,7 @@
* under the License.
*/
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { LegacyElasticsearchErrorHelpers } from './errors';
diff --git a/src/core/server/elasticsearch/legacy/errors.ts b/src/core/server/elasticsearch/legacy/errors.ts
index de4d2739977bb..e557e7395fe56 100644
--- a/src/core/server/elasticsearch/legacy/errors.ts
+++ b/src/core/server/elasticsearch/legacy/errors.ts
@@ -17,7 +17,7 @@
* under the License.
*/
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { get } from 'lodash';
const code = Symbol('ElasticsearchError');
diff --git a/src/core/server/http/base_path_proxy_server.ts b/src/core/server/http/base_path_proxy_server.ts
index acb83962bd457..42841377e7369 100644
--- a/src/core/server/http/base_path_proxy_server.ts
+++ b/src/core/server/http/base_path_proxy_server.ts
@@ -22,8 +22,8 @@ import { Agent as HttpsAgent, ServerOptions as TlsOptions } from 'https';
import apm from 'elastic-apm-node';
import { ByteSizeValue } from '@kbn/config-schema';
-import { Server, Request } from 'hapi';
-import HapiProxy from 'h2o2';
+import { Server, Request } from '@hapi/hapi';
+import HapiProxy from '@hapi/h2o2';
import { sampleSize } from 'lodash';
import * as Rx from 'rxjs';
import { take } from 'rxjs/operators';
diff --git a/src/core/server/http/cookie_session_storage.ts b/src/core/server/http/cookie_session_storage.ts
index 5ca70045f81db..1ff0670d78f4e 100644
--- a/src/core/server/http/cookie_session_storage.ts
+++ b/src/core/server/http/cookie_session_storage.ts
@@ -17,10 +17,10 @@
* under the License.
*/
-import { Request, Server } from 'hapi';
-import hapiAuthCookie from 'hapi-auth-cookie';
+import { Request, Server } from '@hapi/hapi';
+import hapiAuthCookie from '@hapi/cookie';
// @ts-expect-error no TS definitions
-import Statehood from 'statehood';
+import Statehood from '@hapi/statehood';
import { KibanaRequest, ensureRawRequest } from './router';
import { SessionStorageFactory, SessionStorage } from './session_storage';
@@ -80,7 +80,7 @@ class ScopedCookieSessionStorage> implements Sessi
const session = await this.server.auth.test('security-cookie', this.request);
// A browser can send several cookies, if it's not an array, just return the session value
if (!Array.isArray(session)) {
- return session as T;
+ return session.credentials as T;
}
// If we have an array with one value, we're good also
@@ -141,20 +141,22 @@ export async function createCookieSessionStorageFactory(
await server.register({ plugin: hapiAuthCookie });
server.auth.strategy('security-cookie', 'cookie', {
- cookie: cookieOptions.name,
- password: cookieOptions.encryptionKey,
- validateFunc: async (req, session: T | T[]) => {
+ cookie: {
+ name: cookieOptions.name,
+ password: cookieOptions.encryptionKey,
+ isSecure: cookieOptions.isSecure,
+ path: basePath === undefined ? '/' : basePath,
+ clearInvalid: false,
+ isHttpOnly: true,
+ isSameSite: cookieOptions.sameSite === 'None' ? false : cookieOptions.sameSite ?? false,
+ },
+ validateFunc: async (req: Request, session: T | T[]) => {
const result = cookieOptions.validate(session);
if (!result.isValid) {
clearInvalidCookie(req, result.path);
}
return { valid: result.isValid };
},
- isSecure: cookieOptions.isSecure,
- path: basePath,
- clearInvalid: false,
- isHttpOnly: true,
- isSameSite: cookieOptions.sameSite === 'None' ? false : cookieOptions.sameSite ?? false,
});
// A hack to support SameSite: 'None'.
diff --git a/src/core/server/http/http_server.mocks.ts b/src/core/server/http/http_server.mocks.ts
index d615e799f383f..8e8eaf46a7064 100644
--- a/src/core/server/http/http_server.mocks.ts
+++ b/src/core/server/http/http_server.mocks.ts
@@ -16,8 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { parse as parseUrl } from 'url';
-import { Request } from 'hapi';
+import { URL, format as formatUrl } from 'url';
+import { Request } from '@hapi/hapi';
import { merge } from 'lodash';
import { Socket } from 'net';
import { stringify } from 'query-string';
@@ -73,7 +73,7 @@ function createKibanaRequestMock
-
-
+
+
+
+
diff --git a/src/plugins/home/public/application/components/tutorial/tutorial.test.js b/src/plugins/home/public/application/components/tutorial/tutorial.test.js
index 9944ac4848bc6..65e11170e0e42 100644
--- a/src/plugins/home/public/application/components/tutorial/tutorial.test.js
+++ b/src/plugins/home/public/application/components/tutorial/tutorial.test.js
@@ -133,7 +133,7 @@ describe('isCloudEnabled is false', () => {
);
await loadTutorialPromise;
component.update();
- component.find('button#onPremElasticCloud').closest('div').find('input').simulate('change');
+ component.find('#onPremElasticCloud').first().simulate('click');
component.update();
expect(component.state('visibleInstructions')).toBe('onPremElasticCloud');
});
diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap
index 6631a9bbd1d02..db527ea81b2cb 100644
--- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap
+++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap
@@ -63,7 +63,6 @@ exports[`IndicesList should change pages 1`] = `
isOpen={false}
ownFocus={false}
panelPaddingSize="none"
- withTitle={true}
>
diff --git a/src/plugins/kibana_react/public/table_list_view/table_list_view.tsx b/src/plugins/kibana_react/public/table_list_view/table_list_view.tsx
index e0e295723a69d..b6efa40c5e40b 100644
--- a/src/plugins/kibana_react/public/table_list_view/table_list_view.tsx
+++ b/src/plugins/kibana_react/public/table_list_view/table_list_view.tsx
@@ -427,6 +427,7 @@ class TableListView extends React.Component !error,
onClick: this.props.editItem,
},
];
diff --git a/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx b/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx
index 832ea70f0460e..5d26925d34088 100644
--- a/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx
+++ b/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx
@@ -105,15 +105,19 @@ export class ValidatedDualRange extends Component {
allowEmptyRange,
...rest // TODO: Consider alternatives for spread operator in component
} = this.props;
+ // Ensure the form row is display as compressed if compressed is true
+ let evaluatedDisplay = formRowDisplay;
+ if (!evaluatedDisplay) {
+ evaluatedDisplay = compressed ? 'rowCompressed' : 'row';
+ }
return (
= (state: FromVersion) => ToVersion;
+
export interface PersistableState
{
/**
* function to extract telemetry information
@@ -47,8 +52,29 @@ export interface PersistableState
{ state: P; references: SavedObjectReference[] };
+
+ /**
+ * migrateToLatest function receives state of older version and should migrate to the latest version
+ * @param state
+ * @param version
+ */
+ migrateToLatest?: (state: SerializableState, version: string) => P;
+
+ /**
+ * migrate function runs the specified migration
+ * @param state
+ * @param version
+ */
+ migrate?: (state: SerializableState, version: string) => SerializableState;
}
export type PersistableStateDefinition
+ {i18n.translate('xpack.apm.serviceMap.timeoutPromptDescription', {
+ defaultMessage: `Timed out while fetching data for service map. Limit the scope by selecting a smaller time range, or use configuration setting '{configName}' with a reduced value.`,
+ values: {
+ configName: isGlobalServiceMap
+ ? 'xpack.apm.serviceMapFingerprintGlobalBucketSize'
+ : 'xpack.apm.serviceMapFingerprintBucketSize',
+ },
+ })}
+
+ }
+ actions={}
+ />
+ );
+}
+
+function ApmSettingsDocLink() {
+ return (
+
+ {i18n.translate('xpack.apm.serviceMap.timeoutPrompt.docsLink', {
+ defaultMessage: 'Learn more about APM settings in the docs',
+ })}
+
+ );
+}
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/NoServicesMessage.test.tsx b/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/NoServicesMessage.test.tsx
deleted file mode 100644
index 21681f42d4b52..0000000000000
--- a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/NoServicesMessage.test.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { shallow } from 'enzyme';
-import React from 'react';
-import { NoServicesMessage } from '../NoServicesMessage';
-import { FETCH_STATUS } from '../../../../hooks/useFetcher';
-
-describe('NoServicesMessage', () => {
- Object.values(FETCH_STATUS).forEach((status) => {
- [true, false].forEach((historicalDataFound) => {
- it(`status: ${status} and historicalDataFound: ${historicalDataFound}`, () => {
- const wrapper = shallow(
-
- );
- expect(wrapper).toMatchSnapshot();
- });
- });
- });
-});
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap
deleted file mode 100644
index d027422961c99..0000000000000
--- a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/NoServicesMessage.test.tsx.snap
+++ /dev/null
@@ -1,99 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`NoServicesMessage status: failure and historicalDataFound: false 1`] = ``;
-
-exports[`NoServicesMessage status: failure and historicalDataFound: true 1`] = ``;
-
-exports[`NoServicesMessage status: loading and historicalDataFound: false 1`] = ``;
-
-exports[`NoServicesMessage status: loading and historicalDataFound: true 1`] = ``;
-
-exports[`NoServicesMessage status: pending and historicalDataFound: false 1`] = `
-
- }
- body={
-
-
- Upgrading from a pre-7.x version? Make sure you've also upgraded
- your APM Server instance(s) to at least 7.0.
-
-
- You may also have old data that needs to be migrated.
-
-
- Learn more by visiting the Kibana Upgrade Assistant
-
- .
-
-
- }
- title={
-
- Looks like you don't have any APM services installed. Let's add some!
-
- }
- titleSize="s"
-/>
-`;
-
-exports[`NoServicesMessage status: pending and historicalDataFound: true 1`] = `
-
- No services found
-
- Upgrading from a pre-7.x version? Make sure you've also upgraded
- your APM Server instance(s) to at least 7.0.
-
-
- You may also have old data that needs to be migrated.
-
-
- Learn more by visiting the Kibana Upgrade Assistant
-
- .
-
-
- }
- title={
-
- Looks like you don't have any APM services installed. Let's add some!
-
- }
- titleSize="s"
-/>
-`;
-
-exports[`NoServicesMessage status: success and historicalDataFound: true 1`] = `
-
- No services found
-
- }
- titleSize="s"
-/>
-`;
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/service_overview.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/service_overview.test.tsx.snap
deleted file mode 100644
index 49f30910ee0f1..0000000000000
--- a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/service_overview.test.tsx.snap
+++ /dev/null
@@ -1,690 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Service Overview -> View should render empty message, when list is empty and historical data is found 1`] = `
-NodeList [
-
-
-
-
-
-
-
- No services found
-
-
-
-
-
-
-
-
,
-]
-`;
-
-exports[`Service Overview -> View should render getting started message, when list is empty and no historical data is found 1`] = `
-NodeList [
-
-
-
-
-
-
-
- Looks like you don't have any APM services installed. Let's add some!
-
-
-
-
- Upgrading from a pre-7.x version? Make sure you've also upgraded
- your APM Server instance(s) to at least 7.0.
-
,
-]
-`;
diff --git a/x-pack/plugins/apm/public/components/app/Settings/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/index.tsx
index aa71050802215..e770116ac2759 100644
--- a/x-pack/plugins/apm/public/components/app/Settings/index.tsx
+++ b/x-pack/plugins/apm/public/components/app/Settings/index.tsx
@@ -36,8 +36,8 @@ export function Settings({ children, location }: SettingsProps) {
<>
- {i18n.translate('xpack.apm.settings.returnToOverviewLinkLabel', {
- defaultMessage: 'Return to overview',
+ {i18n.translate('xpack.apm.settings.returnLinkLabel', {
+ defaultMessage: 'Return to inventory',
})}
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/ServiceList/HealthBadge.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/HealthBadge.tsx
similarity index 100%
rename from x-pack/plugins/apm/public/components/app/ServiceOverview/ServiceList/HealthBadge.tsx
rename to x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/HealthBadge.tsx
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/ServiceList/MLCallout.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/MLCallout.tsx
similarity index 96%
rename from x-pack/plugins/apm/public/components/app/ServiceOverview/ServiceList/MLCallout.tsx
rename to x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/MLCallout.tsx
index dd632db0f15fe..67eb22d48aae6 100644
--- a/x-pack/plugins/apm/public/components/app/ServiceOverview/ServiceList/MLCallout.tsx
+++ b/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/MLCallout.tsx
@@ -15,7 +15,7 @@ import { APMLink } from '../../../shared/Links/apm/APMLink';
export function MLCallout({ onDismiss }: { onDismiss: () => void }) {
return (
- {i18n.translate('xpack.apm.serviceOverview.toastText', {
+ {i18n.translate('xpack.apm.serviceInventory.toastText', {
defaultMessage:
"You're running Elastic Stack 7.0+ and we've detected incompatible data from a previous 6.x version. If you want to view this data in APM, you should migrate it. See more in ",
})}
@@ -74,7 +74,7 @@ export function ServiceOverview() {
})}
>
{i18n.translate(
- 'xpack.apm.serviceOverview.upgradeAssistantLink',
+ 'xpack.apm.serviceInventory.upgradeAssistantLinkText',
{
defaultMessage: 'the upgrade assistant',
}
@@ -86,6 +86,10 @@ export function ServiceOverview() {
}
}, [data.hasLegacyData, core.http.basePath, core.notifications.toasts]);
+ // The page is called "service inventory" to avoid confusion with the
+ // "service overview", but this is tracked in some dashboards because it's the
+ // initial landing page for APM, so it stays as "services_overview" (plural.)
+ // for backward compatibility.
useTrackPageview({ app: 'apm', path: 'services_overview' });
useTrackPageview({ app: 'apm', path: 'services_overview', delay: 15000 });
diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.test.tsx
new file mode 100644
index 0000000000000..0fc2a2b4cdcef
--- /dev/null
+++ b/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.test.tsx
@@ -0,0 +1,37 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { render } from '@testing-library/react';
+import React, { ReactNode } from 'react';
+import { MockApmPluginContextWrapper } from '../../../context/ApmPluginContext/MockApmPluginContext';
+import { FETCH_STATUS } from '../../../hooks/useFetcher';
+import { NoServicesMessage } from './no_services_message';
+
+function Wrapper({ children }: { children?: ReactNode }) {
+ return {children};
+}
+
+describe('NoServicesMessage', () => {
+ Object.values(FETCH_STATUS).forEach((status) => {
+ [true, false].forEach((historicalDataFound) => {
+ describe(`when status is ${status}`, () => {
+ describe(`when historicalDataFound is ${historicalDataFound}`, () => {
+ it('renders', () => {
+ expect(() =>
+ render(
+ ,
+ { wrapper: Wrapper }
+ )
+ ).not.toThrowError();
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/NoServicesMessage.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.tsx
similarity index 100%
rename from x-pack/plugins/apm/public/components/app/ServiceOverview/NoServicesMessage.tsx
rename to x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.tsx
diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/service_overview.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx
similarity index 79%
rename from x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/service_overview.test.tsx
rename to x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx
index 06e9008d5aebe..d394c7db62554 100644
--- a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/service_overview.test.tsx
+++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx
@@ -7,22 +7,22 @@
import { render, waitFor } from '@testing-library/react';
import { CoreStart } from 'kibana/public';
import { merge } from 'lodash';
-import React, { FunctionComponent, ReactChild } from 'react';
+import React, { ReactNode } from 'react';
import { MemoryRouter } from 'react-router-dom';
import { createKibanaReactContext } from 'src/plugins/kibana_react/public';
-import { ServiceHealthStatus } from '../../../../../common/service_health_status';
-import { ServiceOverview } from '..';
-import { EuiThemeProvider } from '../../../../../../observability/public';
-import { ApmPluginContextValue } from '../../../../context/ApmPluginContext';
+import { ServiceHealthStatus } from '../../../../common/service_health_status';
+import { ServiceInventory } from '.';
+import { EuiThemeProvider } from '../../../../../observability/public';
+import { ApmPluginContextValue } from '../../../context/ApmPluginContext';
import {
mockApmPluginContextValue,
MockApmPluginContextWrapper,
-} from '../../../../context/ApmPluginContext/MockApmPluginContext';
-import * as useAnomalyDetectionJobs from '../../../../hooks/useAnomalyDetectionJobs';
-import { FETCH_STATUS } from '../../../../hooks/useFetcher';
-import * as useLocalUIFilters from '../../../../hooks/useLocalUIFilters';
-import * as urlParamsHooks from '../../../../hooks/useUrlParams';
-import { SessionStorageMock } from '../../../../services/__test__/SessionStorageMock';
+} from '../../../context/ApmPluginContext/MockApmPluginContext';
+import * as useAnomalyDetectionJobs from '../../../hooks/useAnomalyDetectionJobs';
+import { FETCH_STATUS } from '../../../hooks/useFetcher';
+import * as useLocalUIFilters from '../../../hooks/useLocalUIFilters';
+import * as urlParamsHooks from '../../../hooks/useUrlParams';
+import { SessionStorageMock } from '../../../services/__test__/SessionStorageMock';
const KibanaReactContext = createKibanaReactContext({
usageCollection: { reportUiStats: () => {} },
@@ -31,7 +31,7 @@ const KibanaReactContext = createKibanaReactContext({
const addWarning = jest.fn();
const httpGet = jest.fn();
-function wrapper({ children }: { children: ReactChild }) {
+function wrapper({ children }: { children?: ReactNode }) {
const mockPluginContext = (merge({}, mockApmPluginContextValue, {
core: {
http: {
@@ -58,13 +58,7 @@ function wrapper({ children }: { children: ReactChild }) {
);
}
-function renderServiceOverview() {
- return render(, { wrapper } as {
- wrapper: FunctionComponent<{}>;
- });
-}
-
-describe('Service Overview -> View', () => {
+describe('ServiceInventory', () => {
beforeEach(() => {
// @ts-expect-error
global.sessionStorage = new SessionStorageMock();
@@ -129,13 +123,13 @@ describe('Service Overview -> View', () => {
],
});
- const { container, findByText } = renderServiceOverview();
+ const { container, findByText } = render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
await findByText('My Python Service');
- expect(container.querySelectorAll('.euiTableRow')).toMatchSnapshot();
+ expect(container.querySelectorAll('.euiTableRow')).toHaveLength(2);
});
it('should render getting started message, when list is empty and no historical data is found', async () => {
@@ -145,17 +139,17 @@ describe('Service Overview -> View', () => {
items: [],
});
- const { container, findByText } = renderServiceOverview();
+ const { findByText } = render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
// wait for elements to be rendered
- await findByText(
+ const gettingStartedMessage = await findByText(
"Looks like you don't have any APM services installed. Let's add some!"
);
- expect(container.querySelectorAll('.euiTableRow')).toMatchSnapshot();
+ expect(gettingStartedMessage).not.toBeEmpty();
});
it('should render empty message, when list is empty and historical data is found', async () => {
@@ -165,13 +159,13 @@ describe('Service Overview -> View', () => {
items: [],
});
- const { container, findByText } = renderServiceOverview();
+ const { findByText } = render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
- await findByText('No services found');
+ const noServicesText = await findByText('No services found');
- expect(container.querySelectorAll('.euiTableRow')).toMatchSnapshot();
+ expect(noServicesText).not.toBeEmpty();
});
describe('when legacy data is found', () => {
@@ -182,7 +176,7 @@ describe('Service Overview -> View', () => {
items: [],
});
- renderServiceOverview();
+ render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
@@ -203,7 +197,7 @@ describe('Service Overview -> View', () => {
items: [],
});
- renderServiceOverview();
+ render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
@@ -229,7 +223,7 @@ describe('Service Overview -> View', () => {
],
});
- const { queryByText } = renderServiceOverview();
+ const { queryByText } = render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
@@ -256,7 +250,7 @@ describe('Service Overview -> View', () => {
],
});
- const { queryAllByText } = renderServiceOverview();
+ const { queryAllByText } = render(, { wrapper });
// wait for requests to be made
await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1));
diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/service_inventory_link.tsx
similarity index 90%
rename from x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx
rename to x-pack/plugins/apm/public/components/shared/Links/apm/service_inventory_link.tsx
index 2081fc4767903..e3fa03a4d4f86 100644
--- a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx
+++ b/x-pack/plugins/apm/public/components/shared/Links/apm/service_inventory_link.tsx
@@ -14,7 +14,7 @@ import { APMLink, APMLinkExtendProps } from './APMLink';
import { useUrlParams } from '../../../../hooks/useUrlParams';
import { pickKeys } from '../../../../../common/utils/pick_keys';
-function ServiceOverviewLink(props: APMLinkExtendProps) {
+function ServiceInventoryLink(props: APMLinkExtendProps) {
const { urlParams } = useUrlParams();
const persistedFilters = pickKeys(urlParams, 'host', 'agentName');
@@ -22,4 +22,4 @@ function ServiceOverviewLink(props: APMLinkExtendProps) {
return ;
}
-export { ServiceOverviewLink };
+export { ServiceInventoryLink };
diff --git a/x-pack/plugins/apm/public/hooks/useFetcher.tsx b/x-pack/plugins/apm/public/hooks/useFetcher.tsx
index 5d65424844c5a..6add0e8a2b480 100644
--- a/x-pack/plugins/apm/public/hooks/useFetcher.tsx
+++ b/x-pack/plugins/apm/public/hooks/useFetcher.tsx
@@ -21,7 +21,7 @@ export enum FETCH_STATUS {
export interface FetcherResult {
data?: Data;
status: FETCH_STATUS;
- error?: Error;
+ error?: IHttpFetchError;
}
// fetcher functions can return undefined OR a promise. Previously we had a more simple type
diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts
index 560a1a077931b..cc0151afba63c 100644
--- a/x-pack/plugins/apm/public/plugin.ts
+++ b/x-pack/plugins/apm/public/plugin.ts
@@ -81,14 +81,14 @@ export class ApmPlugin implements Plugin {
if (plugins.observability) {
const getApmDataHelper = async () => {
const {
- fetchOverviewPageData,
+ fetchObservabilityOverviewPageData,
hasData,
createCallApmApi,
- } = await import('./services/rest/apm_overview_fetchers');
+ } = await import('./services/rest/apm_observability_overview_fetchers');
// have to do this here as well in case app isn't mounted yet
createCallApmApi(core.http);
- return { fetchOverviewPageData, hasData };
+ return { fetchObservabilityOverviewPageData, hasData };
};
plugins.observability.dashboard.register({
appName: 'apm',
@@ -98,7 +98,7 @@ export class ApmPlugin implements Plugin {
},
fetchData: async (params: FetchDataParams) => {
const dataHelper = await getApmDataHelper();
- return await dataHelper.fetchOverviewPageData(params);
+ return await dataHelper.fetchObservabilityOverviewPageData(params);
},
});
diff --git a/x-pack/plugins/apm/public/services/rest/apm_overview_fetchers.test.ts b/x-pack/plugins/apm/public/services/rest/apm_observability_overview_fetchers.test.ts
similarity index 89%
rename from x-pack/plugins/apm/public/services/rest/apm_overview_fetchers.test.ts
rename to x-pack/plugins/apm/public/services/rest/apm_observability_overview_fetchers.test.ts
index 4e306c93805d0..22ec317fca64b 100644
--- a/x-pack/plugins/apm/public/services/rest/apm_overview_fetchers.test.ts
+++ b/x-pack/plugins/apm/public/services/rest/apm_observability_overview_fetchers.test.ts
@@ -5,7 +5,10 @@
*/
import moment from 'moment';
-import { fetchOverviewPageData, hasData } from './apm_overview_fetchers';
+import {
+ fetchObservabilityOverviewPageData,
+ hasData,
+} from './apm_observability_overview_fetchers';
import * as createCallApmApi from './createCallApmApi';
describe('Observability dashboard data', () => {
@@ -37,7 +40,7 @@ describe('Observability dashboard data', () => {
});
});
- describe('fetchOverviewPageData', () => {
+ describe('fetchObservabilityOverviewPageData', () => {
it('returns APM data with series and stats', async () => {
callApmApiMock.mockImplementation(() =>
Promise.resolve({
@@ -49,7 +52,7 @@ describe('Observability dashboard data', () => {
],
})
);
- const response = await fetchOverviewPageData(params);
+ const response = await fetchObservabilityOverviewPageData(params);
expect(response).toEqual({
appLink: '/app/apm/services?rangeFrom=now-15m&rangeTo=now',
stats: {
@@ -80,7 +83,7 @@ describe('Observability dashboard data', () => {
transactionCoordinates: [],
})
);
- const response = await fetchOverviewPageData(params);
+ const response = await fetchObservabilityOverviewPageData(params);
expect(response).toEqual({
appLink: '/app/apm/services?rangeFrom=now-15m&rangeTo=now',
stats: {
@@ -107,7 +110,7 @@ describe('Observability dashboard data', () => {
transactionCoordinates: [{ x: 1 }, { x: 2 }, { x: 3 }],
})
);
- const response = await fetchOverviewPageData(params);
+ const response = await fetchObservabilityOverviewPageData(params);
expect(response).toEqual({
appLink: '/app/apm/services?rangeFrom=now-15m&rangeTo=now',
stats: {
diff --git a/x-pack/plugins/apm/public/services/rest/apm_overview_fetchers.ts b/x-pack/plugins/apm/public/services/rest/apm_observability_overview_fetchers.ts
similarity index 96%
rename from x-pack/plugins/apm/public/services/rest/apm_overview_fetchers.ts
rename to x-pack/plugins/apm/public/services/rest/apm_observability_overview_fetchers.ts
index 422c7b882e5dc..bc1db4eed1d9e 100644
--- a/x-pack/plugins/apm/public/services/rest/apm_overview_fetchers.ts
+++ b/x-pack/plugins/apm/public/services/rest/apm_observability_overview_fetchers.ts
@@ -13,7 +13,7 @@ import { callApmApi } from './createCallApmApi';
export { createCallApmApi } from './createCallApmApi';
-export const fetchOverviewPageData = async ({
+export const fetchObservabilityOverviewPageData = async ({
absoluteTime,
relativeTime,
bucketSize,
diff --git a/x-pack/plugins/apm/public/setHelpExtension.ts b/x-pack/plugins/apm/public/setHelpExtension.ts
index b6e745dcf1655..f895fbc36ed03 100644
--- a/x-pack/plugins/apm/public/setHelpExtension.ts
+++ b/x-pack/plugins/apm/public/setHelpExtension.ts
@@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import url from 'url';
import { i18n } from '@kbn/i18n';
import { CoreStart } from 'kibana/public';
@@ -20,10 +19,7 @@ export function setHelpExtension({ chrome, http }: CoreStart) {
},
{
linkType: 'custom',
- href: url.format({
- pathname: http.basePath.prepend('/app/kibana'),
- hash: '/management/stack/upgrade_assistant',
- }),
+ href: http.basePath.prepend('/app/management/stack/upgrade_assistant'),
content: i18n.translate('xpack.apm.helpMenu.upgradeAssistantLink', {
defaultMessage: 'Upgrade assistant',
}),
diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts
index d0673335387c6..73e590064bac0 100644
--- a/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts
+++ b/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts
@@ -7,7 +7,7 @@
import { Logger } from 'kibana/server';
import uuid from 'uuid/v4';
import { snakeCase } from 'lodash';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { ProcessorEvent } from '../../../common/processor_event';
import { ML_ERRORS } from '../../../common/anomaly_detection';
import { PromiseReturnType } from '../../../../observability/typings/common';
diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_detection_jobs.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_detection_jobs.ts
index ead0c79a02836..88da6f619d610 100644
--- a/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_detection_jobs.ts
+++ b/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_detection_jobs.ts
@@ -5,7 +5,7 @@
*/
import { Logger } from 'kibana/server';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { ML_ERRORS } from '../../../common/anomaly_detection';
import { Setup } from '../helpers/setup_request';
import { getMlJobsWithAPMGroup } from './get_ml_jobs_with_apm_group';
diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/has_legacy_jobs.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/has_legacy_jobs.ts
index c1f346aa30e1f..eca8ad273a53d 100644
--- a/x-pack/plugins/apm/server/lib/anomaly_detection/has_legacy_jobs.ts
+++ b/x-pack/plugins/apm/server/lib/anomaly_detection/has_legacy_jobs.ts
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { ML_ERRORS } from '../../../common/anomaly_detection';
import { Setup } from '../helpers/setup_request';
import { getMlJobsWithAPMGroup } from './get_ml_jobs_with_apm_group';
diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts
index 895fc70d76af1..19864cb420b82 100644
--- a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts
+++ b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts
@@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { getServiceHealthStatus } from '../../../common/service_health_status';
import { Setup, SetupTimeRange } from '../helpers/setup_request';
import { PromiseReturnType } from '../../../typings/common';
diff --git a/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts b/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts
index dfc4e02c25a7f..22c655bb96f50 100644
--- a/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts
+++ b/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts
@@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { uniq, take, sortBy } from 'lodash';
+import Boom from '@hapi/boom';
import { ProcessorEvent } from '../../../common/processor_event';
import { Setup, SetupTimeRange } from '../helpers/setup_request';
import { rangeFilter } from '../../../common/utils/range_filter';
@@ -15,6 +16,7 @@ import {
SPAN_DESTINATION_SERVICE_RESOURCE,
} from '../../../common/elasticsearch_fieldnames';
import { getEnvironmentUiFilterES } from '../helpers/convert_ui_filters/get_environment_ui_filter_es';
+import { SERVICE_MAP_TIMEOUT_ERROR } from '../../../common/service_map';
const MAX_TRACES_TO_INSPECT = 1000;
@@ -122,26 +124,30 @@ export async function getTraceSampleIds({
},
};
- const tracesSampleResponse = await apmEventClient.search(params);
+ try {
+ const tracesSampleResponse = await apmEventClient.search(params);
+ // make sure at least one trace per composite/connection bucket
+ // is queried
+ const traceIdsWithPriority =
+ tracesSampleResponse.aggregations?.connections.buckets.flatMap((bucket) =>
+ bucket.sample.trace_ids.buckets.map((sampleDocBucket, index) => ({
+ traceId: sampleDocBucket.key as string,
+ priority: index,
+ }))
+ ) || [];
- // make sure at least one trace per composite/connection bucket
- // is queried
- const traceIdsWithPriority =
- tracesSampleResponse.aggregations?.connections.buckets.flatMap((bucket) =>
- bucket.sample.trace_ids.buckets.map((sampleDocBucket, index) => ({
- traceId: sampleDocBucket.key as string,
- priority: index,
- }))
- ) || [];
+ const traceIds = take(
+ uniq(
+ sortBy(traceIdsWithPriority, 'priority').map(({ traceId }) => traceId)
+ ),
+ MAX_TRACES_TO_INSPECT
+ );
- const traceIds = take(
- uniq(
- sortBy(traceIdsWithPriority, 'priority').map(({ traceId }) => traceId)
- ),
- MAX_TRACES_TO_INSPECT
- );
-
- return {
- traceIds,
- };
+ return { traceIds };
+ } catch (error) {
+ if ('displayName' in error && error.displayName === 'RequestTimeout') {
+ throw Boom.internal(SERVICE_MAP_TIMEOUT_ERROR);
+ }
+ throw error;
+ }
}
diff --git a/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/transform.ts b/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/transform.ts
index 7afb7427c210f..e5d6aad693869 100644
--- a/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/transform.ts
+++ b/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/transform.ts
@@ -58,12 +58,10 @@ export function getTpmBuckets({
const buckets = transactionResultBuckets.map(
({ key: resultKey, timeseries }) => {
const dataPoints = timeseries.buckets.map((bucket) => {
- // calculate request/minute. Avoid up-scaling numbers if bucketSize is below 60s (1 minute).
- // Eg. 1 request during a 10 second window should be displayed as "1 rpm" instead of "6 rpm".
- const tmpValue = bucket.count.value * (60 / Math.max(60, bucketSize));
return {
x: bucket.key,
- y: tmpValue,
+ // divide by minutes
+ y: bucket.count.value / (bucketSize / 60),
};
});
diff --git a/x-pack/plugins/apm/server/routes/create_api/index.ts b/x-pack/plugins/apm/server/routes/create_api/index.ts
index 42eebc51463db..cecb4f6ed3367 100644
--- a/x-pack/plugins/apm/server/routes/create_api/index.ts
+++ b/x-pack/plugins/apm/server/routes/create_api/index.ts
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { pick, difference } from 'lodash';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { schema } from '@kbn/config-schema';
import * as t from 'io-ts';
import { PathReporter } from 'io-ts/lib/PathReporter';
diff --git a/x-pack/plugins/apm/server/routes/service_map.ts b/x-pack/plugins/apm/server/routes/service_map.ts
index 6e86ececd1bfe..ffc8cb84b690a 100644
--- a/x-pack/plugins/apm/server/routes/service_map.ts
+++ b/x-pack/plugins/apm/server/routes/service_map.ts
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import * as t from 'io-ts';
import {
invalidLicenseMessage,
diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts
index 5673aa123b6aa..590b6c49d71bf 100644
--- a/x-pack/plugins/apm/server/routes/services.ts
+++ b/x-pack/plugins/apm/server/routes/services.ts
@@ -5,7 +5,7 @@
*/
import * as t from 'io-ts';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { uniq } from 'lodash';
import { setupRequest } from '../lib/helpers/setup_request';
import { getServiceAgentName } from '../lib/services/get_service_agent_name';
diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts
index beab6b6c850e3..7ed5ef442b6fc 100644
--- a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts
+++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts
@@ -5,7 +5,7 @@
*/
import * as t from 'io-ts';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { setupRequest } from '../../lib/helpers/setup_request';
import { getServiceNames } from '../../lib/settings/agent_configuration/get_service_names';
import { createOrUpdateConfiguration } from '../../lib/settings/agent_configuration/create_or_update_configuration';
diff --git a/x-pack/plugins/apm/server/routes/settings/anomaly_detection.ts b/x-pack/plugins/apm/server/routes/settings/anomaly_detection.ts
index f0a22356d074b..3e5a9ee725991 100644
--- a/x-pack/plugins/apm/server/routes/settings/anomaly_detection.ts
+++ b/x-pack/plugins/apm/server/routes/settings/anomaly_detection.ts
@@ -5,7 +5,7 @@
*/
import * as t from 'io-ts';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { isActivePlatinumLicense } from '../../../common/service_map';
import { ML_ERRORS } from '../../../common/anomaly_detection';
import { createRoute } from '../create_route';
diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link.ts b/x-pack/plugins/apm/server/routes/settings/custom_link.ts
index 7882383d78ab0..33769ac1d1c6f 100644
--- a/x-pack/plugins/apm/server/routes/settings/custom_link.ts
+++ b/x-pack/plugins/apm/server/routes/settings/custom_link.ts
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import * as t from 'io-ts';
import { pick } from 'lodash';
import { INVALID_LICENSE } from '../../../common/custom_link';
diff --git a/x-pack/plugins/apm/server/routes/transaction_groups.ts b/x-pack/plugins/apm/server/routes/transaction_groups.ts
index 18fc73b468cd4..a3a73222210bb 100644
--- a/x-pack/plugins/apm/server/routes/transaction_groups.ts
+++ b/x-pack/plugins/apm/server/routes/transaction_groups.ts
@@ -5,7 +5,7 @@
*/
import * as t from 'io-ts';
-import Boom from 'boom';
+import Boom from '@hapi/boom';
import { setupRequest } from '../lib/helpers/setup_request';
import { getTransactionCharts } from '../lib/transactions/charts';
import { getTransactionDistribution } from '../lib/transactions/distribution';
diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js
index d7c7cd9e1a32f..9bdb66cc16c06 100644
--- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js
+++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js
@@ -131,6 +131,7 @@ class ImageUpload extends React.Component {
onChange={this.changeUrlType}
isFullWidth
className="canvasSidebar__buttonGroup"
+ legend={strings.getUrlTypeChangeLegend()}
/>
);
diff --git a/x-pack/plugins/canvas/i18n/components.ts b/x-pack/plugins/canvas/i18n/components.ts
index 51c86f6604330..b7d25a32818f8 100644
--- a/x-pack/plugins/canvas/i18n/components.ts
+++ b/x-pack/plugins/canvas/i18n/components.ts
@@ -870,6 +870,10 @@ export const ComponentStrings = {
i18n.translate('xpack.canvas.textStylePicker.alignRightOption', {
defaultMessage: 'Align right',
}),
+ getAlignmentOptionsControlLegend: () =>
+ i18n.translate('xpack.canvas.textStylePicker.alignmentOptionsControl', {
+ defaultMessage: 'Alignment options',
+ }),
getFontColorLabel: () =>
i18n.translate('xpack.canvas.textStylePicker.fontColorLabel', {
defaultMessage: 'Font Color',
@@ -886,6 +890,10 @@ export const ComponentStrings = {
i18n.translate('xpack.canvas.textStylePicker.styleUnderlineOption', {
defaultMessage: 'Underline',
}),
+ getStyleOptionsControlLegend: () =>
+ i18n.translate('xpack.canvas.textStylePicker.styleOptionsControl', {
+ defaultMessage: 'Style options',
+ }),
},
TimePicker: {
getApplyButtonLabel: () =>
@@ -1061,6 +1069,10 @@ export const ComponentStrings = {
}),
},
VarConfigVarValueField: {
+ getBooleanOptionsLegend: () =>
+ i18n.translate('xpack.canvas.varConfigVarValueField.booleanOptionsLegend', {
+ defaultMessage: 'Boolean value',
+ }),
getFalseOption: () =>
i18n.translate('xpack.canvas.varConfigVarValueField.falseOption', {
defaultMessage: 'False',
diff --git a/x-pack/plugins/canvas/i18n/ui.ts b/x-pack/plugins/canvas/i18n/ui.ts
index bc282db203be2..0347a9c5444aa 100644
--- a/x-pack/plugins/canvas/i18n/ui.ts
+++ b/x-pack/plugins/canvas/i18n/ui.ts
@@ -181,6 +181,10 @@ export const ArgumentStrings = {
url: URL,
},
}),
+ getUrlTypeChangeLegend: () =>
+ i18n.translate('xpack.canvas.uis.arguments.imageUpload.urlTypes.changeLegend', {
+ defaultMessage: 'Image upload type',
+ }),
},
Number: {
getDisplayName: () =>
diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__stories__/__snapshots__/asset_manager.stories.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__stories__/__snapshots__/asset_manager.stories.storyshot
index 8225f6414385d..a6dbe675ee9d6 100644
--- a/x-pack/plugins/canvas/public/components/asset_manager/__stories__/__snapshots__/asset_manager.stories.storyshot
+++ b/x-pack/plugins/canvas/public/components/asset_manager/__stories__/__snapshots__/asset_manager.stories.storyshot
@@ -146,6 +146,7 @@ exports[`Storyshots components/Assets/AssetManager no assets 1`] = `
aria-labelledby="CanvasAssetManagerLabel"
className="euiProgress euiProgress--native euiProgress--s euiProgress--secondary"
max={25000}
+ style={null}
value={0}
/>
@@ -163,6 +164,11 @@ exports[`Storyshots components/Assets/AssetManager no assets 1`] = `
@@ -172,6 +173,7 @@ export const TextStylePicker: FC = ({
idSelected={align}
onChange={(optionId: string) => doChange('align', optionId)}
className="canvasSidebar__buttonGroup"
+ legend={strings.getAlignmentOptionsControlLegend()}
/>
diff --git a/x-pack/plugins/canvas/public/components/var_config/__stories__/__snapshots__/delete_var.stories.storyshot b/x-pack/plugins/canvas/public/components/var_config/__stories__/__snapshots__/delete_var.stories.storyshot
index f1fac7e6ce477..5c9e0b6224126 100644
--- a/x-pack/plugins/canvas/public/components/var_config/__stories__/__snapshots__/delete_var.stories.storyshot
+++ b/x-pack/plugins/canvas/public/components/var_config/__stories__/__snapshots__/delete_var.stories.storyshot
@@ -64,6 +64,11 @@ Array [
@@ -307,6 +315,11 @@ Array [
className="euiButton euiButton--secondary euiButton--small euiButton--fill"
disabled={false}
onClick={[Function]}
+ style={
+ Object {
+ "minWidth": undefined,
+ }
+ }
type="button"
>
= ({ type, value, onChange }) => {
}}
buttonSize="compressed"
isFullWidth
+ legend={strings.getBooleanOptionsLegend()}
/>
);
}
diff --git a/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/__snapshots__/element_menu.stories.storyshot b/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/__snapshots__/element_menu.stories.storyshot
index 6bce2be335b78..de78772bcb124 100644
--- a/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/__snapshots__/element_menu.stories.storyshot
+++ b/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/__snapshots__/element_menu.stories.storyshot
@@ -14,9 +14,14 @@ exports[`Storyshots components/WorkpadHeader/ElementMenu default 1`] = `
>
-
+ (resp) => {
if (resp.isBoom) {
diff --git a/x-pack/plugins/canvas/server/routes/templates/list.test.ts b/x-pack/plugins/canvas/server/routes/templates/list.test.ts
index 9ceab3b5c9705..72a0427306f7f 100644
--- a/x-pack/plugins/canvas/server/routes/templates/list.test.ts
+++ b/x-pack/plugins/canvas/server/routes/templates/list.test.ts
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { badRequest } from 'boom';
+import { badRequest } from '@hapi/boom';
import { initializeListTemplates } from './list';
import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'src/core/server';
import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks';
diff --git a/x-pack/plugins/canvas/shareable_runtime/api/__tests__/__snapshots__/shareable.test.tsx.snap b/x-pack/plugins/canvas/shareable_runtime/api/__tests__/__snapshots__/shareable.test.tsx.snap
index a2d8d03aebce4..8d9c660e15b2c 100644
--- a/x-pack/plugins/canvas/shareable_runtime/api/__tests__/__snapshots__/shareable.test.tsx.snap
+++ b/x-pack/plugins/canvas/shareable_runtime/api/__tests__/__snapshots__/shareable.test.tsx.snap
@@ -9,7 +9,7 @@ exports[`Canvas Shareable Workpad API Placed successfully with default propertie
markdown mock
markdown mock
My Canvas Workpad
Page 1
"
+
markdown mock
My Canvas Workpad
Page 1
"
`;
exports[`Canvas Shareable Workpad API Placed successfully with height specified 1`] = `""`;
@@ -21,7 +21,7 @@ exports[`Canvas Shareable Workpad API Placed successfully with height specified
markdown mock
markdown mock
My Canvas Workpad
Page 1
"
+
markdown mock
My Canvas Workpad
Page 1
"
`;
exports[`Canvas Shareable Workpad API Placed successfully with page specified 1`] = `""`;
@@ -33,7 +33,7 @@ exports[`Canvas Shareable Workpad API Placed successfully with page specified 2`
markdown mock
markdown mock
My Canvas Workpad
Page 1
"
+
markdown mock
My Canvas Workpad
Page 1
"
`;
exports[`Canvas Shareable Workpad API Placed successfully with width and height specified 1`] = `""`;
@@ -45,7 +45,7 @@ exports[`Canvas Shareable Workpad API Placed successfully with width and height
markdown mock
markdown mock
My Canvas Workpad
Page 1
"
+
markdown mock
My Canvas Workpad
Page 1
"
`;
exports[`Canvas Shareable Workpad API Placed successfully with width specified 1`] = `""`;
@@ -57,5 +57,5 @@ exports[`Canvas Shareable Workpad API Placed successfully with width specified 2