diff --git a/docs/en/apm-server/redirects.asciidoc b/docs/en/apm-server/redirects.asciidoc
index f733cc02c8..80df5b06e6 100644
--- a/docs/en/apm-server/redirects.asciidoc
+++ b/docs/en/apm-server/redirects.asciidoc
@@ -35,7 +35,7 @@ The error endpoint has been deprecated. Please see {observability-guide}/apm-api
[role="exclude",id="error-schema-definition"]
=== Error schema definition
-The error schema has moved. Please see {observability-guide}/apm-api-error.html[Error Schema].
+The error schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="error-api-examples"]
=== Error API examples
@@ -45,42 +45,42 @@ The error API examples have moved. Please see {observability-guide}/apm-api-even
[role="exclude",id="error-payload-schema"]
=== Error payload schema
-The error schema has moved. Please see {observability-guide}/apm-api-error.html[Error Schema].
+The error schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="error-service-schema"]
=== Error service schema
-The error schema has moved. Please see {observability-guide}/apm-api-error.html[Error Schema].
+The error schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="error-system-schema"]
=== Error system schema
-The error schema has moved. Please see {observability-guide}/apm-api-error.html[Error Schema].
+The error schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="error-context-schema"]
=== Error context schema
-The error schema has moved. Please see {observability-guide}/apm-api-error.html[Error Schema].
+The error schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="error-stacktraceframe-schema"]
=== Error stack trace frame schema
-The error schema has moved. Please see {observability-guide}/apm-api-error.html[Error Schema].
+The error schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="payload-with-error"]
=== Payload with error
-This is no longer helpful. Please see {observability-guide}/apm-api-error.html[Error Schema].
+This is no longer helpful. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="payload-with-minimal-exception"]
=== Payload with minimal exception
-This is no longer helpful. Please see {observability-guide}/apm-api-error.html[Error Schema].
+This is no longer helpful. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
[role="exclude",id="payload-with-minimal-log"]
=== Payload with minimal log
-This is no longer helpful. Please see {observability-guide}/apm-api-error.html[Error Schema].
+This is no longer helpful. Please see {observability-guide}/apm-api-events.html#apm-api-error[Error Schema].
// Transaction API
@@ -92,7 +92,7 @@ The transaction endpoint has been deprecated. Please see {observability-guide}/a
[role="exclude",id="transaction-schema-definition"]
=== Transaction schema definition
-The transaction schema has moved. Please see {observability-guide}/apm-api-transaction.html#apm-api-transaction-schema[Transaction Schema].
+The transaction schema has moved. Please see {observability-guide}/apm-api-events.html#apm-api-transaction-schema[Transaction Schema].
[role="exclude",id="transaction-api-examples"]
=== Transaction API examples
@@ -102,62 +102,62 @@ The transaction API examples have moved. Please see {observability-guide}/apm-ap
[role="exclude",id="transaction-span-schema"]
=== Transaction span schema
-This schema has changed. Please see {observability-guide}/apm-api-span.html[Spans].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-span[Spans].
[role="exclude",id="transaction-payload-schema"]
=== Transaction payload schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="transaction-service-schema"]
=== Transaction service schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="transaction-system-schema"]
=== Transaction system schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="transaction-context-schema"]
=== Transaction context schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="transaction-stacktraceframe-schema"]
=== Transaction stack trace frame schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="transaction-request-schema"]
=== Transaction request schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="transaction-user-schema"]
=== Transaction user schema
-This schema has changed. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This schema has changed. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="payload-with-transactions"]
=== Payload with transactions
-This is no longer helpful. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This is no longer helpful. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="payload-with-minimal-transaction"]
=== Payload with minimal transaction
-This is no longer helpful. Please see {observability-guide}/apm-api-transaction.html[Transactions].
+This is no longer helpful. Please see {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="payload-with-minimal-span"]
=== Payload with minimal span
-This is no longer helpful. Please see {observability-guide}/apm-api-span.html[Spans].
+This is no longer helpful. Please see {observability-guide}/apm-api-events.html#apm-api-span[Spans].
[role="exclude",id="example-intakev2-events"]
=== Example Request Body
-Refer to {observability-guide}/apm-api-event-example.html[Example request body].
+Refer to {observability-guide}/apm-api-events.html#apm-api-event-example[Example request body].
// V1 intake API
@@ -442,49 +442,49 @@ Refer to {observability-guide}/apm-getting-started-apm-server.html[Self manage A
{move-notice}
-Refer to {observability-guide}/_apm_server_binary.html[APM Server binary].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html[APM Server binary].
[role="exclude",id="installing"]
=== Step 1: Install
{move-notice}
-Refer to {observability-guide}/apm-installing.html[Step 1: Install].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html#apm-installing[Step 1: Install].
[role="exclude",id="apm-server-configuration"]
=== Step 2: Set up and configure
{move-notice}
-Refer to {observability-guide}/apm-server-configuration.html[Step 2: Set up and configure].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html#apm-server-configuration[Step 2: Set up and configure].
[role="exclude",id="apm-server-starting"]
=== Step 3: Start
{move-notice}
-Refer to {observability-guide}/apm-server-starting.html[Step 3: Start].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html#apm-server-starting[Step 3: Start].
[role="exclude",id="next-steps"]
=== Step 4: Next steps
{move-notice}
-Refer to {observability-guide}/apm-next-steps.html[Step 4: Next steps].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html#apm-next-steps[Step 4: Next steps].
[role="exclude",id="setup-repositories"]
=== Repositories for APT and YUM
{move-notice}
-Refer to {observability-guide}/apm-setup-repositories.html[Repositories for APT and YUM].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html#apm-setup-repositories[Repositories for APT and YUM].
[role="exclude",id="running-on-docker"]
=== Run APM Server on Docker
{move-notice}
-Refer to {observability-guide}/apm-running-on-docker.html[Run APM Server on Docker].
+Refer to {observability-guide}/get-started-with-apm-server-binary.html#apm-running-on-docker[Run APM Server on Docker].
[role="exclude",id="_fleet_managed_apm_server"]
=== Fleet-managed APM Server
@@ -498,28 +498,28 @@ Refer to {observability-guide}/get-started-with-fleet-apm-server.html[Fleet-mana
{move-notice}
-Refer to {observability-guide}/_step_1_set_up_fleet.html[Step 1: Set up Fleet].
+Refer to {observability-guide}/get-started-with-fleet-apm-server.html#_step_1_set_up_fleet[Step 1: Set up Fleet].
[role="exclude",id="_step_2_add_and_configure_the_apm_integration"]
=== Step 2: Add and configure the APM integration
{move-notice}
-Refer to {observability-guide}/add-apm-integration.html[Step 2: Add and configure the APM integration].
+Refer to {observability-guide}/get-started-with-fleet-apm-server.html#add-apm-integration[Step 2: Add and configure the APM integration].
[role="exclude",id="_step_3_install_apm_agents"]
=== Step 3: Install APM agents
{move-notice}
-Refer to {observability-guide}/_step_3_install_apm_agents.html[Step 3: Install APM agents].
+Refer to {observability-guide}/get-started-with-fleet-apm-server.html#_step_3_install_apm_agents[Step 3: Install APM agents].
[role="exclude",id="_step_4_view_your_data"]
=== Step 4: View your data
{move-notice}
-Refer to {observability-guide}/_step_4_view_your_data.html[Step 4: View your data].
+Refer to {observability-guide}/get-started-with-fleet-apm-server.html#_step_4_view_your_data[Step 4: View your data].
[role="exclude",id="data-model"]
=== Data Model
@@ -621,7 +621,7 @@ Refer to {observability-guide}/apm-data-security-delete.html[Delete sensitive da
{move-notice}
-Refer to {observability-guide}/apm-distributed-tracing.html[Distributed tracing].
+Refer to {observability-guide}/apm-data-model-traces.html#apm-distributed-tracing[Distributed tracing].
[role="exclude",id="apm-rum"]
=== Real User Monitoring (RUM)
@@ -642,14 +642,14 @@ Refer to {observability-guide}/apm-sampling.html[Transaction sampling].
{move-notice}
-Refer to {observability-guide}/apm-configure-head-based-sampling.html[Configure head-based sampling].
+Refer to {observability-guide}/apm-sampling.html#apm-configure-head-based-sampling[Configure head-based sampling].
[role="exclude",id="configure-tail-based-sampling"]
=== Configure tail-based sampling
{move-notice}
-Refer to {observability-guide}/apm-configure-tail-based-sampling.html[Configure tail-based sampling].
+Refer to {observability-guide}/apm-sampling.html#apm-configure-tail-based-sampling[Configure tail-based sampling].
[role="exclude",id="log-correlation"]
=== Logging integration
@@ -1191,7 +1191,7 @@ Refer to {observability-guide}/apm-monitoring-local-collection.html[Use local co
{move-notice}
-Refer to {observability-guide}/apm-select-metrics.html[The select metrics].
+Refer to {observability-guide}/apm-monitoring-local-collection.html#apm-select-metrics[The select metrics].
[role="exclude",id="monitoring-metricbeat-collection"]
=== Use Metricbeat collection
@@ -1226,45 +1226,45 @@ Refer to {observability-guide}/apm-api-events.html[Elastic APM events intake API
{move-notice}
-Refer to {observability-guide}/apm-api-metadata.html[Metadata].
+Refer to {observability-guide}/apm-api-events.html#apm-api-metadata[Metadata].
[discrete]
[[api-metadata-schema]]
==== Metadata scheme
-Refer to {observability-guide}/apm-api-metadata.html#apm-api-metadata-schema[Metadata scheme].
+Refer to {observability-guide}/apm-api-events.html#apm-api-metadata-schema[Metadata scheme].
[role="exclude",id="api-transaction"]
=== Transactions
{move-notice}
-Refer to {observability-guide}/apm-api-transaction.html[Transactions].
+Refer to {observability-guide}/apm-api-events.html#apm-api-transaction[Transactions].
[role="exclude",id="api-span"]
=== Spans
{move-notice}
-Refer to {observability-guide}/apm-api-span.html[Spans].
+Refer to {observability-guide}/apm-api-events.html#apm-api-span[Spans].
[role="exclude",id="api-error"]
=== Errors
{move-notice}
-Refer to {observability-guide}/apm-api-error.html[Errors].
+Refer to {observability-guide}/apm-api-events.html#apm-api-error[Errors].
[role="exclude",id="api-metricset"]
=== Metrics
-Refer to {observability-guide}/apm-api-metricset.html[Metrics]
+Refer to {observability-guide}/apm-api-events.html#apm-api-metricset[Metrics]
[role="exclude",id="api-event-example"]
=== Example request body
{move-notice}
-Refer to {observability-guide}/apm-api-event-example.html[Example request body].
+Refer to {observability-guide}/apm-api-events.html#apm-api-event-example[Example request body].
[role="exclude",id="api-config"]
=== Elastic APM agent configuration API
diff --git a/docs/en/observability/apm-ui/apm-alerts.asciidoc b/docs/en/observability/apm-alerts.asciidoc
similarity index 95%
rename from docs/en/observability/apm-ui/apm-alerts.asciidoc
rename to docs/en/observability/apm-alerts.asciidoc
index 99a6b6f5ef..063322a2cd 100644
--- a/docs/en/observability/apm-ui/apm-alerts.asciidoc
+++ b/docs/en/observability/apm-alerts.asciidoc
@@ -1,9 +1,5 @@
[[apm-alerts]]
-=== Alerts and rules
-
-++++
-Create an alert
-++++
+= APM alerts and rules
The APM UI allows you to define **rules** to detect complex conditions within your APM data
and trigger built-in **actions** when those conditions are met.
@@ -28,7 +24,7 @@ see Kibana's {kibana-ref}/create-and-manage-rules.html[Create and manage rules].
[float]
[[apm-create-transaction-alert]]
-=== Example: create a latency anomaly rule
+== Example: create a latency anomaly rule
Latency anomaly rules trigger when the latency of a service is abnormal.
Because some parts of an application are more important than others, and have a different
@@ -71,7 +67,7 @@ Click **Save**. Your rule has been created and is now active!
[float]
[[apm-create-error-alert]]
-=== Example: create an error count threshold alert
+== Example: create an error count threshold alert
The error count threshold alert triggers when the number of errors in a service exceeds a defined threshold.
Because some errors are more important than others, this guide will focus a specific error group ID.
@@ -131,13 +127,13 @@ Click **Save**. The alert has been created and is now active!
[float]
[[apm-alert-view-active]]
-=== View active alerts
+== View active alerts
Active alerts are displayed and grouped in multiple ways in the APM UI.
[float]
[[apm-alert-view-group]]
-==== View alerts by service group
+=== View alerts by service group
If you're using the <> feature, you can view alerts by service group.
From the service group overview page, click the red alert indicator to open the **Alerts** tab with a predefined filter that matches the filter used when creating the service group.
@@ -147,7 +143,7 @@ image::./images/apm-service-group.png[Example view of service group in the APM U
[float]
[[apm-alert-view-service]]
-==== View alerts by service
+=== View alerts by service
Alerts can be viewed within the context of any service.
After selecting a service, go to the **Alerts** tab to view any alerts that are active for the selected service.
@@ -157,7 +153,7 @@ image::./images/active-alert-service.png[View active alerts by service]
[float]
[[apm-alert-manage]]
-=== Manage alerts and rules
+== Manage alerts and rules
From the APM UI, select **Alerts and rules** > **Manage rules** to be taken to
the {kib} *{rules-ui}* page.
@@ -165,7 +161,7 @@ From this page, you can disable, mute, and delete APM alerts.
[float]
[[apm-alert-more-info]]
-=== More information
+== More information
See {kibana-ref}/alerting-getting-started.html[Alerting] for more information.
diff --git a/docs/en/observability/apm-ui/apm-app-users.asciidoc b/docs/en/observability/apm-ui/apm-app-users.asciidoc
deleted file mode 100644
index d54c913fac..0000000000
--- a/docs/en/observability/apm-ui/apm-app-users.asciidoc
+++ /dev/null
@@ -1,351 +0,0 @@
-[[apm-app-users]]
-== APM UI users and privileges
-
-:beat_default_index_prefix: apm
-:annotation_index: observability-annotations
-
-++++
-Users and privileges
-++++
-
-Use role-based access control to grant users access to secured
-resources. The roles that you set up depend on your organization's security
-requirements and the minimum privileges required to use specific features.
-
-{es-security-features} provides {ref}/built-in-roles.html[built-in roles] that grant a
-subset of the privileges needed by APM users.
-When possible, assign users the built-in roles to minimize the affect of future changes on your security strategy.
-If no built-in role is available, you can assign users the privileges needed to accomplish a specific task.
-In general, there are three types of privileges you'll work with:
-
-* **Elasticsearch cluster privileges**: Manage the actions a user can perform against your cluster.
-* **Elasticsearch index privileges**: Control access to the data in specific indices your cluster.
-* **Kibana feature privileges**: Grant users write or read access to features and apps within Kibana.
-
-Select your use-case to get started:
-
-* <>
-* <>
-* <>
-* <>
-* <>
-
-////
-*********************************** ***********************************
-////
-
-[[apm-app-reader]]
-=== APM reader user
-
-++++
-Create an APM reader user
-++++
-
-APM reader users typically need to view the APM UI and dashboards and visualizations that use APM data.
-These users might also need to create and edit dashboards, visualizations, and machine learning jobs.
-
-[float]
-[[apm-app-reader-full]]
-==== APM reader
-
-To create an APM reader user:
-
-. Create a new role, named something like `read-apm`, and assign the following privileges:
-+
---
-:apm-read-view:
-:apm-monitor:
-include::./tab-widgets/apm-app-reader/widget.asciidoc[]
-:!apm-read-view:
-:!apm-monitor:
---
-
-. Assign the `read-apm` role created in the previous step, and the following built-in roles to
-any APM reader users:
-+
-[options="header"]
-|====
-|Role | Purpose
-
-|`kibana_admin`
-|Grants access to all features in Kibana.
-
-|`machine_learning_admin`
-|Grants the privileges required to create, update, and view machine learning jobs
-|====
-
-[float]
-[[apm-app-reader-partial]]
-==== Partial APM reader
-
-In some instances, you may wish to restrict certain Kibana apps that a user has access to.
-
-. Create a new role, named something like `read-apm-partial`, and assign the following privileges:
-+
---
-include::./tab-widgets/apm-app-reader/widget.asciidoc[]
---
-
-. Assign feature privileges to any Kibana feature that the user needs access to.
-Here are two examples:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-| Kibana
-| `Read` or `All` on the APM and User Experience feature
-| Allow the use of the the APM and User Experience apps
-
-| Kibana
-| `Read` or `All` on Dashboards and Discover
-| Allow the user to view, edit, and create dashboards, as well as browse data.
-|====
-
-. Finally, assign the following role if a user needs to enable and edit machine learning features:
-+
-[options="header"]
-|====
-|Role | Purpose
-
-|`machine_learning_admin`
-|Grants the privileges required to create, update, and view machine learning jobs
-|====
-
-////
-*********************************** ***********************************
-////
-
-[[apm-app-annotation-user-create]]
-=== APM UI annotation user
-
-++++
-Create an annotation user
-++++
-
-NOTE: By default, the `viewer` and `editor` built-in roles provide read access to Observability annotations.
-You only need to create an annotation user to write to the annotations index
-({kibana-ref}/apm-settings-kb.html[`xpack.observability.annotations.index`]).
-
-[float]
-[[apm-app-annotation-user]]
-==== Annotation user
-
-View deployment annotations in the APM UI.
-
-. Create a new role, named something like `annotation_user`,
-and assign the following privileges:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-|Index
-|`read` on +\{ANNOTATION_INDEX\}+^1^
-|Read-only access to the observability annotation index
-
-|Index
-|`view_index_metadata` on +\{ANNOTATION_INDEX\}+^1^
-|Read-only access to observability annotation index metadata
-|====
-+
-^1^ +\{ANNOTATION_INDEX\}+ should be the index name you've defined in
-{kibana-ref}/apm-settings-kb.html[`xpack.observability.annotations.index`].
-
-. Assign the `annotation_user` created previously, and the roles and privileges necessary to create
-a <> or <> APM reader to any users that need to view annotations in the APM UI
-
-[float]
-[[apm-app-annotation-api]]
-==== Annotation API
-
-See <>.
-
-////
-*********************************** ***********************************
-////
-
-[[apm-app-central-config-user]]
-=== APM UI central config user
-
-++++
-Create a central config user
-++++
-
-[float]
-[[apm-app-central-config-manager]]
-==== Central configuration manager
-
-Central configuration users need to be able to view, create, update, and delete APM agent configurations.
-
-. Create a new role, named something like `central-config-manager`, and assign the following privileges:
-+
---
-include::./tab-widgets/central-config-users/widget.asciidoc[]
---
-+
-TIP: Using the deprecated APM Server binaries?
-Add the privileges under the **Classic APM indices** tab above.
-
-. Assign the `central-config-manager` role created in the previous step,
-and the following Kibana feature privileges to anyone who needs to manage central configurations:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-| Kibana
-|`All` on the APM and User Experience feature
-|Allow full use of the APM and User Experience apps
-|====
-
-[float]
-[[apm-app-central-config-reader]]
-==== Central configuration reader
-
-In some instances, you may wish to create a user that can only read central configurations,
-but not create, update, or delete them.
-
-. Create a new role, named something like `central-config-reader`, and assign the following privileges:
-+
---
-include::./tab-widgets/central-config-users/widget.asciidoc[]
---
-+
-TIP: Using the deprecated APM Server binaries?
-Add the privileges under the **Classic APM indices** tab above.
-
-. Assign the `central-config-reader` role created in the previous step,
-and the following Kibana feature privileges to anyone who needs to read central configurations:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-| Kibana
-|`read` on the APM and User Experience feature
-|Allow read access to the APM and User Experience apps
-|====
-
-[float]
-[[apm-app-central-config-api]]
-==== Central configuration API
-
-See <>.
-
-////
-*********************************** ***********************************
-////
-
-[[apm-app-storage-explorer-user-create]]
-=== APM UI storage explorer user
-
-++++
-Create a storage explorer user
-++++
-
-[float]
-[[apm-app-storage-explorer-user]]
-==== Storage Explorer user
-
-View the **Storage Explorer** in the APM UI.
-
-. Create a new role, named something like `storage-explorer_user`,
-and assign the following privileges:
-+
---
-include::./tab-widgets/storage-explorer-user/widget.asciidoc[]
---
-
-. Assign the `storage-explorer_user` created previously, and the roles and privileges necessary to create
-a <> or <> APM reader to any users that need to view **Storage Explorer** in the APM UI.
-
-////
-*********************************** ***********************************
-////
-
-[[apm-app-api-user]]
-=== APM UI API user
-
-++++
-Create an API user
-++++
-
-[float]
-[[apm-app-api-config-manager]]
-==== Central configuration API
-
-Users can list, search, create, update, and delete central configurations via the APM UI API.
-
-. Assign the following Kibana feature privileges:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-| Kibana
-|`all` on the APM and User Experience feature
-|Allow all access to the APM and User Experience apps
-|====
-
-[float]
-[[apm-app-api-config-reader]]
-==== Central configuration API reader
-
-Sometimes a user only needs to list and search central configurations via the APM UI API.
-
-. Assign the following Kibana feature privileges:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-| Kibana
-|`read` on the APM and User Experience feature
-|Allow read access to the APM and User Experience apps
-|====
-
-[float]
-[[apm-app-api-annotation-manager]]
-==== Annotation API
-
-Users can use the annotation API to create annotations on their APM data.
-
-. Create a new role, named something like `annotation_role`,
-and assign the following privileges:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-|Index
-|`manage` on +{annotation_index}+ index
-|Check if the +{annotation_index}+ index exists
-
-|Index
-|`read` on +{annotation_index}+ index
-|Read the +{annotation_index}+ index
-
-|Index
-|`create_index` on +{annotation_index}+ index
-|Create the +{annotation_index}+ index
-
-|Index
-|`create_doc` on +{annotation_index}+ index
-|Create new annotations in the +{annotation_index}+ index
-|====
-
-. Assign the `annotation_role` created previously,
-and the following Kibana feature privileges to any annotation API users:
-+
-[options="header"]
-|====
-|Type | Privilege | Purpose
-
-| Kibana
-|`all` on the APM and User Experience feature
-|Allow all access to the APM and User Experience apps
-|====
-
-//LEARN MORE
-//Learn more about <>.
diff --git a/docs/en/observability/apm-ui/index.asciidoc b/docs/en/observability/apm-ui/index.asciidoc
deleted file mode 100644
index 5c3303acd7..0000000000
--- a/docs/en/observability/apm-ui/index.asciidoc
+++ /dev/null
@@ -1,76 +0,0 @@
-[[apm-ui]]
-= Navigate the APM UI
-
-TIP: For task-oriented guides, see the <>.
-
-The APM UI in {kib} allows you to monitor your software services and applications in real-time;
-visualize detailed performance information on your services,
-identify and analyze errors,
-and monitor host-level and APM agent-specific metrics like JVM and Go runtime metrics.
-
-Having access to application-level insights with just a few clicks can drastically decrease the time you spend
-debugging errors, slow response times, and crashes.
-
-For example, you can see information about response times, requests per minute, and status codes per endpoint.
-You can even dive into a specific request sample and get a complete waterfall view of what your application is spending its time on.
-You might see that your bottlenecks are in database queries, cache calls, or external requests.
-For each incoming request and each application error,
-you can also see contextual information such as the request header, user information,
-system values, or custom data that you manually attached to the request.
-
-For a quick, high-level overview of the health and performance of your application,
-start with:
-
-* <>
-* <>
-* <>
-* <>
-
-Notice something awry? Select a service or trace and dive deeper with:
-
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-
-Configure and troubleshoot the APM UI:
-
-* <>
-* <>
-* <>
-
-include::services.asciidoc[leveloffset=-1]
-
-include::new-experience-services.asciidoc[leveloffset=+2]
-
-include::traces.asciidoc[leveloffset=-1]
-
-include::dependencies.asciidoc[leveloffset=-1]
-
-include::service-maps.asciidoc[leveloffset=-1]
-
-include::service-overview.asciidoc[leveloffset=-1]
-
-include::mobile-service.asciidoc[leveloffset=-1]
-
-include::transactions.asciidoc[leveloffset=-1]
-
-include::spans.asciidoc[leveloffset=-1]
-
-include::errors.asciidoc[leveloffset=-1]
-
-include::metrics.asciidoc[leveloffset=-1]
-
-include::infrastructure.asciidoc[leveloffset=-1]
-
-include::logs.asciidoc[leveloffset=-1]
-
-include::apm-app-users.asciidoc[]
-
-include::settings.asciidoc[]
-
-include::troubleshooting.asciidoc[]
diff --git a/docs/en/observability/apm.asciidoc b/docs/en/observability/apm.asciidoc
index 4c9e3693c0..ba2f844727 100644
--- a/docs/en/observability/apm.asciidoc
+++ b/docs/en/observability/apm.asciidoc
@@ -46,36 +46,27 @@ like JVM metrics in the Java Agent, and Go runtime metrics in the Go Agent.
Use <> to quickly spin up an APM deployment.
Want to host everything yourself instead? See <>.
-include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm-server.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/data-model.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/features.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm-ui/index.asciidoc[leveloffset=+1]
-
-include::{observability-docs-root}/docs/en/observability/apm/how-to.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/open-telemetry.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/manage-storage.asciidoc[]
-
+////
+Subsections
+////
+
+// Intro content
+include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm/index.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/data-model/index.asciidoc[leveloffset=+1]
+// Get data
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/index.asciidoc[leveloffset=+1]
+// Do things with that data
+include::{observability-docs-root}/docs/en/observability/apm/view-and-analyze/index.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/act-on-data/index.asciidoc[leveloffset=+1]
+// Fine-tune your implementation
+include::{observability-docs-root}/docs/en/observability/apm/security/index.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/manage-storage/index.asciidoc[leveloffset=+1]
include::{observability-docs-root}/docs/en/observability/apm/configure/index.asciidoc[leveloffset=+1]
-
-include::{observability-docs-root}/docs/en/observability/apm/setting-up-and-running.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/secure-comms.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/monitor-apm-server.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/api.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm-ui/api.asciidoc[]
-
-include::{observability-docs-root}/docs/en/observability/apm/troubleshoot-apm.asciidoc[]
-
+include::{observability-docs-root}/docs/en/observability/apm/monitor-apm-server/index.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/api/index.asciidoc[leveloffset=+1]
+// Fix something
+include::{observability-docs-root}/docs/en/observability/apm/troubleshooting/index.asciidoc[leveloffset=+1]
+// Update an existing implementation
include::{observability-docs-root}/docs/en/observability/apm/upgrading.asciidoc[]
-
include::{observability-docs-root}/docs/en/observability/apm/release-notes.asciidoc[leveloffset=+1]
-
-include::{observability-docs-root}/docs/en/observability/apm/known-issues.asciidoc[leveloffset=+1]
\ No newline at end of file
+include::{observability-docs-root}/docs/en/observability/apm/known-issues.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm-ui/custom-links.asciidoc b/docs/en/observability/apm/act-on-data/custom-links.asciidoc
similarity index 97%
rename from docs/en/observability/apm-ui/custom-links.asciidoc
rename to docs/en/observability/apm/act-on-data/custom-links.asciidoc
index 0e235c125e..f4bc31408b 100644
--- a/docs/en/observability/apm-ui/custom-links.asciidoc
+++ b/docs/en/observability/apm/act-on-data/custom-links.asciidoc
@@ -1,5 +1,5 @@
[[apm-custom-links]]
-=== Custom links
+= Custom links in the APM UI
++++
Create custom links
@@ -14,7 +14,7 @@ Ready to dive in? Jump straight to the <>.
[float]
[[custom-links-create]]
-=== Create a link
+== Create a link
Each custom link consists of a label, URL, and optional filter.
The easiest way to create a custom link is from within the actions dropdown in the transaction detail page.
@@ -26,7 +26,7 @@ and selecting **Create custom link**.
[float]
[[custom-links-label]]
-==== Label
+=== Label
The name of your custom link.
The actions context menu displays this text, so keep it as short as possible.
@@ -35,7 +35,7 @@ TIP: Custom links are displayed alphabetically in the actions menu.
[float]
[[custom-links-url]]
-==== URL
+=== URL
The URL your link points to.
URLs support dynamic field name variables, encapsulated in double curly brackets: `{{field.name}}`.
@@ -50,7 +50,7 @@ image::./images/example-metadata.png[Example metadata]
[float]
[[custom-links-filters]]
-==== Filters
+=== Filters
Filter each link to only appear for specific services or transactions.
You can filter on the following fields:
@@ -64,7 +64,7 @@ Multiple values are allowed when comma-separated.
[float]
[[custom-links-examples]]
-=== Custom link examples
+== Custom link examples
// Relevant documentation links
:jira-query-params: https://confluence.atlassian.com/jirakb/how-to-create-issues-using-direct-html-links-in-jira-server-159474.html
@@ -75,7 +75,7 @@ Take a look at the examples below and customize them to your liking!
[float]
[[custom-links-examples-email]]
-==== Email
+=== Email
Email the owner of a service.
@@ -98,7 +98,7 @@ It will only appear on services with the name `python-backend`.
[float]
[[custom-links-examples-gh]]
-==== GitHub issue
+=== GitHub issue
Open a GitHub issue with pre-populated metadata from the selected trace sample.
@@ -127,7 +127,7 @@ See the {github-query-params}[GitHub automation documentation] for a full list o
[float]
[[custom-links-examples-jira]]
-==== Jira task
+=== Jira task
Create a Jira task with pre-populated metadata from the selected trace sample.
@@ -155,7 +155,7 @@ for a full list of supported query parameters.
[float]
[[custom-links-examples-kib]]
-==== Kibana dashboards
+=== Kibana dashboards
Link to a custom dashboard in Kibana.
@@ -176,7 +176,7 @@ There are no filters set.
[float]
[[custom-links-examples-slack]]
-==== Slack channel
+=== Slack channel
Open a specified slack channel.
@@ -199,7 +199,7 @@ It only appears when `transaction.name` is `GET user/login`.
[float]
[[custom-links-examples-web]]
-==== Website
+=== Website
Open an internal or external website.
diff --git a/docs/en/observability/apm/act-on-data/index.asciidoc b/docs/en/observability/apm/act-on-data/index.asciidoc
new file mode 100644
index 0000000000..a3036dcf71
--- /dev/null
+++ b/docs/en/observability/apm/act-on-data/index.asciidoc
@@ -0,0 +1,24 @@
+[[apm-act-on-data]]
+= Act on application data
+
+++++
+Act on data
+++++
+
+In addition to exploring visualizations in the APM UI in {kib}, you can make your application data
+more actionable with:
+
+* *Alerts and rules*: The APM UI allows you to define rules to detect complex
+ conditions within your APM data and trigger built-in actions when those conditions are met.
+ Read more about alerts and rules in the <>.
+* *Custom links*: Build URLs that contain relevant metadata from a specific trace.
+ For example, you can create a link that will take you to a page where you can open a new GitHub issue
+ with context already auto-populated in the issue body.
+ These links will be shown in the _Actions_ context menu in selected areas of the APM UI (for example, by transaction details).
+ Read more in <>.
+
+:leveloffset: +1
+
+include::{observability-docs-root}/docs/en/observability/apm/act-on-data/custom-links.asciidoc[]
+
+:!leveloffset:
diff --git a/docs/en/observability/apm-ui/api.asciidoc b/docs/en/observability/apm/api/api-ui.asciidoc
similarity index 94%
rename from docs/en/observability/apm-ui/api.asciidoc
rename to docs/en/observability/apm/api/api-ui.asciidoc
index 33a64d5d75..8bf85cf5ff 100644
--- a/docs/en/observability/apm-ui/api.asciidoc
+++ b/docs/en/observability/apm/api/api-ui.asciidoc
@@ -1,5 +1,5 @@
[[apm-app-api]]
-== APM UI API
+= APM UI API
Some APM UI features are provided via a REST API:
@@ -10,7 +10,7 @@ Some APM UI features are provided via a REST API:
[float]
[[apm-api-example]]
-=== Using the APIs
+== Using the APIs
// The following content is reused throughout the API docs
// tag::using-the-APIs[]
@@ -68,7 +68,7 @@ curl -X POST \
[float]
[[kibana-api]]
-=== Kibana API
+== Kibana API
In addition to the APM specific API endpoints, Kibana provides its own <>
which you can use to automate certain aspects of configuring and deploying Kibana.
@@ -79,7 +79,7 @@ which you can use to automate certain aspects of configuring and deploying Kiban
////
[[apm-agent-config-api]]
-=== Agent Configuration API
+== Agent Configuration API
The APM agent configuration API allows you to fine-tune your APM agent configuration,
without needing to redeploy your application.
@@ -93,44 +93,44 @@ The following APM agent configuration APIs are available:
[float]
[[use-agent-config-api]]
-==== How to use APM APIs
+=== How to use APM APIs
.Expand for required headers, privileges, and usage details
[%collapsible%closed]
-======
-include::api.asciidoc[tag=using-the-APIs]
-======
+=====
+include::api-ui.asciidoc[tag=using-the-APIs]
+=====
////
*******************************************************
////
[[apm-update-config]]
-==== Create or update configuration
+=== Create or update configuration
[float]
[[apm-update-config-req]]
-===== Request
+==== Request
`PUT /api/apm/settings/agent-configuration`
[float]
[role="child_attributes"]
[[apm-update-config-req-body]]
-===== Request body
+==== Request body
`service`::
(required, object) Service identifying the configuration to create or update.
+
.Properties of `service`
[%collapsible%open]
-======
+=====
`name` :::
(required, string) Name of service
`environment` :::
(optional, string) Environment of service
-======
+=====
`settings`::
(required) Key/value object with option name and option value.
@@ -141,7 +141,7 @@ include::api.asciidoc[tag=using-the-APIs]
[float]
[[apm-update-config-example]]
-===== Example
+==== Example
[source,curl]
--------------------------------------------------
@@ -166,35 +166,35 @@ PUT /api/apm/settings/agent-configuration
[[apm-delete-config]]
-==== Delete configuration
+=== Delete configuration
[float]
[[apm-delete-config-req]]
-===== Request
+==== Request
`DELETE /api/apm/settings/agent-configuration`
[float]
[role="child_attributes"]
[[apm-delete-config-req-body]]
-===== Request body
+==== Request body
`service`::
(required, object) Service identifying the configuration to delete
+
.Properties of `service`
[%collapsible%open]
-======
+=====
`name` :::
(required, string) Name of service
`environment` :::
(optional, string) Environment of service
-======
+=====
[float]
[[apm-delete-config-example]]
-===== Example
+==== Example
[source,curl]
--------------------------------------------------
@@ -212,17 +212,17 @@ DELETE /api/apm/settings/agent-configuration
////
[[apm-list-config]]
-==== List configuration
+=== List configuration
[float]
[[apm-list-config-req]]
-===== Request
+==== Request
`GET /api/apm/settings/agent-configuration`
[float]
[[apm-list-config-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
@@ -273,7 +273,7 @@ DELETE /api/apm/settings/agent-configuration
[float]
[[apm-list-config-example]]
-===== Example
+==== Example
[source,curl]
--------------------------------------------------
@@ -285,38 +285,38 @@ GET /api/apm/settings/agent-configuration
////
[[apm-search-config]]
-==== Search configuration
+=== Search configuration
[float]
[[apm-search-config-req]]
-===== Request
+==== Request
`POST /api/apm/settings/agent-configuration/search`
[float]
[role="child_attributes"]
[[apm-search-config-req-body]]
-===== Request body
+==== Request body
`service`::
(required, object) Service identifying the configuration.
+
.Properties of `service`
[%collapsible%open]
-======
+=====
`name` :::
(required, string) Name of service
`environment` :::
(optional, string) Environment of service
-======
+=====
`etag`::
(required) etag is sent by the APM agent to indicate the etag of the last successfully applied configuration. If the etag matches an existing configuration its `applied_by_agent` property will be set to `true`. Every time a configuration is edited `applied_by_agent` is reset to `false`.
[float]
[[apm-search-config-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
@@ -341,7 +341,7 @@ GET /api/apm/settings/agent-configuration
[float]
[[apm-search-config-example]]
-===== Example
+==== Example
[source,curl]
--------------------------------------------------
@@ -361,7 +361,7 @@ POST /api/apm/settings/agent-configuration/search
////
[[apm-annotation-api]]
-=== Annotation API
+== Annotation API
The Annotation API allows you to annotate visualizations in the APM UI with significant events, like deployments,
allowing you to easily see how these events are impacting the performance of your existing applications.
@@ -379,44 +379,44 @@ The following APIs are available:
[float]
[[use-annotation-api]]
-==== How to use APM APIs
+=== How to use APM APIs
.Expand for required headers, privileges, and usage details
[%collapsible%closed]
-======
-include::api.asciidoc[tag=using-the-APIs]
-======
+=====
+include::api-ui.asciidoc[tag=using-the-APIs]
+=====
////
*******************************************************
////
[[apm-annotation-create]]
-==== Create or update annotation
+=== Create or update annotation
[float]
[[apm-annotation-config-req]]
-===== Request
+==== Request
`POST /api/apm/services/:serviceName/annotation`
[float]
[role="child_attributes"]
[[apm-annotation-config-req-body]]
-===== Request body
+==== Request body
`service`::
(required, object) Service identifying the configuration to create or update.
+
.Properties of `service`
[%collapsible%open]
-======
+=====
`version` :::
(required, string) Version of service.
`environment` :::
(optional, string) Environment of service.
-======
+=====
`@timestamp`::
(required, string) The date and time of the annotation. Must be in https://www.w3.org/TR/NOTE-datetime[ISO 8601] format.
@@ -431,7 +431,7 @@ While you can add additional tags, you cannot remove the `apm` tag.
[float]
[[apm-annotation-config-example]]
-===== Example
+==== Example
The following example creates an annotation for a service named `opbeans-java`.
@@ -453,7 +453,7 @@ curl -X POST \
[float]
[[apm-annotation-config-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
@@ -492,7 +492,7 @@ curl -X POST \
////
[[apm-rum-sourcemap-api]]
-=== RUM source map API
+== RUM source map API
IMPORTANT: This endpoint is only compatible with the
{apm-guide-ref}/index.html[APM integration for Elastic Agent].
@@ -514,7 +514,7 @@ The following APIs are available:
[float]
[[limit-sourcemap-api]]
-==== Max payload size
+=== Max payload size
{kib}'s maximum payload size is 1mb.
If you attempt to upload a source map that exceeds the max payload size, you will get a `413` error.
@@ -524,40 +524,40 @@ with the `server.maxPayload` variable.
[float]
[[use-sourcemap-api]]
-==== How to use APM APIs
+=== How to use APM APIs
.Expand for required headers, privileges, and usage details
[%collapsible%closed]
-======
-include::api.asciidoc[tag=using-the-APIs]
-======
+=====
+include::api-ui.asciidoc[tag=using-the-APIs]
+=====
////
*******************************************************
////
[[rum-sourcemap-post]]
-==== Create or update source map
+=== Create or update source map
Create or update a source map for a specific service and version.
[float]
[[rum-sourcemap-post-privs]]
-===== Privileges
+==== Privileges
The user accessing this endpoint requires `All` Kibana privileges for the APM and User Experience feature.
For more information, see {kibana-ref}/kibana-privileges.html[Kibana privileges].
[float]
[[apm-sourcemap-post-req]]
-===== Request
+==== Request
`POST /api/apm/sourcemaps`
[float]
[role="child_attributes"]
[[apm-sourcemap-post-req-body]]
-===== Request body
+==== Request body
`service_name`::
(required, string) The name of the service that the service map should apply to.
@@ -574,7 +574,7 @@ https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k[
[float]
[[apm-sourcemap-post-example]]
-===== Examples
+==== Examples
The following example uploads a source map for a service named `foo` and a service version of `1.0.0`:
@@ -593,7 +593,7 @@ curl -X POST "http://localhost:5601/api/apm/sourcemaps" \
[float]
[[apm-sourcemap-post-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
@@ -619,26 +619,26 @@ curl -X POST "http://localhost:5601/api/apm/sourcemaps" \
////
[[rum-sourcemap-get]]
-==== Get source maps
+=== Get source maps
Returns an array of Fleet artifacts, including source map uploads.
[float]
[[rum-sourcemap-get-privs]]
-===== Privileges
+==== Privileges
The user accessing this endpoint requires `Read` or `All` Kibana privileges for the APM and User Experience feature.
For more information, see {kibana-ref}/kibana-privileges.html[Kibana privileges].
[float]
[[apm-sourcemap-get-req]]
-===== Request
+==== Request
`GET /api/apm/sourcemaps`
[float]
[[apm-sourcemap-get-example]]
-===== Example
+==== Example
The following example requests all uploaded source maps:
@@ -652,7 +652,7 @@ curl -X GET "http://localhost:5601/api/apm/sourcemaps" \
[float]
[[apm-sourcemap-get-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
@@ -702,26 +702,26 @@ curl -X GET "http://localhost:5601/api/apm/sourcemaps" \
////
[[rum-sourcemap-delete]]
-==== Delete source map
+=== Delete source map
Delete a previously uploaded source map.
[float]
[[rum-sourcemap-delete-privs]]
-===== Privileges
+==== Privileges
The user accessing this endpoint requires `All` Kibana privileges for the APM and User Experience feature.
For more information, see {kibana-ref}/kibana-privileges.html[Kibana privileges].
[float]
[[apm-sourcemap-delete-req]]
-===== Request
+==== Request
`DELETE /api/apm/sourcemaps/:id`
[float]
[[apm-sourcemap-delete-example]]
-===== Example
+==== Example
The following example deletes a source map with an id of `apm:foo-1.0.0-644fd5a9`:
@@ -735,7 +735,7 @@ curl -X DELETE "http://localhost:5601/api/apm/sourcemaps/apm:foo-1.0.0-644fd5a9"
[float]
[[apm-sourcemap-delete-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
@@ -748,7 +748,7 @@ curl -X DELETE "http://localhost:5601/api/apm/sourcemaps/apm:foo-1.0.0-644fd5a9"
////
[[apm-agent-key-api]]
-=== APM agent Key API
+== APM agent Key API
The APM agent Key API allows you to configure APM agent keys to authorize requests from APM agents to the APM Server.
@@ -758,34 +758,34 @@ The following APM agent key APIs are available:
[float]
[[use-agent-key-api]]
-==== How to use APM APIs
+=== How to use APM APIs
.Expand for required headers, privileges, and usage details
[%collapsible%closed]
-======
-include::api.asciidoc[tag=using-the-APIs]
-======
+=====
+include::api-ui.asciidoc[tag=using-the-APIs]
+=====
////
*******************************************************
////
[[apm-create-agent-key]]
-==== Create agent key
+=== Create agent key
Create an APM agent API key. Specify API key privileges in the request body at creation time.
[float]
[[apm-create-agent-key-privileges]]
-===== Privileges
+==== Privileges
The user creating an APM agent API key must have at least the `manage_own_api_key` cluster privilege
and the APM application-level privileges that it wishes to grant.
[float]
-====== Example role
+===== Example role
The example below uses the Kibana {kibana-ref}/role-management-api.html[role management API] to create a role named `apm_agent_key_user`.
Create and assign this role to a user that wishes to create APM agent API keys.
@@ -813,7 +813,7 @@ POST /_security/role/apm_agent_key_user
[float]
[[apm-create-agent-key-req]]
-===== Request
+==== Request
`POST /api/apm/agent_keys`
@@ -821,7 +821,7 @@ POST /_security/role/apm_agent_key_user
[float]
[role="child_attributes"]
[[apm-create-agent-key-req-body]]
-===== Request body
+==== Request body
`name`::
(required, string) Name of the APM agent key.
@@ -835,7 +835,7 @@ POST /_security/role/apm_agent_key_user
[float]
[[apm-agent-key-create-example]]
-===== Example
+==== Example
[source,curl]
--------------------------------------------------
@@ -849,7 +849,7 @@ POST /api/apm/agent_keys
[float]
[[apm-agent-key-create-body]]
-===== Response body
+==== Response body
[source,js]
--------------------------------------------------
diff --git a/docs/en/observability/apm/api-config.asciidoc b/docs/en/observability/apm/api/apm-server/api-config.asciidoc
similarity index 94%
rename from docs/en/observability/apm/api-config.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-config.asciidoc
index f98d464432..9077f13c7a 100644
--- a/docs/en/observability/apm/api-config.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-config.asciidoc
@@ -1,12 +1,12 @@
[[apm-api-config]]
-=== Elastic APM agent configuration API
+= Elastic APM agent configuration API
APM Server exposes API endpoints that allow Elastic APM agents to query the APM Server for configuration changes.
More information on this feature is available in <>.
[float]
[[apm-api-config-endpoint]]
-=== Agent configuration endpoints
+== Agent configuration endpoints
[options="header"]
|====
@@ -20,7 +20,7 @@ If an <> or <> is configured, requests to this en
[float]
[[apm-api-config-api-get]]
-==== HTTP GET
+=== HTTP GET
`service.name` is a required query string parameter.
@@ -31,7 +31,7 @@ http(s)://{hostname}:{port}/config/v1/agents?service.name=SERVICE_NAME
[float]
[[apm-api-config-api-post]]
-==== HTTP POST
+=== HTTP POST
Encode parameters as a JSON object in the body.
`service.name` is a required parameter.
@@ -50,7 +50,7 @@ http(s)://{hostname}:{port}/config/v1/agents
[float]
[[apm-api-config-api-response]]
-==== Responses
+=== Responses
* Successful - `200`
* APM Server is configured to fetch agent configuration from {es} but the configuration is invalid - `403`
@@ -58,7 +58,7 @@ http(s)://{hostname}:{port}/config/v1/agents
[float]
[[apm-api-config-api-example]]
-==== Example request
+=== Example request
Example Agent configuration `GET` request including the service name "test-service":
@@ -79,7 +79,7 @@ curl -X POST http://127.0.0.1:8200/config/v1/agents \
[float]
[[apm-api-config-api-ex-response]]
-==== Example response
+=== Example response
["source","sh",subs="attributes"]
---------------------------------------------------------------------------
diff --git a/docs/en/observability/apm/api-error.asciidoc b/docs/en/observability/apm/api/apm-server/api-error.asciidoc
similarity index 93%
rename from docs/en/observability/apm/api-error.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-error.asciidoc
index 3e49ac2f2e..3044b6ead4 100644
--- a/docs/en/observability/apm/api-error.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-error.asciidoc
@@ -1,11 +1,11 @@
[[apm-api-error]]
-==== Errors
+= Errors
An error or a logged error message captured by an agent occurring in a monitored service.
[float]
[[apm-api-error-schema]]
-==== Error Schema
+== Error Schema
APM Server uses JSON Schema to validate requests. The specification for errors is defined on
https://github.com/elastic/apm-server/blob/{minor-version}/docs/spec/v2/error.json[GitHub] and included below:
diff --git a/docs/en/observability/apm/api-event-example.asciidoc b/docs/en/observability/apm/api/apm-server/api-event-example.asciidoc
similarity index 89%
rename from docs/en/observability/apm/api-event-example.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-event-example.asciidoc
index 7dea62cf5a..43252fa7f9 100644
--- a/docs/en/observability/apm/api-event-example.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-event-example.asciidoc
@@ -1,5 +1,5 @@
[[apm-api-event-example]]
-==== Example request body
+= Example request body
A request body example containing one event for all currently supported event types.
diff --git a/docs/en/observability/apm/api-events.asciidoc b/docs/en/observability/apm/api/apm-server/api-events.asciidoc
similarity index 92%
rename from docs/en/observability/apm/api-events.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-events.asciidoc
index da1b2f7f67..dd289b0840 100644
--- a/docs/en/observability/apm/api-events.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-events.asciidoc
@@ -1,5 +1,5 @@
[[apm-api-events]]
-=== Elastic APM events intake API
+= Elastic APM events intake API
NOTE: Most users do not need to interact directly with the events intake API.
@@ -24,7 +24,7 @@ See the <> to learn more about the different type
[[apm-api-events-endpoint]]
[float]
-=== Endpoints
+== Endpoints
APM Server exposes the following endpoints for Elastic APM agent data intake:
@@ -38,7 +38,7 @@ APM Server exposes the following endpoints for Elastic APM agent data intake:
[[apm-api-events-example]]
[float]
-=== Request
+== Request
Send an `HTTP POST` request to the APM Server `intake/v2/events` endpoint:
@@ -72,7 +72,7 @@ http(s)://{hostname}:{port}/intake/v3/rum/events
[[apm-api-events-response]]
[float]
-=== Response
+== Response
On success, the server will respond with a 202 Accepted status code and no body.
@@ -80,7 +80,7 @@ Keep in mind that events can succeed and fail independently of each other. Only
[[apm-api-events-errors]]
[float]
-=== Errors
+== Errors
There are two types of errors that the APM Server may return to an agent:
@@ -134,7 +134,7 @@ If you're developing an agent, these errors can be useful for debugging.
[[apm-api-events-schema-definition]]
[float]
-=== Event API Schemas
+== Event API Schemas
The APM Server uses a collection of JSON Schemas for validating requests to the intake API:
@@ -145,9 +145,9 @@ The APM Server uses a collection of JSON Schemas for validating requests to the
* <>
* <>
-include::./api-metadata.asciidoc[]
-include::./api-transaction.asciidoc[]
-include::./api-span.asciidoc[]
-include::./api-error.asciidoc[]
-include::./api-metricset.asciidoc[]
-include::./api-event-example.asciidoc[]
+include::./api-metadata.asciidoc[leveloffset=+1]
+include::./api-transaction.asciidoc[leveloffset=+1]
+include::./api-span.asciidoc[leveloffset=+1]
+include::./api-error.asciidoc[leveloffset=+1]
+include::./api-metricset.asciidoc[leveloffset=+1]
+include::./api-event-example.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/api-info.asciidoc b/docs/en/observability/apm/api/apm-server/api-info.asciidoc
similarity index 94%
rename from docs/en/observability/apm/api-info.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-info.asciidoc
index b1f315ad92..01e2ef14ef 100644
--- a/docs/en/observability/apm/api-info.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-info.asciidoc
@@ -1,12 +1,12 @@
[[apm-api-info]]
-=== APM Server information API
+= APM Server information API
The APM Server exposes an API endpoint to query general server information.
This lightweight endpoint is useful as a server up/down health check.
[float]
[[apm-api-info-endpoint]]
-=== Server Information endpoint
+== Server Information endpoint
This is the server information endpoint:
@@ -28,7 +28,7 @@ the response payload will include some information about the APM server.
[float]
[[apm-api-info-example-get-without-credentials]]
-==== Example: GET, without credentials
+=== Example: GET, without credentials
Example APM Server status request with GET, without credentials:
@@ -55,7 +55,7 @@ curl --verbose -X GET http://127.0.0.1:8200
[float]
[[apm-api-info-example-post-with-secret-token]]
-==== Example: POST, with secret token
+=== Example: POST, with secret token
Example APM Server information request with POST, with a <>:
diff --git a/docs/en/observability/apm/api-jaeger.asciidoc b/docs/en/observability/apm/api/apm-server/api-jaeger.asciidoc
similarity index 92%
rename from docs/en/observability/apm/api-jaeger.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-jaeger.asciidoc
index 9750316a9b..89f249344c 100644
--- a/docs/en/observability/apm/api-jaeger.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-jaeger.asciidoc
@@ -1,5 +1,5 @@
[[apm-api-jaeger]]
-=== Jaeger event intake
+= Jaeger event intake
Elastic APM natively supports Jaeger, an open-source, distributed tracing system.
<>.
@@ -11,4 +11,4 @@ Elastic APM natively supports Jaeger, an open-source, distributed tracing system
|Name |Endpoint
|Jaeger span intake |`/jaeger.api_v2.CollectorService/PostSpans`
|Sampling endpoint |`/jaeger.api_v2.SamplingManager/GetSamplingStrategy`
-|====
\ No newline at end of file
+|====
diff --git a/docs/en/observability/apm/api-metadata.asciidoc b/docs/en/observability/apm/api/apm-server/api-metadata.asciidoc
similarity index 97%
rename from docs/en/observability/apm/api-metadata.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-metadata.asciidoc
index 1d8a29e5c1..db3dad5e3f 100644
--- a/docs/en/observability/apm/api-metadata.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-metadata.asciidoc
@@ -1,5 +1,5 @@
[[apm-api-metadata]]
-==== Metadata
+= Metadata
Every new connection to the APM Server starts with a `metadata` stanza.
This provides general metadata concerning the other objects in the stream.
@@ -14,7 +14,7 @@ TIP: Metadata is stored under `context` when viewing documents in {es}.
[[apm-api-kubernetes-data]]
[float]
-==== Kubernetes data
+== Kubernetes data
APM agents automatically read Kubernetes data and send it to the APM Server.
In most instances, agents are able to read this data from inside the container.
@@ -55,7 +55,7 @@ The table below maps these environment variables to the APM metadata event field
[[apm-api-metadata-schema]]
[float]
-==== Metadata Schema
+== Metadata Schema
APM Server uses JSON Schema to validate requests. The specification for metadata is defined on
https://github.com/elastic/apm-server/blob/{minor-version}/docs/spec/v2/metadata.json[GitHub] and included below:
diff --git a/docs/en/observability/apm/api-metricset.asciidoc b/docs/en/observability/apm/api/apm-server/api-metricset.asciidoc
similarity index 92%
rename from docs/en/observability/apm/api-metricset.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-metricset.asciidoc
index 8e9b701f67..42eafa1f3b 100644
--- a/docs/en/observability/apm/api-metricset.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-metricset.asciidoc
@@ -1,11 +1,11 @@
[[apm-api-metricset]]
-==== Metrics
+= Metrics
Metrics contain application metric data captured by an {apm-agent}.
[[apm-api-metricset-schema]]
[float]
-==== Metric Schema
+== Metric Schema
APM Server uses JSON Schema to validate requests. The specification for metrics is defined on
https://github.com/elastic/apm-server/blob/{minor-version}/docs/spec/v2/metricset.json[GitHub] and included below:
diff --git a/docs/en/observability/apm/api-otlp.asciidoc b/docs/en/observability/apm/api/apm-server/api-otlp.asciidoc
similarity index 93%
rename from docs/en/observability/apm/api-otlp.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-otlp.asciidoc
index 9e75dc6fc6..4215d9ac59 100644
--- a/docs/en/observability/apm/api-otlp.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-otlp.asciidoc
@@ -1,5 +1,5 @@
[[apm-api-otlp]]
-=== OpenTelemetry intake API
+= OpenTelemetry intake API
APM Server supports receiving traces, metrics, and logs over the
https://opentelemetry.io/docs/specs/otlp/[OpenTelemetry Protocol (OTLP)].
@@ -11,7 +11,7 @@ APM Server supports two OTLP communication protocols on the same port:
* OTLP/gRPC
[discrete]
-=== OTLP/gRPC paths
+== OTLP/gRPC paths
[options="header"]
|====
@@ -22,7 +22,7 @@ APM Server supports two OTLP communication protocols on the same port:
|====
[discrete]
-==== OTLP/HTTP paths
+== OTLP/HTTP paths
[options="header"]
|====
diff --git a/docs/en/observability/apm/api-span.asciidoc b/docs/en/observability/apm/api/apm-server/api-span.asciidoc
similarity index 93%
rename from docs/en/observability/apm/api-span.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-span.asciidoc
index 6805e1fb3d..c47df6814f 100644
--- a/docs/en/observability/apm/api-span.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-span.asciidoc
@@ -1,11 +1,11 @@
[[apm-api-span]]
-==== Spans
+= Spans
Spans are events captured by an agent occurring in a monitored service.
[[apm-api-span-schema]]
[float]
-==== Span Schema
+== Span Schema
APM Server uses JSON Schema to validate requests. The specification for spans is defined on
https://github.com/elastic/apm-server/blob/{minor-version}/docs/spec/v2/span.json[GitHub] and included below:
diff --git a/docs/en/observability/apm/api-transaction.asciidoc b/docs/en/observability/apm/api/apm-server/api-transaction.asciidoc
similarity index 91%
rename from docs/en/observability/apm/api-transaction.asciidoc
rename to docs/en/observability/apm/api/apm-server/api-transaction.asciidoc
index ff78ee785f..47ff4a8c16 100644
--- a/docs/en/observability/apm/api-transaction.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/api-transaction.asciidoc
@@ -1,11 +1,11 @@
[[apm-api-transaction]]
-==== Transactions
+= Transactions
Transactions are events corresponding to an incoming request or similar task occurring in a monitored service.
[[apm-api-transaction-schema]]
[float]
-==== Transaction Schema
+== Transaction Schema
APM Server uses JSON Schema to validate requests. The specification for transactions is defined on
https://github.com/elastic/apm-server/blob/{minor-version}/docs/spec/v2/transaction.json[GitHub] and included below:
diff --git a/docs/en/observability/apm/api.asciidoc b/docs/en/observability/apm/api/apm-server/index.asciidoc
similarity index 86%
rename from docs/en/observability/apm/api.asciidoc
rename to docs/en/observability/apm/api/apm-server/index.asciidoc
index 8d81091ca1..d5a71fce4c 100644
--- a/docs/en/observability/apm/api.asciidoc
+++ b/docs/en/observability/apm/api/apm-server/index.asciidoc
@@ -1,5 +1,5 @@
[[apm-api]]
-== APM Server API
+= APM Server API
The APM Server exposes endpoints for:
@@ -9,8 +9,12 @@ The APM Server exposes endpoints for:
* <>
* <>
+:leveloffset: +1
+
include::./api-info.asciidoc[]
include::./api-events.asciidoc[]
include::./api-config.asciidoc[]
include::./api-otlp.asciidoc[]
include::./api-jaeger.asciidoc[]
+
+:!leveloffset:
diff --git a/docs/en/observability/apm/api/index.asciidoc b/docs/en/observability/apm/api/index.asciidoc
new file mode 100644
index 0000000000..f12d2ad666
--- /dev/null
+++ b/docs/en/observability/apm/api/index.asciidoc
@@ -0,0 +1,17 @@
+[[apm-apis]]
+= APM APIs
+
+There are two kinds of APIs related to Elastic APM:
+
+[cols="1,1"]
+|===
+| <>
+| {kib} APIs specific to working with the APM UI including updating configuration options,
+ uploading real user monitoring (RUM) source maps, adding annotations, and more.
+| <>
+| APIs for working with APM Server.
+ These are mainly intake APIs that accept data from APM agents and are used primarily by APM agent developers.
+|===
+
+include::{observability-docs-root}/docs/en/observability/apm/api/api-ui.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/api/apm-server/index.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/apm-data-security.asciidoc b/docs/en/observability/apm/apm-data-security.asciidoc
deleted file mode 100644
index 4ff5d4facc..0000000000
--- a/docs/en/observability/apm/apm-data-security.asciidoc
+++ /dev/null
@@ -1,596 +0,0 @@
-[[apm-data-security]]
-=== Data security
-
-When setting up Elastic APM, it's essential to review all captured data carefully to ensure
-it doesn't contain sensitive information like passwords, credit card numbers, or health data.
-In addition, you may wish to filter out other identifiable information, like IP addresses, user agent information,
-or form field data.
-
-Depending on the type of data, we offer several different ways to filter, manipulate,
-or obfuscate sensitive information during or before ingestion:
-
-* <>
-* <>
-
-In addition to utilizing filters, you should regularly review the <> table to ensure
-sensitive data is not being ingested. If it is, it's possible to remove or redact it.
-See <> for more information.
-
-[float]
-[[apm-built-in-data-filters]]
-==== Built-in data filters
-
-// tag::data-filters[]
-Built-in data filters allow you to filter or turn off ingestion of the following types of data:
-
-[options="header"]
-|====
-|Data type |Common sensitive data
-|<> |Passwords, credit card numbers, authorization, etc.
-|<> |Passwords, credit card numbers, etc.
-|<> |Client IP address and user agent.
-|<> |URLs visited, click events, user browser errors, resources used, etc.
-|<> |Sensitive user or business information
-|====
-// end::data-filters[]
-
-[float]
-[[apm-custom-data-filters]]
-==== Custom filters
-
-// tag::custom-filters[]
-Custom filters allow you to filter or redact other types of APM data on ingestion:
-
-|====
-|<> | Applied at ingestion time.
-All agents and fields are supported. Data leaves the instrumented service.
-There are no performance overhead implications on the instrumented service.
-
-|<> | Not supported by all agents.
-Data is sanitized before leaving the instrumented service.
-Potential overhead implications on the instrumented service
-|====
-// end::custom-filters[]
-
-[float]
-[[apm-sensitive-fields]]
-==== Sensitive fields
-
-You should review the following fields regularly to ensure sensitive data is not being captured:
-
-[options="header"]
-|====
-| Field | Description | Remedy
-| `client.ip` | The client IP address, as forwarded by proxy. | <>
-| `http.request.body.original` | The body of the monitored HTTP request. | <>
-| `http.request.headers` | The canonical headers of the monitored HTTP request. | <>
-| `http.request.socket.remote_address` | The address of the last proxy or end-user (if no proxy). | <>
-| `http.response.headers` | The canonical headers of the monitored HTTP response. | <>
-| `process.args` | Process arguments. | <>
-| `span.db.statement` | Database statement. | <>
-| `stacktrace.vars` | A flat mapping of local variables captured in the stack frame | <>
-| `url.query` | The query string of the request, e.g. `?pass=hunter2`. | <>
-| `user.*` | Logged-in user information. | <>
-| `user_agent.*` | Device and version making the network request. | <>
-|====
-
-// ****************************************************************
-
-[[apm-filtering]]
-==== Built-in data filters
-
-include::./apm-data-security.asciidoc[tag=data-filters]
-
-[discrete]
-[[apm-filters-http-header]]
-==== HTTP headers
-
-By default, APM agents capture HTTP request and response headers (including cookies).
-Most Elastic APM agents provide the ability to sanitize HTTP header fields,
-including cookies and `application/x-www-form-urlencoded` data (POST form fields).
-Query string and captured request bodies, like `application/json` data, are not sanitized.
-
-The default list of sanitized fields attempts to target common field names for data relating to
-passwords, credit card numbers, authorization, etc., but can be customized to fit your data.
-This sensitive data never leaves the instrumented service.
-
-This setting supports <>,
-which means the list of sanitized fields can be updated without needing to redeploy your services:
-
-* Go: {apm-go-ref-v}/configuration.html#config-sanitize-field-names[`ELASTIC_APM_SANITIZE_FIELD_NAMES`]
-* Java: {apm-java-ref-v}/config-core.html#config-sanitize-field-names[`sanitize_field_names`]
-* .NET: {apm-dotnet-ref-v}/config-core.html#config-sanitize-field-names[`sanitizeFieldNames`]
-* Node.js: {apm-node-ref-v}/configuration.html#sanitize-field-names[`sanitizeFieldNames`]
-// * PHP: {apm-php-ref-v}[``]
-* Python: {apm-py-ref-v}/configuration.html#config-sanitize-field-names[`sanitize_field_names`]
-* Ruby: {apm-ruby-ref-v}/configuration.html#config-sanitize-field-names[`sanitize_field_names`]
-
-Alternatively, you can completely disable the capturing of HTTP headers.
-This setting also supports <>:
-
-* Go: {apm-go-ref-v}/configuration.html#config-capture-headers[`ELASTIC_APM_CAPTURE_HEADERS`]
-* Java: {apm-java-ref-v}/config-core.html#config-capture-headers[`capture_headers`]
-* .NET: {apm-dotnet-ref-v}/config-http.html#config-capture-headers[`CaptureHeaders`]
-* Node.js: {apm-node-ref-v}/configuration.html#capture-headers[`captureHeaders`]
-// * PHP: {apm-php-ref-v}[``]
-* Python: {apm-py-ref-v}/configuration.html#config-capture-headers[`capture_headers`]
-* Ruby: {apm-ruby-ref-v}/configuration.html#config-capture-headers[`capture_headers`]
-
-[discrete]
-[[apm-filters-http-body]]
-==== HTTP bodies
-
-By default, the body of HTTP requests is not recorded.
-Request bodies often contain sensitive data like passwords or credit card numbers,
-so use care when enabling this feature.
-
-This setting supports <>,
-which means the list of sanitized fields can be updated without needing to redeploy your services:
-
-* Go: {apm-go-ref-v}/configuration.html#config-capture-body[`ELASTIC_APM_CAPTURE_BODY`]
-* Java: {apm-java-ref-v}/config-core.html#config-capture-body[`capture_body`]
-* .NET: {apm-dotnet-ref-v}/config-http.html#config-capture-body[`CaptureBody`]
-* Node.js: {apm-node-ref-v}/configuration.html#capture-body[`captureBody`]
-// * PHP: {apm-php-ref-v}[``]
-* Python: {apm-py-ref-v}/configuration.html#config-capture-body[`capture_body`]
-* Ruby: {apm-ruby-ref-v}/configuration.html#config-capture-body[`capture_body`]
-
-[discrete]
-[[apm-filters-personal-data]]
-==== Personal data
-
-By default, the APM Server captures some personal data associated with trace events:
-
-* `client.ip`: The client's IP address. Typically derived from the HTTP headers of incoming requests.
-`client.ip` is also used in conjunction with the {ref}/geoip-processor.html[`geoip` processor] to assign
-geographical information to trace events. To learn more about how `client.ip` is derived,
-see <>.
-* `user_agent`: User agent data, including the client operating system, device name, vendor, and version.
-
-The capturing of this data can be turned off by setting
-**Capture personal data** to `false`.
-
-[discrete]
-[[apm-filters-real-user-data]]
-==== Real user monitoring data
-
-Protecting user data is important.
-For that reason, individual RUM instrumentations can be disabled in the RUM agent with the
-{apm-rum-ref-v}/configuration.html#disable-instrumentations[`disableInstrumentations`] configuration variable.
-Disabled instrumentations produce no spans or transactions.
-
-[options="header"]
-|====
-|Disable |Configuration value
-|HTTP requests |`fetch` and `xmlhttprequest`
-|Page load metrics including static resources |`page-load`
-|JavaScript errors on the browser |`error`
-|User click events including URLs visited, mouse clicks, and navigation events |`eventtarget`
-|Single page application route changes |`history`
-|====
-
-[discrete]
-[[apm-filters-database-statements]]
-==== Database statements
-
-For SQL databases, APM agents do not capture the parameters of prepared statements.
-Note that Elastic APM currently does not make an effort to strip parameters of regular statements.
-Not using prepared statements makes your code vulnerable to SQL injection attacks,
-so be sure to use prepared statements.
-
-For non-SQL data stores, such as {es} or MongoDB,
-Elastic APM captures the full statement for queries.
-For inserts or updates, the full document is not stored.
-To filter or obfuscate data in non-SQL database statements,
-or to remove the statement entirely,
-you can set up an ingest node pipeline.
-
-[discrete]
-[[apm-filters-agent-specific]]
-==== Agent-specific options
-
-Certain agents offer additional filtering and obfuscating options:
-
-**Agent configuration options**
-
-* (Node.js) Remove errors raised by the server-side process:
-disable with {apm-node-ref-v}/configuration.html#capture-exceptions[captureExceptions].
-
-* (Java) Remove process arguments from transactions:
-disabled by default with {apm-java-ref-v}/config-reporter.html#config-include-process-args[`include_process_args`].
-
-// ****************************************************************
-
-[[apm-custom-filter]]
-==== Custom filters
-
-include::./apm-data-security.asciidoc[tag=custom-filters]
-
-[discrete]
-[[apm-filters-ingest-pipeline]]
-==== Create an ingest pipeline filter
-
-Ingest node pipelines specify a series of processors that transform data in a specific way.
-Transformation happens prior to indexing--inflicting no performance overhead on the monitored application.
-Pipelines are a flexible and easy way to filter or obfuscate Elastic APM data.
-
-[discrete]
-[[apm-filters-ingest-pipeline-tutorial]]
-===== Tutorial: redact sensitive information
-
-Say you decide to <>
-but quickly notice that sensitive information is being collected in the
-`http.request.body.original` field:
-
-[source,json]
-----
-{
- "email": "test@abc.com",
- "password": "hunter2"
-}
-----
-
-**Create a pipeline**
-
-To obfuscate the passwords stored in the request body,
-you can use a series of {ref}/processors.html[ingest processors].
-To start, create a pipeline with a simple description and an empty array of processors:
-
-[source,json]
-----
-{
- "pipeline": {
- "description": "redact http.request.body.original.password",
- "processors": [] <1>
- }
-}
-----
-<1> The processors defined below will go in this array
-
-**Add a JSON processor**
-
-Add your first processor to the processors array.
-Because the agent captures the request body as a string, use the
-{ref}/json-processor.html[JSON processor] to convert the original field value into a structured JSON object.
-Save this JSON object in a new field:
-
-[source,json]
-----
-{
- "json": {
- "field": "http.request.body.original",
- "target_field": "http.request.body.original_json",
- "ignore_failure": true
- }
-}
-----
-
-**Add a set processor**
-
-If `body.original_json` is not `null`, i.e., it exists, we'll redact the `password` with the {ref}/set-processor.html[set processor],
-by setting the value of `body.original_json.password` to `"redacted"`:
-
-[source,json]
-----
-{
- "set": {
- "field": "http.request.body.original_json.password",
- "value": "redacted",
- "if": "ctx?.http?.request?.body?.original_json != null"
- }
-}
-----
-
-**Add a convert processor**
-
-Use the {ref}/convert-processor.html[convert processor] to convert the JSON value of `body.original_json` to a string and set it as the `body.original` value:
-
-[source,json]
-----
-{
- "convert": {
- "field": "http.request.body.original_json",
- "target_field": "http.request.body.original",
- "type": "string",
- "if": "ctx?.http?.request?.body?.original_json != null",
- "ignore_failure": true
- }
-}
-----
-
-**Add a remove processor**
-
-Finally, use the {ref}/remove-processor.html[remove processor] to remove the `body.original_json` field:
-
-[source,json]
-----
-{
- "remove": {
- "field": "http.request.body.original",
- "if": "ctx?.http?.request?.body?.original_json != null",
- "ignore_failure": true
- }
-}
-----
-
-**Register the pipeline**
-
-Now we'll put it all together.
-Use the {ref}/put-pipeline-api.html[create or update pipeline API] to register the new pipeline in {es}.
-Name the pipeline `apm_redacted_body_password`:
-
-[source,console]
-----
-PUT _ingest/pipeline/apm_redacted_body_password
-{
- "description": "redact http.request.body.original.password",
- "processors": [
- {
- "json": {
- "field": "http.request.body.original",
- "target_field": "http.request.body.original_json",
- "ignore_failure": true
- }
- },
- {
- "set": {
- "field": "http.request.body.original_json.password",
- "value": "redacted",
- "if": "ctx?.http?.request?.body?.original_json != null"
- }
- },
- {
- "convert": {
- "field": "http.request.body.original_json",
- "target_field": "http.request.body.original",
- "type": "string",
- "if": "ctx?.http?.request?.body?.original_json != null",
- "ignore_failure": true
- }
- },
- {
- "remove": {
- "field": "http.request.body.original_json",
- "if": "ctx?.http?.request?.body?.original_json != null",
- "ignore_failure": true
- }
- }
- ]
-}
-----
-
-**Test the pipeline**
-
-Prior to enabling this new pipeline, you can test it with the {ref}/simulate-pipeline-api.html[simulate pipeline API].
-This API allows you to run multiple documents through a pipeline to ensure it is working correctly.
-
-The request below simulates running three different documents through the pipeline:
-
-[source,console]
-----
-POST _ingest/pipeline/apm_redacted_body_password/_simulate
-{
- "docs": [
- {
- "_source": { <1>
- "http": {
- "request": {
- "body": {
- "original": """{"email": "test@abc.com", "password": "hunter2"}"""
- }
- }
- }
- }
- },
- {
- "_source": { <2>
- "some-other-field": true
- }
- },
- {
- "_source": { <3>
- "http": {
- "request": {
- "body": {
- "original": """["invalid json" """
- }
- }
- }
- }
- }
- ]
-}
-----
-<1> This document features the same sensitive data from the original example above
-<2> This document only contains an unrelated field
-<3> This document contains invalid JSON
-
-The API response should be similar to this:
-
-[source,json]
-----
-{
- "docs" : [
- {
- "doc" : {
- "_source" : {
- "http" : {
- "request" : {
- "body" : {
- "original" : {
- "password" : "redacted",
- "email" : "test@abc.com"
- }
- }
- }
- }
- }
- }
- },
- {
- "doc" : {
- "_source" : {
- "nobody" : true
- }
- }
- },
- {
- "doc" : {
- "_source" : {
- "http" : {
- "request" : {
- "body" : {
- "original" : """["invalid json" """
- }
- }
- }
- }
- }
- }
- ]
-}
-----
-
-As expected, only the first simulated document has a redacted password field.
-All other documents are unaffected.
-
-**Create an `@custom` pipeline**
-
-The final step in this process is to call the newly created `apm_redacted_body_password` pipeline
-from the `@custom` pipeline of the data stream you wish to edit.
-
-include::./ingest-pipelines.asciidoc[tag=ingest-pipeline-naming]
-
-Use the {ref}/put-pipeline-api.html[create or update pipeline API] to register the new pipeline in {es}.
-Name the pipeline `traces-apm@custom`:
-
-[source,console]
-----
-PUT _ingest/pipeline/traces-apm@custom
-{
- "processors": [
- {
- "pipeline": {
- "name": "apm_redacted_body_password" <1>
- }
- }
- ]
-}
-----
-<1> The name of the pipeline we previously created
-
-TIP: If you prefer using a GUI, you can instead open {kib} and navigate to
-**Stack Management** -> **Ingest Pipelines** -> **Create pipeline**.
-Use the same naming convention explained previously to ensure your new pipeline matches the correct APM data stream.
-
-That's it! Passwords will now be redacted from your APM HTTP body data.
-
-To learn more about ingest pipelines, see <>.
-
-[discrete]
-[[apm-filters-in-agent]]
-==== APM agent filters
-
-Some APM agents offer a way to manipulate or drop APM events _before_ they are sent to the APM Server.
-Please see the relevant agent's documentation for more information and examples:
-
-// * Go: {apm-go-ref-v}/[]
-// * Java: {apm-java-ref-v}/[]
-* .NET: {apm-dotnet-ref-v}/public-api.html#filter-api[Filter API].
-* Node.js: {apm-node-ref-v}/agent-api.html#apm-add-filter[`addFilter()`].
-// * PHP: {apm-php-ref-v}[]
-* Python: {apm-py-ref-v}/sanitizing-data.html[custom processors].
-* Ruby: {apm-ruby-ref-v}/api.html#api-agent-add-filter[`add_filter()`].
-
-// ****************************************************************
-
-[[apm-data-security-delete]]
-==== Delete sensitive data
-
-If you accidentally ingest sensitive data, follow these steps to remove or redact the offending data:
-
-. Stop collecting the sensitive data.
-Use the *remedy* column of the <> table to determine how to stop collecting
-the offending data.
-
-. Delete or redact the ingested data. With data collection fixed, you can now delete or redact the offending data:
-+
-* <>
-* <>
-
-[float]
-[[apm-redact-field-data]]
-===== Redact specific fields
-
-To redact sensitive data in a specific field, use the {ref}/docs-update-by-query.html[update by query API].
-
-For example, the following query removes the `client.ip` address
-from APM documents in the `logs-apm.error-default` data stream:
-
-[source, console]
-----
-POST /logs-apm.error-default/_update_by_query
-{
- "query": {
- "exists": {
- "field": "client.ip"
- }
- }
- "script": {
- "source": "ctx._source.client.ip = params.redacted",
- "params": {
- "redacted": "[redacted]"
- }
- }
-}
-----
-
-Or, perhaps you only want to redact IP addresses from European users:
-
-[source, console]
-----
-POST /logs-apm.error-default/_update_by_query
-{
- "query": {
- "term": {
- "client.geo.continent_name": {
- "value": "Europe"
- }
- }
- },
- "script": {
- "source": "ctx._source.client.ip = params.redacted",
- "params": {
- "redacted": "[redacted]"
- }
- }
-}
-----
-
-See {ref}/docs-update-by-query.html[update by query API] for more information and examples.
-
-[float]
-[[apm-delete-doc-data]]
-===== Delete {es} documents
-
-WARNING: This will permanently delete your data.
-You should test your queries with the {ref}/search-search.html[search API] prior to deleting data.
-
-To delete an {es} document,
-you can use the {ref}/docs-delete-by-query.html[delete by query API].
-
-For example, to delete all documents in the `apm-traces-*` data stream with a `user.email` value, run the following query:
-
-[source, console]
-----
-POST /apm-traces-*/_delete_by_query
-{
- "query": {
- "exists": {
- "field": "user.email"
- }
- }
-}
-----
-
-See {ref}/docs-delete-by-query.html[delete by query API] for more information and examples.
diff --git a/docs/en/observability/apm-ui/agent-configuration.asciidoc b/docs/en/observability/apm/collect-application-data/agents/agent-configuration.asciidoc
similarity index 93%
rename from docs/en/observability/apm-ui/agent-configuration.asciidoc
rename to docs/en/observability/apm/collect-application-data/agents/agent-configuration.asciidoc
index 13d929dd53..7441b33b76 100644
--- a/docs/en/observability/apm-ui/agent-configuration.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/agents/agent-configuration.asciidoc
@@ -1,8 +1,8 @@
[[apm-agent-configuration]]
-=== APM Agent central configuration
+= APM agent central configuration
++++
-Configure APM agents with central config
+Centrally configure APM agents in Kibana
++++
APM Agent configuration allows you to fine-tune your APM agent configuration from within the APM UI.
@@ -15,7 +15,7 @@ The APM UI will let you know when your APM agents have applied your configuratio
image::./images/apm-agent-configuration.png[APM Agent configuration in Kibana]
[float]
-==== Precedence
+== Precedence
Configurations set from the APM UI take precedence over configurations set locally in each APM agent.
However, if APM Server is slow to respond, is offline, reports an error, etc.,
@@ -23,7 +23,7 @@ APM agents will use local defaults until they're able to update the configuratio
For this reason, it is still essential to set custom default configurations locally in each of your APM agents.
[float]
-==== Supported configurations
+== Supported configurations
Each APM agent has a list of supported configurations.
After selecting a Service name and environment in the APM UI,
@@ -45,7 +45,7 @@ Ruby agent:: {apm-ruby-ref}/configuration.html[Configuration reference]
Real User Monitoring (RUM) agent:: {apm-rum-ref}/configuration.html[Configuration reference]
[float]
-==== APM Server configuration
+== APM Server configuration
For most users, APM agent configuration should work out-of-the-box.
If you run into trouble, it may be because you're not using the {es} output,
diff --git a/docs/en/observability/apm/collect-application-data/agents/index.asciidoc b/docs/en/observability/apm/collect-application-data/agents/index.asciidoc
new file mode 100644
index 0000000000..d52dab9eee
--- /dev/null
+++ b/docs/en/observability/apm/collect-application-data/agents/index.asciidoc
@@ -0,0 +1,41 @@
+[[apm-agents]]
+= APM agents
+
+Elastic APM agents automatically measure application performance and track errors.
+They offer built-in support for popular frameworks and technologies, and provide easy-to-use
+APIs that allow you to instrument any application.
+
+[discrete]
+== Available APM agents
+
+Elastic APM agents are built and maintained by Elastic. While they are similar, different
+programming languages have different nuances and requirements. Refer to each APM agent's
+documentation to learn how to install the agent, configure it, and more:
+
+* {apm-android-ref}/intro.html[APM Android agent]
+* {apm-go-ref}/introduction.html[APM Go agent]
+* {apm-ios-ref}/intro.html[APM iOS agent]
+* {apm-java-ref}/intro.html[APM Java agent]
+* {apm-dotnet-ref}/intro.html[APM .NET agent]
+* {apm-node-ref}/intro.html[APM Node.js agent]
+* {apm-php-ref}/intro.html[APM PHP agent]
+* {apm-py-ref}/getting-started.html[APM Python agent]
+* {apm-ruby-ref}/introduction.html[APM Ruby agent]
+* {apm-rum-ref}/intro.html[APM Real User Monitoring JavaScript agent]
+
+[discrete]
+== More APM agent resources
+
+Though you should refer to each APM agent's documentation for information on using the agent,
+there are some tasks you can complete in the APM UI:
+
+* <>
+* <>
+
+////
+Subsections
+////
+
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/agents/agent-configuration.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/agents/rum.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/agents/source-map-how-to.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/apm-rum.asciidoc b/docs/en/observability/apm/collect-application-data/agents/rum.asciidoc
similarity index 96%
rename from docs/en/observability/apm/apm-rum.asciidoc
rename to docs/en/observability/apm/collect-application-data/agents/rum.asciidoc
index 7ca2368f49..b4750cb14d 100644
--- a/docs/en/observability/apm/apm-rum.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/agents/rum.asciidoc
@@ -1,5 +1,5 @@
[[apm-rum]]
-=== Real User Monitoring (RUM)
+= Real User Monitoring (RUM)
Real User Monitoring captures user interaction with clients such as web browsers.
The {apm-rum-ref-v}[JavaScript Agent] is Elastic’s RUM Agent.
// To use it you need to {apm-server-ref-v}/configuration-rum.html[enable RUM support] in the APM Server.
diff --git a/docs/en/observability/apm/source-map-how-to.asciidoc b/docs/en/observability/apm/collect-application-data/agents/source-map-how-to.asciidoc
similarity index 96%
rename from docs/en/observability/apm/source-map-how-to.asciidoc
rename to docs/en/observability/apm/collect-application-data/agents/source-map-how-to.asciidoc
index 12acf196f9..8c76192810 100644
--- a/docs/en/observability/apm/source-map-how-to.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/agents/source-map-how-to.asciidoc
@@ -1,5 +1,5 @@
[[apm-source-map-how-to]]
-=== Create and upload source maps (RUM)
+= Create and upload source maps (RUM)
Minifying JavaScript bundles in production is a common practice;
it can greatly improve the load time and network latency of your applications.
@@ -32,7 +32,7 @@ Follow the steps below to enable source mapping your error stack traces in the A
[float]
[[apm-source-map-rum-initialize]]
-=== Initialize the RUM Agent
+== Initialize the RUM Agent
Set the service name and version of your application when initializing the RUM Agent.
To make uploading subsequent source maps easier, the `serviceVersion` you choose might be the
@@ -62,7 +62,7 @@ The APM integration uses the service name and version to match the correct sourc
[float]
[[apm-source-map-rum-generate]]
-=== Generate a source map
+== Generate a source map
To be compatible with Elastic APM, source maps must follow the
https://sourcemaps.info/spec.html[source map revision 3 proposal spec].
@@ -95,7 +95,7 @@ module.exports = {
[float]
[[apm-source-map-rum-upload]]
-=== Upload the source map
+== Upload the source map
TIP: When uploading a source map, ensure that RUM support is enabled in the APM integration.
@@ -114,7 +114,7 @@ If you have multiple source maps, you'll need to upload each individually.
[float]
[[apm-source-map-curl]]
-==== Upload via curl
+=== Upload via curl
Here’s an example curl request that uploads the source map file created in the previous step.
This request uses an API key for authentication.
@@ -136,7 +136,7 @@ curl -X POST "http://localhost:5601/api/apm/sourcemaps" \
[float]
[[apm-source-map-custom-app]]
-==== Upload via a custom app
+=== Upload via a custom app
To ensure uploading source maps become a part of your deployment process,
consider automating the process with a custom application.
@@ -169,7 +169,7 @@ request.post({url: 'http://localhost:5601/api/apm/sourcemaps',formData: formData
[float]
[[apm-source-map-next]]
-=== What happens next
+== What happens next
Source maps are stored in {es}. When you upload a source map, a new {es} document is created
containing the contents of the source map.
diff --git a/docs/en/observability/apm/aws-lambda-extension.asciidoc b/docs/en/observability/apm/collect-application-data/aws-lambda-extension.asciidoc
similarity index 93%
rename from docs/en/observability/apm/aws-lambda-extension.asciidoc
rename to docs/en/observability/apm/collect-application-data/aws-lambda-extension.asciidoc
index b2efe4673c..f4280f8000 100644
--- a/docs/en/observability/apm/aws-lambda-extension.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/aws-lambda-extension.asciidoc
@@ -1,6 +1,10 @@
[[apm-monitoring-aws-lambda]]
= Monitoring AWS Lambda Functions
+++++
+AWS Lambda Functions
+++++
+
Elastic APM lets you monitor your AWS Lambda functions.
The natural integration of <> into your AWS Lambda functions provides insights into the function's execution and runtime behavior as well as its relationships and dependencies to other services.
diff --git a/docs/en/observability/apm/collect-application-data/index.asciidoc b/docs/en/observability/apm/collect-application-data/index.asciidoc
new file mode 100644
index 0000000000..1d8f3b19d1
--- /dev/null
+++ b/docs/en/observability/apm/collect-application-data/index.asciidoc
@@ -0,0 +1,86 @@
+[[apm-collect-application-data]]
+= Collect application data
+
+[discrete]
+== Language-specific options
+
+Use Elastic APM agents or an OpenTelemetry language SDK to instrument a service in the language its written in:
+
+* <>: Elastic APM agents are instrumentation libraries written in the same language as your service.
+* <>: OpenTelemetry is an open source set of APIs, SDKs, tooling, and integrations that enable the capture and management of telemetry data from your services and applications.
+** This option includes Elastic Distributions of OpenTelemetry, which are customized versions of https://opentelemetry.io/docs/languages/[OpenTelemetry language SDKs] that are optimized to work with an Elastic backend.
+
+*Not sure which method is right for you?* Compare the available options below.
+
+[discrete]
+=== Capabilities
+
+////
+TO DO:
+Is this table even helpful?
+Is it missing anything that would make it more helpful?
+////
+|===
+| | Elastic APM agent | Elastic Distribution of OpenTelemetry
+
+| *Support level*
+| Fully supported
+| Mixed support +
+_Refer to the_ <>
+
+| *Data protocol*
+| Elastic protocol
+| https://opentelemetry.io/docs/specs/otel/protocol/[OpenTelemetry protocol (OTLP)]
+
+| *Central configuration*
+| Supported +
+_Refer to_ <>
+| Not supported
+|===
+
+[discrete]
+[[apm-collect-data-availability]]
+=== Availability
+
+:not-available: image:images/icons/cross.svg[Not available]
+
+////
+TO DO:
+Are we ok with maintaining this table?
+Are we ok with the gaps it exposes?
+////
+[cols="<,^,^"]
+|===
+| *Language* | *Elastic APM agent* | *Elastic Distributions of OpenTelemetry (EDOT)*
+| *Android* | Android agent | {not-available}
+| *Go* | Go agent | {not-available}
+| *iOS* | iOS agent | {not-available}
+| *Java* | Java agent | EDOT Java
+| *.NET* | .NET agent | preview:[] EDOT .NET
+| *Node.js* | Node.js agent | preview:[] EDOT Node.js
+| *PHP* | PHP agent | preview:[] EDOT PHP
+| *Python* | Python agent | preview:[] EDOT Python
+| *Ruby* | Ruby agent | {not-available}
+|===
+
+[discrete]
+== Service-specific options
+
+Elastic also offers several tools to help you collect data from specific services:
+
+* *Kubernetes*: The Elastic APM attacher for Kubernetes simplifies the instrumentation and configuration of your application pods.
+ Read more in the {apm-attacher-ref}/apm-attacher.html[APM attacher for Kubernetes docs].
+* *AWS Lambda Functions*: Helps you monitor your AWS Lambda functions.
+ Read more in the {apm-lambda-ref}/aws-lambda-arch.html[APM Architecture for AWS Lambda docs].
+* deprecated:[8.15.0] *Jaeger*: Helps you to switch an existing Jaeger setup from the default
+ Jaeger backend to the {stack}. Read more in <>.
+
+////
+Subsections
+////
+
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/agents/index.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/open-telemetry/index.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/k8s-attacher.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/aws-lambda-extension.asciidoc[leveloffset=+1]
+include::{observability-docs-root}/docs/en/observability/apm/collect-application-data/jaeger-integration.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/jaeger-integration.asciidoc b/docs/en/observability/apm/collect-application-data/jaeger-integration.asciidoc
similarity index 94%
rename from docs/en/observability/apm/jaeger-integration.asciidoc
rename to docs/en/observability/apm/collect-application-data/jaeger-integration.asciidoc
index d703756c69..47c1cb42d6 100644
--- a/docs/en/observability/apm/jaeger-integration.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/jaeger-integration.asciidoc
@@ -1,8 +1,8 @@
[[apm-jaeger-integration]]
-=== Jaeger integration
+= Integrate with Jaeger
++++
-Integrate with Jaeger
+Jaeger (deprecated)
++++
WARNING: Support for Jaeger is deprecated and will be removed in a future version of Elastic APM. https://www.jaegertracing.io/docs/1.35/client-libraries/[Jaeger clients are deprecated] in favor of OpenTelemetry SDKs, and OpenTelemetry has removed all Jaeger exporters from their https://github.com/open-telemetry/opentelemetry-specification/pull/2858[specification].
@@ -14,7 +14,7 @@ Best of all, no instrumentation changes are needed in your application code.
[float]
[[apm-jaeger-architecture]]
-=== Supported architecture
+== Supported architecture
Jaeger architecture supports different data formats and transport protocols
that define how data can be sent to a collector. Elastic APM, as a Jaeger collector,
@@ -33,7 +33,7 @@ for more information on Jaeger architecture.
[float]
[[apm-get-started-jaeger]]
-=== Get started
+== Get started
Connect your preexisting Jaeger setup to Elastic APM in three steps:
@@ -45,7 +45,7 @@ IMPORTANT: There are <> to this integration.
[float]
[[apm-configure-agent-client-jaeger]]
-==== Configure Jaeger agents
+=== Configure Jaeger agents
The APM integration serves Jaeger gRPC over the same host and port as the Elastic {apm-agent} protocol.
@@ -53,7 +53,7 @@ include::{observability-docs-root}/docs/en/observability/apm/tab-widgets/jaeger-
[float]
[[apm-configure-sampling-jaeger]]
-==== Configure Sampling
+=== Configure Sampling
The APM integration supports probabilistic sampling, which can be used to reduce the amount of data that your agents collect and send.
Probabilistic sampling makes a random sampling decision based on the configured sampling value.
@@ -66,7 +66,7 @@ There are two different ways to configure the sampling rate of your Jaeger agent
[float]
[[apm-configure-sampling-central-jaeger]]
-===== {apm-agent} central configuration (default)
+==== {apm-agent} central configuration (default)
Central sampling, with {apm-agent} central configuration,
allows Jaeger clients to poll APM Server for the sampling rate.
@@ -75,7 +75,7 @@ See <> to learn more.
[float]
[[apm-configure-sampling-local-jaeger]]
-===== Local sampling in each Jaeger client
+==== Local sampling in each Jaeger client
If you don't have access to the APM UI,
you'll need to change the Jaeger client's `sampler.type` and `sampler.param`.
@@ -85,13 +85,13 @@ for more information.
[float]
[[apm-configure-start-jaeger]]
-==== Start sending data
+=== Start sending data
That's it! Data sent from Jaeger clients to the APM Server can now be viewed in the APM UI.
[float]
[[apm-caveats-jaeger]]
-=== Caveats
+== Caveats
There are some limitations and differences between Elastic APM and Jaeger that you should be aware of.
diff --git a/docs/en/observability/apm/apm-k8s-attacher.asciidoc b/docs/en/observability/apm/collect-application-data/k8s-attacher.asciidoc
similarity index 63%
rename from docs/en/observability/apm/apm-k8s-attacher.asciidoc
rename to docs/en/observability/apm/collect-application-data/k8s-attacher.asciidoc
index 9267d54132..1e1b070a4d 100644
--- a/docs/en/observability/apm/apm-k8s-attacher.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/k8s-attacher.asciidoc
@@ -1,7 +1,11 @@
[[apm-k8s-attacher]]
= APM K8S Attacher
-The {apm-attacher-ref}/apm-attacher.html[APM attacher] for Kubernetes simplifies the instrumentation and configuration of your application pods.
+++++
+Kubernetes
+++++
+
+The {apm-attacher-ref}/apm-attacher.html[APM attacher for Kubernetes] simplifies the instrumentation and configuration of your application pods.
The attacher includes a webhook receiver that modifies pods so they are automatically instrumented by an Elastic APM agent.
Ready to get started? See {apm-attacher-ref}/apm-get-started-webhook.html[Instrument and configure pods] to get started.
diff --git a/docs/en/observability/apm/open-telemetry.asciidoc b/docs/en/observability/apm/collect-application-data/open-telemetry/index.asciidoc
similarity index 96%
rename from docs/en/observability/apm/open-telemetry.asciidoc
rename to docs/en/observability/apm/collect-application-data/open-telemetry/index.asciidoc
index 0e387498c3..f1cb772a06 100644
--- a/docs/en/observability/apm/open-telemetry.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/open-telemetry/index.asciidoc
@@ -1,8 +1,8 @@
[[apm-open-telemetry]]
-== Use OpenTelemetry with APM
+= Use OpenTelemetry with APM
++++
-Use OpenTelemetry
+OpenTelemetry
++++
[NOTE]
@@ -139,16 +139,14 @@ To get started, follow the official AWS Distro for OpenTelemetry Lambda document
https://aws-otel.github.io/docs/getting-started/lambda[*Get started with the AWS Distro for OpenTelemetry Lambda*^] image:images/icons/popout.svg[]
-// TODO: I'm not sure what this diagram should look like...
-// image::images/apm-otel-lambda.png[]
+////
+Subsections
+////
-include::./otel-direct.asciidoc[]
-
-include::./otel-metrics.asciidoc[]
-
-include::./otel-limitations.asciidoc[]
-
-include::./otel-attrs.asciidoc[]
+include::./otel-direct.asciidoc[leveloffset=+1]
+include::./otel-metrics.asciidoc[leveloffset=+1]
+include::./otel-limitations.asciidoc[leveloffset=+1]
+include::./otel-attrs.asciidoc[leveloffset=+1]
// ****
// The text below is used in the Quick start guide
diff --git a/docs/en/observability/apm/otel-attrs.asciidoc b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-attrs.asciidoc
similarity index 98%
rename from docs/en/observability/apm/otel-attrs.asciidoc
rename to docs/en/observability/apm/collect-application-data/open-telemetry/otel-attrs.asciidoc
index 7a4bac9654..a54ebb0a3e 100644
--- a/docs/en/observability/apm/otel-attrs.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-attrs.asciidoc
@@ -1,5 +1,5 @@
[[apm-open-telemetry-resource-attributes]]
-=== Resource attributes
+= Resource attributes
A resource attribute is a key/value pair containing information about the entity producing telemetry.
Resource attributes are mapped to Elastic Common Schema (ECS) fields like `service.*`, `cloud.*`, `process.*`, etc.
diff --git a/docs/en/observability/apm/otel-direct.asciidoc b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-direct.asciidoc
similarity index 97%
rename from docs/en/observability/apm/otel-direct.asciidoc
rename to docs/en/observability/apm/collect-application-data/open-telemetry/otel-direct.asciidoc
index df1a47d6f2..9761a73dbf 100644
--- a/docs/en/observability/apm/otel-direct.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-direct.asciidoc
@@ -1,5 +1,5 @@
[[apm-open-telemetry-direct]]
-=== Upstream OpenTelemetry Collectors and language SDKs
+= Upstream OpenTelemetry Collectors and language SDKs
[NOTE]
====
@@ -17,7 +17,7 @@ be sent directly to the {stack}.
[discrete]
[[apm-connect-open-telemetry-collector]]
-==== Send data from an upstream OpenTelemetry Collector
+== Send data from an upstream OpenTelemetry Collector
Connect your OpenTelemetry Collector instances to Elastic {observability} using the OTLP exporter:
@@ -83,7 +83,7 @@ In addition, your data will not be viewable in the {kib} {observability} apps if
[discrete]
[[apm-instrument-apps-otel]]
-==== Send data from an upstream OpenTelemetry SDK
+== Send data from an upstream OpenTelemetry SDK
[NOTE]
====
@@ -139,7 +139,7 @@ and <> in {kib}.
[discrete]
[[apm-open-telemetry-proxy-apm]]
-==== Proxy requests to APM Server
+== Proxy requests to APM Server
APM Server supports both the https://opentelemetry.io/docs/specs/otlp/#otlpgrpc[OTLP/gRPC] and https://opentelemetry.io/docs/specs/otlp/#otlphttp[OTLP/HTTP] protocol on the same port as Elastic APM agent requests. For ease of setup, we recommend using OTLP/HTTP when proxying or load balancing requests to the APM Server.
@@ -155,7 +155,7 @@ https://github.com/elastic/apm-server/blob/main/dev_docs/otel.md#muxing-grpc-and
[discrete]
[[apm-open-telemetry-direct-next]]
-==== Next steps
+== Next steps
* <>
* Learn about the <>
diff --git a/docs/en/observability/apm/otel-limitations.asciidoc b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-limitations.asciidoc
similarity index 95%
rename from docs/en/observability/apm/otel-limitations.asciidoc
rename to docs/en/observability/apm/collect-application-data/open-telemetry/otel-limitations.asciidoc
index a438c4f72c..1817d62dff 100644
--- a/docs/en/observability/apm/otel-limitations.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-limitations.asciidoc
@@ -1,9 +1,9 @@
[[apm-open-telemetry-known-limitations]]
-=== Limitations
+= Limitations
[float]
[[apm-open-telemetry-traces-limitations]]
-==== OpenTelemetry traces
+== OpenTelemetry traces
* Traces of applications using `messaging` semantics might be wrongly displayed as `transactions` in the APM UI, while they should be considered `spans` (see issue https://github.com/elastic/apm-server/issues/7001[#7001]).
* Inability to see Stack traces in spans.
@@ -11,21 +11,21 @@
[float]
[[apm-open-telemetry-logs-intake]]
-==== OpenTelemetry logs
+== OpenTelemetry logs
* preview:[] The OpenTelemetry logs intake via APM Server is in technical preview.
* The application logs data stream (`app_logs`) has dynamic mapping disabled. This means the automatic detection and mapping of new fields is disabled (see issue https://github.com/elastic/apm-server/issues/9093[#9093]).
[float]
[[apm-open-telemetry-otlp-limitations]]
-==== OpenTelemetry Line Protocol (OTLP)
+== OpenTelemetry Line Protocol (OTLP)
APM Server supports both the https://opentelemetry.io/docs/specs/otlp/#otlpgrpc[OTLP/gRPC] and https://opentelemetry.io/docs/specs/otlp/#otlphttp[OTLP/HTTP] protocol with ProtoBuf payload.
APM Server does not yet support JSON Encoding for OTLP/HTTP.
[float]
[[apm-open-telemetry-collector-exporter]]
-==== OpenTelemetry Collector exporter for Elastic
+== OpenTelemetry Collector exporter for Elastic
The https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.57.2/exporter/elasticexporter[OpenTelemetry Collector exporter for Elastic]
has been deprecated and replaced by the native support of the OpenTelemetry Line Protocol in Elastic Observability (OTLP).
@@ -36,7 +36,7 @@ The https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/
[float]
[[apm-open-telemetry-tbs]]
-==== OpenTelemetry's tail-based sampling
+== OpenTelemetry's tail-based sampling
Tail-based sampling allows to make sampling decisions after all spans of a trace have been completed.
This allows for more powerful and informed sampling rules.
diff --git a/docs/en/observability/apm/otel-metrics.asciidoc b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-metrics.asciidoc
similarity index 96%
rename from docs/en/observability/apm/otel-metrics.asciidoc
rename to docs/en/observability/apm/collect-application-data/open-telemetry/otel-metrics.asciidoc
index 4ffcf30256..bff834fd90 100644
--- a/docs/en/observability/apm/otel-metrics.asciidoc
+++ b/docs/en/observability/apm/collect-application-data/open-telemetry/otel-metrics.asciidoc
@@ -1,5 +1,5 @@
[[apm-open-telemetry-collect-metrics]]
-=== Collect metrics
+= Collect metrics
IMPORTANT: When collecting metrics, please note that the https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleValueRecorder.html[`DoubleValueRecorder`]
and https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongValueObserver.html[`LongValueRecorder`] metrics are not yet supported.
@@ -26,7 +26,7 @@ for more information.
[float]
[[apm-open-telemetry-verify-metrics]]
-==== Verify OpenTelemetry metrics data
+== Verify OpenTelemetry metrics data
Use *Discover* to validate that metrics are successfully reported to {kib}.
@@ -44,7 +44,7 @@ only OpenTelemetry metrics documents.
[float]
[[apm-open-telemetry-visualize]]
-==== Visualize in {kib}
+== Visualize in {kib}
Use *Lens* to create visualizations for OpenTelemetry metrics. Lens enables you to build visualizations by dragging and dropping data fields. It makes smart visualization suggestions for your data, allowing you to switch between visualization types.
diff --git a/docs/en/observability/apm/common-problems.asciidoc b/docs/en/observability/apm/common-problems.asciidoc
deleted file mode 100644
index 3df7179c2b..0000000000
--- a/docs/en/observability/apm/common-problems.asciidoc
+++ /dev/null
@@ -1,200 +0,0 @@
-[[apm-common-problems]]
-=== Common problems
-
-This section describes common problems you might encounter when using a Fleet-managed APM Server.
-
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-
-[float]
-[[apm-no-data-indexed]]
-=== No data is indexed
-
-If no data shows up in {es}, first make sure that your APM components are properly connected.
-
-include::{observability-docs-root}/docs/en/observability/apm/tab-widgets/no-data-indexed-widget.asciidoc[]
-
-[[apm-data-indexed-no-apm]]
-[float]
-=== Data is indexed but doesn't appear in the APM UI
-
-The APM UI relies on index mappings to query and display data.
-If your APM data isn't showing up in the APM UI, but is elsewhere in {kib}, like the Discover app,
-you may have a missing index mapping.
-
-You can determine if a field was mapped correctly with the `_mapping` API.
-For example, run the following command in the {kib} {kibana-ref}/console-kibana.html[console].
-This will display the field data type of the `service.name` field.
-
-[source,curl]
-----
-GET *apm*/_mapping/field/service.name
-----
-
-If the `mapping.name.type` is `"text"`, your APM indices were not set up correctly.
-
-[source,yml]
-----
-".ds-metrics-apm.transaction.1m-default-2023.04.12-000038": {
- "mappings": {
- "service.name": {
- "full_name": "service.name",
- "mapping": {
- "name": {
- "type": "text" <1>
- }
- }
- }
- }
-}
-----
-<1> The `service.name` `mapping.name.type` would be `"keyword"` if this field had been set up correctly.
-
-To fix this problem, install the APM integration by following these steps:
-
---
-include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm-server.asciidoc[tag=install-apm-integration]
---
-
-This will reinstall the APM index templates and trigger a data stream index rollover.
-
-You can verify the correct index templates were installed by running the following command in the {kib} console:
-
-[source,curl]
-----
-GET /_index_template/traces-apm
-----
-
-[float]
-[[apm-common-ssl-problems]]
-=== Common SSL-related problems
-
-* <>
-* <>
-* <>
-* <>
-* <>
-
-
-[float]
-[[apm-ssl-client-fails]]
-==== SSL client fails to connect
-
-The target host might be unreachable or the certificate may not be valid.
-To fix this problem:
-
-. Make sure that the APM Server process on the target host is running and you can connect to it.
-Try to ping the target host to verify that you can reach it from the host running APM Server.
-Then use either `nc` or `telnet` to make sure that the port is available. For example:
-+
-[source,shell]
-----
-ping
-telnet 5044
-----
-
-. Verify that the certificate is valid and that the hostname and IP match.
-. Use OpenSSL to test connectivity to the target server and diagnose problems.
-See the https://www.openssl.org/docs/manmaster/man1/openssl-s_client.html[OpenSSL documentation] for more info.
-
-[float]
-[[apm-cannot-validate-certificate]]
-==== x509: cannot validate certificate for because it doesn't contain any IP SANs
-
-This happens because your certificate is only valid for the hostname present in the Subject field.
-To resolve this problem, try one of these solutions:
-
-* Create a DNS entry for the hostname, mapping it to the server's IP.
-* Create an entry in `/etc/hosts` for the hostname. Or, on Windows, add an entry to
-`C:\Windows\System32\drivers\etc\hosts`.
-* Re-create the server certificate and add a Subject Alternative Name (SAN) for the IP address of the server. This makes the
-server's certificate valid for both the hostname and the IP address.
-
-[float]
-[[apm-getsockopt-no-route-to-host]]
-==== getsockopt: no route to host
-
-This is not an SSL problem. It's a networking problem. Make sure the two hosts can communicate.
-
-[float]
-[[apm-getsockopt-connection-refused]]
-==== getsockopt: connection refused
-
-This is not an SSL problem. Make sure that {ls} is running and that there is no firewall blocking the traffic.
-
-[float]
-[[apm-target-machine-refused-connection]]
-==== No connection could be made because the target machine actively refused it
-
-A firewall is refusing the connection. Check if a firewall is blocking the traffic on the client, the network, or the
-destination host.
-
-[[apm-io-timeout]]
-[float]
-=== I/O Timeout
-
-I/O Timeouts can occur when your timeout settings across the stack are not configured correctly,
-especially when using a load balancer.
-
-You may see an error like the one below in the {apm-agent} logs, and/or a similar error on the APM Server side:
-
-[source,logs]
-----
-[ElasticAPM] APM Server responded with an error:
-"read tcp 123.34.22.313:8200->123.34.22.40:41602: i/o timeout"
-----
-
-To fix this, ensure timeouts are incrementing from the {apm-agent},
-through your load balancer, to the APM Server.
-
-By default, the agent timeouts are set at 10 seconds, and the server timeout is set at 3600 seconds.
-Your load balancer should be set somewhere between these numbers.
-
-For example:
-
-[source,txt]
-----
-APM agent --> Load Balancer --> APM Server
- 10s 15s 3600s
-----
-
-The APM Server timeout can be configured by updating the
-<>.
-
-[[apm-field-limit-exceeded]]
-[float]
-=== Field limit exceeded
-
-When adding too many distinct tag keys on a transaction or span,
-you risk creating a link:{ref}/mapping.html#mapping-limit-settings[mapping explosion].
-
-For example, you should avoid that user-specified data,
-like URL parameters, is used as a tag key.
-Likewise, using the current timestamp or a user ID as a tag key is not a good idea.
-However, tag *values* with a high cardinality are not a problem.
-Just try to keep the number of distinct tag keys at a minimum.
-
-The symptom of a mapping explosion is that transactions and spans are not indexed anymore after a certain time. Usually, on the next day,
-the spans and transactions will be indexed again because a new index is created each day.
-But as soon as the field limit is reached, indexing stops again.
-
-In the agent logs, you won't see a sign of failures as the APM server asynchronously sends the data it received from the agents to {es}. However, the APM server and {es} log a warning like this:
-
-[source,logs]
-----
-{\"type\":\"illegal_argument_exception\",\"reason\":\"Limit of total fields [1000] in [INDEX_NAME] has been exceeded\"}
-----
-
-[[apm-tail-based-sampling-memory-disk-io]]
-[float]
-=== Tail-based sampling causing high system memory usage and high disk IO
-
-Tail-based sampling requires minimal memory to run, and there should not be a noticeable increase in RSS memory usage.
-However, since tail-based sampling writes data to disk,
-it is possible to see a significant increase in OS page cache memory usage due to disk IO.
-If you see a drop in throughput and excessive disk activity after enabling tail-based sampling,
-please ensure that there is enough memory headroom in the system for OS page cache to perform disk IO efficiently.
diff --git a/docs/en/observability/apm/command-reference.asciidoc b/docs/en/observability/apm/configure/advanced-setup/command-reference.asciidoc
similarity index 98%
rename from docs/en/observability/apm/command-reference.asciidoc
rename to docs/en/observability/apm/configure/advanced-setup/command-reference.asciidoc
index 45e65e570d..d95b0c0f6a 100644
--- a/docs/en/observability/apm/command-reference.asciidoc
+++ b/docs/en/observability/apm/configure/advanced-setup/command-reference.asciidoc
@@ -26,7 +26,7 @@ endif::serverless[]
// end::attributes[]
[[apm-command-line-options]]
-=== APM Server command reference
+= APM Server command reference
++++
Command reference
@@ -74,7 +74,7 @@ Also see <>.
[float]
[[apm-apikey-command]]
-==== `apikey` command
+== `apikey` command
experimental::[]
@@ -172,7 +172,7 @@ For more information, see <>.
[float]
[[apm-export-command]]
-==== `export` command
+== `export` command
ifndef::serverless[]
{export-command-short-desc}. You can use this
@@ -258,7 +258,7 @@ endif::serverless[]
[float]
[[apm-help-command]]
-==== `help` command
+== `help` command
{help-command-short-desc}.
ifndef::serverless[]
@@ -291,7 +291,7 @@ apm-server help export
ifndef::serverless[]
[float]
[[apm-keystore-command]]
-==== `keystore` command
+== `keystore` command
{keystore-command-short-desc}.
@@ -350,7 +350,7 @@ endif::[]
ifndef::serverless[]
[float]
[[apm-run-command]]
-==== `run` command
+== `run` command
{run-command-short-desc}.
@@ -409,7 +409,7 @@ endif::[]
[float]
[[apm-test-command]]
-==== `test` command
+== `test` command
{test-command-short-desc}.
@@ -444,7 +444,7 @@ apm-server test config
[float]
[[apm-version-command]]
-==== `version` command
+== `version` command
{version-command-short-desc}.
@@ -472,7 +472,7 @@ apm-server version
[float]
[[apm-global-flags]]
-=== Global flags
+== Global flags
These global flags are available whenever you run APM Server.
diff --git a/docs/en/observability/apm/data-ingestion.asciidoc b/docs/en/observability/apm/configure/advanced-setup/data-ingestion.asciidoc
similarity index 93%
rename from docs/en/observability/apm/data-ingestion.asciidoc
rename to docs/en/observability/apm/configure/advanced-setup/data-ingestion.asciidoc
index 13c825a97d..d4e6373cc0 100644
--- a/docs/en/observability/apm/data-ingestion.asciidoc
+++ b/docs/en/observability/apm/configure/advanced-setup/data-ingestion.asciidoc
@@ -1,11 +1,11 @@
[[apm-tune-data-ingestion]]
-=== Tune data ingestion
+= Tune data ingestion
This section explains how to adapt data ingestion according to your needs.
[float]
[[apm-tune-apm-server]]
-=== Tune APM Server
+== Tune APM Server
* <>
* <>
@@ -13,7 +13,7 @@ This section explains how to adapt data ingestion according to your needs.
[[apm-add-apm-server-instances]]
[float]
-==== Add APM Server or {agent} instances
+=== Add APM Server or {agent} instances
If the APM Server cannot process data quickly enough,
you will see request timeouts.
@@ -25,7 +25,7 @@ Having several instances will also increase <Advanced setup
+++++
+
+Before reading this section, see the <>
+for basic installation and running instructions.
+
+This section includes additional information on how to set up and run APM Server, including:
+
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+
+:leveloffset: +1
+
+include::{observability-docs-root}/docs/en/observability/apm/configure/advanced-setup/shared-directory-layout.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/configure/advanced-setup/keystore.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/configure/advanced-setup/command-reference.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/configure/advanced-setup/data-ingestion.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/configure/advanced-setup/high-availability.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/configure/advanced-setup/shared-systemd.asciidoc[]
+
+:!leveloffset:
diff --git a/docs/en/observability/apm/keystore.asciidoc b/docs/en/observability/apm/configure/advanced-setup/keystore.asciidoc
similarity index 96%
rename from docs/en/observability/apm/keystore.asciidoc
rename to docs/en/observability/apm/configure/advanced-setup/keystore.asciidoc
index 39183ab3a3..3e330f8e16 100644
--- a/docs/en/observability/apm/keystore.asciidoc
+++ b/docs/en/observability/apm/configure/advanced-setup/keystore.asciidoc
@@ -1,5 +1,5 @@
[[apm-keystore]]
-=== Secrets keystore for secure settings
+= Secrets keystore for secure settings
++++
Secrets keystore
@@ -45,7 +45,7 @@ APM Server.
[discrete]
[[apm-creating-keystore]]
-=== Create a keystore
+== Create a keystore
To create a secrets keystore, use:
@@ -59,7 +59,7 @@ configuration setting.
[discrete]
[[apm-add-keys-to-keystore]]
-=== Add keys
+== Add keys
To store sensitive values, such as authentication credentials for {es},
use the `keystore add` command:
@@ -88,7 +88,7 @@ cat /file/containing/setting/value | apm-server keystore add ES_PWD --stdin --fo
[discrete]
[[apm-list-settings]]
-=== List keys
+== List keys
To list the keys defined in the keystore, use:
@@ -99,7 +99,7 @@ apm-server keystore list
[discrete]
[[apm-remove-settings]]
-=== Remove keys
+== Remove keys
To remove a key from the keystore, use:
diff --git a/docs/en/observability/apm/shared-directory-layout.asciidoc b/docs/en/observability/apm/configure/advanced-setup/shared-directory-layout.asciidoc
similarity index 95%
rename from docs/en/observability/apm/shared-directory-layout.asciidoc
rename to docs/en/observability/apm/configure/advanced-setup/shared-directory-layout.asciidoc
index f9837466cc..49f1f765fd 100644
--- a/docs/en/observability/apm/shared-directory-layout.asciidoc
+++ b/docs/en/observability/apm/configure/advanced-setup/shared-directory-layout.asciidoc
@@ -10,12 +10,12 @@
//////////////////////////////////////////////////////////////////////////
[[apm-directory-layout]]
-=== Installation layout
+= Installation layout
View the installation layout and default paths for both Fleet-managed APM Server and the APM Server binary.
[float]
-=== Fleet-managed
+== Fleet-managed
{agent} files are installed in the following locations. You cannot override
these installation paths because they are required for upgrades.
@@ -25,7 +25,7 @@ include::{ingest-docs-root}/docs/en/ingest-management/tab-widgets/install-layout
--
[float]
-=== APM Server binary
+== APM Server binary
APM Server uses the following default paths unless you explicitly change them.
diff --git a/docs/en/observability/apm/shared-systemd.asciidoc b/docs/en/observability/apm/configure/advanced-setup/shared-systemd.asciidoc
similarity index 96%
rename from docs/en/observability/apm/shared-systemd.asciidoc
rename to docs/en/observability/apm/configure/advanced-setup/shared-systemd.asciidoc
index 6db6d33565..dcad0c74c6 100644
--- a/docs/en/observability/apm/shared-systemd.asciidoc
+++ b/docs/en/observability/apm/configure/advanced-setup/shared-systemd.asciidoc
@@ -1,5 +1,5 @@
[[apm-running-with-systemd]]
-=== APM Server and systemd
+= APM Server and systemd
IMPORTANT: These commands only apply to the APM Server binary installation method.
Fleet-managed users should see {fleet-guide}/start-stop-elastic-agent.html[Start and stop {agent}s on edge hosts].
@@ -12,7 +12,7 @@ We recommend that the apm-server process is run as a non-root user.
Therefore, that is the default setup for APM Server's DEB package and RPM installation.
[float]
-==== Start and stop APM Server
+== Start and stop APM Server
Use `systemctl` to start or stop APM Server:
@@ -40,7 +40,7 @@ sudo systemctl disable apm-server
------------------------------------------------
[float]
-==== APM Server status and logs
+== APM Server status and logs
To get the service status, use `systemctl`:
@@ -57,7 +57,7 @@ journalctl -u apm-server.service
------------------------------------------------
[float]
-=== Customize systemd unit for APM Server
+== Customize systemd unit for APM Server
The systemd service unit file includes environment variables that you can
override to change the default options.
diff --git a/docs/en/observability/apm/configure/agent-config.asciidoc b/docs/en/observability/apm/configure/agent-config.asciidoc
index 50b6c7eb6e..40abb459f2 100644
--- a/docs/en/observability/apm/configure/agent-config.asciidoc
+++ b/docs/en/observability/apm/configure/agent-config.asciidoc
@@ -25,7 +25,7 @@ apm-server.agent.config.elasticsearch.api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSo
----
[float]
-= APM agent configuration options
+== APM agent configuration options
The following options are only supported for APM Server binary users.
You can specify these options in the `apm-server.agent.config` section of the
@@ -33,14 +33,14 @@ You can specify these options in the `apm-server.agent.config` section of the
[float]
[[apm-agent-config-cache]]
-== `apm-server.agent.config.cache.expiration`
+=== `apm-server.agent.config.cache.expiration`
When using APM agent configuration, information fetched from {es} will be cached in memory for some time.
Specify the cache expiration time via this setting. Defaults to `30s` (30 seconds).
[float]
[[apm-agent-config-elasticsearch]]
-== `apm-server.agent.config.elasticsearch`
+=== `apm-server.agent.config.elasticsearch`
Takes the same options as <>.
@@ -50,7 +50,7 @@ configuration. If `output.elasticsearch` isn't set or doesn't have sufficient pr
use these {es} options to provide {es} access.
[float]
-== Common problems
+=== Common problems
You may see either of the following HTTP 403 errors from APM Server when it attempts to fetch APM agent configuration:
diff --git a/docs/en/observability/apm/configure/anonymous-auth.asciidoc b/docs/en/observability/apm/configure/anonymous-auth.asciidoc
index 16695d34b3..3068eb5a8a 100644
--- a/docs/en/observability/apm/configure/anonymous-auth.asciidoc
+++ b/docs/en/observability/apm/configure/anonymous-auth.asciidoc
@@ -28,7 +28,7 @@ IMPORTANT: All anonymous access configuration is ignored if
[float]
[[apm-config-auth-anon-rum]]
-= Real User Monitoring (RUM)
+== Real User Monitoring (RUM)
If an <> or <> is configured,
then anonymous authentication must be enabled to collect RUM data.
@@ -39,7 +39,7 @@ See <> for additional RUM configuration options.
[float]
[[apm-config-auth-anon-mitigating]]
-== Mitigating malicious requests
+=== Mitigating malicious requests
There are a few configuration variables that can mitigate the impact of malicious requests to an
unauthenticated APM Server endpoint.
@@ -53,7 +53,7 @@ This allows you to specify the maximum number of requests allowed per unique IP
[float]
[[apm-config-auth-anon-client-ip]]
-== Deriving an incoming request's `client.ip` address
+=== Deriving an incoming request's `client.ip` address
The remote IP address of an incoming request might be different
from the end-user's actual IP address, for example, because of a proxy. For this reason,
@@ -68,7 +68,7 @@ If none of these headers are present, the remote address for the incoming reques
[float]
[[apm-config-auth-anon-client-ip-concerns]]
-== Using a reverse proxy or load balancer
+=== Using a reverse proxy or load balancer
HTTP headers are easily modified;
it's possible for anyone to spoof the derived `client.ip` value by changing or setting,
@@ -83,11 +83,11 @@ APM Server's rate limiting feature.
[float]
[[apm-config-auth-anon]]
-= Configuration reference
+== Configuration reference
[float]
[[apm-config-auth-anon-enabled]]
-== Anonymous Agent access
+=== Anonymous Agent access
Enable or disable anonymous authentication.
Default: `false` (disabled). (bool)
@@ -99,7 +99,7 @@ Default: `false` (disabled). (bool)
[float]
[[apm-config-auth-anon-allow-agent]]
-== Allowed anonymous agents
+=== Allowed anonymous agents
A list of permitted {apm-agent} names for anonymous authentication.
Names in this list must match the agent's `agent.name`.
Default: `[rum-js, js-base]` (only RUM agent events are accepted). (array)
@@ -124,7 +124,7 @@ Default: Not set (any service name is accepted). (array)
[float]
[[apm-config-auth-anon-ip-limit]]
-== IP limit
+=== IP limit
The number of unique IP addresses to track in an LRU cache.
IP addresses in the cache will be rate limited according to the <> setting.
Consider increasing this default if your application has many concurrent clients.
@@ -137,7 +137,7 @@ Default: `1000`. (int)
[float]
[[apm-config-auth-anon-event-limit]]
-== Event limit
+=== Event limit
The maximum number of events allowed per second, per agent IP address.
Default: `300`. (int)
diff --git a/docs/en/observability/apm/configure/auth.asciidoc b/docs/en/observability/apm/configure/auth.asciidoc
index f04958beee..d8c02bd988 100644
--- a/docs/en/observability/apm/configure/auth.asciidoc
+++ b/docs/en/observability/apm/configure/auth.asciidoc
@@ -13,14 +13,14 @@ include::./tab-widgets/auth-config-widget.asciidoc[]
[float]
[[apm-api-key-auth-settings]]
-= API key authentication options
+== API key authentication options
These settings apply to API key communication between the APM Server and APM Agents.
NOTE: These settings are different from the API key settings used for {es} output and monitoring.
[float]
-== API key for agent authentication
+=== API key for agent authentication
Enable API key authorization by setting `enabled` to `true`.
By default, `enabled` is set to `false`, and API key support is disabled. (bool)
@@ -35,7 +35,7 @@ When enabled, third-party APM agents must include a valid API key in the followi
`Authorization: ApiKey `. The key must be the base64 encoded representation of the API key's `id:name`.
[float]
-== API key limit
+=== API key limit
Each unique API key triggers one request to {es}.
This setting restricts the number of unique API keys are allowed per minute.
@@ -48,7 +48,7 @@ The default `limit` is `100`. (int)
|====
[float]
-== Secret token
+=== Secret token
Authorization token for sending APM data.
The same token must also be set in each {apm-agent}.
@@ -60,7 +60,7 @@ This token is not used for RUM endpoints. (text)
|====
[float]
-= `auth.api_key.elasticsearch.*` configuration options
+== `auth.api_key.elasticsearch.*` configuration options
****
image:./binary-yes-fm-no.svg[supported deployment methods]
@@ -72,51 +72,51 @@ If none are set, configuration settings from the `apm-server.output` section wil
****
[float]
-== `elasticsearch.hosts`
+=== `elasticsearch.hosts`
API keys are fetched from {es}.
This configuration needs to point to a secured {es} cluster that is able to serve API key requests.
[float]
-== `elasticsearch.protocol`
+=== `elasticsearch.protocol`
The name of the protocol {es} is reachable on.
The options are: `http` or `https`. The default is `http`.
If nothing is configured, configuration settings from the `output` section will be reused.
[float]
-== `elasticsearch.path`
+=== `elasticsearch.path`
An optional HTTP path prefix that is prepended to the HTTP API calls.
If nothing is configured, configuration settings from the `output` section will be reused.
[float]
-== `elasticsearch.proxy_url`
+=== `elasticsearch.proxy_url`
The URL of the proxy to use when connecting to the {es} servers.
The value may be either a complete URL or a "host[:port]", in which case the "http"scheme is assumed.
If nothing is configured, configuration settings from the `output` section will be reused.
[float]
-== `elasticsearch.timeout`
+=== `elasticsearch.timeout`
The HTTP request timeout in seconds for the {es} request.
If nothing is configured, configuration settings from the `output` section will be reused.
[float]
-= `auth.api_key.elasticsearch.ssl.*` configuration options
+== `auth.api_key.elasticsearch.ssl.*` configuration options
SSL is off by default. Set `elasticsearch.protocol` to `https` if you want to enable `https`.
[float]
-== `elasticsearch.ssl.enabled`
+=== `elasticsearch.ssl.enabled`
Enable custom SSL settings.
Set to false to ignore custom SSL settings for secure communication.
[float]
-== `elasticsearch.ssl.verification_mode`
+=== `elasticsearch.ssl.verification_mode`
Configure SSL verification mode.
If `none` is configured, all server hosts and certificates will be accepted.
@@ -124,45 +124,45 @@ In this mode, SSL based connections are susceptible to man-in-the-middle attacks
**Use only for testing**. Default is `full`.
[float]
-== `elasticsearch.ssl.supported_protocols`
+=== `elasticsearch.ssl.supported_protocols`
List of supported/valid TLS versions.
By default, all TLS versions from 1.0 to 1.2 are enabled.
[float]
-== `elasticsearch.ssl.certificate_authorities`
+=== `elasticsearch.ssl.certificate_authorities`
List of root certificates for HTTPS server verifications.
[float]
-== `elasticsearch.ssl.certificate`
+=== `elasticsearch.ssl.certificate`
The path to the certificate for SSL client authentication.
[float]
-== `elasticsearch.ssl.key`
+=== `elasticsearch.ssl.key`
The client certificate key used for client authentication.
This option is required if certificate is specified.
[float]
-== `elasticsearch.ssl.key_passphrase`
+=== `elasticsearch.ssl.key_passphrase`
An optional passphrase used to decrypt an encrypted key stored in the configured key file.
[float]
-== `elasticsearch.ssl.cipher_suites`
+=== `elasticsearch.ssl.cipher_suites`
The list of cipher suites to use. The first entry has the highest priority.
If this option is omitted, the Go crypto library’s default suites are used (recommended).
[float]
-== `elasticsearch.ssl.curve_types`
+=== `elasticsearch.ssl.curve_types`
The list of curve types for ECDHE (Elliptic Curve Diffie-Hellman ephemeral key exchange).
[float]
-== `elasticsearch.ssl.renegotiation`
+=== `elasticsearch.ssl.renegotiation`
Configure what types of renegotiation are supported.
Valid options are `never`, `once`, and `freely`. Default is `never`.
diff --git a/docs/en/observability/apm/configure/general.asciidoc b/docs/en/observability/apm/configure/general.asciidoc
index decdc577e8..16d889230a 100644
--- a/docs/en/observability/apm/configure/general.asciidoc
+++ b/docs/en/observability/apm/configure/general.asciidoc
@@ -13,11 +13,11 @@ include::./tab-widgets/general-config-widget.asciidoc[]
[float]
[[apm-configuration-apm-server]]
-= Configuration options
+== Configuration options
[[apm-host]]
[float]
-== Host
+=== Host
Defines the host and port the server is listening on.
Use `"unix:/path/to.sock"` to listen on a Unix domain socket.
Defaults to 'localhost:8200'. (text)
@@ -28,7 +28,7 @@ Defaults to 'localhost:8200'. (text)
|====
[float]
-== URL
+=== URL
The publicly reachable server URL. For deployments on Elastic Cloud or ECK, the default is unchangeable.
|====
@@ -38,7 +38,7 @@ The publicly reachable server URL. For deployments on Elastic Cloud or ECK, the
[[apm-max_header_size]]
[float]
-== Max header size
+=== Max header size
Maximum permitted size of a request's header accepted by the server to be processed (in Bytes).
Defaults to 1048576 Bytes (1 MB). (int)
@@ -49,7 +49,7 @@ Defaults to 1048576 Bytes (1 MB). (int)
[[apm-idle_timeout]]
[float]
-== Idle timeout
+=== Idle timeout
Maximum amount of time to wait for the next incoming request before underlying connection is closed.
Defaults to `45s` (45 seconds). (text)
@@ -60,7 +60,7 @@ Defaults to `45s` (45 seconds). (text)
[[apm-read_timeout]]
[float]
-== Read timeout
+=== Read timeout
Maximum permitted duration for reading an entire request.
Defaults to `3600s` (3600 seconds). (text)
@@ -71,7 +71,7 @@ Defaults to `3600s` (3600 seconds). (text)
[[apm-write_timeout]]
[float]
-== Write timeout
+=== Write timeout
Maximum permitted duration for writing a response.
Defaults to `30s` (30 seconds). (text)
@@ -82,7 +82,7 @@ Defaults to `30s` (30 seconds). (text)
[[apm-shutdown_timeout]]
[float]
-=== Shutdown timeout
+==== Shutdown timeout
Maximum duration in seconds before releasing resources when shutting down the server.
Defaults to `30s` (30 seconds). (text)
@@ -93,7 +93,7 @@ Defaults to `30s` (30 seconds). (text)
[[apm-max_event_size]]
[float]
-== Max event size
+=== Max event size
Maximum permitted size of an event accepted by the server to be processed (in Bytes).
Defaults to `307200` Bytes. (int)
@@ -104,7 +104,7 @@ Defaults to `307200` Bytes. (int)
[[apm-max_connections]]
[float]
-== Max connections
+=== Max connections
Maximum number of TCP connections to accept simultaneously.
Default value is 0, which means _unlimited_. (int)
@@ -115,7 +115,7 @@ Default value is 0, which means _unlimited_. (int)
[[apm-custom_http_headers]]
[float]
-== Custom HTTP response headers
+=== Custom HTTP response headers
Custom HTTP headers to add to HTTP responses. Useful for security policy compliance. (text)
|====
@@ -125,7 +125,7 @@ Custom HTTP headers to add to HTTP responses. Useful for security policy complia
[[apm-capture_personal_data]]
[float]
-== Capture personal data
+=== Capture personal data
If true,
APM Server captures the IP of the instrumented service and its User Agent if any.
Enabled by default. (bool)
@@ -138,7 +138,7 @@ Enabled by default. (bool)
[[apm-default_service_environment]]
[float]
-== Default service environment
+=== Default service environment
Sets the default service environment to associate with data and requests received from agents which have no service environment defined. Default: none. (text)
|====
@@ -148,7 +148,7 @@ Sets the default service environment to associate with data and requests receive
[[apm-expvar.enabled]]
[float]
-== expvar support
+=== expvar support
When set to true APM Server exposes https://golang.org/pkg/expvar/[golang expvar] under `/debug/vars`.
Disabled by default.
@@ -159,7 +159,7 @@ Disabled by default.
[[apm-expvar.url]]
[float]
-== expvar URL
+=== expvar URL
Configure the URL to expose expvar.
Defaults to `debug/vars`.
@@ -170,7 +170,7 @@ Defaults to `debug/vars`.
[[apm-data_streams.namespace]]
[float]
-== Data stream namespace
+=== Data stream namespace
Change the default namespace.
This setting changes the name of the integration's data stream.
diff --git a/docs/en/observability/apm/configure/index.asciidoc b/docs/en/observability/apm/configure/index.asciidoc
index c4d2722f8e..df3fe704a5 100644
--- a/docs/en/observability/apm/configure/index.asciidoc
+++ b/docs/en/observability/apm/configure/index.asciidoc
@@ -1,5 +1,5 @@
[[apm-configuring-howto-apm-server]]
-= Configure
+= Configure APM Server
How you configure the APM Server depends on your deployment method.
@@ -49,4 +49,6 @@ include::tls.asciidoc[leveloffset=+1]
include::sampling.asciidoc[leveloffset=+1]
-include::env.asciidoc[leveloffset=+1]
\ No newline at end of file
+include::env.asciidoc[leveloffset=+1]
+
+include::advanced-setup/index.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/configure/rum.asciidoc b/docs/en/observability/apm/configure/rum.asciidoc
index 0156fb0c4b..5dbab0cb8e 100644
--- a/docs/en/observability/apm/configure/rum.asciidoc
+++ b/docs/en/observability/apm/configure/rum.asciidoc
@@ -23,11 +23,11 @@ you will need to configure {apm-rum-ref-v}/configuring-cors.html[Cross-Origin Re
[float]
[[apm-enable-rum-support]]
-= Configuration reference
+== Configuration reference
[[apm-rum-enable]]
[float]
-== Enable RUM
+=== Enable RUM
To enable RUM support, set to `true`.
By default this is disabled. (bool)
@@ -45,7 +45,7 @@ Anonymous authentication is required as the RUM agent runs in the browser.
[float]
[[apm-rum-allow-origins]]
-== Allowed Origins
+=== Allowed Origins
A list of permitted origins for RUM support.
User-agents send an Origin header that will be validated against this list.
This is done automatically by modern browsers as part of the https://www.w3.org/TR/cors/[CORS specification].
@@ -60,7 +60,7 @@ Default: `['*']` (allows everything). (text)
[float]
[[apm-rum-allow-headers]]
-== Access-Control-Allow-Headers
+=== Access-Control-Allow-Headers
HTTP requests made from the RUM agent to the APM Server are limited in the HTTP headers they are allowed to have.
If any other headers are added, the request will be rejected by the browser due to Cross-Origin Resource Sharing (CORS) restrictions.
Use this setting to allow additional headers.
@@ -76,7 +76,7 @@ Default: `[]`. (text)
[float]
[[apm-rum-response-headers]]
-== Custom HTTP response headers
+=== Custom HTTP response headers
Custom HTTP headers to add to RUM responses.
This can be useful for security policy compliance.
@@ -91,7 +91,7 @@ Default: none. (text)
[float]
[[apm-rum-library-pattern]]
-== Library Frame Pattern
+=== Library Frame Pattern
RegExp to be matched against a stack trace frame's `file_name` and `abs_path` attributes.
If the RegExp matches, the stack trace frame is considered to be a library frame.
When source mapping is applied, the `error.culprit` is set to reflect the _function_ and the _filename_
@@ -106,7 +106,7 @@ Default: `"node_modules|bower_components|~"`. (text)
|====
[float]
-== Exclude from grouping
+=== Exclude from grouping
RegExp to be matched against a stack trace frame's `file_name`.
If the RegExp matches, the stack trace frame is excluded from being used for calculating error groups.
@@ -120,7 +120,7 @@ Default: `"^/webpack"` (excludes stack trace frames that have a filename startin
[float]
[[apm-rum-source-map]]
-= Source map configuration options
+== Source map configuration options
****
image:./binary-yes-fm-no.svg[supported deployment methods]
@@ -131,7 +131,7 @@ the options in this section are only supported by the APM Server binary.
[[apm-config-sourcemapping-enabled]]
[float]
-== `source_mapping.enabled`
+=== `source_mapping.enabled`
Used to enable/disable <> for RUM events.
When enabled, the APM Server needs additional privileges to read source maps.
See <> for more details.
@@ -140,14 +140,14 @@ Default: `true`
[[apm-config-sourcemapping-elasticsearch]]
[float]
-== `source_mapping.elasticsearch`
+=== `source_mapping.elasticsearch`
Configure the {es} source map retrieval location, taking the same options as <>.
This must be set when using an output other than {es}, and that output is writing to {es}.
Otherwise leave this section empty.
[[apm-rum-sourcemap-cache]]
[float]
-== `source_mapping.cache.expiration`
+=== `source_mapping.cache.expiration`
If a source map has been uploaded to the APM Server,
<> is automatically applied to documents sent to the RUM endpoint.
Source maps are fetched from {es} and then kept in an in-memory cache for the configured time.
@@ -156,7 +156,7 @@ Values configured without a time unit are treated as seconds.
Default: `5m` (5 minutes)
[float]
-== `source_mapping.index_pattern`
+=== `source_mapping.index_pattern`
Previous versions of APM Server stored source maps in `apm-%{[observer.version]}-sourcemap` indices.
Search source maps stored in an older version with this setting.
@@ -164,11 +164,11 @@ Default: `"apm-*-sourcemap*"`
[float]
[[apm-rum-deprecated]]
-= Deprecated configuration options
+== Deprecated configuration options
[float]
[[apm-event_rate.limit]]
-== `event_rate.limit`
+=== `event_rate.limit`
deprecated::[7.15.0, Replaced by <>.]
@@ -177,7 +177,7 @@ The maximum number of events allowed per second, per agent IP address.
Default: `300`
[float]
-== `event_rate.lru_size`
+=== `event_rate.lru_size`
deprecated::[7.15.0, Replaced by <>.]
@@ -189,7 +189,7 @@ Default: `1000`
[float]
[[apm-rum-allow-service-names]]
-== `allow_service_names`
+=== `allow_service_names`
deprecated::[7.15.0, Replaced by <>.]
A list of permitted service names for RUM support.
@@ -200,7 +200,7 @@ in order to limit the number of service-specific indices or data streams created
Default: Not set (any service name is accepted)
[float]
-= Ingest pipelines
+== Ingest pipelines
The default APM Server pipeline includes processors that enrich RUM data prior to indexing in {es}.
See <> for details on how to locate, edit, or disable this preprocessing.
\ No newline at end of file
diff --git a/docs/en/observability/apm/configure/sampling.asciidoc b/docs/en/observability/apm/configure/sampling.asciidoc
index 7932ee17d0..cd31a3e079 100644
--- a/docs/en/observability/apm/configure/sampling.asciidoc
+++ b/docs/en/observability/apm/configure/sampling.asciidoc
@@ -13,7 +13,7 @@ include::./tab-widgets/sampling-config-widget.asciidoc[]
[float]
[[apm-configuration-tbs]]
-= Top-level tail-based sampling settings
+== Top-level tail-based sampling settings
See <> to learn more.
@@ -22,7 +22,7 @@ See <> to learn more.
[float]
[id="sampling-tail-enabled-{input-type}"]
-== Enable tail-based sampling
+=== Enable tail-based sampling
Set to `true` to enable tail based sampling.
Disabled by default. (bool)
@@ -33,7 +33,7 @@ Disabled by default. (bool)
[float]
[id="sampling-tail-interval-{input-type}"]
-== Interval
+=== Interval
Synchronization interval for multiple APM Servers.
Should be in the order of tens of seconds or low minutes.
Default: `1m` (1 minute). (duration)
@@ -45,7 +45,7 @@ Default: `1m` (1 minute). (duration)
[float]
[id="sampling-tail-policies-{input-type}"]
-== Policies
+=== Policies
Criteria used to match a root transaction to a sample rate.
Policies map trace events to a sample rate.
@@ -63,7 +63,7 @@ This final policy is used to catch remaining trace events that don't match a str
[float]
[id="sampling-tail-storage_limit-{input-type}"]
-== Storage limit
+=== Storage limit
The amount of storage space allocated for trace events matching tail sampling policies. Caution: Setting this limit higher than the allowed space may cause APM Server to become unhealthy.
If the configured storage limit is insufficient, it logs "configured storage limit reached". The event will bypass sampling and will always be indexed when storage limit is reached.
@@ -79,7 +79,7 @@ Default: `3GB`. (text)
[float]
[[apm-configuration-tbs-policy]]
-= Policy-level tail-based sampling settings
+== Policy-level tail-based sampling settings
See <> to learn more.
@@ -87,9 +87,7 @@ See <> to learn more.
[float]
[id="sampling-tail-sample-rate-{input-type}"]
-== Sample rate
-
-**`sample_rate`**
+=== **`sample_rate`**
The sample rate to apply to trace events matching this policy.
Required in each policy.
@@ -100,9 +98,7 @@ A `sample_rate` of `1` means that 100% of trace events matching the policy will
[float]
[id="sampling-tail-trace-name-{input-type}"]
-== Trace name
-
-**`trace.name`**
+=== **`trace.name`**
The trace name for events to match a policy.
A match occurs when the configured `trace.name` matches the `transaction.name` of the root transaction of a trace.
@@ -110,9 +106,7 @@ A root transaction is any transaction without a `parent.id`. (string)
[float]
[id="sampling-tail-trace-outcome-{input-type}"]
-== Trace outcome
-
-**`trace.outcome`**
+=== **`trace.outcome`**
The trace outcome for events to match a policy.
A match occurs when the configured `trace.outcome` matches a trace's `event.outcome` field.
@@ -120,17 +114,13 @@ Trace outcome can be `success`, `failure`, or `unknown`. (string)
[float]
[id="sampling-tail-service-name-{input-type}"]
-== Service name
-
-**`service.name`**
+=== **`service.name`**
The service name for events to match a policy. (string)
[float]
[id="sampling-tail-service-environment-{input-type}"]
-== Service Environment
-
-**`service.environment`**
+=== **`service.environment`**
The service environment for events to match a policy. (string)
diff --git a/docs/en/observability/apm/data-model/data-model-errors.asciidoc b/docs/en/observability/apm/data-model/data-model-errors.asciidoc
new file mode 100644
index 0000000000..2f2c749918
--- /dev/null
+++ b/docs/en/observability/apm/data-model/data-model-errors.asciidoc
@@ -0,0 +1,52 @@
+[[apm-data-model-errors]]
+= Errors
+
+An error event contains at least
+information about the original `exception` that occurred
+or about a `log` created when the exception occurred.
+For simplicity, errors are represented by a unique ID.
+
+An Error contains:
+
+* Both the captured `exception` and the captured `log` of an error can contain a `stack trace`,
+which is helpful for debugging.
+* The `culprit` of an error indicates where it originated.
+* An error might relate to the <> during which it happened,
+via the `transaction.id`.
+* Data about the environment in which the event is recorded:
+** Service - environment, framework, language, etc.
+** Host - architecture, hostname, IP, etc.
+** Process - args, PID, PPID, etc.
+** URL - full, domain, port, query, etc.
+** <> - (if supplied) email, ID, username, etc.
+
+In addition, agents provide options for users to capture custom <>.
+Metadata can be indexed - <>, or not-indexed - <>.
+
+TIP: Most agents limit keyword fields (e.g. `error.id`) to 1024 characters,
+non-keyword fields (e.g. `error.exception.message`) to 10,000 characters.
+
+Errors are stored in error indices.
+
+[float]
+== Data streams
+
+Errors are stored in the following data streams:
+
+include::{observability-docs-root}/docs/en/observability/apm/manage-storage/data-streams.asciidoc[tag=logs-data-streams]
+
+See <> to learn more.
+
+[float]
+== Example error document
+
+This example shows what error documents can look like when indexed in {es}.
+
+[%collapsible]
+.Expand {es} document
+====
+[source,json]
+----
+include::{apm-server-root}/docs/data/elasticsearch/generated/errors.json[]
+----
+====
diff --git a/docs/en/observability/apm/data-model/data-model-metadata.asciidoc b/docs/en/observability/apm/data-model/data-model-metadata.asciidoc
new file mode 100644
index 0000000000..fa6be2fc94
--- /dev/null
+++ b/docs/en/observability/apm/data-model/data-model-metadata.asciidoc
@@ -0,0 +1,99 @@
+[[apm-data-model-metadata]]
+= Metadata
+
+Metadata can enrich your events and make application performance monitoring even more useful.
+Let's explore the different types of metadata that Elastic APM offers.
+
+[float]
+[[apm-data-model-labels]]
+== Labels
+
+Labels add *indexed* information to transactions, spans, and errors.
+Indexed means the data is searchable and aggregatable in {es}.
+Add additional key-value pairs to define multiple labels.
+
+* Indexed: Yes
+* {es} type: {ref}/object.html[object]
+* {es} field: `labels`
+* Applies to: <> | <> | <>
+
+Label values can be a string, boolean, or number, although some agents only support string values at this time.
+Because labels for a given key, regardless of agent used, are stored in the same place in {es},
+all label values of a given key must have the same data type.
+Multiple data types per key will throw an exception, for example: `{foo: bar}` and `{foo: 42}` is not allowed.
+
+IMPORTANT: Avoid defining too many user-specified labels.
+Defining too many unique fields in an index is a condition that can lead to a
+{ref}/mapping.html#mapping-limit-settings[mapping explosion].
+
+[float]
+=== Agent API reference
+
+* Go: {apm-go-ref-v}/api.html#context-set-label[`SetLabel`]
+* Java: {apm-java-ref-v}/public-api.html#api-transaction-add-tag[`setLabel`]
+* .NET: {apm-dotnet-ref-v}/public-api.html#api-transaction-set-label[`SetLabel`]
+* Node.js: {apm-node-ref-v}/agent-api.html#apm-set-label[`setLabel`] | {apm-node-ref-v}/agent-api.html#apm-add-labels[`addLabels`]
+* PHP: {apm-php-ref}/public-api.html#api-transaction-interface-set-label[`Transaction` `setLabel`] | {apm-php-ref}/public-api.html#api-span-interface-set-label[`Span` `setLabel`]
+* Python: {apm-py-ref-v}/api.html#api-label[`elasticapm.label()`]
+* Ruby: {apm-ruby-ref-v}/api.html#api-agent-set-label[`set_label`]
+* Rum: {apm-rum-ref-v}/agent-api.html#apm-add-labels[`addLabels`]
+
+[float]
+[[apm-data-model-custom]]
+== Custom context
+
+Custom context adds *non-indexed*,
+custom contextual information to transactions and errors.
+Non-indexed means the data is not searchable or aggregatable in {es},
+and you cannot build dashboards on top of the data.
+This also means you don't have to worry about {ref}/mapping.html#mapping-limit-settings[mapping explosions],
+as these fields are not added to the mapping.
+
+Non-indexed information is useful for providing contextual information to help you
+quickly debug performance issues or errors.
+
+* Indexed: No
+* {es} type: {ref}/object.html[object]
+* {es} fields: `transaction.custom` | `error.custom`
+* Applies to: <> | <>
+
+IMPORTANT: Setting a circular object, a large object, or a non JSON serializable object can lead to errors.
+
+[float]
+=== Agent API reference
+
+* Go: {apm-go-ref-v}/api.html#context-set-custom[`SetCustom`]
+* iOS: _coming soon_
+* Java: {apm-java-ref-v}/public-api.html#api-transaction-add-custom-context[`addCustomContext`]
+* .NET: _coming soon_
+* Node.js: {apm-node-ref-v}/agent-api.html#apm-set-custom-context[`setCustomContext`]
+* PHP: _coming soon_
+* Python: {apm-py-ref-v}/api.html#api-set-custom-context[`set_custom_context`]
+* Ruby: {apm-ruby-ref-v}/api.html#api-agent-set-custom-context[`set_custom_context`]
+* Rum: {apm-rum-ref-v}/agent-api.html#apm-set-custom-context[`setCustomContext`]
+
+[float]
+[[apm-data-model-user]]
+== User context
+
+User context adds *indexed* user information to transactions and errors.
+Indexed means the data is searchable and aggregatable in {es}.
+
+* Indexed: Yes
+* {es} type: {ref}/keyword.html[keyword]
+* {es} fields: `user.email` | `user.name` | `user.id`
+* Applies to: <> | <>
+
+[float]
+=== Agent API reference
+
+* Go: {apm-go-ref-v}/api.html#context-set-username[`SetUsername`] | {apm-go-ref-v}/api.html#context-set-user-id[`SetUserID`] |
+{apm-go-ref-v}/api.html#context-set-user-email[`SetUserEmail`]
+* iOS: _coming soon_
+* Java: {apm-java-ref-v}/public-api.html#api-transaction-set-user[`setUser`]
+* .NET _coming soon_
+* Node.js: {apm-node-ref-v}/agent-api.html#apm-set-user-context[`setUserContext`]
+* PHP: _coming soon_
+* Python: {apm-py-ref-v}/api.html#api-set-user-context[`set_user_context`]
+* Ruby: {apm-ruby-ref-v}/api.html#api-agent-set-user[`set_user`]
+* Rum: {apm-rum-ref-v}/agent-api.html#apm-set-user-context[`setUserContext`]
diff --git a/docs/en/observability/apm/data-model.asciidoc b/docs/en/observability/apm/data-model/data-model-metrics.asciidoc
similarity index 54%
rename from docs/en/observability/apm/data-model.asciidoc
rename to docs/en/observability/apm/data-model/data-model-metrics.asciidoc
index 60c0a69c07..9f2161c2e1 100644
--- a/docs/en/observability/apm/data-model.asciidoc
+++ b/docs/en/observability/apm/data-model/data-model-metrics.asciidoc
@@ -1,224 +1,5 @@
-:span-name-type-sheet: https://docs.google.com/spreadsheets/d/1SmWeX5AeqUcayrArUauS_CxGgsjwRgMYH4ZY8yQsMhQ/edit#gid=644582948
-:span-spec: https://github.com/elastic/apm/blob/main/tests/agents/json-specs/span_types.json
-
-[[apm-data-model]]
-== Data Model
-
-Elastic APM agents capture different types of information from within their instrumented applications.
-These are known as events, and can be `spans`, `transactions`, `errors`, or `metrics`.
-
-* <>
-* <>
-* <>
-* <>
-
-Events can contain additional <> which further enriches your data.
-
-[[apm-data-model-spans]]
-=== Spans
-
-*Spans* contain information about the execution of a specific code path.
-They measure from the start to the end of an activity,
-and they can have a parent/child relationship with other spans.
-
-Agents automatically instrument a variety of libraries to capture these spans from within your application,
-but you can also use the Agent API for custom instrumentation of specific code paths.
-
-Among other things, spans can contain:
-
-* A `transaction.id` attribute that refers to its parent <>.
-* A `parent.id` attribute that refers to its parent span or transaction.
-* Its start time and duration.
-* A `name`, `type`, `subtype`, and `action`—see the {span-name-type-sheet}[span name/type alignment]
-sheet for span name patterns and examples by {apm-agent}.
-In addition, some APM agents test against a public {span-spec}[span type/subtype spec].
-* An optional `stack trace`. Stack traces consist of stack frames,
-which represent a function call on the call stack.
-They include attributes like function name, file name and path, line number, etc.
-
-TIP: Most agents limit keyword fields, like `span.id`, to 1024 characters,
-and non-keyword fields, like `span.start.us`, to 10,000 characters.
-
-[float]
-[[apm-data-model-dropped-spans]]
-==== Dropped spans
-
-For performance reasons, APM agents can choose to sample or omit spans purposefully.
-This can be useful in preventing edge cases, like long-running transactions with over 100 spans,
-that would otherwise overload both the Agent and the APM Server.
-When this occurs, the APM UI will display the number of spans dropped.
-
-To configure the number of spans recorded per transaction, see the relevant Agent documentation:
-
-* Android: _Not yet supported_
-* Go: {apm-go-ref-v}/configuration.html#config-transaction-max-spans[`ELASTIC_APM_TRANSACTION_MAX_SPANS`]
-* iOS: _Not yet supported_
-* Java: {apm-java-ref-v}/config-core.html#config-transaction-max-spans[`transaction_max_spans`]
-* .NET: {apm-dotnet-ref-v}/config-core.html#config-transaction-max-spans[`TransactionMaxSpans`]
-* Node.js: {apm-node-ref-v}/configuration.html#transaction-max-spans[`transactionMaxSpans`]
-* PHP: {apm-php-ref-v}/configuration-reference.html#config-transaction-max-spans[`transaction_max_spans`]
-* Python: {apm-py-ref-v}/configuration.html#config-transaction-max-spans[`transaction_max_spans`]
-* Ruby: {apm-ruby-ref-v}/configuration.html#config-transaction-max-spans[`transaction_max_spans`]
-
-[float]
-[[apm-data-model-missing-spans]]
-==== Missing spans
-
-Agents stream spans to the APM Server separately from their transactions.
-Because of this, unforeseen errors may cause spans to go missing.
-Agents know how many spans a transaction should have;
-if the number of expected spans does not equal the number of spans received by the APM Server,
-the APM UI will calculate the difference and display a message.
-
-[float]
-==== Data streams
-
-Spans are stored with transactions in the following data streams:
-
-include::./data-streams.asciidoc[tag=traces-data-streams]
-
-See <> to learn more.
-
-[float]
-==== Example span document
-
-This example shows what span documents can look like when indexed in {es}.
-
-[%collapsible]
-.Expand {es} document
-====
-[source,json]
-----
-include::{apm-server-root}/docs/data/elasticsearch/generated/spans.json[]
-----
-====
-
-[[apm-data-model-transactions]]
-=== Transactions
-
-*Transactions* are a special kind of <> that have additional attributes associated with them.
-They describe an event captured by an Elastic {apm-agent} instrumenting a service.
-You can think of transactions as the highest level of work you’re measuring within a service.
-As an example, a transaction might be a:
-
-* Request to your server
-* Batch job
-* Background job
-* Custom transaction type
-
-Agents decide whether to sample transactions or not,
-and provide settings to control sampling behavior.
-If sampled, the <> of a transaction are sent and stored as separate documents.
-Within one transaction there can be 0, 1, or many spans captured.
-
-A transaction contains:
-
-* The timestamp of the event
-* A unique id, type, and name
-* Data about the environment in which the event is recorded:
-** Service - environment, framework, language, etc.
-** Host - architecture, hostname, IP, etc.
-** Process - args, PID, PPID, etc.
-** URL - full, domain, port, query, etc.
-** <> - (if supplied) email, ID, username, etc.
-* Other relevant information depending on the agent. Example: The JavaScript RUM agent captures transaction marks,
-which are points in time relative to the start of the transaction with some label.
-
-In addition, agents provide options for users to capture custom <>.
-Metadata can be indexed - <>, or not-indexed - <>.
-
-Transactions are grouped by their `type` and `name` in the APM UI's
-<>.
-If you're using a supported framework, APM agents will automatically handle the naming for you.
-If you're not, or if you wish to override the default,
-all agents have API methods to manually set the `type` and `name`.
-
-* `type` should be a keyword of specific relevance in the service's domain,
-e.g. `request`, `backgroundjob`, etc.
-* `name` should be a generic designation of a transaction in the scope of a single service,
-e.g. `GET /users/:id`, `UsersController#show`, etc.
-
-TIP: Most agents limit keyword fields (e.g. `labels`) to 1024 characters,
-non-keyword fields (e.g. `span.db.statement`) to 10,000 characters.
-
-[float]
-==== Data streams
-
-Transactions are stored with spans in the following data streams:
-
-include::./data-streams.asciidoc[tag=traces-data-streams]
-
-See <> to learn more.
-
-[float]
-==== Example transaction document
-
-This example shows what transaction documents can look like when indexed in {es}.
-
-[%collapsible]
-.Expand {es} document
-====
-[source,json]
-----
-include::{apm-server-root}/docs/data/elasticsearch/generated/transactions.json[]
-----
-====
-
-[[apm-data-model-errors]]
-=== Errors
-
-An error event contains at least
-information about the original `exception` that occurred
-or about a `log` created when the exception occurred.
-For simplicity, errors are represented by a unique ID.
-
-An Error contains:
-
-* Both the captured `exception` and the captured `log` of an error can contain a `stack trace`,
-which is helpful for debugging.
-* The `culprit` of an error indicates where it originated.
-* An error might relate to the <> during which it happened,
-via the `transaction.id`.
-* Data about the environment in which the event is recorded:
-** Service - environment, framework, language, etc.
-** Host - architecture, hostname, IP, etc.
-** Process - args, PID, PPID, etc.
-** URL - full, domain, port, query, etc.
-** <> - (if supplied) email, ID, username, etc.
-
-In addition, agents provide options for users to capture custom <>.
-Metadata can be indexed - <>, or not-indexed - <>.
-
-TIP: Most agents limit keyword fields (e.g. `error.id`) to 1024 characters,
-non-keyword fields (e.g. `error.exception.message`) to 10,000 characters.
-
-Errors are stored in error indices.
-
-[float]
-==== Data streams
-
-Errors are stored in the following data streams:
-
-include::./data-streams.asciidoc[tag=logs-data-streams]
-
-See <> to learn more.
-
-[float]
-==== Example error document
-
-This example shows what error documents can look like when indexed in {es}.
-
-[%collapsible]
-.Expand {es} document
-====
-[source,json]
-----
-include::{apm-server-root}/docs/data/elasticsearch/generated/errors.json[]
-----
-====
-
[[apm-data-model-metrics]]
-=== Metrics
+= Metrics
**Metrics** measure the state of a system by gathering information on a regular interval. There are two types of APM metrics:
@@ -226,7 +7,7 @@ include::{apm-server-root}/docs/data/elasticsearch/generated/errors.json[]
* **Calculated metrics**: Aggregated trace event metrics used to power visualizations in the APM UI.
[float]
-==== System metrics
+== System metrics
APM agents automatically pick up basic host-level metrics,
including system and process-level CPU and memory metrics.
@@ -251,7 +32,7 @@ For a full list of tracked metrics, see the relevant agent documentation:
* {apm-ruby-ref-v}/metrics.html[Ruby]
[float]
-===== Example system metric document
+=== Example system metric document
This example shows what system metric documents can look like when indexed in {es}.
@@ -271,7 +52,7 @@ include::{apm-server-root}/docs/data/elasticsearch/metricset.json[]
====
[float]
-==== Calculated metrics
+== Calculated metrics
APM agents and APM Server calculate metrics from trace events to power visualizations in the APM UI.
@@ -281,7 +62,7 @@ the dimensions and concrete limits for aggregations are subject to change within
These metrics are described below.
[float]
-===== Breakdown metrics
+=== Breakdown metrics
To power the <> graph,
agents collect summarized metrics about the timings of spans and transactions,
@@ -306,7 +87,7 @@ You can filter and group by these dimensions:
--
[float]
-===== Example breakdown metric document
+=== Example breakdown metric document
This example shows what breakdown metric documents can look like when indexed in {es}.
@@ -321,7 +102,7 @@ include::{apm-server-root}/docs/data/elasticsearch/span_breakdown.json[]
====
[float]
-===== Transaction metrics
+=== Transaction metrics
To power <> visualizations,
APM Server aggregates transaction events into latency distribution metrics.
@@ -377,7 +158,7 @@ You can filter and group by these dimensions (some of which are optional, for ex
The `@timestamp` field of these documents holds the start of the aggregation interval.
[float]
-===== Example transaction document
+=== Example transaction document
This example shows what transaction documents can look like when indexed in {es}.
@@ -392,7 +173,7 @@ include::{apm-server-root}/docs/data/elasticsearch/transaction_metric.json[]
====
[float]
-===== Service-transaction metrics
+=== Service-transaction metrics
To power <> visualizations,
APM Server aggregates transaction events into service-transaction metrics.
@@ -423,7 +204,7 @@ You can filter and group by these dimensions:
The `@timestamp` field of these documents holds the start of the aggregation interval.
[float]
-===== Example service-transaction document
+=== Example service-transaction document
This example shows what service-transaction documents can look like when indexed in {es}.
@@ -438,7 +219,7 @@ include::{apm-server-root}/docs/data/elasticsearch/service_transaction_metric.js
====
[float]
-===== Service-destination metrics
+=== Service-destination metrics
To power <> visualizations,
APM Server aggregates span events into service-destination metrics.
@@ -471,7 +252,7 @@ You can filter and group by these dimensions:
The `@timestamp` field of these documents holds the start of the aggregation interval.
[float]
-===== Example service-destination document
+=== Example service-destination document
This example shows what service-destination documents can look like when indexed in {es}.
@@ -486,7 +267,7 @@ include::{apm-server-root}/docs/data/elasticsearch/service_destination_metric.js
====
[float]
-===== Service-summary metrics
+=== Service-summary metrics
To power <> visualizations,
APM Server aggregates transaction, error, log, and metric events into service-summary metrics.
@@ -506,7 +287,7 @@ You can filter and group by these dimensions:
The `@timestamp` field of these documents holds the start of the aggregation interval.
[float]
-===== Example service-summary document
+=== Example service-summary document
This example shows what service-summary documents can look like when indexed in {es}.
@@ -521,22 +302,22 @@ include::{apm-server-root}/docs/data/elasticsearch/service_summary_metric.json[]
====
[float]
-==== Data streams
+== Data streams
Metrics are stored in the following data streams:
-include::./data-streams.asciidoc[tag=metrics-data-streams]
+include::{observability-docs-root}/docs/en/observability/apm/manage-storage/data-streams.asciidoc[tag=metrics-data-streams]
See <> to learn more.
[float]
-==== Aggregated metrics: limits and overflows
+== Aggregated metrics: limits and overflows
For all aggregated metrics, namely transaction, service-transaction, service-destination, and service-summary metrics,
there are limits on the number of unique groups tracked at any given time.
[float]
-===== Limits
+=== Limits
Note that all the below limits may change in the future with further improvements.
@@ -556,7 +337,7 @@ which is 1000 service destination groups for 1GB APM Server with 500 increment p
In the above, a service is defined as a combination of `service.name`, `service.environment`, `service.language.name` and `agent.name`.
[float]
-===== Overflows
+=== Overflows
When a dimension has a high cardinality and exceeds the limit, the metrics will be aggregated
under a dedicated overflow bucket.
@@ -577,104 +358,3 @@ that are based on parameters that can change. For example, user ids, product ids
should be stripped away from the dimensions. For the same reason, avoid high cardinality global labels (`labels.\*` and `numeric_labels.*`).
Aggregated metrics do not consider global labels from RUM agents in order to protect APM server from using too much memory.
-
-// This heading is linked to from the APM UI section in Kibana
-[[apm-data-model-metadata]]
-=== Metadata
-
-Metadata can enrich your events and make application performance monitoring even more useful.
-Let's explore the different types of metadata that Elastic APM offers.
-
-[float]
-[[apm-data-model-labels]]
-==== Labels
-
-Labels add *indexed* information to transactions, spans, and errors.
-Indexed means the data is searchable and aggregatable in {es}.
-Add additional key-value pairs to define multiple labels.
-
-* Indexed: Yes
-* {es} type: {ref}/object.html[object]
-* {es} field: `labels`
-* Applies to: <> | <> | <>
-
-Label values can be a string, boolean, or number, although some agents only support string values at this time.
-Because labels for a given key, regardless of agent used, are stored in the same place in {es},
-all label values of a given key must have the same data type.
-Multiple data types per key will throw an exception, for example: `{foo: bar}` and `{foo: 42}` is not allowed.
-
-IMPORTANT: Avoid defining too many user-specified labels.
-Defining too many unique fields in an index is a condition that can lead to a
-{ref}/mapping.html#mapping-limit-settings[mapping explosion].
-
-[float]
-===== Agent API reference
-
-* Go: {apm-go-ref-v}/api.html#context-set-label[`SetLabel`]
-* Java: {apm-java-ref-v}/public-api.html#api-transaction-add-tag[`setLabel`]
-* .NET: {apm-dotnet-ref-v}/public-api.html#api-transaction-set-label[`SetLabel`]
-* Node.js: {apm-node-ref-v}/agent-api.html#apm-set-label[`setLabel`] | {apm-node-ref-v}/agent-api.html#apm-add-labels[`addLabels`]
-* PHP: {apm-php-ref}/public-api.html#api-transaction-interface-set-label[`Transaction` `setLabel`] | {apm-php-ref}/public-api.html#api-span-interface-set-label[`Span` `setLabel`]
-* Python: {apm-py-ref-v}/api.html#api-label[`elasticapm.label()`]
-* Ruby: {apm-ruby-ref-v}/api.html#api-agent-set-label[`set_label`]
-* Rum: {apm-rum-ref-v}/agent-api.html#apm-add-labels[`addLabels`]
-
-[float]
-[[apm-data-model-custom]]
-==== Custom context
-
-Custom context adds *non-indexed*,
-custom contextual information to transactions and errors.
-Non-indexed means the data is not searchable or aggregatable in {es},
-and you cannot build dashboards on top of the data.
-This also means you don't have to worry about {ref}/mapping.html#mapping-limit-settings[mapping explosions],
-as these fields are not added to the mapping.
-
-Non-indexed information is useful for providing contextual information to help you
-quickly debug performance issues or errors.
-
-* Indexed: No
-* {es} type: {ref}/object.html[object]
-* {es} fields: `transaction.custom` | `error.custom`
-* Applies to: <> | <>
-
-IMPORTANT: Setting a circular object, a large object, or a non JSON serializable object can lead to errors.
-
-[float]
-===== Agent API reference
-
-* Go: {apm-go-ref-v}/api.html#context-set-custom[`SetCustom`]
-* iOS: _coming soon_
-* Java: {apm-java-ref-v}/public-api.html#api-transaction-add-custom-context[`addCustomContext`]
-* .NET: _coming soon_
-* Node.js: {apm-node-ref-v}/agent-api.html#apm-set-custom-context[`setCustomContext`]
-* PHP: _coming soon_
-* Python: {apm-py-ref-v}/api.html#api-set-custom-context[`set_custom_context`]
-* Ruby: {apm-ruby-ref-v}/api.html#api-agent-set-custom-context[`set_custom_context`]
-* Rum: {apm-rum-ref-v}/agent-api.html#apm-set-custom-context[`setCustomContext`]
-
-[float]
-[[apm-data-model-user]]
-==== User context
-
-User context adds *indexed* user information to transactions and errors.
-Indexed means the data is searchable and aggregatable in {es}.
-
-* Indexed: Yes
-* {es} type: {ref}/keyword.html[keyword]
-* {es} fields: `user.email` | `user.name` | `user.id`
-* Applies to: <> | <>
-
-[float]
-===== Agent API reference
-
-* Go: {apm-go-ref-v}/api.html#context-set-username[`SetUsername`] | {apm-go-ref-v}/api.html#context-set-user-id[`SetUserID`] |
-{apm-go-ref-v}/api.html#context-set-user-email[`SetUserEmail`]
-* iOS: _coming soon_
-* Java: {apm-java-ref-v}/public-api.html#api-transaction-set-user[`setUser`]
-* .NET _coming soon_
-* Node.js: {apm-node-ref-v}/agent-api.html#apm-set-user-context[`setUserContext`]
-* PHP: _coming soon_
-* Python: {apm-py-ref-v}/api.html#api-set-user-context[`set_user_context`]
-* Ruby: {apm-ruby-ref-v}/api.html#api-agent-set-user[`set_user`]
-* Rum: {apm-rum-ref-v}/agent-api.html#apm-set-user-context[`setUserContext`]
diff --git a/docs/en/observability/apm/span-compression.asciidoc b/docs/en/observability/apm/data-model/data-model-spans.asciidoc
similarity index 54%
rename from docs/en/observability/apm/span-compression.asciidoc
rename to docs/en/observability/apm/data-model/data-model-spans.asciidoc
index 8156639bd3..a0e395b2fb 100644
--- a/docs/en/observability/apm/span-compression.asciidoc
+++ b/docs/en/observability/apm/data-model/data-model-spans.asciidoc
@@ -1,5 +1,85 @@
-[[apm-span-compression]]
-=== Span compression
+[[apm-data-model-spans]]
+= Spans
+
+*Spans* contain information about the execution of a specific code path.
+They measure from the start to the end of an activity,
+and they can have a parent/child relationship with other spans.
+
+Agents automatically instrument a variety of libraries to capture these spans from within your application,
+but you can also use the Agent API for custom instrumentation of specific code paths.
+
+Among other things, spans can contain:
+
+* A `transaction.id` attribute that refers to its parent <>.
+* A `parent.id` attribute that refers to its parent span or transaction.
+* Its start time and duration.
+* A `name`, `type`, `subtype`, and `action`—see the {span-name-type-sheet}[span name/type alignment]
+sheet for span name patterns and examples by {apm-agent}.
+In addition, some APM agents test against a public {span-spec}[span type/subtype spec].
+* An optional `stack trace`. Stack traces consist of stack frames,
+which represent a function call on the call stack.
+They include attributes like function name, file name and path, line number, etc.
+
+TIP: Most agents limit keyword fields, like `span.id`, to 1024 characters,
+and non-keyword fields, like `span.start.us`, to 10,000 characters.
+
+[float]
+[[apm-data-model-dropped-spans]]
+== Dropped spans
+
+For performance reasons, APM agents can choose to sample or omit spans purposefully.
+This can be useful in preventing edge cases, like long-running transactions with over 100 spans,
+that would otherwise overload both the Agent and the APM Server.
+When this occurs, the APM UI will display the number of spans dropped.
+
+To configure the number of spans recorded per transaction, see the relevant Agent documentation:
+
+* Android: _Not yet supported_
+* Go: {apm-go-ref-v}/configuration.html#config-transaction-max-spans[`ELASTIC_APM_TRANSACTION_MAX_SPANS`]
+* iOS: _Not yet supported_
+* Java: {apm-java-ref-v}/config-core.html#config-transaction-max-spans[`transaction_max_spans`]
+* .NET: {apm-dotnet-ref-v}/config-core.html#config-transaction-max-spans[`TransactionMaxSpans`]
+* Node.js: {apm-node-ref-v}/configuration.html#transaction-max-spans[`transactionMaxSpans`]
+* PHP: {apm-php-ref-v}/configuration-reference.html#config-transaction-max-spans[`transaction_max_spans`]
+* Python: {apm-py-ref-v}/configuration.html#config-transaction-max-spans[`transaction_max_spans`]
+* Ruby: {apm-ruby-ref-v}/configuration.html#config-transaction-max-spans[`transaction_max_spans`]
+
+[float]
+[[apm-data-model-missing-spans]]
+== Missing spans
+
+Agents stream spans to the APM Server separately from their transactions.
+Because of this, unforeseen errors may cause spans to go missing.
+Agents know how many spans a transaction should have;
+if the number of expected spans does not equal the number of spans received by the APM Server,
+the APM UI will calculate the difference and display a message.
+
+[float]
+== Data streams
+
+Spans are stored with transactions in the following data streams:
+
+include::{observability-docs-root}/docs/en/observability/apm/manage-storage/data-streams.asciidoc[tag=traces-data-streams]
+
+See <> to learn more.
+
+[float]
+== Example span document
+
+This example shows what span documents can look like when indexed in {es}.
+
+[%collapsible]
+.Expand {es} document
+====
+[source,json]
+----
+include::{apm-server-root}/docs/data/elasticsearch/generated/spans.json[]
+----
+====
+
+[float]
+[[apm-spans-span-compression]]
+== Span compression
In some cases, APM agents may collect large amounts of very similar or identical spans in a transaction.
For example, this can happen if spans are captured inside of a loop, or in unoptimized SQL queries that use multiple queries instead of joins to fetch related data.
diff --git a/docs/en/observability/apm/apm-distributed-tracing.asciidoc b/docs/en/observability/apm/data-model/distributed-tracing.asciidoc
similarity index 84%
rename from docs/en/observability/apm/apm-distributed-tracing.asciidoc
rename to docs/en/observability/apm/data-model/distributed-tracing.asciidoc
index 42c04a4e79..dbb1e6df76 100644
--- a/docs/en/observability/apm/apm-distributed-tracing.asciidoc
+++ b/docs/en/observability/apm/data-model/distributed-tracing.asciidoc
@@ -1,10 +1,19 @@
+[[apm-data-model-traces]]
+= Traces
+
+A trace is a group of <> and <> with a common root.
+Each trace tracks the entirety of a single request. It describes the individual operations and their causality that
+ensue from a single logical operation.
+
+[float]
[[apm-distributed-tracing]]
-=== Distributed tracing
+== Distributed tracing
+
+When a trace travels through multiple services, as is common in a microservice architecture,
+it is known as a *distributed trace*. A distributed trace comprises operations across multiple
+distributed components, crossing process, network, and security boundaries.
-A `trace` is a group of <> and <> with a common root.
-Each `trace` tracks the entirety of a single request.
-When a `trace` travels through multiple services, as is common in a microservice architecture,
-it is known as a distributed trace.
+image::images/distributed-traces.png[Diagram illustrating the relationship between spans, transactions, and distributed traces as described in the text on this page]
[float]
[[apm-why-distributed-tracing]]
@@ -37,7 +46,7 @@ and continues to propagate the trace.
[float]
[[apm-trace-propagation]]
-==== Trace propagation examples
+=== Trace propagation examples
In this example, Elastic's Ruby agent communicates with Elastic's Java agent.
Both support the `traceparent` header, and trace data is successfully propagated.
@@ -60,7 +69,7 @@ image::./images/dt-trace-ex3.png[How traceparent propagation works]
[float]
[[apm-w3c-tracecontext-spec]]
-==== W3C Trace Context specification
+=== W3C Trace Context specification
All Elastic agents now support the official W3C Trace Context specification and `traceparent` header.
See the table below for the minimum required agent version:
diff --git a/docs/en/observability/apm/data-model/index.asciidoc b/docs/en/observability/apm/data-model/index.asciidoc
new file mode 100644
index 0000000000..b3d0771787
--- /dev/null
+++ b/docs/en/observability/apm/data-model/index.asciidoc
@@ -0,0 +1,52 @@
+:span-name-type-sheet: https://docs.google.com/spreadsheets/d/1SmWeX5AeqUcayrArUauS_CxGgsjwRgMYH4ZY8yQsMhQ/edit#gid=644582948
+:span-spec: https://github.com/elastic/apm/blob/main/tests/agents/json-specs/span_types.json
+
+[[apm-data-model]]
+= Application data types
+
+++++
+Learn about data types
+++++
+
+Elastic APM agents capture different types of information from within their instrumented applications.
+These are known as events, and can be spans, transactions, traces, errors, or metrics.
+
+////
+Explain how the different data types relate to each other at a high level
+////
+
+Elastic APM helps you see what happens from start to finish when a request is made to an application:
+
+* <>: A span contain information about the execution of a specific code path.
+ They are the building blocks of _transactions_ and _traces_.
+* <>: A transaction describes an event captured by an Elastic
+ APM agent instrumenting a service. A transaction is technically a type of span that has additional
+ attributes associated with it and often contains multiple child _spans_. You can think of transactions
+ as the highest level of work you’re measuring within a service.
+* <>: A trace is a group of _transactions_ and _spans_ with a common root.
+ Each trace tracks the entirety of a single request. When a trace travels through multiple services,
+ it is known as a _distributed trace_.
+
+image::images/spans-transactions-and-traces.png[Diagram illustrating the relationship between spans, transactions, and traces as described in the text on this page]
+
+In addition to the building blocks of traces, Elastic APM agents also capture:
+
+* <>: An error is created when something goes wrong with a request to an application.
+ This event contains information to help you determine where and why an error occurred, often including in which
+ _transaction_ the error occurred.
+* <>: Metrics measure the state of a system by gathering information on a regular interval.
+
+Events can contain additional <> which further enriches your data.
+
+////
+Subsections
+////
+
+:leveloffset: +1
+include::{observability-docs-root}/docs/en/observability/apm/data-model/data-model-spans.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/data-model/transactions/index.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/data-model/distributed-tracing.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/data-model/data-model-errors.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/data-model/data-model-metrics.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/data-model/data-model-metadata.asciidoc[]
+:!leveloffset:
diff --git a/docs/en/observability/apm/data-model/transactions/index.asciidoc b/docs/en/observability/apm/data-model/transactions/index.asciidoc
new file mode 100644
index 0000000000..3b4ade2936
--- /dev/null
+++ b/docs/en/observability/apm/data-model/transactions/index.asciidoc
@@ -0,0 +1,76 @@
+[[apm-data-model-transactions]]
+= Transactions
+
+*Transactions* are a special kind of <> that have additional attributes associated with them.
+They describe an event captured by an Elastic {apm-agent} instrumenting a service.
+You can think of transactions as the highest level of work you’re measuring within a service.
+As an example, a transaction might be a:
+
+* Request to your server
+* Batch job
+* Background job
+* Custom transaction type
+
+Agents decide whether to sample transactions or not,
+and provide settings to control sampling behavior.
+If sampled, the <> of a transaction are sent and stored as separate documents.
+Within one transaction there can be 0, 1, or many spans captured.
+
+A transaction contains:
+
+* The timestamp of the event
+* A unique id, type, and name
+* Data about the environment in which the event is recorded:
+** Service - environment, framework, language, etc.
+** Host - architecture, hostname, IP, etc.
+** Process - args, PID, PPID, etc.
+** URL - full, domain, port, query, etc.
+** <> - (if supplied) email, ID, username, etc.
+* Other relevant information depending on the agent. Example: The JavaScript RUM agent captures transaction marks,
+which are points in time relative to the start of the transaction with some label.
+
+In addition, agents provide options for users to capture custom <>.
+Metadata can be indexed - <>, or not-indexed - <>.
+
+Transactions are grouped by their `type` and `name` in the APM UI's
+<>.
+If you're using a supported framework, APM agents will automatically handle the naming for you.
+If you're not, or if you wish to override the default,
+all agents have API methods to manually set the `type` and `name`.
+
+* `type` should be a keyword of specific relevance in the service's domain,
+e.g. `request`, `backgroundjob`, etc.
+* `name` should be a generic designation of a transaction in the scope of a single service,
+e.g. `GET /users/:id`, `UsersController#show`, etc.
+
+TIP: Most agents limit keyword fields (e.g. `labels`) to 1024 characters,
+non-keyword fields (e.g. `span.db.statement`) to 10,000 characters.
+
+[float]
+== Data streams
+
+Transactions are stored with spans in the following data streams:
+
+include::{observability-docs-root}/docs/en/observability/apm/manage-storage/data-streams.asciidoc[tag=traces-data-streams]
+
+See <> to learn more.
+
+[float]
+== Example transaction document
+
+This example shows what transaction documents can look like when indexed in {es}.
+
+[%collapsible]
+.Expand {es} document
+====
+[source,json]
+----
+include::{apm-server-root}/docs/data/elasticsearch/generated/transactions.json[]
+----
+====
+
+////
+Subsections
+////
+
+include::{observability-docs-root}/docs/en/observability/apm/data-model/transactions/sampling.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/sampling.asciidoc b/docs/en/observability/apm/data-model/transactions/sampling.asciidoc
similarity index 93%
rename from docs/en/observability/apm/sampling.asciidoc
rename to docs/en/observability/apm/data-model/transactions/sampling.asciidoc
index 33172f4dc9..af055d6093 100644
--- a/docs/en/observability/apm/sampling.asciidoc
+++ b/docs/en/observability/apm/data-model/transactions/sampling.asciidoc
@@ -1,5 +1,5 @@
[[apm-sampling]]
-=== Transaction sampling
+= Transaction sampling
Distributed tracing can generate a substantial amount of data.
More data can mean higher costs and more noise.
@@ -14,7 +14,7 @@ Elastic APM supports two types of sampling:
[float]
[[apm-head-based-sampling]]
-==== Head-based sampling
+== Head-based sampling
In head-based sampling, the sampling decision for each trace is made when the trace is initiated.
Each trace has a defined and equal probability of being sampled.
@@ -31,7 +31,7 @@ See <> to get started.
[float]
[[distributed-tracing-examples]]
-===== Distributed tracing
+=== Distributed tracing
In a distributed trace, the sampling decision is still made when the trace is initiated.
Each subsequent service respects the initial service's sampling decision, regardless of its configured sample rate;
@@ -52,7 +52,7 @@ be `1` (`100%`).
image::./images/dt-sampling-example-2.png[Distributed tracing and head based sampling example two]
[float]
-===== Trace continuation strategies with distributed tracing
+==== Trace continuation strategies with distributed tracing
In addition to setting the sample rate, you can also specify which _trace continuation strategy_ to use.
There are three trace continuation strategies: `continue`, `restart`, and `restart_external`.
@@ -91,7 +91,7 @@ traces will be sampled as new traces in `Service C`. The end result will be five
image::./images/dt-sampling-continuation-strategy-restart.png[Distributed tracing and head based sampling with restart continuation strategy]
[float]
-===== OpenTelemetry
+=== OpenTelemetry
Head-based sampling is implemented directly in the APM agents and SDKs.
The sample rate must be propagated between services and the managed intake service in order to produce accurate metrics.
@@ -113,7 +113,7 @@ Refer to the documentation of your favorite OpenTelemetry agent or SDK for more
[float]
[[apm-tail-based-sampling]]
-==== Tail-based sampling
+== Tail-based sampling
In tail-based sampling, the sampling decision for each trace is made after the trace has completed.
This means all traces will be analyzed against a set of rules, or policies, which will determine the rate at which they are sampled.
@@ -129,7 +129,8 @@ So running APM Server close to your instrumented services can reduce any increas
See <> to get started.
-**Distributed tracing with tail-based sampling**
+[float]
+=== Distributed tracing with tail-based sampling
With tail-based sampling, all traces are observed and a sampling decision is only made once a trace completes.
@@ -140,7 +141,8 @@ the sampled traces would look something like this:
image::./images/dt-sampling-example-3.png[Distributed tracing and tail based sampling example one]
-**OpenTelemetry with tail-based sampling**
+[float]
+=== OpenTelemetry with tail-based sampling
Tail-based sampling is implemented entirely in APM Server,
and will work with traces sent by either Elastic APM agents or OpenTelemetry SDKs.
@@ -148,7 +150,7 @@ and will work with traces sent by either Elastic APM agents or OpenTelemetry SDK
Due to <> when using https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor[tailsamplingprocessor], we recommend using APM Server tail-based sampling instead.
[float]
-==== Sampled data and visualizations
+== Sampled data and visualizations
A sampled trace retains all data associated with it.
A non-sampled trace drops all <> and <> data^1^.
@@ -174,7 +176,7 @@ The {kib} apps that utilize RUM data depend on transaction events,
so non-sampled RUM traces retain transaction data -- only span data is dropped.
[float]
-==== Sample rates
+== Sample rates
What's the best sampling rate? Unfortunately, there isn't one.
Sampling is dependent on your data, the throughput of your application, data retention policies, and other factors.
@@ -189,26 +191,27 @@ Here are some examples:
Regardless of the above, cost conscious customers are likely to be fine with a lower sample rate.
+[float]
[[apm-configure-head-based-sampling]]
-==== Configure head-based sampling
+== Configure head-based sampling
There are three ways to adjust the head-based sampling rate of your APM agents:
[float]
-===== Dynamic configuration
+=== Dynamic configuration
The transaction sample rate can be changed dynamically (no redeployment necessary) on a per-service and per-environment
basis with <> in {kib}.
[float]
-===== {kib} API configuration
+=== {kib} API configuration
{apm-agent} configuration exposes an API that can be used to programmatically change
your agents' sampling rate.
An example is provided in the <>.
[float]
-===== {apm-agent} configuration
+=== {apm-agent} configuration
Each agent provides a configuration value used to set the transaction sample rate.
See the relevant agent's documentation for more details:
@@ -221,8 +224,9 @@ See the relevant agent's documentation for more details:
* Python: {apm-py-ref-v}/configuration.html#config-transaction-sample-rate[`transaction_sample_rate`]
* Ruby: {apm-ruby-ref-v}/configuration.html#config-transaction-sample-rate[`transaction_sample_rate`]
+[float]
[[apm-configure-tail-based-sampling]]
-==== Configure tail-based sampling
+== Configure tail-based sampling
Enable tail-based sampling with <>.
When enabled, trace events are mapped to sampling policies.
@@ -241,7 +245,7 @@ but, due to how the limit is calculated and enforced the actual disk space may s
over the limit.
[float]
-===== Example configuration
+=== Example configuration
This example defines three tail-based sampling polices:
@@ -261,14 +265,14 @@ This example defines three tail-based sampling polices:
or traces with any other name
[float]
-===== Configuration reference
+=== Configuration reference
-**Top-level tail-based sampling settings:**
+[float]
+==== Top-level tail-based sampling settings
-:leveloffset: +4
-include::./configure/sampling.asciidoc[tag=tbs-top]
+include::{observability-docs-root}/docs/en/observability/apm/configure/sampling.asciidoc[tag=tbs-top,leveloffset=+2]
-**Policy settings:**
+[float]
+==== Policy settings
-include::./configure/sampling.asciidoc[tag=tbs-policy]
-:leveloffset: -4
+include::{observability-docs-root}/docs/en/observability/apm/configure/sampling.asciidoc[tag=tbs-policy,leveloffset=+2]
diff --git a/docs/en/observability/apm/features.asciidoc b/docs/en/observability/apm/features.asciidoc
deleted file mode 100644
index 6800ce61b6..0000000000
--- a/docs/en/observability/apm/features.asciidoc
+++ /dev/null
@@ -1,37 +0,0 @@
-[[apm-features]]
-== Elastic APM features
-
-++++
-Features
-++++
-
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-
-include::./apm-k8s-attacher.asciidoc[leveloffset=+2]
-
-include::./cross-cluster-search.asciidoc[]
-
-include::./apm-data-security.asciidoc[]
-
-include::./apm-distributed-tracing.asciidoc[]
-
-include::./jaeger-integration.asciidoc[]
-
-include::./log-correlation.asciidoc[]
-
-include::./aws-lambda-extension.asciidoc[leveloffset=+2]
-
-include::./apm-rum.asciidoc[]
-
-include::./span-compression.asciidoc[]
-
-include::./sampling.asciidoc[]
diff --git a/docs/en/observability/apm/getting-started-apm-server.asciidoc b/docs/en/observability/apm/getting-started-apm/get-started-with-apm-server-binary.asciidoc
similarity index 55%
rename from docs/en/observability/apm/getting-started-apm-server.asciidoc
rename to docs/en/observability/apm/getting-started-apm/get-started-with-apm-server-binary.asciidoc
index 9ccde19dbd..4087a8cc64 100644
--- a/docs/en/observability/apm/getting-started-apm-server.asciidoc
+++ b/docs/en/observability/apm/getting-started-apm/get-started-with-apm-server-binary.asciidoc
@@ -1,153 +1,10 @@
-[[apm-getting-started-apm-server]]
-== Self manage APM Server
-
-++++
-Self manage APM Server
-++++
-
-TIP: The easiest way to get started with Elastic APM is by using our
-{ess-product}[hosted {es} Service] on {ecloud}.
-The {es} Service is available on AWS, GCP, and Azure.
-See <> to get started in minutes.
-
-
-// TODO: MOVE THIS
-IMPORTANT: Starting in version 8.0.0, {fleet} uses the APM integration to set up and manage APM index templates,
-{ilm-init} policies, and ingest pipelines. APM Server will only send data to {es} _after_ the APM integration has been installed.
-
-The APM Server receives performance data from your APM agents,
-validates and processes it, and then transforms the data into {es} documents.
-If you're on this page, then you've chosen to self-manage the Elastic Stack,
-and you now must decide how to run and configure the APM Server.
-There are two options, and the components required are different for each:
-
-* **<>**
-* **<>**
-// * **<>**
-
-[float]
-[[apm-setup-apm-server-binary]]
-=== APM Server binary
-
-Install, configure, and run the APM Server binary wherever you need it.
-
-image::./images/bin-ov.png[APM Server binary overview]
-
-**Pros**:
-
-- Simplest self-managed option
-- No addition component knowledge required
-- YAML configuration simplifies automation
-
-**Supported outputs**:
-
-- {es}
-- {ess}
-- {ls}
-- Kafka
-- Redis
-- File
-- Console
-
-**Required components**:
-
-- APM agents
-- APM Server
-- {stack}
-
-**Configuration method**: YAML
-
-[float]
-[[apm-setup-fleet-managed-apm]]
-=== Fleet-managed APM Server
-
-Fleet is a web-based UI in {kib} that is used to centrally manage {agent}s.
-In this deployment model, use {agent} to spin up APM Server instances that can be centrally-managed in a custom-curated user interface.
-
-NOTE: Fleet-managed APM Server does not have full feature parity with the APM Server binary method of running Elastic APM.
-
-image::./images/fm-ov.png[APM Server fleet overview]
-
-// (outputs, stable APIs)
-// not the best option for a simple test setup or if only interested in centrally running APM Server
-
-**Pros**:
-
-- Conveniently manage one, some, or many different integrations from one central {fleet} UI.
-
-**Supported outputs**:
-
-- {es}
-- {ess}
-
-**Required components**:
-
-- APM agents
-- APM Server
-- {agent}
-- Fleet Server
-- {stack}
-
-**Configuration method**: {kib} UI
-
-// [float]
-// [[apm-setup-apm-server-ea]]
-// === Standalone Elastic Agent-managed APM Server
-// // I really don't know how to sell this option
-// Instead of installing and configuring the APM Server binary, let {agent} orchestrate it for you.
-// Install {agent} and manually configure the agent locally on the system where it's installed.
-// You are responsible for managing and upgrading {agent}. This approach is recommended for advanced users only.
-
-// **Pros**:
-
-// - Easily add integrations for other data sources
-// useful if EA already in place for other integrations, and customers want to customize setup rather than using Fleet for configuration
-// // TODO:
-// // maybe get some more hints on this one from the EA team to align with highlighting the same pros & cons.
-
-// **Available on Elastic Cloud**: ❌
-
-// This supports all of the same outputs as binary
-// see https://github.com/elastic/apm-server/issues/10467
-// **Supported outputs**:
-
-// **Configuration method**: YAML
-
-// image::./images/ea-ov.png[APM Server ea overview]
-
-// @simitt's notes for how to include EA-managed in the decision tree:
-// ****
-// If we generally describe Standalone Elastic Agent managed APM Server then we should also add it to this diagram:
-// Do you want to use other integrations?
-// -> yes: Would you like to use the comfort of Fleet UI based management? -> yes: Fleet managed APM Server; -> no: Standalone Elastic Agent managed APM Server
-// -> no: What is your prefered way of configuration? -> yaml: APM Server binary; -> Kibana UI: Fleet managed APM Server
-// ****
-
-// Components required:
-
-// [options="header"]
-// |====
-// | Installation method | APM Server | Elastic Agent | Fleet Server
-// | APM Server binary | ✔️ | |
-// // | Standalone Elastic Agent-managed APM Server | ✔️ | ✔️ |
-// | Fleet-managed APM Server | ✔️ | ✔️ | ✔️
-// |====
-
-[float]
-=== Help me decide
-
-Use the decision tree below to help determine which method of configuring and running the APM Server is best for your use case.
-
-[subs=attributes+]
-include::{observability-docs-root}/docs/en/observability/apm/diagrams/apm-decision-tree.asciidoc[APM Server decision tree]
-
-
-=== APM Server binary
+[[get-started-with-apm-server-binary]]
+= APM Server binary
This guide will explain how to set up and configure the APM Server binary.
[float]
-==== Prerequisites
+== Prerequisites
// tag::prereq[]
First, see the https://www.elastic.co/support/matrix[Elastic Support Matrix] for information about supported operating systems and product compatibility.
@@ -168,8 +25,9 @@ image::images/apm-architecture-diy.png[Install Elastic APM yourself]
// STEP 1
// *******************************************************
+[float]
[[apm-installing]]
-==== Step 1: Install
+== Step 1: Install
NOTE: *Before you begin*: If you haven't installed the {stack}, do that now.
See {stack-ref}/installing-elastic-stack.html[Learn how to install the
@@ -303,8 +161,9 @@ See <> for deploying Docker containers
// STEP 2
// *******************************************************
+[float]
[[apm-server-configuration]]
-==== Step 2: Set up and configure
+== Step 2: Set up and configure
// This content is reused in the upgrading guide
// tag::why-apm-integration[]
@@ -313,7 +172,7 @@ Starting in version 8.0.0, {fleet} uses the APM integration to set up and manage
// end::why-apm-integration[]
[float]
-===== Install the APM integration
+=== Install the APM integration
// This content is reused in the upgrading guide
// tag::install-apm-integration[]
@@ -367,7 +226,7 @@ See {kibana-ref}/api.html[Kibana API] to learn more about how to use the Kibana
// end::install-apm-integration[]
[float]
-===== Configure APM
+=== Configure APM
Configure APM by editing the `apm-server.yml` configuration file.
The location of this file varies by platform--see the <> for help locating it.
@@ -396,8 +255,9 @@ All available configuration options are outlined in
// STEP 3
// *******************************************************
+[float]
[[apm-server-starting]]
-==== Step 3: Start
+== Step 3: Start
In a production environment, you would put APM Server on its own machines,
similar to how you run {es}.
@@ -426,7 +286,7 @@ You can change the defaults in `apm-server.yml` or by supplying a different addr
[float]
[[apm-running-deb-rpm]]
-===== Debian Package / RPM
+=== Debian Package / RPM
For Debian package and RPM installations, we recommend the `apm-server` process runs as a non-root user.
Therefore, these installation methods create an `apm-server` user which you can use to start the process.
@@ -447,97 +307,32 @@ See the <> for a full directory la
// STEP 4
// *******************************************************
+[float]
[[apm-next-steps]]
-==== Step 4: Next steps
-
-// Use a tagged region to pull APM Agent information from the APM Overview
-If you haven't already, you can now install APM Agents in your services!
-
-* {apm-android-ref}/intro.html[Android agent]
-* {apm-go-ref-v}/introduction.html[Go agent]
-* {apm-ios-ref-v}/intro.html[iOS agent]
-* {apm-java-ref-v}/intro.html[Java agent]
-* {apm-dotnet-ref-v}/intro.html[.NET agent]
-* {apm-node-ref-v}/intro.html[Node.js agent]
-* {apm-php-ref-v}/intro.html[PHP agent]
-* {apm-py-ref-v}/getting-started.html[Python agent]
-* {apm-ruby-ref-v}/introduction.html[Ruby agent]
-* {apm-rum-ref-v}/intro.html[JavaScript Real User Monitoring (RUM) agent]
-
-Once you have at least one {apm-agent} sending data to APM Server,
-you can start visualizing your data in the <>.
+== Step 4: Install APM agents
-If you're migrating from Jaeger, see <>.
-
-// Shared APM & YUM
-include::{observability-docs-root}/docs/en/observability/apm/repositories.asciidoc[]
-
-// Shared docker
-include::{observability-docs-root}/docs/en/observability/apm/shared-docker.asciidoc[]
-
-[[get-started-with-fleet-apm-server]]
-=== Fleet-managed APM Server
+include::{observability-docs-root}/docs/en/observability/apm/tab-widgets/install-agents-widget.asciidoc[]
-This guide will explain how to set up and configure a Fleet-managed APM Server.
+// *******************************************************
+// STEP 5
+// *******************************************************
[float]
-==== Prerequisites
-
-You need {es} for storing and searching your data, and {kib} for visualizing and managing it.
-When setting these components up, you need:
-
-include::{ingest-docs-root}/docs/en/ingest-management/tab-widgets/prereq.asciidoc[tag=self-managed]
-
-==== Step 1: Set up Fleet
+== Step 5: View your data
-Use {fleet} in {kib} to get APM data into the {stack}.
-The first time you use {fleet}, you'll need to set it up and add a
-{fleet-server}:
-
-include::{ingest-docs-root}/docs/en/ingest-management/tab-widgets/add-fleet-server/content.asciidoc[tag=self-managed]
-
-For more information, refer to {fleet-guide}/fleet-server.html[{fleet-server}].
-
-[[add-apm-integration]]
-==== Step 2: Add and configure the APM integration
-
-include::{observability-docs-root}/docs/en/observability/tab-widgets/add-apm-integration/content.asciidoc[tag=self-managed]
-
-****
-An internet connection is required to install the APM integration via the Fleet UI in Kibana.
-
---
-include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm-server.asciidoc[tag=install-apm-integration-no-internet]
---
-****
-
-==== Step 3: Install APM agents
-
-APM agents are written in the same language as your service.
-To monitor a new service, you must install the agent and configure it with a service name,
-APM Server host, and Secret token.
-
-* **Service name**: The APM integration maps an instrumented service's name–defined in each {apm-agent}'s configuration–
-to the index that its data is stored in {es}.
-Service names are case-insensitive and must be unique.
-For example, you cannot have a service named `Foo` and another named `foo`.
-Special characters will be removed from service names and replaced with underscores (`_`).
-
-* **APM Server URL**: The host and port that APM Server listens for events on.
-This should match the host and port defined when setting up the APM integration.
-
-* **Secret token**: Authentication method for {apm-agent} and APM Server communication.
-This should match the secret token defined when setting up the APM integration.
-
-TIP: You can edit your APM integration settings if you need to change the APM Server URL
-or secret token to match your APM agents.
+Once you have at least one {apm-agent} sending data to APM Server,
+you can start visualizing your data in the <>.
-include::{observability-docs-root}/docs/en/observability/apm/tab-widgets/install-agents-widget.asciidoc[]
+[role="screenshot"]
+image::./images/kibana-apm-sample-data.png[APM UI with data]
-==== Step 4: View your data
+// If you're migrating from Jaeger, see <>.
-Back in {kib}, under {observability}, select APM.
-You should see application performance monitoring data flowing into the {stack}!
+////
+Subsections
+////
-[role="screenshot"]
-image::./images/kibana-apm-sample-data.png[APM UI with data]
+// Shared APM & YUM
+include::{observability-docs-root}/docs/en/observability/apm/repositories.asciidoc[leveloffset=+1]
+// Shared docker
+include::{observability-docs-root}/docs/en/observability/apm/shared-docker.asciidoc[leveloffset=+1]
diff --git a/docs/en/observability/apm/getting-started-apm/get-started-with-fleet-apm-server.asciidoc b/docs/en/observability/apm/getting-started-apm/get-started-with-fleet-apm-server.asciidoc
new file mode 100644
index 0000000000..261bf4617a
--- /dev/null
+++ b/docs/en/observability/apm/getting-started-apm/get-started-with-fleet-apm-server.asciidoc
@@ -0,0 +1,70 @@
+[[get-started-with-fleet-apm-server]]
+= Fleet-managed APM Server
+
+This guide will explain how to set up and configure a Fleet-managed APM Server.
+
+[float]
+== Prerequisites
+
+You need {es} for storing and searching your data, and {kib} for visualizing and managing it.
+When setting these components up, you need:
+
+include::{ingest-docs-root}/docs/en/ingest-management/tab-widgets/prereq.asciidoc[tag=self-managed]
+
+[float]
+== Step 1: Set up Fleet
+
+Use {fleet} in {kib} to get APM data into the {stack}.
+The first time you use {fleet}, you'll need to set it up and add a
+{fleet-server}:
+
+include::{ingest-docs-root}/docs/en/ingest-management/tab-widgets/add-fleet-server/content.asciidoc[tag=self-managed]
+
+For more information, refer to {fleet-guide}/fleet-server.html[{fleet-server}].
+
+[float]
+[[add-apm-integration]]
+== Step 2: Add and configure the APM integration
+
+include::{observability-docs-root}/docs/en/observability/tab-widgets/add-apm-integration/content.asciidoc[tag=self-managed]
+
+****
+An internet connection is required to install the APM integration via the Fleet UI in Kibana.
+
+--
+include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm/get-started-with-apm-server-binary.asciidoc[leveloffset=+2,tag=install-apm-integration-no-internet]
+--
+****
+
+[float]
+== Step 3: Install APM agents
+
+APM agents are written in the same language as your service.
+To monitor a new service, you must install the agent and configure it with a service name,
+APM Server host, and Secret token.
+
+* **Service name**: The APM integration maps an instrumented service's name–defined in each {apm-agent}'s configuration–
+to the index that its data is stored in {es}.
+Service names are case-insensitive and must be unique.
+For example, you cannot have a service named `Foo` and another named `foo`.
+Special characters will be removed from service names and replaced with underscores (`_`).
+
+* **APM Server URL**: The host and port that APM Server listens for events on.
+This should match the host and port defined when setting up the APM integration.
+
+* **Secret token**: Authentication method for {apm-agent} and APM Server communication.
+This should match the secret token defined when setting up the APM integration.
+
+TIP: You can edit your APM integration settings if you need to change the APM Server URL
+or secret token to match your APM agents.
+
+include::{observability-docs-root}/docs/en/observability/apm/tab-widgets/install-agents-widget.asciidoc[]
+
+[float]
+== Step 4: View your data
+
+Back in {kib}, under {observability}, select APM.
+You should see application performance monitoring data flowing into the {stack}!
+
+[role="screenshot"]
+image::./images/kibana-apm-sample-data.png[APM UI with data]
diff --git a/docs/en/observability/apm/getting-started-apm/index.asciidoc b/docs/en/observability/apm/getting-started-apm/index.asciidoc
new file mode 100644
index 0000000000..44dca348f9
--- /dev/null
+++ b/docs/en/observability/apm/getting-started-apm/index.asciidoc
@@ -0,0 +1,154 @@
+[[apm-getting-started-apm-server]]
+= Get started with APM
+
+++++
+Get started
+++++
+
+****
+The easiest way to get started with Elastic APM is by using our
+{ess-product}[hosted {es} Service] on {ecloud}.
+The {es} Service is available on AWS, GCP, and Azure.
+*To get started in minutes, follow the steps in <>.*
+****
+
+// TODO: MOVE THIS
+IMPORTANT: Starting in version 8.0.0, {fleet} uses the APM integration to set up and manage APM index templates,
+{ilm-init} policies, and ingest pipelines. APM Server will only send data to {es} _after_ the APM integration has been installed.
+
+The APM Server receives performance data from your APM agents,
+validates and processes it, and then transforms the data into {es} documents.
+If you're on this page, then you've chosen to self-manage the Elastic Stack,
+and you now must decide how to run and configure the APM Server.
+There are two options, and the components required are different for each:
+
+* **<>**
+* **<>**
+// * **<>**
+
+[float]
+[[apm-setup-fleet-managed-apm]]
+== Fleet-managed APM Server
+
+Fleet is a web-based UI in {kib} that is used to centrally manage {agent}s.
+In this deployment model, use {agent} to spin up APM Server instances that can be centrally-managed in a custom-curated user interface.
+
+NOTE: Fleet-managed APM Server does not have full feature parity with the APM Server binary method of running Elastic APM.
+
+image::./images/fm-ov.png[APM Server fleet overview]
+
+// (outputs, stable APIs)
+// not the best option for a simple test setup or if only interested in centrally running APM Server
+
+[cols="1,3"]
+|===
+| *Pros*
+a| Conveniently manage one, some, or many different
+integrations from one central {fleet} UI.
+
+| *Supported outputs*
+a| * {es}
+* {ess}
+
+| *Required{nbsp}components*
+a| * APM agents
+* APM Server
+* {agent}
+* Fleet Server
+* {stack}
+
+| *Configuration method*
+| {kib} UI
+|===
+
+[float]
+[[apm-setup-apm-server-binary]]
+== APM Server binary
+
+Install, configure, and run the APM Server binary wherever you need it.
+
+image::./images/bin-ov.png[APM Server binary overview]
+
+[cols="1,3"]
+|===
+| *Pros*
+a| * Simplest self-managed option
+* No addition component knowledge required
+* YAML configuration simplifies automation
+
+| *Supported outputs*
+a| * {es}
+* {ess}
+* {ls}
+* Kafka
+* Redis
+* File
+* Console
+
+| *Required components*
+a| * APM agents
+* APM Server
+* {stack}
+
+| *Configuration method*
+a| YAML
+|===
+
+// [float]
+// [[apm-setup-apm-server-ea]]
+// === Standalone Elastic Agent-managed APM Server
+// // I really don't know how to sell this option
+// Instead of installing and configuring the APM Server binary, let {agent} orchestrate it for you.
+// Install {agent} and manually configure the agent locally on the system where it's installed.
+// You are responsible for managing and upgrading {agent}. This approach is recommended for advanced users only.
+
+// **Pros**:
+
+// - Easily add integrations for other data sources
+// useful if EA already in place for other integrations, and customers want to customize setup rather than using Fleet for configuration
+// // TODO:
+// // maybe get some more hints on this one from the EA team to align with highlighting the same pros & cons.
+
+// **Available on Elastic Cloud**: ❌
+
+// This supports all of the same outputs as binary
+// see https://github.com/elastic/apm-server/issues/10467
+// **Supported outputs**:
+
+// **Configuration method**: YAML
+
+// image::./images/ea-ov.png[APM Server ea overview]
+
+// @simitt's notes for how to include EA-managed in the decision tree:
+// ****
+// If we generally describe Standalone Elastic Agent managed APM Server then we should also add it to this diagram:
+// Do you want to use other integrations?
+// -> yes: Would you like to use the comfort of Fleet UI based management? -> yes: Fleet managed APM Server; -> no: Standalone Elastic Agent managed APM Server
+// -> no: What is your prefered way of configuration? -> yaml: APM Server binary; -> Kibana UI: Fleet managed APM Server
+// ****
+
+// Components required:
+
+// [options="header"]
+// |====
+// | Installation method | APM Server | Elastic Agent | Fleet Server
+// | APM Server binary | ✔️ | |
+// // | Standalone Elastic Agent-managed APM Server | ✔️ | ✔️ |
+// | Fleet-managed APM Server | ✔️ | ✔️ | ✔️
+// |====
+
+[float]
+== Help me decide
+
+Use the decision tree below to help determine which method of configuring and running the APM Server is best for your use case.
+
+[subs=attributes+]
+include::{observability-docs-root}/docs/en/observability/apm/diagrams/apm-decision-tree.asciidoc[APM Server decision tree]
+
+////
+Subsections
+////
+:leveloffset: +1
+include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm/get-started-with-fleet-apm-server.asciidoc[]
+include::{observability-docs-root}/docs/en/observability/apm/getting-started-apm/get-started-with-apm-server-binary.asciidoc[]
+:leveloffset!:
diff --git a/docs/en/observability/apm/how-to.asciidoc b/docs/en/observability/apm/how-to.asciidoc
deleted file mode 100644
index 266c611ffd..0000000000
--- a/docs/en/observability/apm/how-to.asciidoc
+++ /dev/null
@@ -1,47 +0,0 @@
-[[apm-how-to-guides]]
-== Perform common tasks in the APM UI
-
-Learn how to perform common tasks in the APM UI:
-
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-* <>
-
-include::../apm-ui/agent-configuration.asciidoc[]
-
-include::../apm-ui/apm-spaces.asciidoc[]
-
-include::../apm-ui/apm-alerts.asciidoc[]
-
-include::./source-map-how-to.asciidoc[]
-
-include::../apm-ui/custom-links.asciidoc[]
-
-include::../apm-ui/filters.asciidoc[]
-
-include::../apm-ui/correlations.asciidoc[]
-
-include::../apm-ui/agent-explorer.asciidoc[]
-
-include::../apm-ui/machine-learning.asciidoc[]
-
-include::../apm-ui/mobile-session-explorer.asciidoc[]
-
-include::../apm-ui/lambda.asciidoc[]
-
-include::../apm-ui/advanced-queries.asciidoc[]
-
-include::../apm-ui/storage-explorer.asciidoc[]
-
-include::../apm-ui/deployment-annotations.asciidoc[]
diff --git a/docs/en/observability/apm-ui/images/active-alert-service.png b/docs/en/observability/apm/images/active-alert-service.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/active-alert-service.png
rename to docs/en/observability/apm/images/active-alert-service.png
diff --git a/docs/en/observability/apm-ui/images/add-variable.png b/docs/en/observability/apm/images/add-variable.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/add-variable.png
rename to docs/en/observability/apm/images/add-variable.png
diff --git a/docs/en/observability/apm-ui/images/advanced-discover.png b/docs/en/observability/apm/images/advanced-discover.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/advanced-discover.png
rename to docs/en/observability/apm/images/advanced-discover.png
diff --git a/docs/en/observability/apm-ui/images/all-instances.png b/docs/en/observability/apm/images/all-instances.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/all-instances.png
rename to docs/en/observability/apm/images/all-instances.png
diff --git a/docs/en/observability/apm-ui/images/apm-agent-configuration.png b/docs/en/observability/apm/images/apm-agent-configuration.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-agent-configuration.png
rename to docs/en/observability/apm/images/apm-agent-configuration.png
diff --git a/docs/en/observability/apm-ui/images/apm-agent-explorer-flyout.png b/docs/en/observability/apm/images/apm-agent-explorer-flyout.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-agent-explorer-flyout.png
rename to docs/en/observability/apm/images/apm-agent-explorer-flyout.png
diff --git a/docs/en/observability/apm-ui/images/apm-agent-explorer.png b/docs/en/observability/apm/images/apm-agent-explorer.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-agent-explorer.png
rename to docs/en/observability/apm/images/apm-agent-explorer.png
diff --git a/docs/en/observability/apm-ui/images/apm-alert.png b/docs/en/observability/apm/images/apm-alert.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-alert.png
rename to docs/en/observability/apm/images/apm-alert.png
diff --git a/docs/en/observability/apm-ui/images/apm-anomaly-alert.png b/docs/en/observability/apm/images/apm-anomaly-alert.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-anomaly-alert.png
rename to docs/en/observability/apm/images/apm-anomaly-alert.png
diff --git a/docs/en/observability/apm-ui/images/apm-distributed-tracing.png b/docs/en/observability/apm/images/apm-distributed-tracing-apm-ui.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-distributed-tracing.png
rename to docs/en/observability/apm/images/apm-distributed-tracing-apm-ui.png
diff --git a/docs/en/observability/apm-ui/images/apm-error-group.png b/docs/en/observability/apm/images/apm-error-group.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-error-group.png
rename to docs/en/observability/apm/images/apm-error-group.png
diff --git a/docs/en/observability/apm-ui/images/apm-errors-overview.png b/docs/en/observability/apm/images/apm-errors-overview.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-errors-overview.png
rename to docs/en/observability/apm/images/apm-errors-overview.png
diff --git a/docs/en/observability/apm-ui/images/apm-errors-watcher-assistant.png b/docs/en/observability/apm/images/apm-errors-watcher-assistant.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-errors-watcher-assistant.png
rename to docs/en/observability/apm/images/apm-errors-watcher-assistant.png
diff --git a/docs/en/observability/apm-ui/images/apm-geo-ui.png b/docs/en/observability/apm/images/apm-geo-ui.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-geo-ui.png
rename to docs/en/observability/apm/images/apm-geo-ui.png
diff --git a/docs/en/observability/apm-ui/images/apm-index-pattern.png b/docs/en/observability/apm/images/apm-index-pattern.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-index-pattern.png
rename to docs/en/observability/apm/images/apm-index-pattern.png
diff --git a/docs/en/observability/apm-ui/images/apm-integration-config.png b/docs/en/observability/apm/images/apm-integration-config.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-integration-config.png
rename to docs/en/observability/apm/images/apm-integration-config.png
diff --git a/docs/en/observability/apm-ui/images/apm-logs-tab.png b/docs/en/observability/apm/images/apm-logs-tab.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-logs-tab.png
rename to docs/en/observability/apm/images/apm-logs-tab.png
diff --git a/docs/en/observability/apm-ui/images/apm-metrics.png b/docs/en/observability/apm/images/apm-metrics.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-metrics.png
rename to docs/en/observability/apm/images/apm-metrics.png
diff --git a/docs/en/observability/apm-ui/images/apm-ml-integration.png b/docs/en/observability/apm/images/apm-ml-integration.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-ml-integration.png
rename to docs/en/observability/apm/images/apm-ml-integration.png
diff --git a/docs/en/observability/apm-ui/images/apm-query-bar.png b/docs/en/observability/apm/images/apm-query-bar.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-query-bar.png
rename to docs/en/observability/apm/images/apm-query-bar.png
diff --git a/docs/en/observability/apm-ui/images/apm-roles-config.png b/docs/en/observability/apm/images/apm-roles-config.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-roles-config.png
rename to docs/en/observability/apm/images/apm-roles-config.png
diff --git a/docs/en/observability/apm-ui/images/apm-service-group.png b/docs/en/observability/apm/images/apm-service-group.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-service-group.png
rename to docs/en/observability/apm/images/apm-service-group.png
diff --git a/docs/en/observability/apm-ui/images/apm-service-map-anomaly.png b/docs/en/observability/apm/images/apm-service-map-anomaly.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-service-map-anomaly.png
rename to docs/en/observability/apm/images/apm-service-map-anomaly.png
diff --git a/docs/en/observability/apm-ui/images/apm-services-overview.png b/docs/en/observability/apm/images/apm-services-overview.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-services-overview.png
rename to docs/en/observability/apm/images/apm-services-overview.png
diff --git a/docs/en/observability/apm-ui/images/apm-services-trace.png b/docs/en/observability/apm/images/apm-services-trace.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-services-trace.png
rename to docs/en/observability/apm/images/apm-services-trace.png
diff --git a/docs/en/observability/apm-ui/images/apm-settings.png b/docs/en/observability/apm/images/apm-settings.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-settings.png
rename to docs/en/observability/apm/images/apm-settings.png
diff --git a/docs/en/observability/apm-ui/images/apm-setup.png b/docs/en/observability/apm/images/apm-setup.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-setup.png
rename to docs/en/observability/apm/images/apm-setup.png
diff --git a/docs/en/observability/apm-ui/images/apm-span-detail.png b/docs/en/observability/apm/images/apm-span-detail.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-span-detail.png
rename to docs/en/observability/apm/images/apm-span-detail.png
diff --git a/docs/en/observability/apm-ui/images/apm-traces.png b/docs/en/observability/apm/images/apm-traces.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-traces.png
rename to docs/en/observability/apm/images/apm-traces.png
diff --git a/docs/en/observability/apm-ui/images/apm-transaction-annotation.png b/docs/en/observability/apm/images/apm-transaction-annotation.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-transaction-annotation.png
rename to docs/en/observability/apm/images/apm-transaction-annotation.png
diff --git a/docs/en/observability/apm-ui/images/apm-transaction-duration-dist.png b/docs/en/observability/apm/images/apm-transaction-duration-dist.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-transaction-duration-dist.png
rename to docs/en/observability/apm/images/apm-transaction-duration-dist.png
diff --git a/docs/en/observability/apm-ui/images/apm-transaction-response-dist.png b/docs/en/observability/apm/images/apm-transaction-response-dist.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-transaction-response-dist.png
rename to docs/en/observability/apm/images/apm-transaction-response-dist.png
diff --git a/docs/en/observability/apm-ui/images/apm-transaction-sample.png b/docs/en/observability/apm/images/apm-transaction-sample.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-transaction-sample.png
rename to docs/en/observability/apm/images/apm-transaction-sample.png
diff --git a/docs/en/observability/apm-ui/images/apm-transactions-overview.png b/docs/en/observability/apm/images/apm-transactions-overview.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-transactions-overview.png
rename to docs/en/observability/apm/images/apm-transactions-overview.png
diff --git a/docs/en/observability/apm-ui/images/apm-transactions-table.png b/docs/en/observability/apm/images/apm-transactions-table.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/apm-transactions-table.png
rename to docs/en/observability/apm/images/apm-transactions-table.png
diff --git a/docs/en/observability/apm-ui/images/correlations-failed-transactions.png b/docs/en/observability/apm/images/correlations-failed-transactions.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/correlations-failed-transactions.png
rename to docs/en/observability/apm/images/correlations-failed-transactions.png
diff --git a/docs/en/observability/apm-ui/images/correlations-hover.png b/docs/en/observability/apm/images/correlations-hover.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/correlations-hover.png
rename to docs/en/observability/apm/images/correlations-hover.png
diff --git a/docs/en/observability/apm-ui/images/create-github-issue.png b/docs/en/observability/apm/images/create-github-issue.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/create-github-issue.png
rename to docs/en/observability/apm/images/create-github-issue.png
diff --git a/docs/en/observability/apm-ui/images/create-jira-issue.png b/docs/en/observability/apm/images/create-jira-issue.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/create-jira-issue.png
rename to docs/en/observability/apm/images/create-jira-issue.png
diff --git a/docs/en/observability/apm-ui/images/dependencies-drilldown.png b/docs/en/observability/apm/images/dependencies-drilldown.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/dependencies-drilldown.png
rename to docs/en/observability/apm/images/dependencies-drilldown.png
diff --git a/docs/en/observability/apm-ui/images/dependencies.png b/docs/en/observability/apm/images/dependencies.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/dependencies.png
rename to docs/en/observability/apm/images/dependencies.png
diff --git a/docs/en/observability/apm/images/diagram-of-a-trace.png b/docs/en/observability/apm/images/diagram-of-a-trace.png
new file mode 100644
index 0000000000..a80dd9d0fb
Binary files /dev/null and b/docs/en/observability/apm/images/diagram-of-a-trace.png differ
diff --git a/docs/en/observability/apm/images/distributed-traces.png b/docs/en/observability/apm/images/distributed-traces.png
new file mode 100644
index 0000000000..14c32a7e00
Binary files /dev/null and b/docs/en/observability/apm/images/distributed-traces.png differ
diff --git a/docs/en/observability/apm-ui/images/dynamic-config.svg b/docs/en/observability/apm/images/dynamic-config.svg
similarity index 100%
rename from docs/en/observability/apm-ui/images/dynamic-config.svg
rename to docs/en/observability/apm/images/dynamic-config.svg
diff --git a/docs/en/observability/apm-ui/images/error-rate.png b/docs/en/observability/apm/images/error-rate.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/error-rate.png
rename to docs/en/observability/apm/images/error-rate.png
diff --git a/docs/en/observability/apm-ui/images/example-metadata.png b/docs/en/observability/apm/images/example-metadata.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/example-metadata.png
rename to docs/en/observability/apm/images/example-metadata.png
diff --git a/docs/en/observability/apm-ui/images/global-filters.png b/docs/en/observability/apm/images/global-filters.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/global-filters.png
rename to docs/en/observability/apm/images/global-filters.png
diff --git a/docs/en/observability/apm-ui/images/green-service.png b/docs/en/observability/apm/images/green-service.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/green-service.png
rename to docs/en/observability/apm/images/green-service.png
diff --git a/docs/en/observability/apm-ui/images/infra.png b/docs/en/observability/apm/images/infra.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/infra.png
rename to docs/en/observability/apm/images/infra.png
diff --git a/docs/en/observability/apm-ui/images/jvm-metrics-overview.png b/docs/en/observability/apm/images/jvm-metrics-overview.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/jvm-metrics-overview.png
rename to docs/en/observability/apm/images/jvm-metrics-overview.png
diff --git a/docs/en/observability/apm-ui/images/jvm-metrics.png b/docs/en/observability/apm/images/jvm-metrics.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/jvm-metrics.png
rename to docs/en/observability/apm/images/jvm-metrics.png
diff --git a/docs/en/observability/apm-ui/images/lambda-cold-start-trace.png b/docs/en/observability/apm/images/lambda-cold-start-trace.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/lambda-cold-start-trace.png
rename to docs/en/observability/apm/images/lambda-cold-start-trace.png
diff --git a/docs/en/observability/apm-ui/images/lambda-correlations.png b/docs/en/observability/apm/images/lambda-correlations.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/lambda-correlations.png
rename to docs/en/observability/apm/images/lambda-correlations.png
diff --git a/docs/en/observability/apm-ui/images/lambda-overview.png b/docs/en/observability/apm/images/lambda-overview.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/lambda-overview.png
rename to docs/en/observability/apm/images/lambda-overview.png
diff --git a/docs/en/observability/apm-ui/images/latency.png b/docs/en/observability/apm/images/latency.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/latency.png
rename to docs/en/observability/apm/images/latency.png
diff --git a/docs/en/observability/apm-ui/images/local-filter.png b/docs/en/observability/apm/images/local-filter.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/local-filter.png
rename to docs/en/observability/apm/images/local-filter.png
diff --git a/docs/en/observability/apm-ui/images/logs.png b/docs/en/observability/apm/images/logs.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/logs.png
rename to docs/en/observability/apm/images/logs.png
diff --git a/docs/en/observability/apm-ui/images/metadata-icons.png b/docs/en/observability/apm/images/metadata-icons.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/metadata-icons.png
rename to docs/en/observability/apm/images/metadata-icons.png
diff --git a/docs/en/observability/apm-ui/images/mobile-location.png b/docs/en/observability/apm/images/mobile-location.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-location.png
rename to docs/en/observability/apm/images/mobile-location.png
diff --git a/docs/en/observability/apm-ui/images/mobile-most-used.png b/docs/en/observability/apm/images/mobile-most-used.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-most-used.png
rename to docs/en/observability/apm/images/mobile-most-used.png
diff --git a/docs/en/observability/apm-ui/images/mobile-session-error-details.png b/docs/en/observability/apm/images/mobile-session-error-details.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-session-error-details.png
rename to docs/en/observability/apm/images/mobile-session-error-details.png
diff --git a/docs/en/observability/apm-ui/images/mobile-session-explorer-apm.png b/docs/en/observability/apm/images/mobile-session-explorer-apm.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-session-explorer-apm.png
rename to docs/en/observability/apm/images/mobile-session-explorer-apm.png
diff --git a/docs/en/observability/apm-ui/images/mobile-session-explorer-nav.png b/docs/en/observability/apm/images/mobile-session-explorer-nav.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-session-explorer-nav.png
rename to docs/en/observability/apm/images/mobile-session-explorer-nav.png
diff --git a/docs/en/observability/apm-ui/images/mobile-session-filter-discover.png b/docs/en/observability/apm/images/mobile-session-filter-discover.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-session-filter-discover.png
rename to docs/en/observability/apm/images/mobile-session-filter-discover.png
diff --git a/docs/en/observability/apm-ui/images/mobile-tp.png b/docs/en/observability/apm/images/mobile-tp.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/mobile-tp.png
rename to docs/en/observability/apm/images/mobile-tp.png
diff --git a/docs/en/observability/apm-ui/images/operations-detail.png b/docs/en/observability/apm/images/operations-detail.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/operations-detail.png
rename to docs/en/observability/apm/images/operations-detail.png
diff --git a/docs/en/observability/apm-ui/images/operations.png b/docs/en/observability/apm/images/operations.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/operations.png
rename to docs/en/observability/apm/images/operations.png
diff --git a/docs/en/observability/apm-ui/images/red-service.png b/docs/en/observability/apm/images/red-service.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/red-service.png
rename to docs/en/observability/apm/images/red-service.png
diff --git a/docs/en/observability/apm-ui/images/service-maps-java.png b/docs/en/observability/apm/images/service-maps-java.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/service-maps-java.png
rename to docs/en/observability/apm/images/service-maps-java.png
diff --git a/docs/en/observability/apm-ui/images/service-maps.png b/docs/en/observability/apm/images/service-maps.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/service-maps.png
rename to docs/en/observability/apm/images/service-maps.png
diff --git a/docs/en/observability/apm-ui/images/service-quick-health.png b/docs/en/observability/apm/images/service-quick-health.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/service-quick-health.png
rename to docs/en/observability/apm/images/service-quick-health.png
diff --git a/docs/en/observability/apm-ui/images/spans-dependencies.png b/docs/en/observability/apm/images/spans-dependencies.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/spans-dependencies.png
rename to docs/en/observability/apm/images/spans-dependencies.png
diff --git a/docs/en/observability/apm/images/spans-transactions-and-traces.png b/docs/en/observability/apm/images/spans-transactions-and-traces.png
new file mode 100644
index 0000000000..06badc4454
Binary files /dev/null and b/docs/en/observability/apm/images/spans-transactions-and-traces.png differ
diff --git a/docs/en/observability/apm-ui/images/specific-transaction-search.png b/docs/en/observability/apm/images/specific-transaction-search.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/specific-transaction-search.png
rename to docs/en/observability/apm/images/specific-transaction-search.png
diff --git a/docs/en/observability/apm-ui/images/specific-transaction.png b/docs/en/observability/apm/images/specific-transaction.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/specific-transaction.png
rename to docs/en/observability/apm/images/specific-transaction.png
diff --git a/docs/en/observability/apm-ui/images/storage-explorer-expanded.png b/docs/en/observability/apm/images/storage-explorer-expanded.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/storage-explorer-expanded.png
rename to docs/en/observability/apm/images/storage-explorer-expanded.png
diff --git a/docs/en/observability/apm-ui/images/storage-explorer-overview.png b/docs/en/observability/apm/images/storage-explorer-overview.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/storage-explorer-overview.png
rename to docs/en/observability/apm/images/storage-explorer-overview.png
diff --git a/docs/en/observability/apm-ui/images/time-series-expected-bounds-comparison.png b/docs/en/observability/apm/images/time-series-expected-bounds-comparison.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/time-series-expected-bounds-comparison.png
rename to docs/en/observability/apm/images/time-series-expected-bounds-comparison.png
diff --git a/docs/en/observability/apm-ui/images/trace-explorer.png b/docs/en/observability/apm/images/trace-explorer.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/trace-explorer.png
rename to docs/en/observability/apm/images/trace-explorer.png
diff --git a/docs/en/observability/apm-ui/images/traffic-transactions.png b/docs/en/observability/apm/images/traffic-transactions.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/traffic-transactions.png
rename to docs/en/observability/apm/images/traffic-transactions.png
diff --git a/docs/en/observability/apm-ui/images/transaction-icon.png b/docs/en/observability/apm/images/transaction-icon.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/transaction-icon.png
rename to docs/en/observability/apm/images/transaction-icon.png
diff --git a/docs/en/observability/apm-ui/images/yellow-service.png b/docs/en/observability/apm/images/yellow-service.png
similarity index 100%
rename from docs/en/observability/apm-ui/images/yellow-service.png
rename to docs/en/observability/apm/images/yellow-service.png
diff --git a/docs/en/observability/apm/log-correlation.asciidoc b/docs/en/observability/apm/log-correlation.asciidoc
deleted file mode 100644
index 8735b4049e..0000000000
--- a/docs/en/observability/apm/log-correlation.asciidoc
+++ /dev/null
@@ -1,11 +0,0 @@
-[[apm-log-correlation]]
-=== Logging integration
-
-Elastic APM integrates with popular logging frameworks, making it easy to correlate your logs and traces.
-This enables you to:
-
-- view the context of a log and the parameters provided by a user
-- view all logs belonging to a particular trace
-- easily move between logs and traces when debugging application issues
-
-See the <> guide to get started.
\ No newline at end of file
diff --git a/docs/en/observability/apm/manage-storage.asciidoc b/docs/en/observability/apm/manage-storage.asciidoc
deleted file mode 100644
index f2817b1732..0000000000
--- a/docs/en/observability/apm/manage-storage.asciidoc
+++ /dev/null
@@ -1,216 +0,0 @@
-[[apm-manage-storage]]
-== Manage storage
-
-{agent} uses <> to store time series data across multiple indices.
-<> are used to configure the backing indices of data streams as they are created.
-Each data stream ships with a customizable <> that automates data retention as your indices grow and age.
-Use <