` with your [Datadog site][1]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct {{< ui >}}DATADOG SITE{{< /ui >}} is selected on the right.)
{{% site-region region="gov,gov2" %}}
For FED, also set
useFIPSAgent: true under
spec.global to use the FIPS-compliant Agent image. See
FIPS compliance.
diff --git a/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md b/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md
index 0a2080c8d91..889d0fb7014 100644
--- a/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md
+++ b/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md
@@ -1345,7 +1345,7 @@ The DDOT Collector gateway includes the [Datadog extension][11] by default. This
To view your gateway pods:
-1. Navigate to **Integrations > Fleet Automation**.
+1. Navigate to {{< ui >}}Integrations{{< /ui >}} > {{< ui >}}Fleet Automation{{< /ui >}}.
{{< img src="opentelemetry/embedded_collector/fleet_automation2.png" alt="Fleet Automation page showing DDOT gateway pods" style="width:100%;" >}}
diff --git a/content/en/opentelemetry/setup/ddot_collector/install/linux.md b/content/en/opentelemetry/setup/ddot_collector/install/linux.md
index 8656d937f9f..6028871e23c 100644
--- a/content/en/opentelemetry/setup/ddot_collector/install/linux.md
+++ b/content/en/opentelemetry/setup/ddot_collector/install/linux.md
@@ -73,7 +73,7 @@ Agent (v7.x.x)
Log Level: info
```
-There will also be an **OTel Agent** status section that includes OpenTelemetry information:
+There will also be an {{< ui >}}OTel Agent{{< /ui >}} status section that includes OpenTelemetry information:
```text
==========
diff --git a/content/en/opentelemetry/setup/ddot_collector/install/windows.md b/content/en/opentelemetry/setup/ddot_collector/install/windows.md
index c4f5801ac6f..1c74d87ccc4 100644
--- a/content/en/opentelemetry/setup/ddot_collector/install/windows.md
+++ b/content/en/opentelemetry/setup/ddot_collector/install/windows.md
@@ -75,7 +75,7 @@ Agent (v7.x.x)
Log Level: info
```
-There will also be an **OTel Agent** status section that includes OpenTelemetry information:
+There will also be an {{< ui >}}OTel Agent{{< /ui >}} status section that includes OpenTelemetry information:
```text
==========
diff --git a/content/en/product_analytics/_index.md b/content/en/product_analytics/_index.md
index 09fa10ab687..5c5ffad0108 100644
--- a/content/en/product_analytics/_index.md
+++ b/content/en/product_analytics/_index.md
@@ -58,7 +58,7 @@ To set up your application with a coding assistant, see [Agentic onboarding][17]
### Track server-side events (API)
-After you set up client-side collection, you can use the [Product Analytics API][21] to send custom events from your server, such as completed checkouts or processed payments.
+After you set up client-side collection, you can use the [Product Analytics API][21] to send custom events from your server, such as completed checkouts or processed payments. For more information, see [Track Server-Side Events][22].
Datadog bills server-side events separately. See the
pricing page for details, and contact your Customer Success Manager with additional questions.
@@ -177,3 +177,4 @@ Use the following features to inform your product change decisions, such as chan
[19]: /real_user_monitoring/guide/understanding-the-rum-event-hierarchy
[20]: https://app.datadoghq.com/rum/sessions?query=%40type%3Aaction
[21]: /api/latest/product-analytics/#send-server-side-events
+[22]: /product_analytics/data_collected/server_side_events/
diff --git a/content/en/product_analytics/data_collected.md b/content/en/product_analytics/data_collected/_index.md
similarity index 98%
rename from content/en/product_analytics/data_collected.md
rename to content/en/product_analytics/data_collected/_index.md
index 3d235455a4d..b02f2ae2c41 100644
--- a/content/en/product_analytics/data_collected.md
+++ b/content/en/product_analytics/data_collected/_index.md
@@ -11,6 +11,9 @@ further_reading:
- link: "/real_user_monitoring/application_monitoring/android/data_collected/"
tag: "Documentation"
text: "RUM Android Data Collected"
+- link: "/product_analytics/data_collected/server_side_events/"
+ tag: "Documentation"
+ text: "Track Server-Side Events"
---
## Overview
diff --git a/content/en/product_analytics/data_collected/server_side_events.md b/content/en/product_analytics/data_collected/server_side_events.md
new file mode 100644
index 00000000000..6df0b0ab034
--- /dev/null
+++ b/content/en/product_analytics/data_collected/server_side_events.md
@@ -0,0 +1,48 @@
+---
+title: Track Server-Side Events
+description: Send custom events from your server to supplement client-side data in Product Analytics.
+further_reading:
+- link: "/api/latest/product-analytics/#send-server-side-events"
+ tag: "API Reference"
+ text: "Product Analytics API"
+- link: "/product_analytics/"
+ tag: "Documentation"
+ text: "Product Analytics"
+- link: "/product_analytics/data_collected/"
+ tag: "Documentation"
+ text: "Product Analytics Data Collected"
+---
+
+## Overview
+
+Server-side events are custom events sent through the [Product Analytics API][1] from your server. Unlike client-side events captured by the RUM SDK, such as pageviews or button clicks, server-side events track actions that occur in your backend, such as a completed checkout or processed payment.
+
+Use server-side events to:
+
+- Capture events at the source of truth on the server, independent of client-side behavior
+- Track backend actions with no client-side equivalent, such as a payment confirmation or subscription renewal
+- Supplement client-side data with server-side context
+
+Datadog bills server-side events separately. See the
pricing page for details, and contact your Customer Success Manager with additional questions.
+
+## Prerequisites
+
+Before sending server-side events, [set up the Datadog SDK][2] for your application and [enable Product Analytics][3].
+
+## Send server-side events
+
+Use the [Product Analytics API][1] to send events from your server. To associate a server-side event with a client session, include the `session_id` from the client's active RUM session. Including the session ID links server-side events to client-side data for a complete view of the user journey.
+
+For the full API reference, including authentication, required fields, and request parameters, see [Send server-side events][1].
+
+## Analyze server-side events
+
+After you send server-side events, they are available in any Product Analytics chart. In the event picker, select **Server Events** to scope your analysis to server-side data.
+
+## Further reading
+
+{{< partial name="whats-next/whats-next.html" >}}
+
+[1]: /api/latest/product-analytics/#send-server-side-events
+[2]: /product_analytics/#track-client-side-events-sdk
+[3]: /product_analytics/#enable-product-analytics
diff --git a/content/en/product_analytics/guide/_index.md b/content/en/product_analytics/guide/_index.md
index 8034fda439c..ebf493d9346 100644
--- a/content/en/product_analytics/guide/_index.md
+++ b/content/en/product_analytics/guide/_index.md
@@ -11,6 +11,7 @@ cascade:
{{< whatsnext desc="General Product Analytics:" >}}
{{< nextlink href="product_analytics/guide/rum_and_product_analytics" >}}Understanding RUM and Product Analytics{{< /nextlink >}}
+ {{< nextlink href="product_analytics/data_collected/server_side_events" >}}Track server-side events{{< /nextlink >}}
{{< nextlink href="session_replay/guide/diagnose-funnel-drop-offs-with-session-replay" >}}Diagnose funnel drop-offs with Session Replay{{< /nextlink >}}
{{< nextlink href="product_analytics/guide/monitor-utm-campaigns-in-product-analytics" >}}Monitor UTM Campaigns{{< /nextlink >}}
diff --git a/content/en/security/application_security/setup/dotnet/_index.md b/content/en/security/application_security/setup/dotnet/_index.md
index d5be300224c..94ef770df76 100644
--- a/content/en/security/application_security/setup/dotnet/_index.md
+++ b/content/en/security/application_security/setup/dotnet/_index.md
@@ -10,6 +10,7 @@ aliases:
- /security/application_security/threats_detection/dotnet
- /security/application_security/setup/threat_detection/dotnet
- /security/application_security/enabling/dotnet
+ - /security/application_security/setup/dotnet/compatibility
further_reading:
- link: "/security/application_security/add-user-info/"
tag: "Documentation"
@@ -64,4 +65,4 @@ further_reading:
- [Compatibility Information][2]
[1]: /security/application_security/setup/dotnet/troubleshooting
-[2]: /security/application_security/setup/dotnet/compatibility
+[2]: /security/application_security/setup/compatibility/dotnet
diff --git a/content/en/security/application_security/setup/dotnet/aws-fargate.md b/content/en/security/application_security/setup/dotnet/aws-fargate.md
index 8bd20a28b2d..d322a7654b1 100644
--- a/content/en/security/application_security/setup/dotnet/aws-fargate.md
+++ b/content/en/security/application_security/setup/dotnet/aws-fargate.md
@@ -163,7 +163,7 @@ If you encounter issues while setting up App and API Protection for your .net ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/dotnet/compatibility
+[1]: /security/application_security/setup/compatibility/dotnet
[2]: /security/application_security/setup/dotnet/troubleshooting
diff --git a/content/en/security/application_security/setup/dotnet/compatibility.md b/content/en/security/application_security/setup/dotnet/compatibility.md
deleted file mode 100644
index 09caeb88153..00000000000
--- a/content/en/security/application_security/setup/dotnet/compatibility.md
+++ /dev/null
@@ -1,81 +0,0 @@
----
-title: .NET Compatibility Requirements
-aliases:
- - /security/application_security/threats/setup/compatibility/dotnet
----
-
-## App and API Protection capabilities
-
-The following App and API Protection capabilities are supported in the .NET library, for the specified tracer version:
-
-| App and API Protection capability | Minimum .NET tracer version |
-| --------------------------------------- | ----------------------------|
-| Threat Detection | 2.23.0 |
-| Threat Protection | 2.26.0 |
-| Customize response to blocked requests | 2.27.0 |
-| Automatic user activity event tracking | 2.32.0 |
-| API Security | 2.42.0 |
-
-The minimum tracer version to get all supported App and API Protection capabilities for .NET is 2.42.0.
-
-**Note**: Threat Protection requires enabling [Remote Configuration][1], which is included in the listed minimum tracer version.
-
-### Supported deployment types
-
-Threat Detection is supported for the following deployment types:
-
-- Docker
-- Kubernetes
-- Amazon ECS
-- AWS Fargate
-- AWS Lambda
-- Azure App Service
-
-**Note**: Azure App Service is supported for **web applications only**. App and API Protection capabilities are not supported for Azure Functions.
-
-## Language and framework compatibility
-
-### Supported .NET versions
-
-The Datadog .NET SDK is open source. View the [GitHub repository][2] for more information.
-
-The .NET Tracer supports instrumentation from
- - .NET Framework 4.6.1 and newer versions
- - .NET Core 3.1 and newer versions
-
-These are supported on the following architectures:
-- Linux (GNU) x86-64, ARM64
-- Alpine Linux (musl) x86-64, ARM64
-- macOS (Darwin) x86-64, ARM64
-- Windows (msvc) x86, x86-64
-
-For a complete list of supported versions and operating systems, see the [.NET Core tracer documentation][3] and [.NET Framework tracer documentation][4].
-
-You must be running Datadog Agent v7.41.1+ for App and API Protection features.
-
-## Integrations
-
-The .NET tracer includes support for the following frameworks, data stores, and libraries:
-
-### Web framework compatibility
-- ASP.NET MVC
-- ASP.NET Web API 2
-
-### Data stores
-- OracleDB
-- ADO.NET
-- SQL Server
-- MySQL
-- SQLite
-- PostgreSQL
-
-### Other
-- Kafka
-- GraphQL
-
-For a complete list of supported integrations and their versions, see the [.NET Core tracer documentation][3] and [.NET Framework tracer documentation][4].
-
-[1]: /agent/remote_config/#enabling-remote-configuration
-[2]: https://github.com/DataDog/dd-trace-dotnet
-[3]: /tracing/trace_collection/compatibility/dotnet-core
-[4]: /tracing/trace_collection/compatibility/dotnet-framework
diff --git a/content/en/security/application_security/setup/dotnet/docker.md b/content/en/security/application_security/setup/dotnet/docker.md
index cf1d9502b80..bbc3ca3ed29 100644
--- a/content/en/security/application_security/setup/dotnet/docker.md
+++ b/content/en/security/application_security/setup/dotnet/docker.md
@@ -99,7 +99,7 @@ If you encounter issues while setting up App and API Protection for your .NET ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/dotnet/compatibility
+[1]: /security/application_security/setup/compatibility/dotnet
[2]: /security/application_security/setup/dotnet/troubleshooting
[3]: /agent/?tab=cloud_and_container
diff --git a/content/en/security/application_security/setup/dotnet/kubernetes.md b/content/en/security/application_security/setup/dotnet/kubernetes.md
index 7b28944df8b..ea8ca6d21a3 100644
--- a/content/en/security/application_security/setup/dotnet/kubernetes.md
+++ b/content/en/security/application_security/setup/dotnet/kubernetes.md
@@ -125,5 +125,5 @@ If you encounter issues while setting up App and API Protection for your .NET ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/dotnet/compatibility
+[1]: /security/application_security/setup/compatibility/dotnet
[2]: /security/application_security/setup/dotnet/troubleshooting
diff --git a/content/en/security/application_security/setup/dotnet/linux.md b/content/en/security/application_security/setup/dotnet/linux.md
index dde6d4ab260..ed23857b709 100644
--- a/content/en/security/application_security/setup/dotnet/linux.md
+++ b/content/en/security/application_security/setup/dotnet/linux.md
@@ -128,7 +128,7 @@ If you encounter issues while setting up App and API Protection for your .NET ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/dotnet/compatibility
+[1]: /security/application_security/setup/compatibility/dotnet
[2]: /agent/?tab=Linux
[3]: https://github.com/DataDog/dd-trace-dotnet/releases
[4]: /security/application_security/setup/dotnet/troubleshooting
diff --git a/content/en/security/application_security/setup/dotnet/windows.md b/content/en/security/application_security/setup/dotnet/windows.md
index 4072f420469..a92f563820e 100644
--- a/content/en/security/application_security/setup/dotnet/windows.md
+++ b/content/en/security/application_security/setup/dotnet/windows.md
@@ -112,7 +112,7 @@ If you encounter issues while setting up App and API Protection for your .NET ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/dotnet/compatibility
+[1]: /security/application_security/setup/compatibility/dotnet
[2]: /agent/?tab=Windows
[3]: https://github.com/DataDog/dd-trace-dotnet/releases
[4]: /security/application_security/setup/dotnet/troubleshooting
diff --git a/content/en/security/application_security/setup/java/_index.md b/content/en/security/application_security/setup/java/_index.md
index bc48ed449ce..77d1c660c76 100644
--- a/content/en/security/application_security/setup/java/_index.md
+++ b/content/en/security/application_security/setup/java/_index.md
@@ -10,6 +10,7 @@ aliases:
- /security/application_security/enabling/tracing_libraries/threat_detection/java
- /security/application_security/enabling/java
- /security/application_security/threats/setup/standalone/java
+ - /security/application_security/setup/java/compatibility
further_reading:
- link: "/security/application_security/add-user-info/"
tag: "Documentation"
@@ -65,4 +66,4 @@ further_reading:
- [Compatibility Information][2]
[1]: /security/application_security/setup/java/troubleshooting
-[2]: /security/application_security/setup/java/compatibility
+[2]: /security/application_security/setup/compatibility/java
diff --git a/content/en/security/application_security/setup/java/aws-fargate.md b/content/en/security/application_security/setup/java/aws-fargate.md
index 7a1d8fe99d1..305d0e96062 100644
--- a/content/en/security/application_security/setup/java/aws-fargate.md
+++ b/content/en/security/application_security/setup/java/aws-fargate.md
@@ -224,6 +224,6 @@ If you encounter issues while setting up App and API Protection for your Java ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/java/compatibility
+[1]: /security/application_security/setup/compatibility/java
[2]: /security/application_security/setup/java/troubleshooting
diff --git a/content/en/security/application_security/setup/java/compatibility.md b/content/en/security/application_security/setup/java/compatibility.md
deleted file mode 100644
index 2494c9eb6c7..00000000000
--- a/content/en/security/application_security/setup/java/compatibility.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-title: Java Compatibility Requirements
-aliases:
- - /security/application_security/threats/setup/compatibility/java
----
-
-## App and API Protection capabilities
-
-The following App and API Protection capabilities are supported in the Java library, for the specified tracer version:
-
-| App and API Protection capability | Minimum Java tracer version |
-| -------------------------------------------------- | --------------------------- |
-| Threat Detection | 0.94.0 |
-| Threat Protection | 0.94.0 |
-| Customize response to blocked requests | 0.94.0 |
-| Automatic user activity event tracking | 0.94.0 |
-| API Security | 0.94.0 |
-
-The minimum tracer version to get all supported App and API Protection capabilities for Java is 0.94.0.
-
-**Note**: Threat Protection requires enabling [Remote Configuration][1], which is included in the listed minimum tracer version.
-
-
-
-### Supported deployment types
-
-Threat Detection is supported for the following deployment types:
-
-- Docker
-- Kubernetes
-- Amazon ECS
-- AWS Fargate
-- AWS Lambda
-- Google Cloud Run
-
-## Language and framework compatibility
-
-### Supported Java versions
-
-The Datadog Java SDK is open source. View the [GitHub repository][2] for more information.
-
-The Datadog Java SDK supports Java 8 and newer versions. For optimal performance and feature support, we recommend using the latest LTS version of Java.
-
-You must be running Datadog Agent v7.41.1+ for App and API Protection features.
-
-## Integrations
-
-The Java tracer includes support for the following frameworks, data stores, and libraries:
-
-### Web frameworks
-- Spring Boot
-- Spring Web
-- Spring WebFlux
-- JAX-RS
-- Play Framework
-- Spark Java
-- Vert.x
-- gRPC
-
-### Data stores
-- JDBC
-- MongoDB
-- Redis
-- Elasticsearch
-- Cassandra
-- Couchbase
-
-### Message brokers
-- Kafka
-- RabbitMQ
-- JMS
-
-### Other
-- OkHttp
-- Apache HttpClient
-- JSP
-- Servlet
-- GraphQL
-
-For a complete list of supported integrations and their versions, see the [Java tracer documentation][3].
-
-[1]: /agent/remote_config/#enabling-remote-configuration
-[2]: https://github.com/DataDog/dd-trace-java
-[3]: /tracing/trace_collection/compatibility_requirements/java
diff --git a/content/en/security/application_security/setup/java/docker.md b/content/en/security/application_security/setup/java/docker.md
index cb982fb3d35..0c653990b9d 100644
--- a/content/en/security/application_security/setup/java/docker.md
+++ b/content/en/security/application_security/setup/java/docker.md
@@ -129,7 +129,7 @@ If you encounter issues while setting up App and API Protection for your Java ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/java/compatibility
+[1]: /security/application_security/setup/compatibility/java
[2]: /security/application_security/setup/java/troubleshooting
[3]: /agent/?tab=cloud_and_container
diff --git a/content/en/security/application_security/setup/java/kubernetes.md b/content/en/security/application_security/setup/java/kubernetes.md
index d777e6ba773..669e26706b7 100644
--- a/content/en/security/application_security/setup/java/kubernetes.md
+++ b/content/en/security/application_security/setup/java/kubernetes.md
@@ -202,6 +202,6 @@ If you encounter issues while setting up App and API Protection for your Java ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/java/compatibility
+[1]: /security/application_security/setup/compatibility/java
[2]: /security/application_security/setup/java/troubleshooting
[3]: /agent/?tab=cloud_and_container
diff --git a/content/en/security/application_security/setup/java/linux.md b/content/en/security/application_security/setup/java/linux.md
index 23de94b1bdb..21a2e3b2880 100644
--- a/content/en/security/application_security/setup/java/linux.md
+++ b/content/en/security/application_security/setup/java/linux.md
@@ -114,7 +114,7 @@ If you encounter issues while setting up App and API Protection for your Java ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/java/compatibility
+[1]: /security/application_security/setup/compatibility/java
[2]: /security/application_security/setup/java/troubleshooting
[3]: /agent/?tab=Linux
diff --git a/content/en/security/application_security/setup/java/macos.md b/content/en/security/application_security/setup/java/macos.md
index 87c023a5f8e..41d96885dcb 100644
--- a/content/en/security/application_security/setup/java/macos.md
+++ b/content/en/security/application_security/setup/java/macos.md
@@ -110,6 +110,6 @@ If you encounter issues while setting up App and API Protection for your Java ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/java/compatibility
+[1]: /security/application_security/setup/compatibility/java
[2]: /security/application_security/setup/java/troubleshooting
[3]: /agent/?tab=macOS
diff --git a/content/en/security/application_security/setup/java/windows.md b/content/en/security/application_security/setup/java/windows.md
index 1050aafb9c5..50613cce1ac 100644
--- a/content/en/security/application_security/setup/java/windows.md
+++ b/content/en/security/application_security/setup/java/windows.md
@@ -110,6 +110,6 @@ If you encounter issues while setting up App and API Protection for your Java ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/java/compatibility
+[1]: /security/application_security/setup/compatibility/java
[2]: /security/application_security/setup/java/troubleshooting
[3]: /agent/?tab=Windows
diff --git a/content/en/security/application_security/setup/nginx/_index.md b/content/en/security/application_security/setup/nginx/_index.md
index 14576993756..b46bd818851 100644
--- a/content/en/security/application_security/setup/nginx/_index.md
+++ b/content/en/security/application_security/setup/nginx/_index.md
@@ -38,4 +38,4 @@ Learn how to set up App and API Protection (AAP) on your NGINX proxy by selectin
[1]: https://github.com/DataDog/nginx-datadog/
[2]: /security/application_security/setup/php/troubleshooting
-[3]: /security/application_security/setup/php/compatibility
+[3]: /security/application_security/setup/compatibility/nginx
diff --git a/content/en/security/application_security/setup/nodejs/_index.md b/content/en/security/application_security/setup/nodejs/_index.md
index a49629c7bb8..bf13e1db185 100644
--- a/content/en/security/application_security/setup/nodejs/_index.md
+++ b/content/en/security/application_security/setup/nodejs/_index.md
@@ -8,6 +8,7 @@ aliases:
- /security/application_security/threats_detection/nodejs
- /security/application_security/setup/aws/fargate/nodejs
- /security/application_security/setup/standalone/nodejs
+ - /security/application_security/setup/nodejs/compatibility
further_reading:
- link: "/security/application_security/add-user-info/"
tag: "Documentation"
@@ -60,4 +61,4 @@ further_reading:
## Additional Resources
- [Troubleshooting Guide](./troubleshooting)
-- [Compatibility Information](./compatibility)
+- [Compatibility Information](/security/application_security/setup/compatibility/nodejs)
diff --git a/content/en/security/application_security/setup/nodejs/aws-fargate.md b/content/en/security/application_security/setup/nodejs/aws-fargate.md
index 6564f597306..8231f73b408 100644
--- a/content/en/security/application_security/setup/nodejs/aws-fargate.md
+++ b/content/en/security/application_security/setup/nodejs/aws-fargate.md
@@ -165,5 +165,5 @@ If you encounter issues while setting up App and API Protection for your Node.js
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/nodejs/compatibility
+[1]: /security/application_security/setup/compatibility/nodejs
[2]: /security/application_security/setup/nodejs/troubleshooting
diff --git a/content/en/security/application_security/setup/nodejs/compatibility.md b/content/en/security/application_security/setup/nodejs/compatibility.md
deleted file mode 100644
index 7afcfbf3c3a..00000000000
--- a/content/en/security/application_security/setup/nodejs/compatibility.md
+++ /dev/null
@@ -1,165 +0,0 @@
----
-title: Node.js Compatibility Requirements
-code_lang: nodejs
-type: multi-code-lang
-code_lang_weight: 50
-aliases:
- - /security/application_security/threats/setup/compatibility/nodejs
----
-
-## App and API Protection capabilities
-
-The following App and API Protection capabilities are supported in the Node.js library, for the specified tracer version:
-
-| App and API Protection capability | Minimum Node.js tracer version |
-|----------------------------------------|--------------------------------------------------|
-| Threat Detection | 4.0.0 |
-| Threat Protection | 4.0.0 |
-| Customize response to blocked requests | 4.1.0 |
-| Automatic user activity event tracking | 4.4.0 |
-| API Security | 4.30.0 |
-
-The minimum tracer version to get all supported App and API Protection capabilities for Node.js is 4.30.0.
-
-**Note**:
-- Threat Protection requires enabling [Remote Configuration][2], which is included in the listed minimum tracer version.
-
-### Supported deployment types
-
-| Type | Threat Detection support |
-|-------------|--------------------------|
-| Docker | {{< X >}} |
-| Kubernetes | {{< X >}} |
-| Amazon ECS | {{< X >}} |
-| AWS Fargate | {{< X >}} |
-| AWS Lambda | {{< X >}} |
-
-
-## Language and framework compatibility
-
-### Node.js Version Support
-
-When the Node.js project drops support for an LTS major release line (when it goes End of Life), support for it is dropped in the next major version of `dd-trace`.
-The last major supporting release line of `dd-trace` library supports that EOL version of Node.js for at least another year on a maintenance mode basis.
-
-Some issues cannot be solved in `dd-trace` and instead must be solved in Node.js. When this happens and the Node.js release in question is EOL, it's not possible to solve the issue without moving to another non-EOL release.
-Datadog does not make new releases of `dd-trace` to provide specific support for non-LTS Node.js major release lines (odd numbered versions).
-
-For the best level of support, always run the latest LTS release of Node.js, and the latest major version of `dd-trace`. Whatever release line of Node.js you use, also use the latest version of Node.js on that release line, to ensure you have the latest security fixes.
-
-For more information about Node.js release, see the [official Node.js documentation][4].
-
-### Operating system support
-
-The following operating systems are officially supported by `dd-trace`. Any operating system not listed is still likely to work, but with some features missing, for example App and API Protection capabilities, profiling, and runtime metrics. Generally speaking, operating systems that are actively maintained at the time of initial release for a major version are supported.
-
-| Operating System | Architectures | Minimum Versions |
-|------------------|---------------|------------------------------------------|
-| Linux (glibc) | arm64, x64 | CentOS 7, Debian 9, RHEL 7, Ubuntu 14.04 |
-| Linux (musl) | arm64, x64 | Alpine 3.13 |
-| macOS | arm64, x64 | Sonoma (14.0) |
-| Windows | x64 | Windows 8.1, Windows Server 2012 |
-
-### Web framework compatibility
-
-- Attacker source HTTP request details
-- Tags for the HTTP request (status code, method, etc)
-- Distributed Tracing to see attack flows through your applications
-
-##### App and API Protection Capability Notes
-
-Although Threat Protection is available for express >= 4 versions, the blocking of payloads on the body is only supported for applications using either the [`body-parser`][45] or [`multer`][46] libraries.
-
-| Framework | Versions | Threat Detection supported? | Threat Protection supported? |
-|-----------|----------|-----------------------------|------------------------------|
-| express | `>=4` | {{< X >}} | {{< X >}} |
-| fastify | `>=2` | {{< X >}} | {{< X >}} |
-| nextjs | `>=11.1` | {{< X >}} | |
-
-If you would like to see support added for any of the unsupported capabilities or for your Node.js framework, let us know! Fill out
this short form to send details.
-
-### Networking framework compatibility
-
-**Networking tracing provides:**
-
-- Distributed tracing through your applications
-- Request-based blocking
-
-##### App and API Protection Capability Notes
-
-| Framework | Threat Detection supported? | Threat Protection supported? |
-|-----------|-----------------------------|------------------------------|
-| http | {{< X >}} | {{< X >}} |
-| https | {{< X >}} | {{< X >}} |
-
-
-
-
-### Data store compatibility
-
-**Datastore tracing provides:**
-
-- Timing request to response
-- Query info (for example, a sanitized query string)
-- Error and stacktrace capturing
-
-##### App and API Protection Capability Notes
-
-- **Threat Protection** also works at the HTTP request (input) layer, and so works for all databases by default, even those not listed in the table below.
-
-| Framework | Versions | Threat Detection supported? | Threat Protection supported? |
-|--------------------------|-----------|-----------------------------|------------------------------|
-| [@apollo/server][43] | `>=4` | {{< X >}} | {{< X >}} |
-| [apollo-server-core][44] | `>=3` | {{< X >}} | {{< X >}} |
-| [cassandra-driver][28] | `>=3` | {{< X >}} | {{< X >}} |
-| [couchbase][29] | `^2.4.2` | {{< X >}} | {{< X >}} |
-| [elasticsearch][30] | `>=10` | {{< X >}} | {{< X >}} |
-| [ioredis][31] | `>=2` | {{< X >}} | {{< X >}} |
-| [knex][32] | `>=0.8` | {{< X >}} | {{< X >}} |
-| [mariadb][5] | `>=3` | {{< X >}} | {{< X >}} |
-| [memcached][33] | `>=2.2` | {{< X >}} | {{< X >}} |
-| [mongodb-core][34] | `>=2` | {{< X >}} | {{< X >}} |
-| [mysql][35] | `>=2` | {{< X >}} | {{< X >}} |
-| [mysql2][36] | `>=1` | {{< X >}} | {{< X >}} |
-| [oracledb][37] | `>=5` | {{< X >}} | {{< X >}} |
-| [pg][38] | `>=4` | {{< X >}} | {{< X >}} |
-| [redis][39] | `>=0.12` | {{< X >}} | {{< X >}} |
-| [sharedb][40] | `>=1` | {{< X >}} | {{< X >}} |
-| [tedious][41] | `>=1` | {{< X >}} | {{< X >}} |
-| [sequelize][42] | `>=4` | {{< X >}} | {{< X >}} |
-
-### User Authentication Frameworks compatibility
-
-**Integrations to User Authentication Frameworks provide:**
-
-- User login events, including the user IDs
-- The Account Takeover detection monitoring the user login events
-
-| Framework | Minimum Framework Version |
-|-----------------|---------------------------|
-| passport-local | 1.0.0 |
-| passport-http | 0.3.0 |
-
-[1]: /tracing/trace_collection/compatibility/nodejs/
-[2]: /agent/remote_config/#enabling-remote-configuration
-[4]: https://github.com/nodejs/release#release-schedule
-[5]: https://github.com/mariadb-corporation/mariadb-connector-nodejs
-[28]: https://github.com/datastax/nodejs-driver
-[29]: https://github.com/couchbase/couchnode
-[30]: https://github.com/elastic/elasticsearch-js
-[31]: https://github.com/luin/ioredis
-[32]: https://knexjs.org
-[33]: https://github.com/3rd-Eden/memcached
-[34]: https://www.mongodb.com/docs/drivers/node/current/
-[35]: https://github.com/mysqljs/mysql
-[36]: https://github.com/sidorares/node-mysql2
-[37]: https://oracle.github.io/node-oracledb/
-[38]: https://node-postgres.com
-[39]: https://github.com/NodeRedis/node_redis
-[40]: https://share.github.io/sharedb/
-[41]: http://tediousjs.github.io/tedious
-[42]: https://github.com/sequelize/sequelize
-[43]: https://github.com/apollographql/apollo-server
-[44]: https://www.npmjs.com/package/apollo-server-core
-[45]: https://www.npmjs.com/package/body-parser
-[46]: https://www.npmjs.com/package/multer
diff --git a/content/en/security/application_security/setup/nodejs/docker.md b/content/en/security/application_security/setup/nodejs/docker.md
index 94d77df946c..189686bacf9 100644
--- a/content/en/security/application_security/setup/nodejs/docker.md
+++ b/content/en/security/application_security/setup/nodejs/docker.md
@@ -118,5 +118,5 @@ If you encounter issues while setting up App and API Protection for your Node.js
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/nodejs/compatibility
+[1]: /security/application_security/setup/compatibility/nodejs
[2]: /security/application_security/setup/nodejs/troubleshooting
diff --git a/content/en/security/application_security/setup/nodejs/kubernetes.md b/content/en/security/application_security/setup/nodejs/kubernetes.md
index c45917ab20f..ef45e36be25 100644
--- a/content/en/security/application_security/setup/nodejs/kubernetes.md
+++ b/content/en/security/application_security/setup/nodejs/kubernetes.md
@@ -128,5 +128,5 @@ If you encounter issues while setting up App and API Protection for your Node.js
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/nodejs/compatibility
+[1]: /security/application_security/setup/compatibility/nodejs
[2]: /security/application_security/setup/nodejs/troubleshooting
diff --git a/content/en/security/application_security/setup/nodejs/linux.md b/content/en/security/application_security/setup/nodejs/linux.md
index 09042ce68e0..248a7d0fab6 100644
--- a/content/en/security/application_security/setup/nodejs/linux.md
+++ b/content/en/security/application_security/setup/nodejs/linux.md
@@ -79,5 +79,5 @@ If you encounter issues while setting up App and API Protection for your Node.js
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/nodejs/compatibility
+[1]: /security/application_security/setup/compatibility/nodejs
[2]: /security/application_security/setup/nodejs/troubleshooting
diff --git a/content/en/security/application_security/setup/nodejs/macos.md b/content/en/security/application_security/setup/nodejs/macos.md
index e7f485e075e..5aba0145081 100644
--- a/content/en/security/application_security/setup/nodejs/macos.md
+++ b/content/en/security/application_security/setup/nodejs/macos.md
@@ -77,5 +77,5 @@ If you encounter issues while setting up App and API Protection for your Node.js
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/nodejs/compatibility
+[1]: /security/application_security/setup/compatibility/nodejs
[2]: /security/application_security/setup/nodejs/troubleshooting
diff --git a/content/en/security/application_security/setup/nodejs/troubleshooting.md b/content/en/security/application_security/setup/nodejs/troubleshooting.md
index 45dad57cb19..371e2798166 100644
--- a/content/en/security/application_security/setup/nodejs/troubleshooting.md
+++ b/content/en/security/application_security/setup/nodejs/troubleshooting.md
@@ -73,7 +73,7 @@ If you're still experiencing problems:
4. Contact [Datadog support][5].
[1]: /security/application_security/troubleshooting
-[2]: /security/application_security/setup/nodejs/compatibility
+[2]: /security/application_security/setup/compatibility/nodejs
[3]: /tracing/trace_collection/compatibility/nodejs/#performance
[4]: /tracing/trace_collection/compatibility/nodejs/
[5]: /help
diff --git a/content/en/security/application_security/setup/nodejs/windows.md b/content/en/security/application_security/setup/nodejs/windows.md
index 9be676015f6..e7526186d7a 100644
--- a/content/en/security/application_security/setup/nodejs/windows.md
+++ b/content/en/security/application_security/setup/nodejs/windows.md
@@ -85,5 +85,5 @@ If you encounter issues while setting up App and API Protection for your Node.js
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/nodejs/compatibility
+[1]: /security/application_security/setup/compatibility/nodejs
[2]: /security/application_security/setup/nodejs/troubleshooting
diff --git a/content/en/security/application_security/setup/php/_index.md b/content/en/security/application_security/setup/php/_index.md
index 954a9a969ec..32296466f96 100644
--- a/content/en/security/application_security/setup/php/_index.md
+++ b/content/en/security/application_security/setup/php/_index.md
@@ -9,6 +9,7 @@ aliases:
- /security/application_security/setup/threat_detection/php
- /security/application_security/setup/standalone/php
- /security/application_security/enabling/compatibility/php
+ - /security/application_security/setup/php/compatibility
---
{{< partial name="app_and_api_protection/callout.html" >}}
@@ -45,4 +46,4 @@ aliases:
## Additional Resources
- [Troubleshooting Guide](/security/application_security/setup/php/troubleshooting)
-- [Compatibility Information](/security/application_security/setup/php/compatibility)
+- [Compatibility Information](/security/application_security/setup/compatibility/php)
diff --git a/content/en/security/application_security/setup/php/aws-fargate.md b/content/en/security/application_security/setup/php/aws-fargate.md
index 79584772e7b..a5100fe9ac3 100644
--- a/content/en/security/application_security/setup/php/aws-fargate.md
+++ b/content/en/security/application_security/setup/php/aws-fargate.md
@@ -174,5 +174,5 @@ If you encounter issues while setting up App and API Protection for your PHP app
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/php/compatibility
+[1]: /security/application_security/setup/compatibility/php
[2]: /security/application_security/setup/php/troubleshooting
diff --git a/content/en/security/application_security/setup/php/compatibility.md b/content/en/security/application_security/setup/php/compatibility.md
deleted file mode 100644
index 4e7a5154f4d..00000000000
--- a/content/en/security/application_security/setup/php/compatibility.md
+++ /dev/null
@@ -1,141 +0,0 @@
----
-title: PHP Compatibility Requirements
----
-
-## App and API Protection capabilities support
-
-The following App and API Protection capabilities are supported in the PHP library, for the specified tracer version:
-
-| App and API Protection capability | Minimum PHP tracer version |
-| -------------------------------- |----------------------------|
-| Threat Detection | 0.84.0 |
-| Threat Protection | 0.86.0 |
-| Customize response to blocked requests | 0.86.0 |
-| Automatic user activity event tracking | 0.89.0 |
-| API Security | 0.98.0 |
-
-The minimum tracer version to get all supported App and API Protection capabilities for PHP is 0.98.0.
-
-
-
-
-### Supported deployment types
-| Type | Threat Detection support |
-|-------------|--------------------------|
-| Docker | {{< X >}} |
-| Kubernetes | {{< X >}} |
-| Amazon ECS | {{< X >}} |
-| AWS Fargate | {{< X >}} |
-| AWS Lambda | |
-
-## Language and framework compatibility
-
-
-
-| PHP Version | Support level | Package version |
-|:---------------|:--------------------------------------|:----------------|
-| 8.3.x | General Availability | > `0.95.0+` |
-| 8.2.x | General Availability | > `0.82.0+` |
-| 8.1.x | General Availability | > `0.66.0+` |
-| 8.0.x | General Availability | > `0.52.0+` |
-| 7.4.x | General Availability | All |
-| 7.3.x | General Availability | All |
-| 7.2.x | General Availability | All |
-| 7.1.x | General Availability | All |
-| 7.0.x | General Availability | All |
-
-App and API Protection capabilities for PHP support the following SAPI's:
-
-| SAPI | Support type |
-|:---------------|:----------------|
-| apache2handler | Fully Supported |
-| cli | Fully Supported |
-| fpm-fcgi | Fully Supported |
-| cgi-fcgi | Fully Supported |
-| FrankenPHP | Fully Supported |
-
-## Supported processor architectures
-
-App and API Protection capabilities for PHP support the following architectures:
-
-| Processor architectures | Support level | Package version |
-| ------------------------------------------|-----------------------|----------------------------------------|
-| Linux GNU amd64 (`x86-64-linux-gnu`) | GA | All |
-| Linux MUSL amd64 (`x86-64-linux-musl`) | GA | All |
-| Linux GNU arm64 (aarch64-linux-gnu) | GA | > `0.95.0` |
-| Linux MUSL arm64 (aarch64-linux-musl) | GA | > `0.95.0` |
-| Windows | Not supported | |
-
-The Datadog PHP library supports PHP version 7.0 and above on the following architectures:
-
-- Linux (GNU) x86-64 and arm64
-- Alpine Linux (musl) x86-64 and arm64
-
-The library supports the use of all PHP frameworks, and also the use of no framework.
-
-
-### Web framework compatibility
-
-- Attacker source HTTP request details
-- Tags for the HTTP request (status code, method, etc)
-- Distributed Tracing to see attack flows through your applications
-
-##### App and API Protection Capability Notes
-
-The following frameworks aren't directly instrumented by App and API Protection, but indirectly supported through runtime instrumentation.
-
-| Framework | Versions | Threat Detection supported? | Threat Protection supported? |
-| ------------------------ | ----------- | --------------- | ---------------------------------------------- |
-| CakePHP | 2.x | {{< X >}} | {{< X >}} |
-| CodeIgniter | 2.x | {{< X >}} | {{< X >}} |
-| FuelPHP | 1.1 | {{< X >}} | {{< X >}} |
-| Laravel | 4.2, 5.x, 6.x, 8.x(tracer 0.52.0+), 9.x, 10.x | {{< X >}} | {{< X >}} |
-| Lumen | 5.2+ | {{< X >}} | {{< X >}} |
-| Magento | 1, 2 | {{< X >}} | {{< X >}} |
-| Neos Flow | 3.0.x | {{< X >}} | {{< X >}} |
-| Phalcon | 3.1+ | {{< X >}} | {{< X >}} |
-| Slim | 3.1+ | {{< X >}} | {{< X >}} |
-| Symfony | 3.1+, 4.x, 5.x, 6.x | {{< X >}} | {{< X >}} |
-| Wordpress | 3.1+, 4.x, 5.x, 6.x | {{< X >}} | {{< X >}} |
-| Yii | 3.1+ | {{< X >}} | {{< X >}} |
-| Zend | 3.1+ | {{< X >}} | {{< X >}} |
-| RoadRunner | 2.x | {{< X >}} | {{< X >}} |
-
-
-### Data store compatibility
-
-**Datastore tracing provides:**
-
-- SQL attack detection
-- query info (for example, a sanitized query string)
-- error and stacktrace capturing
-
-##### App and API Protection Capability Notes
-- **Threat Protection** also works at the HTTP request (input) layer, and so works for all databases by default, even those not listed in the table below.
-
-| Framework | Versions | Threat Detection supported? | Threat Protection supported?|
-|-------------------|-----------------|-----------------|---------------|
-| Amazon RDS | Any supported PHP | {{< X >}} | {{< X >}} |
-| Eloquent | Laravel supported versions | {{< X >}} | {{< X >}} |
-| Memcached | Any supported PHP | {{< X >}} | {{< X >}} |
-| MySQLi | Any supported PHP | {{< X >}} | {{< X >}} |
-| PDO | Any supported PHP| {{< X >}}| {{< X >}} |
-| PHPRedis | 3, 4, 5 | {{< X >}} | {{< X >}} |
-| Predis | 1.1 | {{< X >}} | {{< X >}} |
-
-### User Authentication Frameworks compatibility
-
-**Integrations to User Authentication Frameworks provide:**
-
-- User login events, including the user IDs
-- Account Takeover detection monitoring for user login events
-
-| Framework | Minimum Framework Version |
-|-----------|---------------------------|
-| Laravel | 4.2 |
-| Symfony | 3.3 |
-| Wordpress | 4.8 |
-
diff --git a/content/en/security/application_security/setup/php/docker.md b/content/en/security/application_security/setup/php/docker.md
index 00832cd52fe..a9295d76e9d 100644
--- a/content/en/security/application_security/setup/php/docker.md
+++ b/content/en/security/application_security/setup/php/docker.md
@@ -96,5 +96,5 @@ If you encounter issues while setting up App and API Protection for your PHP app
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/php/compatibility
+[1]: /security/application_security/setup/compatibility/php
[2]: /security/application_security/setup/php/troubleshooting
diff --git a/content/en/security/application_security/setup/php/kubernetes.md b/content/en/security/application_security/setup/php/kubernetes.md
index 7db4b5cb991..b0f1572d291 100644
--- a/content/en/security/application_security/setup/php/kubernetes.md
+++ b/content/en/security/application_security/setup/php/kubernetes.md
@@ -120,5 +120,5 @@ If you encounter issues while setting up App and API Protection for your PHP app
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/php/compatibility
+[1]: /security/application_security/setup/compatibility/php
[2]: /security/application_security/setup/php/troubleshooting
diff --git a/content/en/security/application_security/setup/php/linux.md b/content/en/security/application_security/setup/php/linux.md
index 45d6336fcc5..d769668c0ed 100644
--- a/content/en/security/application_security/setup/php/linux.md
+++ b/content/en/security/application_security/setup/php/linux.md
@@ -87,5 +87,5 @@ If you encounter issues while setting up App and API Protection for your PHP app
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/php/compatibility
+[1]: /security/application_security/setup/compatibility/php
[2]: /security/application_security/setup/php/troubleshooting
diff --git a/content/en/security/application_security/setup/python/_index.md b/content/en/security/application_security/setup/python/_index.md
index 294b54bec0e..2b29f4226d5 100644
--- a/content/en/security/application_security/setup/python/_index.md
+++ b/content/en/security/application_security/setup/python/_index.md
@@ -9,6 +9,7 @@ aliases:
- /security/application_security/setup/threat_detection/python
- /security/application_security/setup/standalone/python
- /security/application_security/enabling/python
+ - /security/application_security/setup/python/compatibility
further_reading:
- link: "/security/application_security/how-it-works/add-user-info/?tab=python"
tag: "Documentation"
@@ -61,4 +62,4 @@ further_reading:
## Additional Resources
- [Troubleshooting Guide](/security/application_security/setup/python/troubleshooting)
-- [Compatibility Information](/security/application_security/setup/python/compatibility)
+- [Compatibility Information](/security/application_security/setup/compatibility/python)
diff --git a/content/en/security/application_security/setup/python/aws-fargate.md b/content/en/security/application_security/setup/python/aws-fargate.md
index b4b9b15c08d..1a0b85d572f 100644
--- a/content/en/security/application_security/setup/python/aws-fargate.md
+++ b/content/en/security/application_security/setup/python/aws-fargate.md
@@ -165,5 +165,5 @@ If you encounter issues while setting up App and API Protection for your Python
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/setup/python/troubleshooting
diff --git a/content/en/security/application_security/setup/python/compatibility.md b/content/en/security/application_security/setup/python/compatibility.md
deleted file mode 100644
index 1fce454df99..00000000000
--- a/content/en/security/application_security/setup/python/compatibility.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: Python App and API Protection Compatibility
-code_lang: python
-type: multi-code-lang
-code_lang_weight: 10
-further_reading:
- - link: "/security/application_security/how-it-works/"
- tag: "Documentation"
- text: "How App and API Protection Works"
- - link: "/security/default_rules/?category=cat-application-security"
- tag: "Documentation"
- text: "OOTB App and API Protection Rules"
- - link: "/security/application_security/troubleshooting"
- tag: "Documentation"
- text: "Troubleshooting App and API Protection"
----
-
-## App and API Protection capabilities support
-
-The following App and API Protection capabilities are supported in the Python library, for the specified tracer version:
-
-{{< partial name="app_and_api_protection/python/capabilities.html" >}}
-
-Datadog strongly encourages you to always use the last stable release of the SDK.
-
-Threat Protection requires enabling [Remote Configuration][2], which is included in the listed minimum tracer version.
-
-### Supported deployment types
-
-| Type | Threat Detection support |
-|-------------|--------------------------|
-| Docker | {{< X >}} |
-| Kubernetes | {{< X >}} |
-| Amazon ECS | {{< X >}} |
-| AWS Fargate | {{< X >}} |
-| AWS Lambda | {{< X >}} |
-
-
-## Language and framework compatibility
-
-### Supported Python versions
-
-The Python App and API Protection Client library follows a [versioning policy][3] that specifies the support level for the different versions of the library and Python runtime.
-
-Two release branches are supported:
-
-{{< partial name="trace_collection/python/supported_versions.html" >}}
-
-And the library supports the following runtimes:
-
-{{< partial name="trace_collection/python/supported_runtimes.html" >}}
-
-### Web framework compatibility
-
-- Attacker source HTTP request details
-- Tags for the HTTP request (status code, method, etc)
-- Distributed Tracing to see attack flows through your applications
-
-### Supported frameworks
-
-**Note:** Tornado support is available starting in ddtrace Python version 4.4.
-
-| Framework | Versions | Threat Detection supported? | Threat Protection supported? |
-|-----------|------------|-----------------------------|------------------------------|
-| Django | 2.2 | {{< X >}} | {{< X >}} |
-| FastAPI | 0.86 | {{< X >}} | {{< X >}} |
-| Flask | 1.1 | {{< X >}} | {{< X >}} |
-| Tornado | 6.3 | {{< X >}} | {{< X >}} |
-
-
-
-
-### Data store compatibility
-
-
-**Datastore tracing provides:**
-
-- timing request to response
-- query info (for example, a sanitized query string)
-- error and stacktrace capturing
-
-##### App and API Protection Capability Notes
-
-- **Threat Protection** also works at the HTTP request (input) layer, and so works for all databases by default, even those not listed in the table below.
-
-The Python library supports the [database API specifications][4] and supports all generic SQL databases. This includes databases such as SQLite, MySQL, PostgreSQL, and MariaDB.
-
-### User Authentication Frameworks compatibility
-
-**Integrations to User Authentication Frameworks provide:**
-
-- User login events, including the user IDs
-- Account Takeover detection monitoring for user login events
-
-| Framework | Framework Versions |
-|------------------|------------------------|
-| Django | 1.11, 2.2, 3.2, >= 4.0 |
-
-[1]: /tracing/trace_collection/compatibility/python/
-[2]: /agent/remote_config/#enabling-remote-configuration
-[3]: https://ddtrace.readthedocs.io/en/stable/versioning.html
-[4]: https://peps.python.org/pep-0249/
diff --git a/content/en/security/application_security/setup/python/docker.md b/content/en/security/application_security/setup/python/docker.md
index 39f5305fccd..b1f4aeba7de 100644
--- a/content/en/security/application_security/setup/python/docker.md
+++ b/content/en/security/application_security/setup/python/docker.md
@@ -99,5 +99,5 @@ If you encounter issues while setting up App and API Protection for your Python
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/setup/python/troubleshooting
diff --git a/content/en/security/application_security/setup/python/kubernetes.md b/content/en/security/application_security/setup/python/kubernetes.md
index 060ef39594b..d39aad17a4e 100644
--- a/content/en/security/application_security/setup/python/kubernetes.md
+++ b/content/en/security/application_security/setup/python/kubernetes.md
@@ -121,5 +121,5 @@ If you encounter issues while setting up App and API Protection for your Python
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/setup/python/troubleshooting
diff --git a/content/en/security/application_security/setup/python/linux.md b/content/en/security/application_security/setup/python/linux.md
index c8a6b6ff242..2baa8a5839c 100644
--- a/content/en/security/application_security/setup/python/linux.md
+++ b/content/en/security/application_security/setup/python/linux.md
@@ -90,5 +90,5 @@ If you encounter issues while setting up App and API Protection for your Python
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/setup/python/troubleshooting
diff --git a/content/en/security/application_security/setup/python/macos.md b/content/en/security/application_security/setup/python/macos.md
index 27edc17444b..9d514fa78d3 100644
--- a/content/en/security/application_security/setup/python/macos.md
+++ b/content/en/security/application_security/setup/python/macos.md
@@ -88,5 +88,5 @@ If you encounter issues while setting up App and API Protection for your Python
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/setup/python/troubleshooting
diff --git a/content/en/security/application_security/setup/python/troubleshooting.md b/content/en/security/application_security/setup/python/troubleshooting.md
index 553bffbd67a..48ed81a54c0 100644
--- a/content/en/security/application_security/setup/python/troubleshooting.md
+++ b/content/en/security/application_security/setup/python/troubleshooting.md
@@ -92,7 +92,7 @@ If you're still experiencing problems:
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/troubleshooting
[3]: /tracing/trace_collection/compatibility/python
[4]: /help
diff --git a/content/en/security/application_security/setup/python/windows.md b/content/en/security/application_security/setup/python/windows.md
index abd9432770e..d15341c8d97 100644
--- a/content/en/security/application_security/setup/python/windows.md
+++ b/content/en/security/application_security/setup/python/windows.md
@@ -85,5 +85,5 @@ If you encounter issues while setting up App and API Protection for your Python
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/python/compatibility
+[1]: /security/application_security/setup/compatibility/python
[2]: /security/application_security/setup/python/troubleshooting
diff --git a/content/en/security/application_security/setup/ruby/_index.md b/content/en/security/application_security/setup/ruby/_index.md
index f19214f2194..67ed291f009 100644
--- a/content/en/security/application_security/setup/ruby/_index.md
+++ b/content/en/security/application_security/setup/ruby/_index.md
@@ -10,6 +10,7 @@ aliases:
- /security/application_security/setup/standalone/ruby
- /security/application_security/setup/threat_detection/ruby
- /security/application_security/enabling/ruby
+ - /security/application_security/setup/ruby/compatibility
further_reading:
- link: "/security/application_security/add-user-info/"
tag: "Documentation"
@@ -64,5 +65,5 @@ further_reading:
## Additional Resources
-- [Compatibility Information](/security/application_security/setup/ruby/compatibility)
+- [Compatibility Information](/security/application_security/setup/compatibility/ruby)
- [Troubleshooting Guide](/security/application_security/setup/ruby/troubleshooting)
diff --git a/content/en/security/application_security/setup/ruby/aws-fargate.md b/content/en/security/application_security/setup/ruby/aws-fargate.md
index 8ffd1749549..244e2bddb5a 100644
--- a/content/en/security/application_security/setup/ruby/aws-fargate.md
+++ b/content/en/security/application_security/setup/ruby/aws-fargate.md
@@ -251,5 +251,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/ruby/compatibility
+[1]: /security/application_security/setup/compatibility/ruby
[2]: /security/application_security/setup/ruby/troubleshooting
diff --git a/content/en/security/application_security/setup/ruby/compatibility.md b/content/en/security/application_security/setup/ruby/compatibility.md
deleted file mode 100644
index ddc0d4c7b71..00000000000
--- a/content/en/security/application_security/setup/ruby/compatibility.md
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: Ruby Compatibility Requirements
-aliases:
- - /security/application_security/threats/setup/compatibility/ruby
----
-
-## App and API Protection capabilities
-
-The following App and API Protection capabilities are supported in the Ruby library, for the specified tracer version:
-
-| App and API Protection capability | Minimum Ruby tracer version |
-| -------------------------------------------------- | --------------------------- |
-| Threat Detection | 1.9.0 |
-| Threat Protection | 1.11.0 |
-| Customize response to blocked requests | 1.15.0 |
-| Automatic user activity event tracking | 1.14.0 |
-| API Security | 2.17.0 |
-
-The minimum tracer version to get all supported App and API Protection capabilities for Ruby is 2.17.0.
-
-### Supported deployment types
-
-| Type | Threat Detection support |
-|------------------ | ------------------------ |
-| Docker | {{< X >}} |
-| Kubernetes | {{< X >}} |
-| Amazon ECS | {{< X >}} |
-| AWS Fargate | {{< X >}} |
-| AWS Lambda | |
-| Google Cloud Run | |
-
-## Language and framework compatibility
-
-### Supported Ruby interpreters
-
-The Datadog Ruby SDK is open source. View the [GitHub repository][1] for more information.
-
-- MRI versions 2.5 to 3.5
-- JRuby versions 9.2.21.0+ and 9.4
-
-These are supported on the following architectures:
-
-- Linux (GNU) x86-64, aarch64
-- Alpine Linux (musl) x86-64, aarch64
-- macOS (Darwin) x86-64, arm64
-
-You must be running Datadog Agent v7.41.1+ for App and API Protection features.
-
-## Integrations
-
-The Ruby tracer includes support for the following frameworks, ORMs, and libraries:
-
-### Web and API frameworks
-
-- Rails
-- Sinatra
-- Grape
-
-### ORMs
-
-- ActiveRecord
-
-### HTTP clients
-
-- Faraday
-- Excon
-- RestClient
-
-### Other
-
-- GraphQL
-- Rack
-
-
-[1]: https://github.com/DataDog/dd-trace-rb
diff --git a/content/en/security/application_security/setup/ruby/docker.md b/content/en/security/application_security/setup/ruby/docker.md
index 2a0a164b6f9..822d0efbd75 100644
--- a/content/en/security/application_security/setup/ruby/docker.md
+++ b/content/en/security/application_security/setup/ruby/docker.md
@@ -170,5 +170,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/ruby/compatibility
+[1]: /security/application_security/setup/compatibility/ruby
[2]: /security/application_security/setup/ruby/troubleshooting
diff --git a/content/en/security/application_security/setup/ruby/kubernetes.md b/content/en/security/application_security/setup/ruby/kubernetes.md
index 35f17502df8..ef17f1aa4d6 100644
--- a/content/en/security/application_security/setup/ruby/kubernetes.md
+++ b/content/en/security/application_security/setup/ruby/kubernetes.md
@@ -208,5 +208,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/ruby/compatibility
+[1]: /security/application_security/setup/compatibility/ruby
[2]: /security/application_security/setup/ruby/troubleshooting
diff --git a/content/en/security/application_security/setup/ruby/linux.md b/content/en/security/application_security/setup/ruby/linux.md
index 5d77df009d6..d1b1030849d 100644
--- a/content/en/security/application_security/setup/ruby/linux.md
+++ b/content/en/security/application_security/setup/ruby/linux.md
@@ -188,5 +188,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/ruby/compatibility
+[1]: /security/application_security/setup/compatibility/ruby
[2]: /security/application_security/setup/ruby/troubleshooting
diff --git a/content/en/security/application_security/setup/ruby/macos.md b/content/en/security/application_security/setup/ruby/macos.md
index 5373e850065..bf779c83bee 100644
--- a/content/en/security/application_security/setup/ruby/macos.md
+++ b/content/en/security/application_security/setup/ruby/macos.md
@@ -187,5 +187,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap
{{< partial name="whats-next/whats-next.html" >}}
-[1]: /security/application_security/setup/ruby/compatibility
+[1]: /security/application_security/setup/compatibility/ruby
[2]: /security/application_security/setup/ruby/troubleshooting
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md b/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md
index 2988f58133d..d934986c4ab 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md
@@ -84,7 +84,7 @@ logger.LogInformation("Hello World!");
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/go.md b/content/en/serverless/google_cloud_run/containers/in_container/go.md
index 62f6c7cc095..c2d96cc4d94 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/go.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/go.md
@@ -79,7 +79,7 @@ go get github.com/DataDog/dd-trace-go/contrib/net/http/v2
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/java.md b/content/en/serverless/google_cloud_run/containers/in_container/java.md
index 2691938d45f..2c3df9b2ccb 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/java.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/java.md
@@ -96,7 +96,7 @@ logger.info("Hello World!");
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md b/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md
index bff6d73a43c..603d69c13b5 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md
@@ -147,7 +147,7 @@ gcloud pubsub subscriptions update \
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/php.md b/content/en/serverless/google_cloud_run/containers/in_container/php.md
index a5f69a6ee28..f609636f4e3 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/php.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/php.md
@@ -63,7 +63,7 @@ apk add libgcc
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/python.md b/content/en/serverless/google_cloud_run/containers/in_container/python.md
index 0620c511d5f..426cd01d934 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/python.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/python.md
@@ -96,7 +96,7 @@ logger.info("Hello world!")
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/serverless/google_cloud_run/containers/in_container/ruby.md b/content/en/serverless/google_cloud_run/containers/in_container/ruby.md
index 619649faa67..076eb6e240a 100644
--- a/content/en/serverless/google_cloud_run/containers/in_container/ruby.md
+++ b/content/en/serverless/google_cloud_run/containers/in_container/ruby.md
@@ -66,7 +66,7 @@ logger.info "Hello world!"
## Troubleshooting
-{{% serverless-init-troubleshooting productNames="Cloud Run services" %}}
+{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}}
## Further reading
diff --git a/content/en/tracing/trace_collection/compatibility/java.md b/content/en/tracing/trace_collection/compatibility/java.md
index 660d218eed0..4810d844da4 100644
--- a/content/en/tracing/trace_collection/compatibility/java.md
+++ b/content/en/tracing/trace_collection/compatibility/java.md
@@ -105,7 +105,7 @@ Integrations in Preview are disabled by default but can be enabled individually:
| Ratpack | 1.5+ | Fully Supported | `ratpack` |
| Restlet HTTP Server | 2.2 - 2.4 | Fully Supported | `restlet-http`. |
| Spark Java | 2.3+ | [Preview](#framework-integrations-disabled-by-default) | `sparkjava` (requires `jetty`) |
-| Spring Boot | 1.5+ | Fully Supported | `spring-web` or `spring-webflux` |
+| Spring Boot | 1.5 - 3.X | Fully Supported | `spring-web` or `spring-webflux` |
| Spring Web (MVC) | 4.0+ | Fully Supported | `spring-web` |
| Spring WebFlux | 5.0+ | Fully Supported | `spring-webflux` |
| Tomcat | 5.5+ | Fully Supported | `tomcat` |
diff --git a/data/api/v2/full_spec.yaml b/data/api/v2/full_spec.yaml
index cd47e5637db..f249d8ddf0d 100644
--- a/data/api/v2/full_spec.yaml
+++ b/data/api/v2/full_spec.yaml
@@ -13171,6 +13171,20 @@ components:
BudgetAttributes:
description: The attributes of a budget.
properties:
+ costs:
+ $ref: "#/components/schemas/BudgetAttributesCosts"
+ description: Aggregated cost data for the budget. Present only when `actual=true` or `forecast=true` is requested.
+ costs_period_end:
+ description: The end of the period used to compute cost data, in milliseconds since epoch.
+ format: int64
+ type: integer
+ costs_period_start:
+ description: The start of the period used to compute cost data, in milliseconds since epoch.
+ format: int64
+ type: integer
+ costs_unit:
+ $ref: "#/components/schemas/BudgetAttributesCostsUnit"
+ description: The unit used for all cost values in the response.
created_at:
description: The timestamp when the budget was created.
example: 1738258683590
@@ -13223,6 +13237,53 @@ components:
example: 00000000-0a0a-0a0a-aaa0-00000000000a
type: string
type: object
+ BudgetAttributesCosts:
+ description: Aggregated cost data for the budget over the requested period.
+ properties:
+ actual:
+ description: The total actual cost. Present only when `actual=true` is requested.
+ format: double
+ nullable: true
+ type: number
+ amount:
+ description: The total budgeted amount over the requested period.
+ format: double
+ nullable: true
+ type: number
+ forecast:
+ description: The total forecast cost, with any custom forecast overrides applied. Present only when `forecast=true` is requested.
+ format: double
+ nullable: true
+ type: number
+ ootb_forecast:
+ description: The out-of-the-box ML forecast before custom overrides. Present only when `forecast=true` is requested.
+ format: double
+ nullable: true
+ type: number
+ type: object
+ BudgetAttributesCostsUnit:
+ description: The unit used for all cost values in the response.
+ properties:
+ family:
+ description: The unit family (for example, `currency`).
+ type: string
+ id:
+ description: The unique identifier for the unit.
+ type: string
+ name:
+ description: The full name of the unit.
+ type: string
+ plural:
+ description: The plural form of the unit name.
+ type: string
+ scale_factor:
+ description: The scale factor applied to raw cost values.
+ format: double
+ type: number
+ short_name:
+ description: The abbreviated unit name.
+ type: string
+ type: object
BudgetValidationRequest:
description: The request object for validating a budget configuration before creating or updating it.
example:
@@ -13388,6 +13449,9 @@ components:
description: The budgeted amount for this entry.
format: double
type: number
+ costs:
+ $ref: "#/components/schemas/BudgetWithEntriesDataAttributesEntriesItemsCosts"
+ description: Cost data for this entry. Present only when `actual=true` or `forecast=true` is requested.
month:
description: The month this budget entry applies to, in YYYYMM format.
format: int64
@@ -13398,6 +13462,36 @@ components:
$ref: "#/components/schemas/BudgetWithEntriesDataAttributesEntriesItemsTagFiltersItems"
type: array
type: object
+ BudgetWithEntriesDataAttributesEntriesItemsCosts:
+ description: Cost data for a single budget entry.
+ properties:
+ actual:
+ description: The actual cost for this entry. Present only when `actual=true` is requested.
+ format: double
+ nullable: true
+ type: number
+ amount:
+ description: The budgeted amount for this entry.
+ format: double
+ nullable: true
+ type: number
+ custom_forecast:
+ description: |-
+ The custom forecast override for this entry. `null` when `forecast=true` is requested but no custom forecast has been set for this entry's month. A numeric value, including `0`, indicates an explicit custom forecast override. Omitted when `forecast=false` or the feature is not available for the organization.
+ format: double
+ nullable: true
+ type: number
+ forecast:
+ description: The final forecast for this entry, with any custom forecast override applied. Present only when `forecast=true` is requested.
+ format: double
+ nullable: true
+ type: number
+ ootb_forecast:
+ description: The out-of-the-box ML forecast for this entry, before custom overrides. Present only when `forecast=true` is requested.
+ format: double
+ nullable: true
+ type: number
+ type: object
BudgetWithEntriesDataAttributesEntriesItemsTagFiltersItems:
description: A tag filter used to scope a budget entry to specific resource tags.
properties:
@@ -25075,7 +25169,7 @@ components:
text: "Example annotation."
connectionEnvs:
- connections:
- - connectionId: "11111111-1111-1111-1111-111111111111"
+ - connectionId: "e1e64943-c7c5-4487-aece-25aaec7d3aad"
label: "INTEGRATION_DATADOG"
env: "default"
handle: "my-handle"
@@ -27070,6 +27164,156 @@ components:
$ref: "#/components/schemas/CustomDestinationResponseDefinition"
type: array
type: object
+ CustomForecastEntry:
+ description: A monthly entry of a custom budget forecast.
+ properties:
+ amount:
+ description: Forecast amount for the month.
+ example: 400
+ format: double
+ type: number
+ month:
+ description: Month the custom forecast entry applies to, in `YYYYMM` format.
+ example: 202501
+ format: int64
+ type: integer
+ tag_filters:
+ description: Tag filters that scope this custom forecast entry to specific resources.
+ items:
+ $ref: "#/components/schemas/CustomForecastEntryTagFilter"
+ type: array
+ required:
+ - month
+ - amount
+ - tag_filters
+ type: object
+ CustomForecastEntryTagFilter:
+ description: A tag filter that scopes a custom forecast entry to specific resource tags.
+ properties:
+ tag_key:
+ description: The tag key to filter on.
+ example: service
+ type: string
+ tag_value:
+ description: The tag value to filter on.
+ example: ec2
+ type: string
+ required:
+ - tag_key
+ - tag_value
+ type: object
+ CustomForecastResponse:
+ description: Response object containing the custom forecast for a budget.
+ properties:
+ data:
+ $ref: "#/components/schemas/CustomForecastResponseData"
+ required:
+ - data
+ type: object
+ CustomForecastResponseData:
+ description: Custom forecast resource wrapper in a response.
+ properties:
+ attributes:
+ $ref: "#/components/schemas/CustomForecastResponseDataAttributes"
+ id:
+ description: The unique identifier of the custom forecast.
+ example: 11111111-1111-1111-1111-111111111111
+ type: string
+ type:
+ $ref: "#/components/schemas/CustomForecastType"
+ required:
+ - id
+ - type
+ - attributes
+ type: object
+ CustomForecastResponseDataAttributes:
+ description: Attributes of a custom forecast.
+ properties:
+ budget_uid:
+ description: The UUID of the budget that this custom forecast belongs to.
+ example: 00000000-0000-0000-0000-000000000001
+ type: string
+ created_at:
+ description: Timestamp the custom forecast was created, in Unix milliseconds.
+ example: 1738258683590
+ format: int64
+ type: integer
+ created_by:
+ description: The id of the user that created the custom forecast.
+ example: 00000000-0a0a-0a0a-aaa0-00000000000a
+ type: string
+ entries:
+ description: Monthly custom forecast entries.
+ items:
+ $ref: "#/components/schemas/CustomForecastEntry"
+ type: array
+ updated_at:
+ description: Timestamp the custom forecast was last updated, in Unix milliseconds.
+ example: 1738258683590
+ format: int64
+ type: integer
+ updated_by:
+ description: The id of the user that last updated the custom forecast.
+ example: 00000000-0a0a-0a0a-aaa0-00000000000a
+ type: string
+ required:
+ - budget_uid
+ - created_at
+ - updated_at
+ - created_by
+ - updated_by
+ - entries
+ type: object
+ CustomForecastType:
+ default: custom_forecast
+ description: The type of the custom forecast resource. Must be `custom_forecast`.
+ enum:
+ - custom_forecast
+ example: custom_forecast
+ type: string
+ x-enum-varnames:
+ - CUSTOM_FORECAST
+ CustomForecastUpsertRequest:
+ description: Request body to upsert (create or replace) the custom forecast for a budget.
+ properties:
+ data:
+ $ref: "#/components/schemas/CustomForecastUpsertRequestData"
+ required:
+ - data
+ type: object
+ CustomForecastUpsertRequestData:
+ description: Custom forecast resource wrapper in an upsert request.
+ properties:
+ attributes:
+ $ref: "#/components/schemas/CustomForecastUpsertRequestDataAttributes"
+ id:
+ description: Unused on upsert; the resource is keyed by `budget_uid`. Send an empty string.
+ example: ""
+ type: string
+ type:
+ $ref: "#/components/schemas/CustomForecastType"
+ required:
+ - type
+ - attributes
+ type: object
+ CustomForecastUpsertRequestDataAttributes:
+ description: Attributes of a custom forecast upsert request.
+ properties:
+ budget_uid:
+ description: The UUID of the budget that this custom forecast belongs to.
+ example: 00000000-0000-0000-0000-000000000001
+ type: string
+ entries:
+ description: |-
+ Monthly custom forecast entries. An empty list deletes any existing
+ custom forecast for the budget.
+ items:
+ $ref: "#/components/schemas/CustomForecastEntry"
+ type: array
+ required:
+ - budget_uid
+ - entries
+ type: object
CustomFrameworkControl:
description: Framework Control.
properties:
@@ -35038,6 +35282,12 @@ components:
$ref: "#/components/schemas/ExternalUserMeta"
name:
$ref: "#/components/schemas/ExternalUserNameType"
+ roles:
+ description: Datadog roles assigned to the user. Provide the role UUID in `value` when provisioning or updating roles through SCIM.
+ items:
+ $ref: "#/components/schemas/ExternalUserRole"
+ maxItems: 50
+ type: array
schemas:
description: User JSON Schemas.
example:
@@ -35233,10 +35483,12 @@ components:
$ref: "#/components/schemas/ExternalUserPatchRequestOperationsItemsOp"
path:
description: An attribute path describing the target of the operation.
- example: title
+ example: roles
type: string
value:
- description: New value to use for the patch operation.
+ description: New value to use for the patch operation. When `path` is `roles`, use an array of role objects with each role UUID in `value`.
+ example:
+ - value: 00000000-0000-0000-0000-000000000001
type: object
ExternalUserPatchRequestOperationsItemsOp:
description: The operation to be performed.
@@ -35247,6 +35499,21 @@ components:
x-enum-varnames:
- ADD
- REPLACE
+ ExternalUserRole:
+ description: Datadog role assigned to a SCIM user.
+ properties:
+ display:
+ description: Human-readable Datadog role name returned in responses.
+ example: Datadog Read Only Role
+ readOnly: true
+ type: string
+ value:
+ description: Datadog role UUID.
+ example: 00000000-0000-0000-0000-000000000001
+ type: string
+ required:
+ - value
+ type: object
FacetInfoRequest:
description: Request body for retrieving facet value information for a specified attribute with optional filtering.
example:
@@ -41767,6 +42034,404 @@ components:
- impact_hint
- status
type: object
+ GovernanceControlAttributes:
+ description: The attributes of a governance control.
+ properties:
+ active_detections_count:
+ description: The number of active detections for the control.
+ example: 12
+ format: int64
+ type: integer
+ category:
+ description: The value driver the control is grouped under, such as `security` or `cost`.
+ example: "security"
+ type: string
+ created_at:
+ description: The time the control configuration was created.
+ example: "2024-01-15T09:30:00Z"
+ format: date-time
+ type: string
+ created_by:
+ description: The UUID of the user who created the control configuration.
+ example: "11111111-2222-3333-4444-555555555555"
+ type: string
+ description:
+ description: A human-readable description of what the control detects.
+ example: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials."
+ type: string
+ detection_frequency:
+ description: How often detections are evaluated for the control.
+ example: "daily"
+ type: string
+ detection_parameters:
+ $ref: "#/components/schemas/GovernanceControlParametersMap"
+ nullable: true
+ detection_type:
+ description: The detection type that uniquely identifies the control.
+ example: "unused_api_keys"
+ type: string
+ feature_flags:
+ description: The feature flags that gate the control.
+ example: []
+ items:
+ description: A feature flag that gates the control.
+ type: string
+ type: array
+ insights:
+ description: The insight slugs associated with the control.
+ example: []
+ items:
+ description: An insight slug associated with the control.
+ type: string
+ type: array
+ last_detection_at:
+ description: The time of the most recent detection for the control. `null` when there are no detections.
+ example: "2024-03-01T12:00:00Z"
+ format: date-time
+ nullable: true
+ type: string
+ mitigated_detections_count:
+ description: The number of mitigated detections for the control.
+ example: 3
+ format: int64
+ type: integer
+ mitigation_parameters:
+ $ref: "#/components/schemas/GovernanceControlParametersMap"
+ nullable: true
+ mitigation_type:
+ description: The configured mitigation type for the control. Empty when not configured.
+ example: "revoke_api_key"
+ type: string
+ mitigations:
+ $ref: "#/components/schemas/GovernanceControlMitigationDefinitionArray"
+ name:
+ description: Human-readable name of the control.
+ example: "Unused API Keys"
+ type: string
+ next_steps:
+ description: Guidance on the next steps to remediate detections for the control.
+ example: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture."
+ type: string
+ notification_frequency:
+ description: The configured notification frequency for the control. Empty when not configured.
+ example: ""
+ type: string
+ notification_parameters:
+ $ref: "#/components/schemas/GovernanceControlParametersMap"
+ nullable: true
+ notification_type:
+ description: The configured notification type for the control. Empty when not configured.
+ example: ""
+ type: string
+ priority:
+ description: The priority of the control, such as `High`.
+ example: "High"
+ type: string
+ product:
+ description: The product the control belongs to.
+ example: "api_keys"
+ type: string
+ release_status:
+ description: The release status of the control, such as `prod` or `beta`.
+ example: "prod"
+ type: string
+ resource_type:
+ description: The type of resource the control evaluates.
+ example: "api_key"
+ type: string
+ resource_type_display_name:
+ description: The human-readable name of the resource type.
+ example: "API Key"
+ type: string
+ supported_detection_parameters:
+ $ref: "#/components/schemas/GovernanceControlParameterDefinitionArray"
+ supported_notification_parameters:
+ $ref: "#/components/schemas/GovernanceControlParameterDefinitionArray"
+ task:
+ description: A short description of the remediation task for the control.
+ example: "Review and revoke unused API keys."
+ type: string
+ type:
+ description: The control type, such as `Proactive` or `Detection`.
+ example: "Proactive"
+ type: string
+ usage_concern:
+ description: The usage concern the control addresses, such as `Security` or `Cost Optimization`.
+ example: "Security"
+ type: string
+ required:
+ - name
+ - description
+ - detection_type
+ - supported_detection_parameters
+ - supported_notification_parameters
+ - resource_type
+ - resource_type_display_name
+ - product
+ - category
+ - insights
+ - mitigations
+ - task
+ - next_steps
+ - release_status
+ - feature_flags
+ - type
+ - priority
+ - usage_concern
+ - detection_parameters
+ - detection_frequency
+ - notification_type
+ - notification_parameters
+ - notification_frequency
+ - mitigation_type
+ - mitigation_parameters
+ - created_at
+ - created_by
+ - active_detections_count
+ - mitigated_detections_count
+ - last_detection_at
+ type: object
+ GovernanceControlData:
+ description: A governance control resource.
+ properties:
+ attributes:
+ $ref: "#/components/schemas/GovernanceControlAttributes"
+ id:
+ description: The unique identifier of the control.
+ example: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a"
+ type: string
+ type:
+ $ref: "#/components/schemas/GovernanceControlResourceType"
+ required:
+ - id
+ - type
+ - attributes
+ type: object
+ GovernanceControlMitigationDefinition:
+ description: The definition of a mitigation available for a control.
+ properties:
+ action_verb:
+ description: The verb describing the mitigation action, such as `revoke` or `delete`.
+ example: "revoke"
+ type: string
+ description:
+ description: A human-readable description of the mitigation.
+ example: "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface."
+ type: string
+ execution_modes:
+ description: The execution modes the mitigation supports, such as `manual` or `automatic`.
+ example:
+ - "manual"
+ - "automatic"
+ items:
+ description: An execution mode the mitigation supports.
+ type: string
+ type: array
+ feature_flags:
+ description: The feature flags that gate the mitigation.
+ example: []
+ items:
+ description: A feature flag that gates the mitigation.
+ type: string
+ type: array
+ id:
+ description: The unique identifier of the mitigation.
+ example: "revoke_api_key"
+ type: string
+ manual_mitigation_warning:
+ description: A warning shown to the user before applying the mitigation manually.
+ example: "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again."
+ type: string
+ permissions:
+ description: The permissions required to apply the mitigation.
+ example:
+ - "api_keys_write"
+ - "api_keys_delete"
+ items:
+ description: A permission required to apply the mitigation.
+ type: string
+ type: array
+ requires_ai:
+ description: Whether the mitigation requires AI to be enabled.
+ example: false
+ type: boolean
+ supported_parameters:
+ $ref: "#/components/schemas/GovernanceControlParameterDefinitionArray"
+ title:
+ description: A short, human-readable name for the mitigation.
+ example: "Revoke Unused API Keys"
+ type: string
+ required:
+ - id
+ - title
+ - description
+ - action_verb
+ - supported_parameters
+ - permissions
+ - manual_mitigation_warning
+ - feature_flags
+ - requires_ai
+ type: object
+ GovernanceControlMitigationDefinitionArray:
+ description: The mitigations available for a control.
+ items:
+ $ref: "#/components/schemas/GovernanceControlMitigationDefinition"
+ type: array
+ GovernanceControlParameterDefinition:
+ description: The definition of a configurable parameter on a control or mitigation.
+ properties:
+ default_value:
+ description: The default value of the parameter. The JSON type depends on the parameter's `type`.
+ example: 30
+ description:
+ description: A human-readable description of the parameter.
+ example: "Number of days of inactivity before an API key is considered unused."
+ type: string
+ display_name:
+ description: The human-readable name of the parameter.
+ example: "Unused API Key Threshold"
+ type: string
+ hidden:
+ description: Whether the parameter is hidden from the UI.
+ example: false
+ type: boolean
+ name:
+ description: The machine-readable name of the parameter.
+ example: "api_key_threshold"
+ type: string
+ required:
+ description: Whether the parameter must be provided.
+ example: false
+ type: boolean
+ supported_values:
+ $ref: "#/components/schemas/GovernanceControlSupportedValueArray"
+ type:
+ description: The type of the parameter, such as `integer`, `string`, `boolean`, `enum`, or `pattern_list`.
+ example: "integer"
+ type: string
+ required:
+ - name
+ - display_name
+ - description
+ - type
+ - required
+ - hidden
+ - supported_values
+ - default_value
+ type: object
+ GovernanceControlParameterDefinitionArray:
+ description: An array of parameter definitions.
+ items:
+ $ref: "#/components/schemas/GovernanceControlParameterDefinition"
+ type: array
+ GovernanceControlParametersMap:
+ additionalProperties: {}
+ description: A free-form map of parameter names to their configured values.
+ type: object
+ GovernanceControlResourceType:
+ description: JSON:API resource type for a governance control.
+ enum:
+ - governance_control
+ example: "governance_control"
+ type: string
+ x-enum-varnames:
+ - GOVERNANCE_CONTROL
+ GovernanceControlResponse:
+ description: A single governance control.
+ properties:
+ data:
+ $ref: "#/components/schemas/GovernanceControlData"
+ required:
+ - data
+ type: object
+ GovernanceControlSupportedValue:
+ description: A supported value for an enumerated parameter.
+ properties:
+ label:
+ description: The human-readable label for the value.
+ example: "30 days"
+ type: string
+ value:
+ description: The machine-readable value.
+ example: "thirty"
+ type: string
+ required:
+ - value
+ - label
+ type: object
+ GovernanceControlSupportedValueArray:
+ description: The supported values for an enumerated parameter.
+ items:
+ $ref: "#/components/schemas/GovernanceControlSupportedValue"
+ type: array
+ GovernanceControlUpdateAttributes:
+ description: The attributes of a governance control that can be updated. Only the attributes present in the request are modified.
+ properties:
+ detection_frequency:
+ description: How often detections should be evaluated for the control.
+ example: "daily"
+ type: string
+ detection_parameters:
+ $ref: "#/components/schemas/GovernanceControlParametersMap"
+ nullable: true
+ mitigation_parameters:
+ $ref: "#/components/schemas/GovernanceControlParametersMap"
+ nullable: true
+ mitigation_type:
+ description: The mitigation type to configure for the control.
+ example: "revoke_api_key"
+ type: string
+ name:
+ description: A new human-readable name for the control.
+ example: "Unused API Keys"
+ type: string
+ notification_frequency:
+ description: The notification frequency to configure for the control.
+ example: "daily"
+ type: string
+ notification_parameters:
+ $ref: "#/components/schemas/GovernanceControlParametersMap"
+ nullable: true
+ notification_type:
+ description: The notification type to configure for the control.
+ example: "slack"
+ type: string
+ type: object
+ GovernanceControlUpdateData:
+ description: The data of a governance control update request.
+ properties:
+ attributes:
+ $ref: "#/components/schemas/GovernanceControlUpdateAttributes"
+ id:
+ description: The unique identifier of the control.
+ example: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a"
+ type: string
+ type:
+ $ref: "#/components/schemas/GovernanceControlResourceType"
+ required:
+ - type
+ type: object
+ GovernanceControlUpdateRequest:
+ description: A request to update a governance control.
+ properties:
+ data:
+ $ref: "#/components/schemas/GovernanceControlUpdateData"
+ required:
+ - data
+ type: object
+ GovernanceControlsDataArray:
+ description: An array of governance control resources.
+ items:
+ $ref: "#/components/schemas/GovernanceControlData"
+ type: array
+ GovernanceControlsResponse:
+ description: A list of governance controls.
+ properties:
+ data:
+ $ref: "#/components/schemas/GovernanceControlsDataArray"
+ required:
+ - data
+ type: object
GovernanceInsightAttributes:
description: The attributes of a governance insight.
properties:
@@ -56152,6 +56817,9 @@ components:
resourceType: User
name:
formatted: John Doe
+ roles:
+ - display: Datadog Read Only Role
+ value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
title: Mr.
@@ -56169,6 +56837,9 @@ components:
resourceType: User
name:
formatted: Jane Doe
+ roles:
+ - display: Datadog Standard Role
+ value: 00000000-0000-0000-0000-000000000002
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
title: Mrs.
@@ -56229,6 +56900,12 @@ components:
$ref: "#/components/schemas/ExternalUserMeta"
name:
$ref: "#/components/schemas/ExternalUserNameType"
+ roles:
+ description: Datadog roles assigned to the user. Provide the role UUID in `value` when provisioning or updating roles through SCIM.
+ items:
+ $ref: "#/components/schemas/ExternalUserRole"
+ maxItems: 50
+ type: array
schemas:
description: User JSON Schemas.
example:
@@ -107200,7 +107877,7 @@ components:
text: "Example annotation."
connectionEnvs:
- connections:
- - connectionId: "11111111-1111-1111-1111-111111111111"
+ - connectionId: "e1e64943-c7c5-4487-aece-25aaec7d3aad"
label: "INTEGRATION_DATADOG"
env: "default"
handle: "my-handle"
@@ -125522,6 +126199,83 @@ paths:
tags:
- Cloud Cost Management
x-menu-order: 36
+ /api/v2/cost/budget/custom-forecast:
+ put:
+ description: |-
+ Create or replace the custom forecast for an existing budget.
+ Pass an empty `entries` list to delete the custom forecast for the budget.
+ operationId: UpsertCustomForecast
+ requestBody:
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ budget_uid: 00000000-0000-0000-0000-000000000001
+ entries:
+ - amount: 400
+ month: 202501
+ tag_filters:
+ - tag_key: service
+ tag_value: ec2
+ - amount: 450
+ month: 202502
+ tag_filters:
+ - tag_key: service
+ tag_value: ec2
+ id: ""
+ type: custom_forecast
+ schema:
+ $ref: "#/components/schemas/CustomForecastUpsertRequest"
+ required: true
+ responses:
+ "200":
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ budget_uid: 00000000-0000-0000-0000-000000000001
+ created_at: 1738258683590
+ created_by: 00000000-0a0a-0a0a-aaa0-00000000000a
+ entries:
+ - amount: 400
+ month: 202501
+ tag_filters:
+ - tag_key: service
+ tag_value: ec2
+ - amount: 450
+ month: 202502
+ tag_filters:
+ - tag_key: service
+ tag_value: ec2
+ updated_at: 1738258683590
+ updated_by: 00000000-0a0a-0a0a-aaa0-00000000000a
+ id: 11111111-1111-1111-1111-111111111111
+ type: custom_forecast
+ schema:
+ $ref: "#/components/schemas/CustomForecastResponse"
+ description: OK
+ "400":
+ $ref: "#/components/responses/BadRequestResponse"
+ "404":
+ $ref: "#/components/responses/NotFoundResponse"
+ "429":
+ $ref: "#/components/responses/TooManyRequestsResponse"
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ summary: Create or replace a budget's custom forecast
+ tags:
+ - Cloud Cost Management
+ x-menu-order: 67
+ x-unstable: |-
+ **Note**: This endpoint is in preview and is subject to change.
+ If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
/api/v2/cost/budget/validate:
post:
description: Validate a budget configuration without creating or modifying it
@@ -125604,10 +126358,36 @@ paths:
- Cloud Cost Management
x-menu-order: 38
get:
- description: Get a budget
+ description: Get a budget by ID. Pass `actual=true` or `forecast=true` to include cost data in the response. Use `start` and `end` (millisecond epochs, both required) to set the cost window. When `forecast=true`, each entry also includes `ootb_forecast` (the ML forecast before overrides) and `custom_forecast` (`null` if no override is set, a number if one is).
operationId: GetBudget
parameters:
- $ref: "#/components/parameters/BudgetID"
+ - description: When `true`, includes actual cost data in the response.
+ in: query
+ name: actual
+ required: false
+ schema:
+ type: boolean
+ - description: When `true`, includes forecast cost data in the response, including `ootb_forecast` and `custom_forecast` per entry.
+ in: query
+ name: forecast
+ required: false
+ schema:
+ type: boolean
+ - description: Start of the cost window in milliseconds since epoch. Must be used together with `end`.
+ in: query
+ name: start
+ required: false
+ schema:
+ format: int64
+ type: integer
+ - description: End of the cost window in milliseconds since epoch. Must be used together with `start`.
+ in: query
+ name: end
+ required: false
+ schema:
+ format: int64
+ type: integer
responses:
"200":
content:
@@ -125617,11 +126397,31 @@ paths:
value:
data:
attributes:
+ costs:
+ actual: 850.25
+ amount: 1000.0
+ forecast: 1100.5
+ ootb_forecast: 1100.5
+ costs_period_end: 1740873600000
+ costs_period_start: 1738281600000
+ costs_unit:
+ family: currency
+ id: "1"
+ name: dollar
+ plural: dollars
+ scale_factor: 1.0
+ short_name: $
created_at: 1738258683590
created_by: 00000000-0a0a-0a0a-aaa0-00000000000a
end_month: 202502
entries:
- amount: 500
+ costs:
+ actual: 425.5
+ amount: 500.0
+ custom_forecast:
+ forecast: 550.25
+ ootb_forecast: 550.25
month: 202501
tag_filters:
- tag_key: service
@@ -125638,6 +126438,10 @@ paths:
schema:
$ref: "#/components/schemas/BudgetWithEntries"
description: OK
+ "400":
+ $ref: "#/components/responses/BadRequestResponse"
+ "404":
+ $ref: "#/components/responses/NotFoundResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
security:
@@ -125647,6 +126451,31 @@ paths:
tags:
- Cloud Cost Management
x-menu-order: 37
+ /api/v2/cost/budget/{budget_id}/custom-forecast:
+ delete:
+ description: Delete the custom forecast for a budget.
+ operationId: DeleteCustomForecast
+ parameters:
+ - $ref: "#/components/parameters/BudgetID"
+ responses:
+ "204":
+ description: No Content
+ "400":
+ $ref: "#/components/responses/BadRequestResponse"
+ "404":
+ $ref: "#/components/responses/NotFoundResponse"
+ "429":
+ $ref: "#/components/responses/TooManyRequestsResponse"
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ summary: Delete a budget's custom forecast
+ tags:
+ - Cloud Cost Management
+ x-menu-order: 68
+ x-unstable: |-
+ **Note**: This endpoint is in preview and is subject to change.
+ If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
/api/v2/cost/budgets:
get:
description: List budgets.
@@ -135542,6 +136371,322 @@ paths:
operator: OR
permissions:
- user_access_read
+ /api/v2/governance/control:
+ get:
+ description: |-
+ Retrieve the list of governance controls configured for the organization. Each control pairs a
+ detection definition with the organization's current detection, notification, and mitigation
+ configuration, along with counts of active and mitigated detections.
+ operationId: ListGovernanceControls
+ responses:
+ "200":
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ - attributes:
+ active_detections_count: 12
+ category: "security"
+ created_at: "2024-01-15T09:30:00Z"
+ created_by: "11111111-2222-3333-4444-555555555555"
+ description: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials."
+ detection_frequency: "daily"
+ detection_parameters:
+ api_key_threshold: 30
+ detection_type: "unused_api_keys"
+ feature_flags: []
+ insights: []
+ last_detection_at: "2024-03-01T12:00:00Z"
+ mitigated_detections_count: 3
+ mitigation_parameters: {}
+ mitigation_type: ""
+ mitigations:
+ - action_verb: "revoke"
+ description: "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface."
+ execution_modes:
+ - "manual"
+ - "automatic"
+ feature_flags: []
+ id: "revoke_api_key"
+ manual_mitigation_warning: "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again."
+ permissions:
+ - "api_keys_write"
+ - "api_keys_delete"
+ requires_ai: false
+ supported_parameters: []
+ title: "Revoke Unused API Keys"
+ name: "Unused API Keys"
+ next_steps: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture."
+ notification_frequency: ""
+ notification_parameters: {}
+ notification_type: ""
+ priority: "High"
+ product: "api_keys"
+ release_status: "prod"
+ resource_type: "api_key"
+ resource_type_display_name: "API Key"
+ supported_detection_parameters:
+ - default_value: 30
+ description: "Number of days of inactivity before an API key is considered unused."
+ display_name: "Unused API Key Threshold"
+ hidden: false
+ name: "api_key_threshold"
+ required: false
+ supported_values: []
+ type: "integer"
+ supported_notification_parameters:
+ - default_value: false
+ description: "Enables the Governance Console to automatically assign ownership of detections based off of tagging and other internal heuristics."
+ display_name: "Automatic Ownership Assignment"
+ hidden: false
+ name: "governance_auto_assignment"
+ required: false
+ supported_values: []
+ type: "boolean"
+ task: "Review and revoke unused API keys."
+ type: "Proactive"
+ usage_concern: "Security"
+ id: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a"
+ type: "governance_control"
+ schema:
+ $ref: "#/components/schemas/GovernanceControlsResponse"
+ description: OK
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Bad Request
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Unauthorized
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Forbidden
+ "429":
+ $ref: "#/components/responses/TooManyRequestsResponse"
+ summary: List governance controls
+ tags:
+ - Governance Controls
+ x-menu-order: 2
+ x-unstable: |-
+ **Note**: This endpoint is in preview and is subject to change.
+ If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
+ /api/v2/governance/control/{detection_type}:
+ get:
+ description: |-
+ Retrieve a single governance control by its detection type, including the organization's current
+ detection, notification, and mitigation configuration and detection counts.
+ operationId: GetGovernanceControl
+ parameters:
+ - description: The detection type that identifies the control, for example `unused_api_keys`.
+ example: "unused_api_keys"
+ in: path
+ name: detection_type
+ required: true
+ schema:
+ type: string
+ responses:
+ "200":
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ active_detections_count: 12
+ category: "security"
+ created_at: "2024-01-15T09:30:00Z"
+ created_by: "11111111-2222-3333-4444-555555555555"
+ description: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials."
+ detection_frequency: "daily"
+ detection_parameters:
+ api_key_threshold: 30
+ detection_type: "unused_api_keys"
+ feature_flags: []
+ insights: []
+ last_detection_at: "2024-03-01T12:00:00Z"
+ mitigated_detections_count: 3
+ mitigation_parameters: {}
+ mitigation_type: "revoke_api_key"
+ mitigations: []
+ name: "Unused API Keys"
+ next_steps: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture."
+ notification_frequency: ""
+ notification_parameters: {}
+ notification_type: ""
+ priority: "High"
+ product: "api_keys"
+ release_status: "prod"
+ resource_type: "api_key"
+ resource_type_display_name: "API Key"
+ supported_detection_parameters:
+ - default_value: 30
+ description: "Number of days of inactivity before an API key is considered unused."
+ display_name: "Unused API Key Threshold"
+ hidden: false
+ name: "api_key_threshold"
+ required: false
+ supported_values: []
+ type: "integer"
+ supported_notification_parameters: []
+ task: "Review and revoke unused API keys."
+ type: "Proactive"
+ usage_concern: "Security"
+ id: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a"
+ type: "governance_control"
+ schema:
+ $ref: "#/components/schemas/GovernanceControlResponse"
+ description: OK
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Bad Request
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Unauthorized
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Forbidden
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Not Found
+ "429":
+ $ref: "#/components/responses/TooManyRequestsResponse"
+ summary: Get a governance control
+ tags:
+ - Governance Controls
+ x-menu-order: 3
+ x-unstable: |-
+ **Note**: This endpoint is in preview and is subject to change.
+ If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
+ patch:
+ description: |-
+ Update the detection, notification, and mitigation configuration of a governance control. Only
+ the attributes present in the request are modified. Changing the mitigation type or its
+ parameters may require additional permissions.
+ operationId: UpdateGovernanceControl
+ parameters:
+ - description: The detection type that identifies the control, for example `unused_api_keys`.
+ example: "unused_api_keys"
+ in: path
+ name: detection_type
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ detection_parameters:
+ api_key_threshold: 60
+ mitigation_type: "revoke_api_key"
+ type: "governance_control"
+ schema:
+ $ref: "#/components/schemas/GovernanceControlUpdateRequest"
+ required: true
+ responses:
+ "200":
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ active_detections_count: 12
+ category: "security"
+ created_at: "2024-01-15T09:30:00Z"
+ created_by: "11111111-2222-3333-4444-555555555555"
+ description: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials."
+ detection_frequency: "daily"
+ detection_parameters:
+ api_key_threshold: 60
+ detection_type: "unused_api_keys"
+ feature_flags: []
+ insights: []
+ last_detection_at: "2024-03-01T12:00:00Z"
+ mitigated_detections_count: 3
+ mitigation_parameters: {}
+ mitigation_type: "revoke_api_key"
+ mitigations: []
+ name: "Unused API Keys"
+ next_steps: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture."
+ notification_frequency: ""
+ notification_parameters: {}
+ notification_type: ""
+ priority: "High"
+ product: "api_keys"
+ release_status: "prod"
+ resource_type: "api_key"
+ resource_type_display_name: "API Key"
+ supported_detection_parameters: []
+ supported_notification_parameters: []
+ task: "Review and revoke unused API keys."
+ type: "Proactive"
+ usage_concern: "Security"
+ id: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a"
+ type: "governance_control"
+ schema:
+ $ref: "#/components/schemas/GovernanceControlResponse"
+ description: OK
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Bad Request
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Unauthorized
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Forbidden
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/JSONAPIErrorResponse"
+ description: Not Found
+ "429":
+ $ref: "#/components/responses/TooManyRequestsResponse"
+ summary: Update a governance control
+ tags:
+ - Governance Controls
+ x-menu-order: 4
+ x-unstable: |-
+ **Note**: This endpoint is in preview and is subject to change.
+ If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
/api/v2/governance/insights:
get:
description: |-
@@ -169829,6 +170974,29 @@ paths:
returned: default
type: boolean
uniqueness: none
+ - description: Datadog roles assigned to the user.
+ multiValued: true
+ mutability: readWrite
+ name: roles
+ required: false
+ returned: default
+ subAttributes:
+ - description: Datadog role UUID.
+ mutability: readWrite
+ name: value
+ required: true
+ returned: default
+ type: string
+ uniqueness: none
+ - description: Human-readable Datadog role name.
+ mutability: readOnly
+ name: display
+ required: false
+ returned: default
+ type: string
+ uniqueness: none
+ type: complex
+ uniqueness: none
description: User Schema
id: urn:ietf:params:scim:schemas:core:2.0:User
meta:
@@ -169858,6 +171026,7 @@ paths:
List users in the organization.
Results are paginated by `startIndex` and `count` parameters.
Results can be narrowed down by the `filter` parameter.
+ Responses include the Datadog roles assigned to each user in the `roles` attribute.
operationId: ListSCIMUsers
parameters:
- description: |-
@@ -169904,6 +171073,9 @@ paths:
id: 00000000-0000-0000-0000-000000000001
name:
formatted: Example Name
+ roles:
+ - display: Datadog Read Only Role
+ value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
userName: test@example.com
@@ -169932,6 +171104,7 @@ paths:
post:
description: |-
Create a new user.
+ To assign Datadog roles to the user, include a `roles` array containing role UUIDs in the `value` field.
operationId: CreateSCIMUser
requestBody:
content:
@@ -169946,6 +171119,8 @@ paths:
value: john.doe@datadoghq.com
name:
formatted: John Doe
+ roles:
+ - value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
title: Mr.
@@ -169959,6 +171134,8 @@ paths:
value: john.doe@datadoghq.com
name:
formatted: John Doe
+ roles:
+ - value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
title: Mr.
@@ -169981,6 +171158,9 @@ paths:
id: 00000000-0000-0000-0000-000000000001
name:
formatted: Example Name
+ roles:
+ - display: Datadog Read Only Role
+ value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
userName: test@example.com
@@ -170035,6 +171215,7 @@ paths:
get:
description: |-
Get a single user using the `user_uuid`.
+ The response includes the Datadog roles assigned to the user in the `roles` attribute.
operationId: GetSCIMUser
parameters:
- description: None
@@ -170058,6 +171239,9 @@ paths:
id: 00000000-0000-0000-0000-000000000001
name:
formatted: Example Name
+ roles:
+ - display: Datadog Read Only Role
+ value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
userName: test@example.com
@@ -170081,6 +171265,7 @@ paths:
patch:
description: |-
Patch the user with the given `user_uuid`.
+ To update Datadog roles, send an operation with `path` set to `roles` and `value` set to an array of role objects containing role UUIDs.
operationId: PatchSCIMUser
parameters:
- description: None
@@ -170099,6 +171284,10 @@ paths:
- op: replace
path: title
value: CEO
+ - op: replace
+ path: roles
+ value:
+ - value: 00000000-0000-0000-0000-000000000001
- op: replace
value:
name:
@@ -170111,6 +171300,10 @@ paths:
- op: replace
path: title
value: CEO
+ - op: replace
+ path: roles
+ value:
+ - value: 00000000-0000-0000-0000-000000000001
- op: replace
value:
name:
@@ -170135,6 +171328,9 @@ paths:
id: 00000000-0000-0000-0000-000000000001
name:
formatted: Example Name
+ roles:
+ - display: Datadog Read Only Role
+ value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
userName: test@example.com
@@ -170162,6 +171358,7 @@ paths:
put:
description: |-
Update the user with the given `user_uuid`.
+ To update Datadog roles, include a `roles` array containing role UUIDs in the `value` field.
operationId: UpdateSCIMUser
parameters:
- description: None
@@ -170184,6 +171381,8 @@ paths:
id: e43536e9-33fe-43f8-90b8-d3e39a7dd6ad
name:
formatted: John Doe
+ roles:
+ - value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
title: Mr.
@@ -170198,6 +171397,8 @@ paths:
id: e43536e9-33fe-43f8-90b8-d3e39a7dd6ad
name:
formatted: John Doe
+ roles:
+ - value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
title: Mr.
@@ -170220,6 +171421,9 @@ paths:
id: 00000000-0000-0000-0000-000000000001
name:
formatted: Example Name
+ roles:
+ - display: Datadog Read Only Role
+ value: 00000000-0000-0000-0000-000000000001
schemas:
- urn:ietf:params:scim:schemas:core:2.0:User
userName: test@example.com
@@ -196621,7 +197825,7 @@ paths:
text: Example annotation.
connectionEnvs:
- connections:
- - connectionId: 11111111-1111-1111-1111-111111111111
+ - connectionId: e1e64943-c7c5-4487-aece-25aaec7d3aad
label: INTEGRATION_DATADOG
env: default
handle: my-handle
@@ -196829,7 +198033,7 @@ paths:
text: Example annotation.
connectionEnvs:
- connections:
- - connectionId: 11111111-1111-1111-1111-111111111111
+ - connectionId: e1e64943-c7c5-4487-aece-25aaec7d3aad
label: INTEGRATION_DATADOG
env: default
handle: my-handle
@@ -197379,6 +198583,12 @@ tags:
description: For more information about the Datadog Google Chat integration, see the integration page.
url: https://docs.datadoghq.com/integrations/google-hangouts-chat/
name: Google Chat Integration
+ - description: |-
+ Governance Controls pair a detection definition with an organization's detection, notification,
+ and mitigation configuration within the Governance Console. Each control reports how a class of
+ governance issue (such as unused API keys or unqueried metrics) is detected and remediated, along
+ with counts of active and mitigated detections.
+ name: Governance Controls
- description: |-
Governance Insights surface key usage, configuration, and best-practice signals for an
organization within the Governance Console. Each insight reports a current value (and,
diff --git a/data/api/v2/translate_actions.json b/data/api/v2/translate_actions.json
index e54e3e14609..6677e010bd7 100644
--- a/data/api/v2/translate_actions.json
+++ b/data/api/v2/translate_actions.json
@@ -1238,6 +1238,12 @@
"ValidateCsvBudget": {
"summary": "Validate CSV budget"
},
+ "UpsertCustomForecast": {
+ "description": "Create or replace the custom forecast for an existing budget.\nPass an empty `entries` list to delete the custom forecast for the budget.",
+ "summary": "Create or replace a budget's custom forecast",
+ "request_description": "",
+ "request_schema_description": "Request body to upsert (create or replace) the custom forecast for a budget."
+ },
"ValidateBudget": {
"description": "Validate a budget configuration without creating or modifying it",
"summary": "Validate budget",
@@ -1249,9 +1255,13 @@
"summary": "Delete budget"
},
"GetBudget": {
- "description": "Get a budget",
+ "description": "Get a budget by ID. Pass `actual=true` or `forecast=true` to include cost data in the response. Use `start` and `end` (millisecond epochs, both required) to set the cost window. When `forecast=true`, each entry also includes `ootb_forecast` (the ML forecast before overrides) and `custom_forecast` (`null` if no override is set, a number if one is).",
"summary": "Get budget"
},
+ "DeleteCustomForecast": {
+ "description": "Delete the custom forecast for a budget.",
+ "summary": "Delete a budget's custom forecast"
+ },
"ListBudgets": {
"description": "List budgets.",
"summary": "List budgets"
@@ -1948,6 +1958,20 @@
"description": "Returns organizations across regions for the authenticated user. The `user_handle` query parameter must match the authenticated user's handle.",
"summary": "List global orgs"
},
+ "ListGovernanceControls": {
+ "description": "Retrieve the list of governance controls configured for the organization. Each control pairs a\ndetection definition with the organization's current detection, notification, and mitigation\nconfiguration, along with counts of active and mitigated detections.",
+ "summary": "List governance controls"
+ },
+ "GetGovernanceControl": {
+ "description": "Retrieve a single governance control by its detection type, including the organization's current\ndetection, notification, and mitigation configuration and detection counts.",
+ "summary": "Get a governance control"
+ },
+ "UpdateGovernanceControl": {
+ "description": "Update the detection, notification, and mitigation configuration of a governance control. Only\nthe attributes present in the request are modified. Changing the mitigation type or its\nparameters may require additional permissions.",
+ "summary": "Update a governance control",
+ "request_description": "",
+ "request_schema_description": "A request to update a governance control."
+ },
"ListGovernanceInsights": {
"description": "Retrieve the list of governance insights available to the organization. By default, only\ninsight metadata is returned; pass `withValues=true` to also compute and include each\ninsight's current and previous values. Insights can be filtered by product.",
"summary": "List governance insights"
@@ -4742,11 +4766,11 @@
"summary": "Get schema"
},
"ListSCIMUsers": {
- "description": "List users in the organization.\nResults are paginated by `startIndex` and `count` parameters.\nResults can be narrowed down by the `filter` parameter.",
+ "description": "List users in the organization.\nResults are paginated by `startIndex` and `count` parameters.\nResults can be narrowed down by the `filter` parameter.\nResponses include the Datadog roles assigned to each user in the `roles` attribute.",
"summary": "List users"
},
"CreateSCIMUser": {
- "description": "Create a new user.",
+ "description": "Create a new user.\nTo assign Datadog roles to the user, include a `roles` array containing role UUIDs in the `value` field.",
"summary": "Create user",
"request_description": "",
"request_schema_description": "Definition of a user."
@@ -4756,17 +4780,17 @@
"summary": "Delete user"
},
"GetSCIMUser": {
- "description": "Get a single user using the `user_uuid`.",
+ "description": "Get a single user using the `user_uuid`.\nThe response includes the Datadog roles assigned to the user in the `roles` attribute.",
"summary": "Get user"
},
"PatchSCIMUser": {
- "description": "Patch the user with the given `user_uuid`.",
+ "description": "Patch the user with the given `user_uuid`.\nTo update Datadog roles, send an operation with `path` set to `roles` and `value` set to an array of role objects containing role UUIDs.",
"summary": "Patch user",
"request_description": "",
"request_schema_description": "Request object for patching a user."
},
"UpdateSCIMUser": {
- "description": "Update the user with the given `user_uuid`.",
+ "description": "Update the user with the given `user_uuid`.\nTo update Datadog roles, include a `roles` array containing role UUIDs in the `value` field.",
"summary": "Update user",
"request_description": "",
"request_schema_description": "Definition of a user."
diff --git a/data/api/v2/translate_tags.json b/data/api/v2/translate_tags.json
index 65785e0df81..b4e27272915 100644
--- a/data/api/v2/translate_tags.json
+++ b/data/api/v2/translate_tags.json
@@ -223,6 +223,10 @@
"name": "Google Chat Integration",
"description": "Configure your [Datadog Google Chat integration](https://docs.datadoghq.com/integrations/google-hangouts-chat/)\ndirectly through the Datadog API."
},
+ "governance-controls": {
+ "name": "Governance Controls",
+ "description": "Governance Controls pair a detection definition with an organization's detection, notification,\nand mitigation configuration within the Governance Console. Each control reports how a class of\ngovernance issue (such as unused API keys or unqueried metrics) is detected and remediated, along\nwith counts of active and mitigated detections."
+ },
"governance-insights": {
"name": "Governance Insights",
"description": "Governance Insights surface key usage, configuration, and best-practice signals for an\norganization within the Governance Console. Each insight reports a current value (and,\noptionally, a previous value for comparison) along with the query used to compute it, so\nthat the Console can render trends and highlight areas that need attention."
diff --git a/data/reference/functions.json b/data/reference/functions.json
index 0f0a47e85f2..74a270679f9 100644
--- a/data/reference/functions.json
+++ b/data/reference/functions.json
@@ -435,8 +435,40 @@
},
{
"title": "Chunks do not respect unicode code point boundaries",
- "source": "chunks(\"ab你好\", 4)",
- "return": "[\"ab�\",\"�好\"]"
+ "source": "chunks(\"ab\u4f60\u597d\", 4)",
+ "return": "[\"ab\ufffd\",\"\ufffd\u597d\"]"
+ }
+ ],
+ "deprecated": false,
+ "pure": true
+ },
+ {
+ "anchor": "pop",
+ "name": "pop",
+ "category": "Array",
+ "description": "Removes the last item from the `value` array, returning a new array without the last element.",
+ "notices": [],
+ "arguments": [
+ {
+ "name": "value",
+ "description": "The array to pop from.",
+ "required": true,
+ "type": [
+ "array"
+ ]
+ }
+ ],
+ "internal_failure_reasons": [],
+ "return": {
+ "types": [
+ "array"
+ ]
+ },
+ "examples": [
+ {
+ "title": "Pop an item from an array",
+ "source": "pop([1, 2, 3])",
+ "return": "[1,2]"
}
],
"deprecated": false,
@@ -2493,12 +2525,12 @@
},
{
"title": "UTF-8 string with bytes segmentation",
- "source": "floor(shannon_entropy(\"test123%456.فوائد.net.\"), precision: 4)",
+ "source": "floor(shannon_entropy(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\"), precision: 4)",
"return": "4.0784"
},
{
"title": "UTF-8 string with grapheme segmentation",
- "source": "floor(shannon_entropy(\"test123%456.فوائد.net.\", segmentation: \"grapheme\"), precision: 4)",
+ "source": "floor(shannon_entropy(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\", segmentation: \"grapheme\"), precision: 4)",
"return": "3.9362"
}
],
@@ -2556,12 +2588,12 @@
"examples": [
{
"title": "Sieve with regex",
- "source": "sieve(\"test123%456.فوائد.net.\", r'[a-z0-9.]')",
+ "source": "sieve(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\", r'[a-z0-9.]')",
"return": "\"test123456..net.\""
},
{
"title": "Custom replacements",
- "source": "sieve(\"test123%456.فوائد.net.\", r'[a-z.0-9]', replace_single: \"X\", replace_repeated: \"\")",
+ "source": "sieve(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\", r'[a-z.0-9]', replace_single: \"X\", replace_repeated: \"\")",
"return": "\"test123X456..net.\""
}
],
@@ -3509,7 +3541,7 @@
"examples": [
{
"title": "strlen",
- "source": "strlen(\"ñandú\")",
+ "source": "strlen(\"\u00f1and\u00fa\")",
"return": "5"
}
],
@@ -3943,17 +3975,17 @@
{
"title": "Decode EUC-KR string",
"source": "decode_charset!(decode_base64!(\"vsiz58fPvLy/5A==\"), \"euc-kr\")",
- "return": "\"안녕하세요\""
+ "return": "\"\uc548\ub155\ud558\uc138\uc694\""
},
{
"title": "Decode EUC-JP string",
"source": "decode_charset!(decode_base64!(\"pLOk86TLpMGkzw==\"), \"euc-jp\")",
- "return": "\"こんにちは\""
+ "return": "\"\u3053\u3093\u306b\u3061\u306f\""
},
{
"title": "Decode GB2312 string",
"source": "decode_charset!(decode_base64!(\"xOO6ww==\"), \"gb2312\")",
- "return": "\"你好\""
+ "return": "\"\u4f60\u597d\""
}
],
"deprecated": false,
@@ -4140,7 +4172,7 @@
{
"title": "Decode a punycode encoded internationalized domain name",
"source": "decode_punycode!(\"www.xn--caf-dma.com\")",
- "return": "\"www.café.com\""
+ "return": "\"www.caf\u00e9.com\""
},
{
"title": "Decode an ASCII only string",
@@ -4150,7 +4182,7 @@
{
"title": "Ignore validation",
"source": "decode_punycode!(\"xn--8hbb.xn--fiba.xn--8hbf.xn--eib.\", validate: false)",
- "return": "\"١٠.٦٦.٣٠.٥.\""
+ "return": "\"\u0661\u0660.\u0666\u0666.\u0663\u0660.\u0665.\""
}
],
"deprecated": false,
@@ -4389,17 +4421,17 @@
"examples": [
{
"title": "Encode UTF8 string to EUC-KR",
- "source": "encode_base64(encode_charset!(\"안녕하세요\", \"euc-kr\"))",
+ "source": "encode_base64(encode_charset!(\"\uc548\ub155\ud558\uc138\uc694\", \"euc-kr\"))",
"return": "\"vsiz58fPvLy/5A==\""
},
{
"title": "Encode UTF8 string to EUC-JP",
- "source": "encode_base64(encode_charset!(\"こんにちは\", \"euc-jp\"))",
+ "source": "encode_base64(encode_charset!(\"\u3053\u3093\u306b\u3061\u306f\", \"euc-jp\"))",
"return": "\"pLOk86TLpMGkzw==\""
},
{
"title": "Encode UTF8 string to GB2312",
- "source": "encode_base64(encode_charset!(\"你好\", \"gb2312\"))",
+ "source": "encode_base64(encode_charset!(\"\u4f60\u597d\", \"gb2312\"))",
"return": "\"xOO6ww==\""
}
],
@@ -4818,12 +4850,12 @@
"examples": [
{
"title": "Encode an internationalized domain name",
- "source": "encode_punycode!(\"www.café.com\")",
+ "source": "encode_punycode!(\"www.caf\u00e9.com\")",
"return": "\"www.xn--caf-dma.com\""
},
{
"title": "Encode an internationalized domain name with mixed case",
- "source": "encode_punycode!(\"www.CAFé.com\")",
+ "source": "encode_punycode!(\"www.CAF\u00e9.com\")",
"return": "\"www.xn--caf-dma.com\""
},
{
@@ -6176,6 +6208,110 @@
}
],
"IP": [
+ {
+ "anchor": "decrypt_ip",
+ "name": "decrypt_ip",
+ "category": "IP",
+ "description": "Decrypts an IP address encrypted with `encrypt_ip`, returning the original IP address.\n\nSupported modes:\n\n* `aes128` - Reverses AES-128 ipcrypt-deterministic encryption. Key must be exactly 16 bytes.\n* `pfx` - Reverses prefix-preserving ipcrypt-pfx encryption. Key must be exactly 32 bytes.\n\nThe key and mode must match those used during encryption.",
+ "notices": [],
+ "arguments": [
+ {
+ "name": "ip",
+ "description": "The encrypted IP address to decrypt (IPv4 or IPv6).",
+ "required": true,
+ "type": [
+ "string"
+ ]
+ },
+ {
+ "name": "key",
+ "description": "The decryption key as raw bytes. Must match the key used for encryption: 16 bytes for `aes128`, 32 bytes for `pfx`.",
+ "required": true,
+ "type": [
+ "string"
+ ]
+ },
+ {
+ "name": "mode",
+ "description": "The decryption mode: `aes128` or `pfx`. Must match the mode used for encryption.",
+ "required": true,
+ "type": [
+ "string"
+ ]
+ }
+ ],
+ "internal_failure_reasons": [
+ "`ip` is not a valid IP address.",
+ "`mode` is not a supported mode (`aes128` or `pfx`).",
+ "`key` length does not match the mode requirements (16 bytes for `aes128`, 32 bytes for `pfx`)."
+ ],
+ "return": {
+ "types": [
+ "string"
+ ]
+ },
+ "examples": [
+ {
+ "title": "Decrypt an encrypted IPv4 address",
+ "source": "decrypt_ip!(\"72b9:a747:f2e9:72af:76ca:5866:6dcf:c3b0\", key: \"sixteen byte key\", mode: \"aes128\")",
+ "return": "\"192.168.1.1\""
+ }
+ ],
+ "deprecated": false,
+ "pure": true
+ },
+ {
+ "anchor": "encrypt_ip",
+ "name": "encrypt_ip",
+ "category": "IP",
+ "description": "Encrypts an IP address, transforming it into a different valid IP address of the same version.\n\nSupported modes:\n\n* `aes128` - Scrambles the IP using AES-128 encryption (ipcrypt-deterministic). Accepts IPv4 or IPv6; key must be exactly 16 bytes.\n* `pfx` - Prefix-preserving encryption (ipcrypt-pfx), that maintains network hierarchy so addresses in the same subnet encrypt to addresses sharing the same prefix. Key must be exactly 32 bytes.\n\nEncryption is deterministic: the same input IP, key, and mode always produce the same output.",
+ "notices": [],
+ "arguments": [
+ {
+ "name": "ip",
+ "description": "The IP address to encrypt (IPv4 or IPv6).",
+ "required": true,
+ "type": [
+ "string"
+ ]
+ },
+ {
+ "name": "key",
+ "description": "The encryption key as raw bytes. Must be 16 bytes for `aes128` mode or 32 bytes for `pfx` mode.",
+ "required": true,
+ "type": [
+ "string"
+ ]
+ },
+ {
+ "name": "mode",
+ "description": "The encryption mode: `aes128` or `pfx`.",
+ "required": true,
+ "type": [
+ "string"
+ ]
+ }
+ ],
+ "internal_failure_reasons": [
+ "`ip` is not a valid IP address.",
+ "`mode` is not a supported mode (`aes128` or `pfx`).",
+ "`key` length does not match the mode requirements (16 bytes for `aes128`, 32 bytes for `pfx`)."
+ ],
+ "return": {
+ "types": [
+ "string"
+ ]
+ },
+ "examples": [
+ {
+ "title": "Encrypt an IPv4 address",
+ "source": "encrypt_ip!(\"192.168.1.1\", key: \"sixteen byte key\", mode: \"aes128\")",
+ "return": "\"72b9:a747:f2e9:72af:76ca:5866:6dcf:c3b0\""
+ }
+ ],
+ "deprecated": false,
+ "pure": true
+ },
{
"anchor": "ip_aton",
"name": "ip_aton",
@@ -7397,7 +7533,7 @@
"enum": {
"ns": "Nanoseconds (1 billion nanoseconds in a second)",
"us": "Microseconds (1 million microseconds in a second)",
- "µs": "Microseconds (1 million microseconds in a second)",
+ "\u00b5s": "Microseconds (1 million microseconds in a second)",
"ms": "Milliseconds (1 thousand microseconds in a second)",
"cs": "Centiseconds (100 centiseconds in a second)",
"ds": "Deciseconds (10 deciseconds in a second)",
@@ -7775,7 +7911,7 @@
},
{
"name": "lossy",
- "description": "Whether to parse the JSON in a lossy manner. Replaces invalid UTF-8 characters\nwith the Unicode character `�` (U+FFFD) if set to true, otherwise returns an error\nif there are any invalid UTF-8 characters present.",
+ "description": "Whether to parse the JSON in a lossy manner. Replaces invalid UTF-8 characters\nwith the Unicode character `\ufffd` (U+FFFD) if set to true, otherwise returns an error\nif there are any invalid UTF-8 characters present.",
"required": false,
"default": true,
"type": [
@@ -8512,12 +8648,12 @@
},
{
"title": "Parse URL with internationalized domain name",
- "source": "parse_url!(\"https://www.café.com\")",
+ "source": "parse_url!(\"https://www.caf\u00e9.com\")",
"return": "{\"scheme\":\"https\",\"username\":\"\",\"password\":\"\",\"host\":\"www.xn--caf-dma.com\",\"port\":null,\"path\":\"/\",\"query\":{},\"fragment\":null}"
},
{
"title": "Parse URL with mixed case internationalized domain name",
- "source": "parse_url!(\"https://www.CAFé.com\")",
+ "source": "parse_url!(\"https://www.CAF\u00e9.com\")",
"return": "{\"scheme\":\"https\",\"username\":\"\",\"password\":\"\",\"host\":\"www.xn--caf-dma.com\",\"port\":null,\"path\":\"/\",\"query\":{},\"fragment\":null}"
}
],
@@ -9235,5 +9371,77 @@
"deprecated": false,
"pure": true
}
+ ],
+ "Map": [
+ {
+ "anchor": "haversine",
+ "name": "haversine",
+ "category": "Map",
+ "description": "Calculates the [haversine](https://en.wikipedia.org/wiki/Haversine_formula) great-circle distance and bearing between two geographic coordinates.",
+ "notices": [],
+ "arguments": [
+ {
+ "name": "latitude1",
+ "description": "Latitude of the first point in decimal degrees.",
+ "required": true,
+ "type": [
+ "float"
+ ]
+ },
+ {
+ "name": "longitude1",
+ "description": "Longitude of the first point in decimal degrees.",
+ "required": true,
+ "type": [
+ "float"
+ ]
+ },
+ {
+ "name": "latitude2",
+ "description": "Latitude of the second point in decimal degrees.",
+ "required": true,
+ "type": [
+ "float"
+ ]
+ },
+ {
+ "name": "longitude2",
+ "description": "Longitude of the second point in decimal degrees.",
+ "required": true,
+ "type": [
+ "float"
+ ]
+ },
+ {
+ "name": "measurement_unit",
+ "description": "Unit for the returned distance: `kilometers` or `miles`.",
+ "required": false,
+ "type": [
+ "string"
+ ],
+ "default": "kilometers"
+ }
+ ],
+ "internal_failure_reasons": [],
+ "return": {
+ "types": [
+ "object"
+ ]
+ },
+ "examples": [
+ {
+ "title": "Calculate distance and bearing in kilometers",
+ "source": "haversine(0.0, 0.0, 10.0, 10.0)",
+ "return": "{\"bearing\":44.561,\"distance\":1568.5227233}"
+ },
+ {
+ "title": "Calculate distance in miles",
+ "source": "haversine(0.0, 0.0, 10.0, 10.0, measurement_unit: \"miles\")",
+ "return": "{\"bearing\":44.561,\"distance\":974.6348468}"
+ }
+ ],
+ "deprecated": false,
+ "pure": true
+ }
]
-}
\ No newline at end of file
+}
diff --git a/data/synthetics_worker_versions.json b/data/synthetics_worker_versions.json
index d867354334a..51f1880e141 100644
--- a/data/synthetics_worker_versions.json
+++ b/data/synthetics_worker_versions.json
@@ -1,6 +1,6 @@
[
{
"client": "synthetics-windows-pl",
- "version": "1.68.0"
+ "version": "1.69.0"
}
]
\ No newline at end of file
diff --git a/layouts/_default/list.partners.json b/layouts/_default/list.partners.json
index 8b65cc7e4ed..09b8128677d 100644
--- a/layouts/_default/list.partners.json
+++ b/layouts/_default/list.partners.json
@@ -1,4 +1,4 @@
-{{- if (or (eq hugo.Environment "live") (in (slice "typesense_sync_preview:manual") (os.Getenv "CI_JOB_NAME" | default "" ))) -}}
+{{- if (in (slice "live" "preview") hugo.Environment) -}}
{{ $.Scratch.Add "partners_collection" slice }}
{{- range where .Site.AllPages "Type" "=" "partners" -}}
diff --git a/layouts/_default/list.search.json b/layouts/_default/list.search.json
index 54645fd3da9..f742ac6522a 100644
--- a/layouts/_default/list.search.json
+++ b/layouts/_default/list.search.json
@@ -1,4 +1,4 @@
-{{- if (or (eq hugo.Environment "live") (eq hugo.Environment "preview") (in (slice "typesense_sync_preview:manual" "algolia_sync_preview:manual") (os.Getenv "CI_JOB_NAME" | default "" ))) -}}
+{{- if (in (slice "live" "preview") hugo.Environment) -}}
{{ $.Scratch.Add "algoliaindex" slice }}
{{ $section := $.Site.GetPage "section" .Section }}
{{ $hugo_context := . }}
diff --git a/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md b/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md
index 7035c753937..645272fc702 100644
--- a/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md
+++ b/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md
@@ -3,7 +3,7 @@
## Overview
App and API Protection leverages the [Datadog .NET library](https://github.com/DataDog/dd-trace-dotnet/) to monitor and secure your .NET service. The library integrates seamlessly with your existing application without requiring code changes.
-For detailed compatibility information, including supported .NET versions, frameworks, and deployment environments, see [.NET Compatibility Requirements](/security/application_security/setup/dotnet/compatibility).
+For detailed compatibility information, including supported .NET versions, frameworks, and deployment environments, see [.NET Compatibility Requirements](/security/application_security/setup/compatibility/dotnet).
{{ if $showSetup }}
This guide explains how to set up App and API Protection (AAP) for .NET applications. The setup involves:
diff --git a/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md b/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md
index d1cff92241d..c89fbb8d002 100644
--- a/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md
+++ b/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md
@@ -3,7 +3,7 @@
## Overview
App and API Protection works by leveraging the [Datadog Node.js library](https://github.com/DataDog/dd-trace-js/) to monitor and secure your Node.js service. The library integrates seamlessly with your existing application without requiring code changes.
-For detailed compatibility information, including supported Node.js versions, frameworks, and deployment environments, see [Node.js Compatibility Requirements](/security/application_security/setup/nodejs/compatibility).
+For detailed compatibility information, including supported Node.js versions, frameworks, and deployment environments, see [Node.js Compatibility Requirements](/security/application_security/setup/compatibility/nodejs).
{{ if $showSetup }}
This guide explains how to set up App and API Protection (AAP) for Node.js applications. The setup involves:
diff --git a/layouts/shortcodes/app-and-api-protection-ruby-overview.md b/layouts/shortcodes/app-and-api-protection-ruby-overview.md
index d539be87d00..9b823009d22 100644
--- a/layouts/shortcodes/app-and-api-protection-ruby-overview.md
+++ b/layouts/shortcodes/app-and-api-protection-ruby-overview.md
@@ -4,7 +4,7 @@
App and API Protection works by leveraging the [Datadog Ruby library](https://github.com/DataDog/dd-trace-rb/) to monitor and secure your Ruby service. The library integrates seamlessly with your existing application without requiring code changes.
-For detailed compatibility information, including supported Ruby versions, frameworks, and deployment environments, see [Ruby Compatibility Requirements](/security/application_security/setup/ruby/compatibility).
+For detailed compatibility information, including supported Ruby versions, frameworks, and deployment environments, see [Ruby Compatibility Requirements](/security/application_security/setup/compatibility/ruby).
{{ if $showSetup }}
This guide explains how to set up App and API Protection (AAP) for Ruby applications. The setup involves:
diff --git a/layouts/shortcodes/app_and_api_protection_java_overview.md b/layouts/shortcodes/app_and_api_protection_java_overview.md
index 7197c8b8299..81379e76ba5 100644
--- a/layouts/shortcodes/app_and_api_protection_java_overview.md
+++ b/layouts/shortcodes/app_and_api_protection_java_overview.md
@@ -3,7 +3,7 @@
## Overview
App and API Protection leverages the [Datadog Java library](https://github.com/DataDog/dd-trace-java/) to monitor and secure your Java service. The library integrates seamlessly with your existing application without requiring code changes.
-For detailed compatibility information, including supported Java versions, frameworks, and deployment environments, see [Java Compatibility Requirements](/security/application_security/setup/java/compatibility).
+For detailed compatibility information, including supported Java versions, frameworks, and deployment environments, see [Java Compatibility Requirements](/security/application_security/setup/compatibility/java).
{{ if $showSetup }}
This guide explains how to set up App and API Protection (AAP) for Java applications. The setup involves:
diff --git a/layouts/shortcodes/app_and_api_protection_php_overview.md b/layouts/shortcodes/app_and_api_protection_php_overview.md
index 65f14ae76af..b54b80f5d20 100644
--- a/layouts/shortcodes/app_and_api_protection_php_overview.md
+++ b/layouts/shortcodes/app_and_api_protection_php_overview.md
@@ -3,7 +3,7 @@
## Overview
App and API Protection leverages the [Datadog PHP library](https://github.com/DataDog/dd-trace-php/) to monitor and secure your PHP service. The library integrates seamlessly with your existing application without requiring code changes.
-For detailed compatibility information, including supported PHP versions, frameworks, and deployment environments, see [PHP Compatibility Requirements](/security/application_security/setup/php/compatibility).
+For detailed compatibility information, including supported PHP versions, frameworks, and deployment environments, see [PHP Compatibility Requirements](/security/application_security/setup/compatibility/php).
{{ if $showSetup }}
This guide explains how to set up App and API Protection (AAP) for PHP applications. The setup involves:
diff --git a/layouts/shortcodes/app_and_api_protection_python_overview.md b/layouts/shortcodes/app_and_api_protection_python_overview.md
index 0de4ead1943..ebc73c7c4be 100644
--- a/layouts/shortcodes/app_and_api_protection_python_overview.md
+++ b/layouts/shortcodes/app_and_api_protection_python_overview.md
@@ -3,7 +3,7 @@
## Overview
App and API Protection leverages the [Datadog Python library](https://github.com/DataDog/dd-trace-py/) to monitor and secure your Python service. The library integrates seamlessly with your existing application without requiring code changes.
-For detailed compatibility information, including supported Python versions, frameworks, and deployment environments, see [Python Compatibility Requirements](/security/application_security/setup/python/compatibility).
+For detailed compatibility information, including supported Python versions, frameworks, and deployment environments, see [Python Compatibility Requirements](/security/application_security/setup/compatibility/python).
{{ if $showSetup }}
This guide explains how to set up App and API Protection (AAP) for Python applications. The setup involves:
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/android.mdoc.md
new file mode 100644
index 00000000000..e32b4b5f331
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/android.mdoc.md
@@ -0,0 +1,13 @@
+### Track attributes
+
+```kotlin
+// Adds an attribute to all future RUM events
+GlobalRumMonitor.get().addAttribute(key, value)
+
+// Removes an attribute to all future RUM events
+GlobalRumMonitor.get().removeAttribute(key)
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/android
+[3]: /real_user_monitoring/android/data_collected
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/flutter.mdoc.md
new file mode 100644
index 00000000000..6bba5ee4092
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/flutter.mdoc.md
@@ -0,0 +1,9 @@
+### Set a custom global attribute
+
+To set a custom global attribute, use `DdRum.addAttribute`.
+
+* To add or update an attribute, use `DdRum.addAttribute`.
+* To remove the key, use `DdRum.removeAttribute`.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[14]: /real_user_monitoring/application_monitoring/flutter/data_collected
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/ios.mdoc.md
new file mode 100644
index 00000000000..cef6393d089
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/ios.mdoc.md
@@ -0,0 +1,15 @@
+### Set a custom global attribute
+
+To set a custom global attribute, use `RUMMonitor.shared().addAttribute(forKey:value:)`.
+
+* To add an attribute, use `RUMMonitor.shared().addAttribute(forKey: "", value: "")`.
+* To update the value, use `RUMMonitor.shared().addAttribute(forKey: "", value: "")`.
+* To remove the key, use `RUMMonitor.shared().removeAttribute(forKey: "")`.
+
+For better performance in bulk operations (modifying multiple attributes at once), use `.addAttributes(_:)` and `.removeAttributes(forKeys:)`.
+
+**Note**: You can't create facets on custom attributes if you use spaces or special characters in your key names. For example, use `forKey: "store_id"` instead of `forKey: "Store ID"`.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/ios
+[6]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..030db2df492
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,12 @@
+### Track attributes
+
+```kotlin
+// Adds an attribute to all future RUM events
+GlobalRumMonitor.get().addAttribute(key, value)
+
+// Removes an attribute to all future RUM events
+GlobalRumMonitor.get().removeAttribute(key)
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/react_native.mdoc.md
new file mode 100644
index 00000000000..af9ce01c9a1
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/react_native.mdoc.md
@@ -0,0 +1,52 @@
+### Global attributes
+
+You can keep global attributes to track information about a specific session, such as A/B testing configuration, ad campaign origin, or cart status. These attributes are attached to all future Logs, Spans, and RUM events.
+
+**Add multiple global attributes**
+
+Use `addAttributes` to add or update several attributes at once.
+
+```js
+DdSdkReactNative.addAttributes({
+ profile_mode: 'wall',
+ chat_enabled: true,
+ campaign_origin: 'example_ad_network'
+});
+```
+
+**Add a single global attribute**
+
+Use `addAttribute` when you want to add or update a single attribute.
+
+```js
+DdSdkReactNative.addAttribute('profile_mode', 'wall');
+DdSdkReactNative.addAttribute('chat_enabled', true);
+```
+
+If the attribute already exists, its value is overwritten.
+
+**Remove a single global attribute**
+
+Use `removeAttribute` to remove a specific attribute from the global context.
+
+```js
+DdSdkReactNative.removeAttribute('campaign_origin');
+```
+
+After removal, the attribute is no longer attached to future Logs, Spans, or RUM events.
+
+**Remove multiple global attributes**
+
+Use `removeAttributes` to remove several attributes at once.
+
+```js
+DdSdkReactNative.removeAttributes([
+ 'profile_mode',
+ 'chat_enabled'
+]);
+```
+
+This is useful when cleaning up session-specific data, such as when a user logs out or exits a feature flow.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/react_native
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/roku.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/roku.mdoc.md
new file mode 100644
index 00000000000..9a839614754
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/roku.mdoc.md
@@ -0,0 +1,10 @@
+### Track custom global attributes
+
+In addition to the default attributes captured by the SDK automatically, you can choose to add additional contextual information, such as custom attributes, to your Logs and RUM events to enrich your observability within Datadog. Custom attributes allow you to filter and group information about observed user behavior (for example by cart value, merchant tier, or ad campaign) with code-level information (such as backend services, session timeline, error logs, and network health).
+
+```text
+ m.global.setField("datadogContext", { foo: "Some value", bar: 123})
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/roku/setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/unity.mdoc.md
new file mode 100644
index 00000000000..74317147c51
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/unity.mdoc.md
@@ -0,0 +1,9 @@
+### Set a custom global attribute
+
+To set a custom global attribute, use `DdRum.AddAttribute`.
+
+* To add or update an attribute, use `DdRum.AddAttribute`.
+* To remove the key, use `DdRum.RemoveAttribute`.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[3]: /real_user_monitoring/application_monitoring/unity/data_collected/
diff --git a/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md
index b18b0e3e7af..e7464a5b023 100644
--- a/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md
+++ b/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md
@@ -66,7 +66,7 @@ The flavor (variant) of the application. For stack trace deobfuscation, this mus
`firstPartyHosts`
: Optional
**Type**: List<String>
-A list of first party hosts, used in conjunction with Datadog network tracking packages. Overrides any values set in `firstPartyHostsWithTracinHeaders`. To specify different headers per host, use `firstPartyHostsWithTracingHeaders` instead.
+A list of first party hosts, used in conjunction with Datadog network tracking packages. Overrides any values set in `firstPartyHostsWithTracingHeaders`. To specify different headers per host, use `firstPartyHostsWithTracingHeaders` instead.
`firstPartyHostsWithTracingHeaders`
: Optional
@@ -208,9 +208,44 @@ To enable Datadog [distributed tracing][13], you must set the `DatadogConfigurat
- `DatadogRumConfiguration.traceSampleRate` sets a default sampling rate of 20%. If you want all resources requests to generate a full distributed trace, set this value to `100.0`.
+### Capture resource headers
+
+When [tracking resources automatically][10], you can capture HTTP request and response headers on RUM Resources by setting `trackResourceHeaders` on `DatadogRumConfiguration`. This option applies to all Datadog HTTP tracking clients (Tracking HTTP Client, `DatadogClient`, Dio Interceptor, and GQL Link), but does not apply to the gRPC Interceptor. This option is disabled by default.
+
+Captured headers appear on the RUM Resource event under `resource.request.headers` and `resource.response.headers`. You can query them in the RUM Explorer.
+
+```dart
+DatadogRumConfiguration(
+ applicationId: '',
+ trackResourceHeaders: ResourceHeadersExtractor(),
+)
+```
+
+With no arguments, `ResourceHeadersExtractor` captures a predefined set of safe headers:
+
+| Direction | Headers |
+|-----------|---------|
+| Request | `cache-control`, `content-type` |
+| Response | `age`, `cache-control`, `content-encoding`, `content-length`, `content-type`, `etag`, `expires`, `server-timing`, `vary`, `x-cache` |
+
+To capture additional headers in addition to the defaults, pass them through `captureHeaders`. To skip the defaults, set `includeDefaults: false`.
+
+```dart
+DatadogRumConfiguration(
+ applicationId: '',
+ trackResourceHeaders: ResourceHeadersExtractor(
+ captureHeaders: ['x-request-id', 'x-custom-header'],
+ ),
+)
+```
+
+{% alert level="info" %}
+Sensitive headers, such as tokens and API keys, are filtered out automatically, even if you list them explicitly.
+{% /alert %}
+
### Track resources from other packages
-While `Datadog Tracking HTTP Client` can track most common network calls in Flutter, Datadog supplies packages for integration into specific networking libraries, including gRPC, GraphQL and Dio. For more information about these libraries, see [Integrated Libraries][22].
+While [Datadog Tracking HTTP Client][10] can track most common network calls in Flutter, Datadog supplies packages for integration into specific networking libraries, including gRPC, GraphQL and Dio. For more information about these libraries, see [Integrated Libraries][22].
## Enrich user sessions
diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/android.mdoc.md
new file mode 100644
index 00000000000..5516cd7d0e2
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/android.mdoc.md
@@ -0,0 +1,79 @@
+## Event and data management
+
+The Android SDK first stores events and only uploads events when the [intake specifications][8] conditions are met.
+
+### Clear all data
+
+You have the option of deleting all unsent data stored by the SDK with the `clearAllData` API.
+
+```kotlin
+fun clearAllData(sdkCore: SdkCore = getInstance()) {
+ sdkCore.clearAllData()
+}
+```
+
+### Stop data collection
+
+You can use the `StopInstance` API to stop the SDK instance assigned to the given name (or the default instance if the name is null) from collecting and uploading data further.
+
+```kotlin
+fun stopInstance(instanceName: String? = null) {
+ synchronized(registry) {
+ val instance = registry.unregister(instanceName)
+ (instance as? DatadogCore)?.stop()
+ }
+}
+```
+
+### Control event buildup
+
+Many operations, such as data processing and event I/O, are queued in background threads to handle edge cases where the queue has grown so much that there could be delayed processing, high memory usage, or Application Not Responding (ANR) errors.
+
+You can control the buildup of events on the SDK with the `setBackpressureStrategy` API. This API ignores new tasks if a queue reaches 1024 items.
+
+```kotlin
+fun setBackpressureStrategy(backpressureStrategy: BackPressureStrategy): Builder {
+ coreConfig = coreConfig.copy(backpressureStrategy = backpressureStrategy)
+ return this
+}
+```
+
+See an [example of this API][9] being used.
+
+### Set remote log threshold
+
+You can define the minimum log level (priority) to send events to Datadog in a logger instance. If the log priority is below the one you set at this threshold, it does not get sent. The default value is -1 (allow all).
+
+```kotlin
+fun setRemoteLogThreshold(minLogThreshold: Int): Builder {
+ minDatadogLogsPriority = minLogThreshold
+ return this
+}
+```
+
+## Retrieve the RUM session ID
+
+Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog.
+
+You can access the RUM session ID at runtime without waiting for the `sessionStarted` event:
+
+```kotlin
+GlobalRumMonitor.get().getCurrentSessionId { sessionId ->
+ currentSessionId = sessionId
+}
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/android
+[3]: /real_user_monitoring/android/data_collected
+[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views
+[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters
+[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests
+[7]: /real_user_monitoring/android/data_collected/#event-specific-attributes
+[8]: /real_user_monitoring/application_monitoring/android/setup/#sending-data-when-device-is-offline
+[9]: https://github.com/DataDog/dd-sdk-android/blob/eaa15cd344d1723fafaf179fcebf800d6030c6bb/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt#L279
+[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget
+[11]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#time-to-network-settled
+[12]: https://square.github.io/okhttp/features/events/
+[13]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#interaction-to-next-view
+[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/flutter.mdoc.md
new file mode 100644
index 00000000000..1a3acb075ab
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/flutter.mdoc.md
@@ -0,0 +1,66 @@
+## Tracking from background isolates
+
+Starting with v3, Datadog Flutter SDK is capable of monitoring from multiple isolates, but monitoring must be initialized from the background isolate:
+
+When initializing your background isolate, call `DatadogSdk.instance.attachToBackgroundIsolate`. For example:
+
+```dart
+Future _spawnIsolate() async {
+ final receivePort = ReceivePort();
+ receivePort.listen((message) {
+ //
+ });
+ await Isolate.spawn(_backgroundWork, receivePort.sendPort);
+ }
+
+void _backgroundWork(SendPort port) async {
+ await DatadogSdk.instance.attachToBackgroundIsolate();
+
+ // Your background work
+}
+```
+
+`attachToBackgroundIsolate` must be called **after** Datadog is initialized in your main isolate, otherwise the call silently fails and tracking is not available.
+
+If you are using [Datadog Tracking HTTP Client][10] to automatically track resources, `attachToBackgroundIsolate` automatically starts tracking resources from the calling isolate. However, using `Client` from the `http` package or `Dio` requires you to re-initialize HTTP tracking for those packages from the background isolate.
+
+## Clear all data
+
+Use `clearAllData` to clear all data that has not been sent to Datadog.
+
+```dart
+DatadogSdk.instance.clearAllData();
+```
+
+## Retrieve the RUM session ID
+
+Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog.
+
+You can access the RUM session ID at runtime without waiting for the `sessionStarted` event:
+
+```dart
+final sessionId = await DatadogSdk.instance.rum?.getCurrentSessionId()
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/flutter/setup/
+[3]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries/
+[4]: /getting_started/tagging/#defining-tags
+[5]: /real_user_monitoring/connect_rum_and_traces/?tab=browserrum#how-are-rum-resources-linked-to-traces
+[6]: https://github.com/openzipkin/b3-propagation#single-headers
+[7]: https://github.com/openzipkin/b3-propagation#multiple-headers
+[8]: https://www.w3.org/TR/trace-context/#tracestate-header
+[9]: /real_user_monitoring/application_monitoring/browser/frustration_signals/
+[10]: https://pub.dev/packages/datadog_tracking_http_client
+[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html
+[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html
+[13]: /serverless/aws_lambda/distributed_tracing/
+[14]: /real_user_monitoring/application_monitoring/flutter/data_collected
+[15]: /real_user_monitoring/explorer/?tab=measures#setup-facets-and-measures
+[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client
+[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/
+[18]: /real_user_monitoring/application_monitoring/mobile_vitals/?tab=flutter
+[19]: https://pub.dev/packages/datadog_grpc_interceptor
+[20]: https://pub.dev/packages/datadog_gql_link
+[21]: https://pub.dev/packages/datadog_dio
+[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries
diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/ios.mdoc.md
new file mode 100644
index 00000000000..685f5091802
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/ios.mdoc.md
@@ -0,0 +1,85 @@
+## Track background events
+
+{% alert level="info" %}
+Tracking background events may lead to additional sessions, which can impact billing. For questions, [contact Datadog support](https://docs.datadoghq.com/help/).
+{% /alert %}
+
+You can track events such as crashes and network requests when your application is in the background (for example, no active view is available).
+
+To track background events, add the following snippet during initialization in your Datadog configuration:
+
+```swift
+import DatadogRUM
+
+RUM.enable(
+ with: RUM.Configuration(
+ ...
+ trackBackgroundEvents: true
+ )
+)
+```
+
+## Retrieve the RUM session ID
+
+Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog.
+
+You can access the RUM session ID at runtime without waiting for the `sessionStarted` event:
+
+```swift
+RumMonitor.shared().currentSessionID(completion: { sessionId in
+ currentSessionId = sessionId
+})
+```
+
+## Set tracking consent (GDPR compliance)
+
+To be compliant with the GDPR regulation, the RUM iOS SDK requires the tracking consent value at initialization.
+
+The `trackingConsent` setting can be one of the following values:
+
+1. `.pending`: The RUM iOS SDK starts collecting and batching the data but does not send it to Datadog. The RUM iOS SDK waits for the new tracking consent value to decide what to do with the batched data.
+2. `.granted`: The RUM iOS SDK starts collecting the data and sends it to Datadog.
+3. `.notGranted`: The RUM iOS SDK does not collect any data. No logs, traces, or RUM events are sent to Datadog.
+
+To change the tracking consent value after the RUM iOS SDK is initialized, use the `Datadog.set(trackingConsent:)` API call. The RUM iOS SDK changes its behavior according to the new value.
+
+For example, if the current tracking consent is `.pending`:
+
+- If you change the value to `.granted`, the RUM iOS SDK sends all current and future data to Datadog.
+- If you change the value to `.notGranted`, the RUM iOS SDK wipes all current data and does not collect future data.
+
+## Data management
+
+The iOS SDK first stores events locally and only uploads events when the [intake specifications][9] conditions are met.
+
+### Clear all data
+
+You have the option of deleting all unsent data stored by the SDK with the `Datadog.clearAllData()` API.
+
+```swift
+import DatadogCore
+
+Datadog.clearAllData()
+```
+
+### Stop data collection
+
+You can use the `Datadog.stopInstance()` API to stop a named SDK instance (or the default instance if the name is `nil`) from collecting and uploading data further.
+
+```swift
+import DatadogCore
+
+Datadog.stopInstance()
+```
+
+Calling this method disables the SDK and all active features, such as RUM. To resume data collection, you must reinitialize the SDK. You can use this API if you want to change configurations dynamically.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/ios
+[3]: /real_user_monitoring/application_monitoring/ios/data_collected/
+[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift
+[5]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#error-attributes
+[6]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes
+[7]: https://www.ntppool.org/en/
+[8]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting
+[9]: /real_user_monitoring/application_monitoring/ios/setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..e4e44d98c3c
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,67 @@
+## Event and data management
+
+The Kotlin Multiplatform SDK first stores events. It only uploads these events when the [intake specification][9] conditions are met.
+
+### Clear all data
+
+You have the option of deleting all unsent data stored by the SDK with the `clearAllData` API.
+
+```kotlin
+Datadog.clearAllData()
+```
+
+### Stop data collection
+
+You can use the `stopInstance` API to stop the SDK instance from collecting and uploading data further.
+
+```kotlin
+Datadog.stopInstance()
+```
+
+### Set remote log threshold
+
+You can define the minimum log level (priority) to send events to Datadog in a logger instance. If the log priority is below the one you set at this threshold, it does not get sent. The default value is to allow all.
+
+```kotlin
+val logger = Logger.Builder()
+ .setRemoteLogThreshold(LogLevel.INFO)
+ .build()
+```
+
+## Track background events
+
+You can track events such as crashes and network requests when your application is in the background (for example, no active view is available).
+
+Add the following snippet during RUM configuration:
+
+```kotlin
+.trackBackgroundEvents(true)
+```
+
+{% alert level="info" %}
+Tracking background events may lead to additional sessions, which can impact billing. For questions, [contact Datadog support][a1].
+{% /alert %}
+
+## Retrieve the RUM session ID
+
+Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog.
+
+You can access the RUM session ID at runtime without waiting for the `sessionStarted` event:
+
+```kotlin
+GlobalRumMonitor.get().getCurrentSessionId { sessionId ->
+ currentSessionId = sessionId
+}
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform
+[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
+[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views
+[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters
+[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor
+[7]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
+[8]: /real_user_monitoring/explorer/search/#setup-facets-and-measures
+[9]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#sending-data-when-device-is-offline
+[10]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting
+[a1]: https://docs.datadoghq.com/help/
diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/react_native.mdoc.md
new file mode 100644
index 00000000000..0d5071ea301
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/react_native.mdoc.md
@@ -0,0 +1,43 @@
+## Clear all data
+
+Use `clearAllData` to clear all data that has not been sent to Datadog.
+
+```js
+DdSdkReactNative.clearAllData();
+```
+
+## Retrieve the RUM session ID
+
+Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog.
+
+You can access the RUM session ID at runtime with:
+
+```javascript
+import { DdRum } from '@datadog/mobile-react-native';
+
+const rumSessionId = await DdRum.getCurrentSessionId();
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/react_native
+[3]: https://jestjs.io/
+[4]: /account_management/api-app-keys/#client-tokens
+[5]: /getting_started/tagging/#define-tags
+[6]: /getting_started/site/
+[7]: /real_user_monitoring/application_monitoring/browser/frustration_signals/
+[8]: /real_user_monitoring/correlate_with_other_telemetry/apm?tab=reactnativerum
+[9]: /real_user_monitoring/guide/proxy-mobile-rum-data/
+[10]: https://github.com/wix/react-native-navigation
+[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/
+[12]: https://github.com/react-navigation/react-navigation
+[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation
+[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2
+[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
+[16]: https://reactnative.dev/docs/global-requestIdleCallback
+[17]: https://reactnative.dev/docs/interactionmanager#runafterinteractions
+[18]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation-async
+[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications
+[20]: /real_user_monitoring/error_tracking/mobile/ios/?tab=cocoapods#configure-the-app-hang-threshold
+[21]: #rum-configuration
+[22]: #logs-configuration
+[23]: #trace-configuration
diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/unity.mdoc.md
new file mode 100644
index 00000000000..c97e8571d65
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/unity.mdoc.md
@@ -0,0 +1,11 @@
+## Clear all data
+
+Use `ClearAllData` to clear all data that has not been sent to Datadog.
+
+```csharp
+DatadogSdk.instance.ClearAllData();
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/unity/setup/
+[3]: /real_user_monitoring/application_monitoring/unity/data_collected/
diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/android.mdoc.md
new file mode 100644
index 00000000000..c583589974b
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/android.mdoc.md
@@ -0,0 +1,68 @@
+## Modify or drop RUM events
+
+To modify some attributes in your RUM events, or to drop some of the events entirely before batching, provide an implementation of `EventMapper` when initializing the RUM Android SDK:
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ // ...
+ .setErrorEventMapper(rumErrorEventMapper)
+ .setActionEventMapper(rumActionEventMapper)
+ .setResourceEventMapper(rumResourceEventMapper)
+ .setViewEventMapper(rumViewEventMapper)
+ .setLongTaskEventMapper(rumLongTaskEventMapper)
+ .build()
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
+ // ...
+ .setErrorEventMapper(rumErrorEventMapper)
+ .setActionEventMapper(rumActionEventMapper)
+ .setResourceEventMapper(rumResourceEventMapper)
+ .setViewEventMapper(rumViewEventMapper)
+ .setLongTaskEventMapper(rumLongTaskEventMapper)
+ .build();
+```
+
+{% /tab %}
+{% /tabs %}
+
+When implementing the `EventMapper` interface, only some attributes are modifiable for each event type:
+
+| Event type | Attribute key | Description |
+| ------------- | -------------------- | ------------------------------------------------ |
+| ViewEvent | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| ActionEvent | | |
+| | `action.target.name` | Target name. |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| ErrorEvent | | |
+| | `error.message` | Error message. |
+| | `error.stack` | Stacktrace of the error. |
+| | `error.resource.url` | URL of the resource. |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| ResourceEvent | | |
+| | `resource.url` | URL of the resource. |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| LongTaskEvent | | |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+
+**Note**: If you return null from the `EventMapper` implementation, the event is kept and sent as-is.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/android
diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/flutter.mdoc.md
new file mode 100644
index 00000000000..1d64f3d8e40
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/flutter.mdoc.md
@@ -0,0 +1,53 @@
+## Modify or drop RUM events
+
+**Note**: This feature is not yet available for Flutter web applications.
+
+To modify attributes of a RUM event before it is sent to Datadog or to drop an event entirely, use the Event Mappers API when configuring the Flutter RUM SDK:
+
+```dart
+final config = DatadogConfiguration(
+ // other configuration...
+ rumConfiguration: DatadogRumConfiguration(
+ applicationId: '',
+ rumViewEventMapper = (event) => event,
+ rumActionEventMapper = (event) => event,
+ rumResourceEventMapper = (event) => event,
+ rumErrorEventMapper = (event) => event,
+ rumLongTaskEventMapper = (event) => event,
+ ),
+);
+```
+
+Each mapper is a function with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it is sent, or dropping the event entirely.
+
+For example, to redact sensitive information in a RUM Resource's `url`, implement a custom `redacted` function and use it in `rumResourceEventMapper`:
+
+```dart
+ rumResourceEventMapper = (event) {
+ var resourceEvent = resourceEvent
+ resourceEvent.resource.url = redacted(resourceEvent.resource.url)
+ return resourceEvent
+ }
+```
+
+Returning `null` from the error, resource, or action mapper drops the event entirely; the event is not sent to Datadog. The value returned from the view event mapper must not be `null`.
+
+Depending on the event's type, only some specific properties can be modified:
+
+| Event Type | Attribute key | Description |
+| ---------------- | --------------------------------- | ------------------------------------------- |
+| RumViewEvent | `viewEvent.view.url` | URL of the view. |
+| | `viewEvent.view.referrer` | Referrer of the view. |
+| RumActionEvent | `actionEvent.action.target?.name` | Name of the action. |
+| | `actionEvent.view.referrer` | Referrer of the view linked to this action. |
+| | `actionEvent.view.url` | URL of the view linked to this action. |
+| RumErrorEvent | `errorEvent.error.message` | Error message. |
+| | `errorEvent.error.stack` | Stacktrace of the error. |
+| | `errorEvent.error.resource?.url` | URL of the resource the error refers to. |
+| | `errorEvent.view.referrer` | Referrer of the view linked to this action. |
+| | `errorEvent.view.url` | URL of the view linked to this error. |
+| RumResourceEvent | `resourceEvent.resource.url` | URL of the resource. |
+| | `resourceEvent.view.referrer` | Referrer of the view linked to this action. |
+| | `resourceEvent.view.url` | URL of the view linked to this resource. |
+
+[1]: https://app.datadoghq.com/rum/application/create
diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/ios.mdoc.md
new file mode 100644
index 00000000000..74f8495ae6d
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/ios.mdoc.md
@@ -0,0 +1,110 @@
+## Modify or drop RUM events
+
+To modify attributes of a RUM event before it is sent to Datadog or to drop an event entirely, use the Event Mappers API when configuring the RUM iOS SDK:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+let configuration = RUM.Configuration(
+ applicationID: "",
+ viewEventMapper: { RUMViewEvent in
+ return RUMViewEvent
+ }
+ resourceEventMapper: { RUMResourceEvent in
+ return RUMResourceEvent
+ }
+ actionEventMapper: { RUMActionEvent in
+ return RUMActionEvent
+ }
+ errorEventMapper: { RUMErrorEvent in
+ return RUMErrorEvent
+ }
+ longTaskEventMapper: { RUMLongTaskEvent in
+ return RUMLongTaskEvent
+ }
+)
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""];
+
+[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) {
+ return RUMViewEvent;
+}];
+
+[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) {
+ return RUMErrorEvent;
+}];
+
+[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) {
+ return RUMResourceEvent;
+}];
+
+[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) {
+ return RUMActionEvent;
+}];
+
+[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) {
+ return RUMLongTaskEvent;
+}];
+```
+
+{% /tab %}
+{% /tabs %}
+
+Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it is sent.
+
+For example, to redact sensitive information in a RUM Resource's `url`, implement a custom `redacted(_:) -> String` function and use it in `resourceEventMapper`:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+let configuration = RUM.Configuration(
+ applicationID: "",
+ resourceEventMapper: { RUMResourceEvent in
+ var RUMResourceEvent = RUMResourceEvent
+ RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url)
+ return RUMResourceEvent
+ }
+)
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""];
+
+[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) {
+ return RUMResourceEvent;
+}];
+```
+
+{% /tab %}
+{% /tabs %}
+
+Returning `nil` from the error, resource, or action mapper drops the event entirely; the event is not sent to Datadog. The value returned from the view event mapper must not be `nil` (to drop views, customize your implementation of `UIKitRUMViewsPredicate`; read more in [tracking views automatically](#automatically-track-views)).
+
+Depending on the event's type, only some specific properties can be modified:
+
+| Event Type | Attribute key | Description |
+| ---------------- | ------------------------------------ | ------------------------------------------------ |
+| RUMActionEvent | `RUMActionEvent.action.target?.name` | Name of the action. |
+| | `RUMActionEvent.view.url` | URL of the view linked to this action. |
+| RUMErrorEvent | `RUMErrorEvent.error.message` | Error message. |
+| | `RUMErrorEvent.error.stack` | Stacktrace of the error. |
+| | `RUMErrorEvent.error.resource?.url` | URL of the resource the error refers to. |
+| | `RUMErrorEvent.view.url` | URL of the view linked to this error. |
+| RUMResourceEvent | `RUMResourceEvent.resource.url` | URL of the resource. |
+| | `RUMResourceEvent.view.url` | URL of the view linked to this resource. |
+| RUMViewEvent | `RUMViewEvent.view.name` | Name of the view. |
+| | `RUMViewEvent.view.url` | URL of the view. |
+| | `RUMViewEvent.view.referrer` | URL that linked to the initial view of the page. |
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/ios
diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..d93372709fa
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,44 @@
+## Modify or drop RUM events
+
+To modify some attributes in your RUM events, or to drop some of the events entirely before batching, provide an implementation of `EventMapper` when initializing the RUM Kotlin Multiplatform SDK:
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ // ...
+ .setErrorEventMapper(rumErrorEventMapper)
+ .setActionEventMapper(rumActionEventMapper)
+ .setResourceEventMapper(rumResourceEventMapper)
+ .setViewEventMapper(rumViewEventMapper)
+ .setLongTaskEventMapper(rumLongTaskEventMapper)
+ .build()
+```
+
+When implementing the `EventMapper` interface, only some attributes are modifiable for each event type:
+
+| Event type | Attribute key | Description |
+| ------------- | -------------------- | ------------------------------------------------ |
+| ViewEvent | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| ActionEvent | `action.target.name` | Target name. |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| ErrorEvent | `error.message` | Error message. |
+| | `error.stack` | Stacktrace of the error. |
+| | `error.resource.url` | URL of the resource. |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| ResourceEvent | `resource.url` | URL of the resource. |
+| | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+| LongTaskEvent | `view.referrer` | URL that linked to the initial view of the page. |
+| | `view.url` | URL of the view. |
+| | `view.name` | Name of the view. |
+
+**Note**: If you return null from the `EventMapper` implementation, the event is dropped.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform
diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/react_native.mdoc.md
new file mode 100644
index 00000000000..aa0acbf3dae
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/react_native.mdoc.md
@@ -0,0 +1,84 @@
+## Modify or drop RUM events
+
+To modify attributes of a RUM event before it is sent to Datadog, or to drop an event entirely, use the Event Mappers API when configuring the RUM React Native SDK:
+
+```javascript
+import {
+ SdkVerbosity,
+ DatadogProvider,
+ DatadogProviderConfiguration,
+ RumConfiguration,
+ LogsConfiguration,
+ TraceConfiguration
+} from '@datadog/mobile-react-native';
+
+const config = new DatadogProviderConfiguration(
+ '',
+ '',
+ {
+ rumConfiguration: {
+ applicationId: '',
+ trackInteractions: true, // Track user interactions (such as a tap on buttons).
+ trackResources: true, // Track XHR resources
+ trackErrors: true, // Track errors
+ // RUM Event Mappers
+ errorEventMapper: (event) => event,
+ resourceEventMapper: (event) => event,
+ actionEventMapper: (event) => event
+ },
+
+ // Log Event Mappers
+ logsConfiguration: {
+ logEventMapper: (event) => event
+ },
+
+ traceConfiguration: {}
+ }
+)
+```
+
+Each mapper is a function with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it is sent, or dropping the event entirely.
+
+For example, to redact sensitive information from a RUM error `message`, implement a custom `redacted` function and use it in `errorEventMapper`:
+
+```javascript
+config.rumConfiguration.errorEventMapper = (event) => {
+ event.message = redacted(event.message);
+ return event;
+};
+```
+
+Returning `null` from the error, resource, or action mapper drops the event entirely; the event is not sent to Datadog.
+
+Depending on the event type, only some specific properties can be modified:
+
+| Event Type | Attribute key | Description |
+| ------------- | ------------------------ | ---------------------------------- |
+| LogEvent | `logEvent.message` | Message of the log. |
+| | `logEvent.context` | Custom attributes of the log. |
+| ActionEvent | `actionEvent.context` | Custom attributes of the action. |
+| ErrorEvent | `errorEvent.message` | Error message. |
+| | `errorEvent.source` | Source of the error. |
+| | `errorEvent.stacktrace` | Stacktrace of the error. |
+| | `errorEvent.context` | Custom attributes of the error. |
+| | `errorEvent.timestampMs` | Timestamp of the error. |
+| ResourceEvent | `resourceEvent.context` | Custom attributes of the resource. |
+
+Events include additional context:
+
+| Event Type | Context attribute key | Description |
+| ------------- | ------------------------------------------------ | ----------------------------------------------------------------------- |
+| LogEvent | `logEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. |
+| | `logEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. |
+| ActionEvent | `actionEvent.actionContext` | [GestureResponderEvent][14] corresponding to the action or `undefined`. |
+| | `actionEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. |
+| | `actionEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. |
+| ErrorEvent | `errorEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. |
+| | `errorEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. |
+| ResourceEvent | `resourceEvent.resourceContext` | [XMLHttpRequest][15] corresponding to the resource or `undefined`. |
+| | `resourceEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. |
+| | `resourceEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. |
+
+[1]: https://app.datadoghq.com/rum/application/create
+[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2
+[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
diff --git a/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md
index 2efbd22b6b3..8e9da1ecb60 100644
--- a/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md
+++ b/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md
@@ -362,7 +362,7 @@ To request support for a web server that is not listed here, [fill out this form
Visualize the [data collected][11] in [dashboards][12] or create a search query in the [RUM Explorer][5].
-Your application appears as pending on the Applications page until Datadog starts receiving data.
+Your application appears as pending on the Applications page until Datadog starts receiving data. If data takes time to appear, see [Troubleshooting Browser SDK Issues][15].
[1]: /real_user_monitoring/
[2]: /error_tracking/frontend/browser
@@ -378,4 +378,5 @@ Your application appears as pending on the Applications page until Datadog start
[12]: /real_user_monitoring/platform/dashboards/
[13]: /private-beta/rum-sdk-auto-injection/
[14]: /real_user_monitoring/application_monitoring/browser/setup/client
+[15]: /real_user_monitoring/browser/troubleshooting/#data-to-the-datadog-intake
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/android.mdoc.md
new file mode 100644
index 00000000000..804cf50ff7d
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/android.mdoc.md
@@ -0,0 +1,22 @@
+### Custom errors
+
+To track specific errors, notify the monitor when an error occurs with the message, source, exception, and additional attributes. See the [Error Attributes documentation][7].
+
+```kotlin
+GlobalRumMonitor.get().addError(message, source, throwable, attributes)
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/android
+[3]: /real_user_monitoring/android/data_collected
+[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views
+[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters
+[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests
+[7]: /real_user_monitoring/android/data_collected/#event-specific-attributes
+[8]: /real_user_monitoring/application_monitoring/android/setup/#sending-data-when-device-is-offline
+[9]: https://github.com/DataDog/dd-sdk-android/blob/eaa15cd344d1723fafaf179fcebf800d6030c6bb/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt#L279
+[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget
+[11]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#time-to-network-settled
+[12]: https://square.github.io/okhttp/features/events/
+[13]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#interaction-to-next-view
+[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/flutter.mdoc.md
new file mode 100644
index 00000000000..eba27be2f50
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/flutter.mdoc.md
@@ -0,0 +1,30 @@
+### Track custom errors
+
+To track specific errors, notify `DdRum` when an error occurs with the message, source, exception, and additional attributes.
+
+```dart
+DatadogSdk.instance.rum?.addError("This is an error message.");
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/flutter/setup/
+[3]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries/
+[4]: /getting_started/tagging/#defining-tags
+[5]: /real_user_monitoring/connect_rum_and_traces/?tab=browserrum#how-are-rum-resources-linked-to-traces
+[6]: https://github.com/openzipkin/b3-propagation#single-headers
+[7]: https://github.com/openzipkin/b3-propagation#multiple-headers
+[8]: https://www.w3.org/TR/trace-context/#tracestate-header
+[9]: /real_user_monitoring/application_monitoring/browser/frustration_signals/
+[10]: https://pub.dev/packages/datadog_tracking_http_client
+[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html
+[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html
+[13]: /serverless/aws_lambda/distributed_tracing/
+[14]: /real_user_monitoring/application_monitoring/flutter/data_collected
+[15]: /real_user_monitoring/explorer/?tab=measures#setup-facets-and-measures
+[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client
+[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/
+[18]: /real_user_monitoring/application_monitoring/mobile_vitals/?tab=flutter
+[19]: https://pub.dev/packages/datadog_grpc_interceptor
+[20]: https://pub.dev/packages/datadog_gql_link
+[21]: https://pub.dev/packages/datadog_dio
+[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/ios.mdoc.md
new file mode 100644
index 00000000000..d83aa626848
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/ios.mdoc.md
@@ -0,0 +1,93 @@
+### Custom errors
+
+To track specific errors, notify `RUMMonitor.shared()` when an error occurs using one of following methods:
+
+- `.addError(message:)`
+- `.addError(error:)`
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+let rum = RUMMonitor.shared()
+rum.addError(message: "error message.")
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}];
+```
+
+{% /tab %}
+{% /tabs %}
+
+For more details and available options, see [`RUMMonitorProtocol` in GitHub][4] and the [Error Attributes documentation][5].
+
+### Automatically track errors
+
+All "error" and "critical" logs sent with `Logger` are automatically reported as RUM errors and linked to the current RUM view:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+import DatadogLogs
+
+let logger = Logger.create()
+
+logger.error("message")
+logger.critical("message")
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+@import DatadogLogs;
+
+DDLogger *logger = [DDLogger create];
+[logger error:@"message"];
+[logger critical:@"message"];
+```
+
+{% /tab %}
+{% /tabs %}
+
+Similarly, all finished spans marked as error are reported as RUM errors:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+import DatadogTrace
+
+let span = Tracer.shared().startSpan(operationName: "operation")
+// ... capture the `error`
+span.setError(error)
+span.finish()
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+// ... capture the `error`
+id span = [[DDTracer shared] startSpan:@"operation"];
+[span setError:error];
+[span finish];
+```
+
+{% /tab %}
+{% /tabs %}
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/ios
+[3]: /real_user_monitoring/application_monitoring/ios/data_collected/
+[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift
+[5]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#error-attributes
+[6]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes
+[7]: https://www.ntppool.org/en/
+[8]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting
+[9]: /real_user_monitoring/application_monitoring/ios/setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..57cadd3dd88
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,21 @@
+### Custom errors
+
+To track specific errors, notify the monitor when an error occurs with the message, source, exception, and additional attributes. See the [Attributes collected documentation][7].
+
+```kotlin
+GlobalRumMonitor.get().addError(message, source, throwable, attributes)
+```
+
+**Note**: `addError` method accepting `NSError` is also available from iOS source set.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform
+[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
+[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views
+[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters
+[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor
+[7]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
+[8]: /real_user_monitoring/explorer/search/#setup-facets-and-measures
+[9]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#sending-data-when-device-is-offline
+[10]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting
+[a1]: https://docs.datadoghq.com/help/
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/react_native.mdoc.md
new file mode 100644
index 00000000000..75fd5f65a32
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/react_native.mdoc.md
@@ -0,0 +1,31 @@
+### Manually track RUM errors
+
+You can manually track RUM errors:
+
+```javascript
+DdRum.addError('', ErrorSource.SOURCE, '', {}, Date.now());
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/react_native
+[3]: https://jestjs.io/
+[4]: /account_management/api-app-keys/#client-tokens
+[5]: /getting_started/tagging/#define-tags
+[6]: /getting_started/site/
+[7]: /real_user_monitoring/application_monitoring/browser/frustration_signals/
+[8]: /real_user_monitoring/correlate_with_other_telemetry/apm?tab=reactnativerum
+[9]: /real_user_monitoring/guide/proxy-mobile-rum-data/
+[10]: https://github.com/wix/react-native-navigation
+[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/
+[12]: https://github.com/react-navigation/react-navigation
+[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation
+[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2
+[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
+[16]: https://reactnative.dev/docs/global-requestIdleCallback
+[17]: https://reactnative.dev/docs/interactionmanager#runafterinteractions
+[18]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation-async
+[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications
+[20]: /real_user_monitoring/error_tracking/mobile/ios/?tab=cocoapods#configure-the-app-hang-threshold
+[21]: #rum-configuration
+[22]: #logs-configuration
+[23]: #trace-configuration
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/unity.mdoc.md
new file mode 100644
index 00000000000..4956911cf71
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/unity.mdoc.md
@@ -0,0 +1,18 @@
+### Track custom errors
+
+To track specific errors, notify `DdRum` when an error occurs with the exception, the source, and any additional attributes.
+
+```csharp
+try
+{
+ // Error prone code
+}
+catch(Exception e)
+{
+ DatadogSdk.Instance.Rum.AddError(e, RumErrorSource.Source);
+}
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/unity/setup/
+[3]: /real_user_monitoring/application_monitoring/unity/data_collected/
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/android.mdoc.md
new file mode 100644
index 00000000000..82d841b6875
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/android.mdoc.md
@@ -0,0 +1,123 @@
+### Custom views
+
+In addition to [tracking views automatically][4], you can also track specific distinct views (such as activities and fragments) when they become visible and interactive in the `onResume()` lifecycle. Stop tracking when the view is no longer visible. Most often, this method should be called in the frontmost `Activity` or `Fragment`:
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+fun onResume() {
+ GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes)
+}
+
+fun onPause() {
+ GlobalRumMonitor.get().stopView(viewKey, viewAttributes)
+}
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+public void onResume() {
+ GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes);
+}
+
+public void onPause() {
+ GlobalRumMonitor.get().stopView(viewKey, viewAttributes);
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+### Automatically track views
+
+To automatically track your views (such as activities and fragments), provide a tracking strategy at initialization. Depending on your application's architecture, you can choose one of the following strategies:
+
+`ActivityViewTrackingStrategy`
+: Every activity in your application is considered a distinct view.
+
+`FragmentViewTrackingStrategy`
+: Every fragment in your application is considered a distinct view.
+
+`MixedViewTrackingStrategy`
+: Every activity or fragment in your application is considered a distinct view.
+
+`NavigationViewTrackingStrategy`
+: Recommended for Android Jetpack Navigation library users. Each Navigation destination is considered a distinct view.
+
+For instance, to set each fragment as a distinct view, use the following configuration in your [setup][1]:
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ .useViewTrackingStrategy(FragmentViewTrackingStrategy(...))
+ .build()
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
+ .useViewTrackingStrategy(new FragmentViewTrackingStrategy(...))
+ .build();
+```
+
+{% /tab %}
+{% /tabs %}
+
+
+For `ActivityViewTrackingStrategy`, `FragmentViewTrackingStrategy`, or `MixedViewTrackingStrategy`, you can filter which `Fragment` or `Activity` is tracked as a RUM View by providing a `ComponentPredicate` implementation in the constructor:
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ .useViewTrackingStrategy(
+ ActivityViewTrackingStrategy(
+ trackExtras = true,
+ componentPredicate = object : ComponentPredicate {
+ override fun accept(component: Activity): Boolean {
+ return true
+ }
+
+ override fun getViewName(component: Activity): String? = null
+ })
+ )
+ .build()
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
+ .useViewTrackingStrategy(new ActivityViewTrackingStrategy(
+ true,
+ new ComponentPredicate() {
+ @Override
+ public boolean accept(Activity component) {
+ return true;
+ }
+
+ @Override
+ public String getViewName(Activity component) {
+ return null;
+ }
+ }
+ ))
+ .build();
+```
+
+{% /tab %}
+{% /tabs %}
+
+**Note**: By default, the library is using `ActivityViewTrackingStrategy`. If you decide not to provide a view tracking strategy, you must manually send the views by calling the `startView` and `stopView` methods yourself.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/ios.mdoc.md
new file mode 100644
index 00000000000..c28ca84acdd
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/ios.mdoc.md
@@ -0,0 +1,246 @@
+### Custom views
+
+In addition to [tracking views automatically](#automatically-track-views), you can also track specific distinct views such as `viewControllers` when they become visible and interactive. Stop tracking when the view is no longer visible using the following methods in `RUMMonitor.shared()`:
+
+- `.startView(viewController:)`
+- `.stopView(viewController:)`
+
+For example:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+import DatadogRUM
+
+// in your `UIViewController`:
+let rum = RUMMonitor.shared()
+
+override func viewDidAppear(_ animated: Bool) {
+ super.viewDidAppear(animated)
+ rum.startView(viewController: self)
+}
+
+override func viewDidDisappear(_ animated: Bool) {
+ super.viewDidDisappear(animated)
+ rum.stopView(viewController: self)
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+@import DatadogRUM;
+// in your `UIViewController`:
+
+DDRUMMonitor *rum = [DDRUMMonitor shared];
+
+- (void)viewDidAppear:(BOOL)animated {
+ [super viewDidAppear:animated];
+
+ [rum startViewWithViewController:self name:nil attributes:nil];
+}
+
+- (void)viewDidDisappear:(BOOL)animated {
+ [super viewDidDisappear:animated];
+
+ [rum stopViewWithViewController:self attributes:nil];
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+For more details and available options, see [`RUMMonitorProtocol` in GitHub][4].
+
+### Automatically track views
+
+You can automatically track views with UIKit and SwiftUI.
+
+#### UIKit
+
+To automatically track views (`UIViewControllers`), use the `uiKitViewsPredicate` option when enabling RUM. By default, views are named with the view controller's class name. To customize it, provide your own implementation of the `predicate` which conforms to `UIKitRUMViewsPredicate` protocol:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+public protocol UIKitRUMViewsPredicate {
+ func rumView(for viewController: UIViewController) -> RUMView?
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```swift
+@objc
+public protocol DDUIKitRUMViewsPredicate: AnyObject {
+ func rumView(for viewController: UIViewController) -> DDRUMView?
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+Inside the `rumView(for:)` implementation, your app should decide if a given `UIViewController` instance should start a RUM view (return a value) or not (return `nil`). The returned `RUMView` value must specify the `name` and may provide additional `attributes` for the created RUM view.
+
+For instance, you can configure the predicate to use explicit type check for each view controller in your app:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+class YourCustomPredicate: UIKitRUMViewsPredicate {
+
+ func rumView(for viewController: UIViewController) -> RUMView? {
+ switch viewController {
+ case is HomeViewController: return .init(name: "Home")
+ case is DetailsViewController: return .init(name: "Details")
+ default: return nil
+ }
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+@interface YourCustomPredicate : NSObject
+
+@end
+
+@implementation YourCustomPredicate
+
+- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController {
+ if ([viewController isKindOfClass:[HomeViewController class]]) {
+ return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}];
+ }
+
+ if ([viewController isKindOfClass:[DetailsViewController class]]) {
+ return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}];
+ }
+
+ return nil;
+}
+
+@end
+```
+
+{% /tab %}
+{% /tabs %}
+
+You can even come up with a more dynamic solution depending on your app's architecture.
+
+For example, if your view controllers use `accessibilityLabel` consistently, you can name views by the value of accessibility label:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+class YourCustomPredicate: UIKitRUMViewsPredicate {
+
+ func rumView(for viewController: UIViewController) -> RUMView? {
+ guard let accessibilityLabel = viewController.accessibilityLabel else {
+ return nil
+ }
+
+ return RUMView(name: accessibilityLabel)
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+@interface YourCustomPredicate : NSObject
+
+@end
+
+@implementation YourCustomPredicate
+
+- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController {
+ if (viewController.accessibilityLabel) {
+ return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}];
+ }
+
+ return nil;
+}
+
+@end
+```
+
+{% /tab %}
+{% /tabs %}
+
+**Note**: The RUM iOS SDK calls `rumView(for:)` many times while your app is running. Datadog recommends keeping its implementation fast and single-threaded.
+
+#### SwiftUI
+
+To automatically track views with SwiftUI, use the `swiftUIViewsPredicate` option when enabling RUM.
+
+The mechanism to extract a SwiftUI view name relies on reflection. As a result, view names may not always be meaningful. If a meaningful name cannot be extracted, a generic name such as `AutoTracked_HostingController_Fallback` or `AutoTracked_NavigationStackController_Fallback` is used.
+
+You can use the default predicate (`DefaultSwiftUIRUMViewsPredicate`) or provide your own implementation of the `SwiftUIRUMViewsPredicate` protocol to customize or filter view names.
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+public protocol SwiftUIRUMViewsPredicate {
+ func rumView(for extractedViewName: String) -> RUMView?
+}
+
+// Example: Custom predicate to ignore fallback names and rename views
+class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate {
+ func rumView(for extractedViewName: String) -> RUMView? {
+ if extractedViewName == "AutoTracked_HostingController_Fallback" ||
+ extractedViewName == "AutoTracked_NavigationStackController_Fallback" {
+ return nil // Ignore fallback names
+ }
+ if extractedViewName == "MySpecialView" {
+ return RUMView(name: "Special")
+ }
+ return RUMView(name: extractedViewName)
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+@protocol DDSwiftUIRUMViewsPredicate
+- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName;
+@end
+
+@interface CustomSwiftUIPredicate : NSObject
+@end
+
+@implementation CustomSwiftUIPredicate
+- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName {
+ if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] ||
+ [extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) {
+ return nil; // Ignore fallback names
+ }
+ if ([extractedViewName isEqualToString:@"MySpecialView"]) {
+ return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}];
+ }
+ return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}];
+}
+@end
+```
+
+{% /tab %}
+{% /tabs %}
+
+**Notes:**
+- Datadog recommends enabling UIKit view tracking as well, even if your app is built entirely with SwiftUI.
+- Tab bars are not tracked automatically. Use [manual tracking](#custom-views) for each tab view to track them.
+- If you use both automatic and manual tracking, you may see duplicate events. To avoid this, rely on a single instrumentation method or use a custom predicate to filter out duplicates.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..ff00a687c67
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,98 @@
+### Custom views
+
+In addition to [tracking views automatically][4], you can also track specific distinct views (such as activities and fragments) manually. Stop tracking when the view is no longer visible.
+
+```kotlin
+// to start view
+GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes)
+
+// to stop view
+GlobalRumMonitor.get().stopView(viewKey, viewAttributes)
+```
+
+### Automatically track views
+
+#### Android
+
+To automatically track your views (such as activities and fragments), provide a tracking strategy at initialization. Depending on your application's architecture, you can choose one of the following strategies:
+
+`ActivityViewTrackingStrategy`
+: Every activity in your application is considered a distinct view.
+
+`FragmentViewTrackingStrategy`
+: Every fragment in your application is considered a distinct view.
+
+`MixedViewTrackingStrategy`
+: Every activity or fragment in your application is considered a distinct view.
+
+`NavigationViewTrackingStrategy`
+: Recommended for Android Jetpack Navigation library users. Each Navigation destination is considered a distinct view.
+
+For instance, to set each fragment as a distinct view, use the following configuration in your [setup][1]:
+
+```kotlin
+// in common source set
+val rumConfig = RumConfiguration.Builder(applicationId)
+ .apply {
+ platformSpecificSetup(this)
+ }
+ .build()
+
+internal expect fun platformSpecificSetup(
+ rumConfigurationBuilder: RumConfiguration.Builder
+)
+
+// in Android source set
+internal actual fun platformSpecificSetup(
+ rumConfigurationBuilder: RumConfiguration.Builder
+) {
+ rumConfigurationBuilder.useViewTrackingStrategy(
+ FragmentViewTrackingStrategy(...)
+ )
+}
+```
+
+For `ActivityViewTrackingStrategy`, `FragmentViewTrackingStrategy`, or `MixedViewTrackingStrategy`, you can filter which `Fragment` or `Activity` is tracked as a RUM View by providing a `ComponentPredicate` implementation in the constructor:
+
+```kotlin
+val strategy = ActivityViewTrackingStrategy(
+ trackExtras = true,
+ componentPredicate = object : ComponentPredicate {
+ override fun accept(component: Activity): Boolean {
+ return true
+ }
+
+ override fun getViewName(component: Activity): String? = null
+ }
+)
+```
+
+**Note**: By default, the library is using `ActivityViewTrackingStrategy`. If you decide not to provide a view tracking strategy, you must manually send the views by calling the `startView` and `stopView` methods yourself.
+
+#### iOS
+
+To automatically track views (`UIViewController`s), use the `trackUiKitViews` method when enabling RUM. By default, views are named with the view controller's class name. To customize it, provide your own implementation of the `uiKitViewsPredicate` that conforms to `UIKitRUMViewsPredicate` interface.
+
+Inside the `createView(viewController: UIViewController)` implementation, your app should decide if a given `UIViewController` instance should start the RUM view (return value) or not (return `null`). The returned `RUMView` value must specify the `name` and may provide additional `attributes` for the created RUM view.
+
+For instance, you can configure the predicate to use explicit type check for each view controller in your app:
+
+```kotlin
+class YourCustomPredicate: UIKitRUMViewsPredicate {
+
+ override fun createView(viewController: UIViewController): RUMView? {
+ return when (viewController) {
+ is HomeViewController -> RUMView("Home")
+ is DetailsViewController -> RUMView("Details")
+ else -> null
+ }
+ }
+}
+```
+
+You can even come up with a more dynamic solution depending on your app's architecture.
+
+**Note**: By default, UIKit view tracking is not enabled.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/react_native.mdoc.md
new file mode 100644
index 00000000000..5135bb8b4f4
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/react_native.mdoc.md
@@ -0,0 +1,49 @@
+### Manually track RUM views
+
+To manually track RUM Views, provide a `view key`, `view name`, and `action name` at initialization. Depending on your needs, you can choose one of the following strategies:
+
+```javascript
+DdRum.startView('', 'View Name', {}, Date.now());
+//…
+DdRum.stopView('', { custom: 42 }, Date.now());
+```
+
+## Track view navigation
+
+Because React Native offers a wide range of libraries to create screen navigation, only manual view tracking is supported by default. To see RUM or Error tracking sessions populate in Datadog, you need to implement view tracking.
+
+You can manually start and stop a view using the following `startView()` and `stopView` methods.
+
+```js
+import {
+ DdRum
+} from '@datadog/mobile-react-native';
+
+// Start a view with a unique view identifier, a custom view name, and an object to attach additional attributes to the view
+DdRum.startView(
+ '', // has to be unique, for example it can be ViewName-unique-id
+ 'View Name',
+ { 'custom.foo': 'something' },
+ Date.now()
+);
+// Stops a previously started view with the same unique view identifier, and an object to attach additional attributes to the view
+DdRum.stopView('', { 'custom.bar': 42 }, Date.now());
+```
+
+Use one of Datadog's integrations to automatically track views for the following libraries:
+
+- If you use the [`react-native-navigation`][10] library, then add the `@datadog/mobile-react-native-navigation` package and follow the [setup instructions][11].
+- If you use the [`react-navigation`][12] library, then add the `@datadog/mobile-react-navigation` package and follow the [setup instructions][11].
+
+If you experience any issues setting up View tracking with `@datadog/mobile-react-navigation` you can see this Datadog [example application][13] as a reference.
+
+## Hybrid app monitoring
+
+See [Monitor hybrid React Native applications][19].
+
+[1]: https://app.datadoghq.com/rum/application/create
+[10]: https://github.com/wix/react-native-navigation
+[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/
+[12]: https://github.com/react-navigation/react-navigation
+[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation
+[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/unity.mdoc.md
new file mode 100644
index 00000000000..31f2ddcc1a5
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/unity.mdoc.md
@@ -0,0 +1,5 @@
+### Automatic view tracking
+
+If you select `Enable Automatic Scene Tracking`, Datadog hooks into Unity's `SceneManager` to detect scenes loading and unloading, and start RUM Views appropriately. If you are using methods to move between scenes other than `SceneManager`, or would like to track changes in views that occur without `SceneManager`, you need to track views manually using `DdRum.StartView` and `DdRum.StopView`.
+
+[1]: https://app.datadoghq.com/rum/application/create
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/android.mdoc.md
new file mode 100644
index 00000000000..8801a79cb35
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/android.mdoc.md
@@ -0,0 +1,246 @@
+### Capture resource headers
+
+When [tracking resources automatically][6], you can capture HTTP request and response headers on RUM Resources by calling `trackResourceHeaders` on the `DatadogInterceptor.Builder`.
+
+Captured headers appear on the RUM Resource event under `resource.request.headers` and `resource.response.headers`. You can query them in the RUM Explorer.
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+val interceptor = DatadogInterceptor.Builder(tracedHosts)
+ .trackResourceHeaders()
+ .build()
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+DatadogInterceptor interceptor = new DatadogInterceptor.Builder(tracedHosts)
+ .trackResourceHeaders()
+ .build();
+```
+
+{% /tab %}
+{% /tabs %}
+
+With no arguments, `trackResourceHeaders` captures a predefined set of common headers:
+
+| Direction | Headers |
+|-----------|---------|
+| Request | `cache-control`, `content-type` |
+| Response | `age`, `cache-control`, `content-encoding`, `content-length`, `content-type`, `etag`, `expires`, `server-timing`, `vary`, `x-cache` |
+
+To capture additional headers on top of the defaults, configure a `ResourceHeadersExtractor` and pass it to `trackResourceHeaders`. To skip the defaults, set `includeDefaults = false`.
+
+{% alert level="info" %}
+Sensitive headers, such as tokens and API keys, are filtered out automatically, even if you list them explicitly.
+{% /alert %}
+
+### Custom resource attributes
+
+When [tracking resources automatically][6], provide a custom `RumResourceAttributesProvider` to the `DatadogInterceptor.Builder` to add custom attributes to each tracked network request.
+
+For example, if you want to surface an OkHttp request tag as a custom attribute on the resource, create an implementation as follows:
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+class CustomRumResourceAttributesProvider : RumResourceAttributesProvider {
+ override fun onProvideAttributes(
+ request: Request,
+ response: Response?,
+ throwable: Throwable?
+ ): Map {
+ return mapOf("request.kind" to request.tag(String::class.java).orEmpty())
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+public class CustomRumResourceAttributesProvider implements RumResourceAttributesProvider {
+ @NonNull
+ @Override
+ public Map onProvideAttributes(
+ @NonNull Request request,
+ @Nullable Response response,
+ @Nullable Throwable throwable
+ ) {
+ Map result = new HashMap<>();
+ String kind = request.tag(String.class);
+ result.put("request.kind", kind != null ? kind : "");
+ return result;
+ }
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+### Custom resources
+
+In addition to [tracking resources automatically][6], you can also track specific custom resources (such as network requests and third-party provider APIs) with methods (such as `GET` and `POST`) while loading the resource with `RumMonitor#startResource`. Stop tracking with `RumMonitor#stopResource` when it is fully loaded, or `RumMonitor#stopResourceWithError` if an error occurs while loading the resource.
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+fun loadResource() {
+ GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes)
+ try {
+ // do load the resource
+ GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes)
+ } catch (e: Exception) {
+ GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e)
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+public void loadResource() {
+ GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes);
+ try {
+ // do load the resource
+ GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes);
+ } catch (Exception e) {
+ GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e);
+ }
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+### Automatically track network requests
+
+#### Basic network instrumentation
+
+To get timing information in resources (such as third-party providers, network requests) such as time to first byte or DNS resolution, customize the `OkHttpClient` to add the [EventListener][12] factory:
+
+1. Add the Gradle dependency to the `dd-sdk-android-okhttp` library in the module-level `build.gradle` file:
+
+```groovy
+dependencies {
+ implementation "com.datadoghq:dd-sdk-android-okhttp:x.x.x"
+}
+```
+
+2. Add the [EventListener][12] factory:
+{% tabs %}
+{% tab label="Kotlin" %}
+```kotlin
+val tracedHosts = listOf("example.com")
+val okHttpClient = OkHttpClient.Builder()
+ .addInterceptor(DatadogInterceptor.Builder(tracedHosts).build())
+ .eventListenerFactory(DatadogEventListener.Factory())
+ .build()
+```
+{% /tab %}
+{% tab label="Java" %}
+```java
+List tracedHosts = Arrays.asList("example.com");
+OkHttpClient okHttpClient = new OkHttpClient.Builder()
+ .addInterceptor(new DatadogInterceptor.Builder(tracedHosts).build())
+ .eventListenerFactory(new DatadogEventListener.Factory())
+ .build();
+```
+{% /tab %}
+{% /tabs %}
+
+#### Cronet network instrumentation
+
+If you use Cronet instead of OkHttp, you can instrument your `CronetEngine` for automatic RUM resource tracking.
+
+1. Add the Gradle dependencies in the module-level `build.gradle` file:
+
+```groovy
+dependencies {
+ implementation "com.datadoghq:dd-sdk-android-cronet:x.x.x"
+}
+```
+
+2. Instrument the `CronetEngine.Builder`:
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+val cronetEngine = CronetEngine.Builder(context)
+ .configureDatadogInstrumentation(
+ rumInstrumentationConfiguration = RumNetworkInstrumentationConfiguration(),
+ apmInstrumentationConfiguration = ApmNetworkInstrumentationConfiguration(
+ tracedHosts = listOf("example.com", "example.eu")
+ )
+ )
+ .build()
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+CronetEngine.Builder builder = new CronetEngine.Builder(context);
+CronetEngine cronetEngine = CronetIntegrationPluginKt
+ .configureDatadogInstrumentation(
+ builder,
+ new RumNetworkInstrumentationConfiguration(),
+ new ApmNetworkInstrumentationConfiguration(
+ Arrays.asList("example.com", "example.eu")
+ )
+ )
+ .build();
+```
+
+{% /tab %}
+{% /tabs %}
+
+#### Apollo instrumentation
+
+1. [Set up][14] RUM monitoring with Datadog Android RUM.
+
+2. [Set up](#basic-network-instrumentation) OkHttp instrumentation with the Datadog RUM SDK.
+
+3. Add the following to your application's build.gradle file.
+```groovy
+dependencies {
+ implementation "com.datadoghq:dd-sdk-android-apollo:x.x.x"
+}
+```
+
+4. Add the Datadog interceptor to your Apollo Client setup:
+
+```kotlin
+import com.apollographql.apollo.ApolloClient
+import com.apollographql.apollo.network.okHttpClient
+import com.datadog.android.apollo.DatadogApolloInterceptor
+
+val apolloClient = ApolloClient.Builder()
+ .serverUrl("GraphQL endpoint")
+ .addInterceptor(DatadogApolloInterceptor())
+ .okHttpClient(okHttpClient)
+ .build()
+```
+
+This automatically adds Datadog headers to your GraphQL requests, allowing them to be tracked by Datadog.
+
+{% alert level="danger" %}
+- The integration only supports Apollo version `4`.
+- The `query` and `mutation` type operations are tracked; `subscription` operations are not.
+- GraphQL payload sending is disabled by default. To enable it, set the `sendGraphQLPayloads` flag in the `DatadogApolloInterceptor` constructor as follows:
+
+```kotlin
+DatadogApolloInterceptor(sendGraphQLPayloads = true)
+```
+{% /alert %}
+
+[1]: https://app.datadoghq.com/rum/application/create
+[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests
+[12]: https://square.github.io/okhttp/features/events/
+[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/flutter.mdoc.md
new file mode 100644
index 00000000000..f322a32f059
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/flutter.mdoc.md
@@ -0,0 +1,107 @@
+## Automatically track resources
+
+Use the [Datadog Tracking HTTP Client][10] package to enable automatic tracking of resources and HTTP calls from your views.
+
+Add the package to your `pubspec.yaml` and add the following to your initialization file:
+
+```dart
+final configuration = DatadogConfiguration(
+ // configuration
+ firstPartyHosts: ['example.com'],
+)..enableHttpTracking()
+```
+
+**Note**: The Datadog Tracking HTTP Client modifies [`HttpOverrides.global`][11]. If you are using your own custom `HttpOverrides`, you may need to inherit from [`DatadogHttpOverrides`][12]. In this case, you do not need to call `enableHttpTracking`. Versions of `datadog_tracking_http_client` >= 1.3 check the value of `HttpOverrides.current` and use this for client creation, so you only need to make sure to initialize `HttpOverrides.global` prior to initializing Datadog.
+
+To enable Datadog [distributed tracing][13], you must set the `DatadogConfiguration.firstPartyHosts` property in your configuration object to a domain that supports distributed tracing. You can also modify the sampling rate for distributed tracing by setting the `traceSampleRate` on your `DatadogRumConfiguration`.
+
+- `firstPartyHosts` does not allow wildcards, but matches any subdomains for a given domain. For example, `api.example.com` matches `staging.api.example.com` and `prod.api.example.com`, not `news.example.com`.
+
+- `DatadogRumConfiguration.traceSampleRate` sets a default sampling rate of 20%. If you want all resources requests to generate a full distributed trace, set this value to `100.0`.
+
+### Track resources from other packages
+
+While `Datadog Tracking HTTP Client` can track most common network calls in Flutter, Datadog supplies packages for integration into specific networking libraries, including gRPC, GraphQL and Dio. For more information about these libraries, see [Integrated Libraries][22].
+
+### Track custom resources
+
+In addition to tracking resources automatically using the [Datadog Tracking HTTP Client][16], you can track specific custom resources such as network requests or third-party provider APIs using the [following methods][17]:
+
+- `DdRum.startResource`
+- `DdRum.stopResource`
+- `DdRum.stopResourceWithError`
+- `DdRum.stopResourceWithErrorInfo`
+
+For example:
+
+```dart
+// in your network client:
+
+DatadogSdk.instance.rum?.startResource(
+ "resource-key",
+ RumHttpMethod.get,
+ url,
+);
+
+// Later
+
+DatadogSdk.instance.rum?.stopResource(
+ "resource-key",
+ 200,
+ RumResourceType.image
+);
+```
+
+The `String` used for `resourceKey` in both calls must be unique for the resource you are calling in order for the Flutter Datadog SDK to match a resource's start with its completion.
+
+## OpenTelemetry setup
+
+All of Datadog's automatic network tracking packages ([Datadog Tracking HTTP Client][10], [gRPC Interceptor][19], [GQL Link][20], and [Dio Interceptor][21]) support distributed traces through both automatic header generation and header ingestion. This section describes how to use OpenTelemetry with RUM Flutter.
+
+### Datadog header generation
+
+When configuring your tracking client or gRPC Interceptor, you can specify the types of tracing headers you want Datadog to generate. For example, if you want to send `b3` headers to `example.com` and `tracecontext` headers for `myapi.names`, you can do so with the following code:
+
+```dart
+final hostHeaders = {
+ 'example.com': { TracingHeaderType.b3 },
+ 'myapi.names': { TracingHeaderType.tracecontext}
+};
+```
+
+You can use this object during initial configuration:
+
+```dart
+// For default Datadog HTTP tracing:
+final configuration = DatadogConfiguration(
+ // configuration
+ firstPartyHostsWithTracingHeaders: hostHeaders,
+);
+```
+
+You can then enable tracing as usual.
+
+This information is merged with any hosts set on `DatadogConfiguration.firstPartyHosts`. Hosts specified in `firstPartyHosts` generate Datadog Tracing Headers by default.
+
+## Check first party hosts
+
+To determine if a specific URI is a first party host, use `isFirstPartyHost`.
+
+For example:
+```dart
+var host = 'example.com'
+if (DatadogSdk.instance.isFirstPartyHost(host)){
+ print('$host is a first party host.');
+}
+```
+
+[10]: https://pub.dev/packages/datadog_tracking_http_client
+[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html
+[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html
+[13]: /serverless/aws_lambda/distributed_tracing/
+[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client
+[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/
+[19]: https://pub.dev/packages/datadog_grpc_interceptor
+[20]: https://pub.dev/packages/datadog_gql_link
+[21]: https://pub.dev/packages/datadog_dio
+[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/ios.mdoc.md
new file mode 100644
index 00000000000..7dbf7a0ffe0
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/ios.mdoc.md
@@ -0,0 +1,360 @@
+### Custom resources
+
+In addition to [tracking resources automatically](#automatically-track-network-requests), you can also track specific custom resources such as network requests or third-party provider APIs. This is the recommended approach for third-party libraries that don't expose a `URLSession` delegate. Use the following methods on `RUMMonitor.shared()` to manually collect RUM resources:
+
+- `.startResource(resourceKey:request:)`
+- `.stopResource(resourceKey:response:)`
+- `.stopResourceWithError(resourceKey:error:)`
+- `.stopResourceWithError(resourceKey:message:)`
+
+For example:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+import DatadogRUM
+
+// in your network client:
+
+let rum = RUMMonitor.shared()
+
+rum.startResource(
+ resourceKey: "resource-key",
+ request: request
+)
+
+rum.stopResource(
+ resourceKey: "resource-key",
+ response: response
+)
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+// in your network client:
+
+[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key"
+ request:request
+ attributes:@{}];
+
+[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key"
+ response:response
+ attributes:@{}];
+```
+
+{% /tab %}
+{% /tabs %}
+
+**Note**: The `String` used for `resourceKey` in both calls must be unique for the resource you are calling. This is necessary for the RUM iOS SDK to match a resource's start with its completion.
+
+For more details and available options, see [`RUMMonitorProtocol` in GitHub][4].
+
+### Automatically track network requests
+
+Network requests are automatically tracked after you enable RUM with the `urlSessionTracking` configuration.
+
+#### (Optional) Enable detailed timing breakdown
+
+To get detailed timing breakdown (DNS resolution, SSL handshake, time to first byte, connection time, and download duration), enable `URLSessionInstrumentation` for your delegate type:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+URLSessionInstrumentation.enableDurationBreakdown(
+ with: .init(
+ delegateClass: .self
+ )
+)
+
+let session = URLSession(
+ configuration: .default,
+ delegate: (),
+ delegateQueue: nil
+)
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[ class]];
+[DDURLSessionInstrumentation enableWithConfiguration:config];
+
+NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
+ delegate:[[ alloc] init]
+ delegateQueue:nil];
+```
+
+{% /tab %}
+{% /tabs %}
+
+**Notes**:
+- Without `URLSessionInstrumentation`, network requests are still tracked. Enabling it provides detailed timing breakdown for performance analysis.
+- Response data is available in the `resourceAttributesProvider` callback (set in `RUM.Configuration.URLSessionTracking`) for tasks with completion handlers in automatic mode, and for all tasks after enabling `URLSessionInstrumentation`.
+- To filter out specific requests from being tracked, use the `resourceEventMapper` in `RUM.Configuration` (see [Modify or drop RUM events](#modify-or-drop-rum-events)).
+
+{% alert level="info" %}
+Be mindful of delegate retention.
+While Datadog instrumentation does not create memory leaks directly, it relies on `URLSession` delegates. According to [Apple documentation](https://developer.apple.com/documentation/foundation/urlsession/init(configuration:delegate:delegatequeue:)#parameters):
+"The session object keeps a strong reference to the delegate until your app exits or explicitly invalidates the session. If you do not invalidate the session by calling the `invalidateAndCancel()` or `finishTasksAndInvalidate()` method, your app leaks memory until it exits."
+To avoid memory leaks, make sure to invalidate any `URLSession` instances you no longer need.
+{% /alert %}
+
+If you have more than one delegate type in your app that you want to instrument, you can call `URLSessionInstrumentation.enable(with:)` for each delegate type.
+
+Also, you can configure first party hosts using `urlSessionTracking`. This classifies resources that match the given domain as "first party" in RUM and propagates tracing information to your backend (if you have enabled Tracing). Network traces are sampled with an adjustable sampling rate. A sampling of 20% is applied by default.
+
+For instance, you can configure `example.com` as the first party host and enable both RUM and Tracing features:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+
+import DatadogRUM
+
+RUM.enable(
+ with: RUM.Configuration(
+ applicationID: "",
+ uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(),
+ uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(),
+ urlSessionTracking: RUM.Configuration.URLSessionTracking(
+ firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20)
+ )
+ )
+)
+
+URLSessionInstrumentation.enable(
+ with: .init(
+ delegateClass: .self
+ )
+)
+
+let session = URLSession(
+ configuration: .default,
+ delegate: (),
+ delegateQueue: nil
+)
+```
+
+This tracks all requests sent with the instrumented `session`. Requests matching the `example.com` domain are marked as "first party" and tracing information is sent to your backend to [connect the RUM resource with its Trace](https://docs.datadoghq.com/real_user_monitoring/correlate_with_other_telemetry/apm?tab=browserrum).
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+@import DatadogRUM;
+
+DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""];
+DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new];
+[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20];
+[configuration setURLSessionTracking:urlSessionTracking];
+
+[DDRUM enableWith:configuration];
+```
+
+{% /tab %}
+{% /tabs %}
+
+To add custom attributes to resources, use the `URLSessionTracking.resourceAttributesProvider` option when enabling the RUM. By setting attributes provider closure, you can return additional attributes to be attached to tracked resource.
+
+For instance, you may want to add HTTP request and response headers to the RUM resource:
+
+```swift
+RUM.enable(
+ with: RUM.Configuration(
+ ...
+ urlSessionTracking: RUM.Configuration.URLSessionTracking(
+ resourceAttributesProvider: { request, response, data, error in
+ return [
+ "request.headers" : redactedHeaders(from: request),
+ "response.headers" : redactedHeaders(from: response)
+ ]
+ }
+ )
+ )
+)
+```
+
+#### Capture resource headers
+
+When [tracking network requests automatically](#automatically-track-network-requests), you can capture HTTP request and response headers on RUM Resources by setting `trackResourceHeaders` on `RUM.Configuration.URLSessionTracking`. This option is disabled by default.
+
+Captured headers appear on the RUM Resource event under `resource.request.headers` and `resource.response.headers` and are queryable in the RUM Explorer.
+
+Use `.defaults` to capture a predefined set of common headers:
+
+```swift
+RUM.enable(
+ with: RUM.Configuration(
+ applicationID: "",
+ urlSessionTracking: RUM.Configuration.URLSessionTracking(
+ trackResourceHeaders: .defaults
+ )
+ )
+)
+```
+
+The following headers are captured with `.defaults`:
+
+| Direction | Headers |
+|-----------|---------|
+| Request | `cache-control`, `content-type` |
+| Response | `age`, `cache-control`, `content-encoding`, `content-length`, `content-type`, `etag`, `expires`, `server-timing`, `vary`, `x-cache` |
+
+To capture additional headers on top of the defaults, use `.custom` with `.matchHeaders`. For example, to also capture `x-request-id` and `x-datadog-trace` on both request and response:
+
+```swift
+RUM.enable(
+ with: RUM.Configuration(
+ applicationID: "",
+ urlSessionTracking: RUM.Configuration.URLSessionTracking(
+ trackResourceHeaders: .custom([
+ .defaults,
+ .matchHeaders(["x-request-id", "x-datadog-trace"])
+ ])
+ )
+ )
+)
+```
+
+**Note**: Sensitive headers (such as tokens, API keys, and cookies) are filtered out automatically, even if listed explicitly.
+
+If you don't want to track requests, you can disable URLSessionInstrumentation for the delegate type:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+URLSessionInstrumentation.disable(delegateClass: .self)
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+[DDURLSessionInstrumentation disableWithDelegateClass:[ class]];
+```
+
+{% /tab %}
+{% /tabs %}
+
+#### Apollo instrumentation
+
+Instrumenting Apollo in your iOS application gives RUM visibility into GraphQL errors and performance. Because GraphQL requests all go to a single endpoint and often return 200 OK even on errors, default HTTP instrumentation lacks context. It lets RUM capture the operation name, operation type, and variables (and optionally the payload). This provides more detailed context for each network request.
+
+This integration supports both Apollo iOS 1.0+ and Apollo iOS 2.0+. Follow the instructions for the Apollo iOS version you have below.
+
+1. [Set up][2] RUM monitoring with Datadog iOS RUM.
+
+2. Add the following to your application's `Package.swift` file:
+
+ ```swift
+ dependencies: [
+ // For Apollo iOS 1.0+
+ .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "1.0.0"))
+
+ // For Apollo iOS 2.0+
+ .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "2.0.0"))
+ ]
+ ```
+
+ Alternatively, you can add it using Xcode:
+ 1. Go to **File** → **Add Package Dependencies**.
+ 2. Enter the repository URL: `https://github.com/DataDog/dd-sdk-ios-apollo-interceptor`.
+ 3. Select the package version that matches your Apollo major version (choose `1.x.x` for Apollo iOS 1.0+ or `2.x.x` for Apollo iOS 2.0+).
+
+3. Set up network instrumentation based on your Apollo iOS version:
+
+{% tabs %}
+{% tab label="Apollo iOS 1.0+" %}
+Set up network instrumentation for Apollo's built-in URLSessionClient:
+
+```swift
+import Apollo
+
+URLSessionInstrumentation.enable(with: .init(delegateClass: URLSessionClient.self))
+```
+
+Add the Datadog interceptor to your Apollo Client setup:
+
+```swift
+import Apollo
+import DatadogApollo
+
+class CustomInterceptorProvider: DefaultInterceptorProvider {
+ override func interceptors(for operation: Operation) -> [ApolloInterceptor] {
+ var interceptors = super.interceptors(for: operation)
+ interceptors.insert(DatadogApolloInterceptor(), at: 0)
+ return interceptors
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Apollo iOS 2.0+" %}
+Configure network instrumentation using the provided `DatadogApolloDelegate` and `DatadogApolloURLSession`:
+
+```swift
+import Apollo
+import DatadogApollo
+import DatadogCore
+
+// Create the Datadog delegate
+let delegate = DatadogApolloDelegate()
+
+// Create the custom URLSession wrapper
+let customSession = DatadogApolloURLSession(
+ configuration: .default,
+ delegate: delegate
+)
+
+// Enable Datadog instrumentation for the delegate
+URLSessionInstrumentation.enable(
+ with: .init(delegateClass: DatadogApolloDelegate.self)
+)
+
+// Configure Apollo Client with the custom session
+let networkTransport = RequestChainNetworkTransport(
+ urlSession: customSession,
+ interceptorProvider: NetworkInterceptorProvider(),
+ store: store,
+ endpointURL: url
+)
+```
+
+Create an interceptor provider with the Datadog interceptor:
+
+```swift
+import Apollo
+import DatadogApollo
+
+struct NetworkInterceptorProvider: InterceptorProvider {
+ func graphQLInterceptors(for operation: Operation) -> [any GraphQLInterceptor] where Operation : GraphQLOperation {
+ return [DatadogApolloInterceptor()] + DefaultInterceptorProvider.shared.graphQLInterceptors(for: operation)
+ }
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+This lets Datadog RUM extract the operation type, name, variables, and payloads (optional) automatically from the requests to enrich GraphQL Requests RUM Resources.
+
+{% alert level="info" %}
+- The integration supports Apollo iOS versions `1.0+` and `2.0+`.
+- The `query` and `mutation` type operations are tracked; `subscription` operations are not.
+- GraphQL payload sending is disabled by default. To enable it, set the `sendGraphQLPayloads` flag in the `DatadogApolloInterceptor` constructor as follows:
+
+ ```swift
+ let datadogInterceptor = DatadogApolloInterceptor(sendGraphQLPayloads: true)
+ ```
+
+{% /alert %}
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/ios
+[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..75ae74d97b3
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,47 @@
+### Enrich resources
+
+When [tracking resources automatically][6], provide a custom `RumResourceAttributesProvider` instance to add custom attributes to each tracked network request/response. For example, if you want to track a network request's headers, create an implementation like the following, and pass it in the `datadogKtorPlugin` initialization call.
+
+```kotlin
+class CustomRumResourceAttributesProvider : RumResourceAttributesProvider {
+ override fun onRequest(request: HttpRequestSnapshot) =
+ request.headers.names().associateWith { request.headers[it] }.mapKeys { "header.$it" }
+
+ override fun onResponse(response: HttpResponse) = emptyMap()
+
+ override fun onError(request: HttpRequestSnapshot, throwable: Throwable) = emptyMap()
+}
+
+val ktorClient = HttpClient {
+ install(
+ datadogKtorPlugin(
+ tracedHosts = mapOf(
+ "example.com" to setOf(TracingHeaderType.DATADOG),
+ "example.eu" to setOf(TracingHeaderType.DATADOG)
+ ),
+ rumResourceAttributesProvider = CustomRumResourceAttributesProvider()
+ )
+ )
+}
+```
+
+### Custom resources
+
+In addition to [tracking resources automatically][6], you can also track specific custom resources (such as network requests and third-party provider APIs) with methods (such as `GET` and `POST`) while loading the resource with `RumMonitor#startResource`. Stop tracking with `RumMonitor#stopResource` when it is fully loaded, or `RumMonitor#stopResourceWithError` if an error occurs while loading the resource.
+
+```kotlin
+fun loadResource() {
+ GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes)
+ try {
+ // do load the resource
+ GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes)
+ } catch (e: Exception) {
+ GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e)
+ }
+}
+```
+
+**Note**: `stopResource` / `stopResourceWithError` methods accepting `NSURLConnection` and `NSError` are also available from iOS source set.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/react_native.mdoc.md
new file mode 100644
index 00000000000..7570aa94155
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/react_native.mdoc.md
@@ -0,0 +1,28 @@
+### Manually track RUM resources
+
+You can manually track RUM resources:
+
+```javascript
+DdRum.startResource('', 'GET', 'http://www.example.com/api/v1/test', {}, Date.now());
+//...
+DdRum.stopResource('', 200, 'xhr', (size = 1337), {}, Date.now());
+```
+
+### Manually send spans
+
+You can send spans manually:
+
+```javascript
+const spanId = await DdTrace.startSpan('foo', { custom: 42 }, Date.now());
+//...
+DdTrace.finishSpan(spanId, { custom: 21 }, Date.now());
+```
+
+## Resource timings
+
+Resource tracking provides the following timings:
+
+- `First Byte`: The time between the scheduled request and the first byte of the response. This includes time for the request preparation on the native level, network latency, and the time it took the server to prepare the response.
+- `Download`: The time it took to receive a response.
+
+[1]: https://app.datadoghq.com/rum/application/create
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/roku.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/roku.mdoc.md
new file mode 100644
index 00000000000..ccfb2a6ed77
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/roku.mdoc.md
@@ -0,0 +1,79 @@
+## Track RUM resources
+
+### roUrlTransfer
+
+Network requests made directly with a `roUrlTransfer` node must be tracked.
+
+For *synchronous requests*, you can use Datadog's `datadogroku_DdUrlTransfer` wrapper to track the resource automatically. This wrapper supports most features of the `roUrlTransfer` component, but does not support anything related to async network calls.
+
+For example, here's how to do a `GetToString` call:
+
+```text
+ ddUrlTransfer = datadogroku_DdUrlTransfer(m.global.datadogRumAgent)
+ ddUrlTransfer.SetUrl(url)
+ ddUrlTransfer.EnablePeerVerification(false)
+ ddUrlTransfer.EnableHostVerification(false)
+ result = ddUrlTransfer.GetToString()
+```
+
+For *asynchronous requests*, automatic instrumentation is not supported. You need to track the resource manually. The following code snippet shows how to report the request as a RUM Resource:
+
+```text
+sub performRequest()
+
+ m.port = CreateObject("roMessagePort")
+ request = CreateObject("roUrlTransfer")
+ ' setup the node url, headers, …
+
+ timer = CreateObject("roTimespan")
+ timer.Mark()
+ request.AsyncGetToString()
+
+ while (true)
+ msg = wait(1000, m.port)
+ if (msg <> invalid)
+ msgType = type(msg)
+ if (msgType = "roUrlEvent")
+ if (msg.GetInt() = 1) ' transfer complete
+ durationMs& = timer.TotalMilliseconds()
+ transferTime# = datadogroku_millisToSec(durationMs&)
+ httpCode = msg.GetResponseCode()
+ status = "ok"
+ if (httpCode < 0)
+ status = msg.GetFailureReason()
+ end if
+ resource = {
+ url: requestUrl
+ method: "GET"
+ transferTime: transferTime#
+ httpCode: httpCode
+ status: status
+ }
+ m.global.datadogRumAgent.callfunc("addResource", resource)
+ end if
+ end if
+ end if
+ end while
+end sub
+```
+
+### Streaming resources
+
+Whenever you use a `Video` or an `Audio` node to stream media, you can forward all `roSystemLogEvent` you receive to Datadog as follows:
+
+```text
+ sysLog = CreateObject("roSystemLog")
+ sysLog.setMessagePort(m.port)
+ sysLog.enableType("http.error")
+ sysLog.enableType("http.complete")
+
+ while(true)
+ msg = wait(0, m.port)
+ if (type(msg) = "roSystemLogEvent")
+ m.global.datadogRumAgent.callfunc("addResource", msg.getInfo())
+ end if
+ end while
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/roku/setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/unity.mdoc.md
new file mode 100644
index 00000000000..94078bd4a5b
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/unity.mdoc.md
@@ -0,0 +1,47 @@
+### Track resources
+
+Datadog provides `DatadogTrackedWebRequest` as a drop in replacement for `UnityWebRequest` to enable tracking of resources and HTTP calls from your RUM views.
+
+You can use it the same way as you would any other `UnityWebRequest`:
+
+```csharp
+var request = DatadogTrackedWebRequest.Get("https://httpbin.org/headers");
+yield return request.SendWebRequest();
+
+Debug.Log("Got result: " + request.downloadHandler.text);
+```
+
+### Track custom resources
+
+In addition to tracking resources automatically using `DatadogTrackedWebRequest`, you can track specific custom resources such as network requests or third-party provider APIs using the following methods:
+
+- `DdRum.StartResource`
+- `DdRum.StopResource`
+- `DdRum.StopResourceWithError`
+- `DdRum.StopResourceWithErrorInfo`
+
+For example:
+
+```csharp
+// in your network client:
+
+DatadogSdk.Instance.Rum.StartResource(
+ "resource-key",
+ RumHttpMethod.Get,
+ url,
+);
+
+// Later
+
+DatadogSdk.Instance.Rum.StopResource(
+ "resource-key",
+ 200,
+ RumResourceType.Image
+);
+```
+
+The `string` used for `resourceKey` in both calls must be unique for the resource you are calling in order for the Unity Datadog SDK to match a resource's start with its completion.
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/unity/setup/
+[3]: /real_user_monitoring/application_monitoring/unity/data_collected/
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/android.mdoc.md
new file mode 100644
index 00000000000..893f579c0ac
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/android.mdoc.md
@@ -0,0 +1,58 @@
+### Automatically track long tasks
+
+Long running operations performed on the main thread can impact the visual performance and reactivity of your application. To track these operations, define the duration threshold above which a task is considered too long.
+
+{% tabs %}
+{% tab label="Kotlin" %}
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ // …
+ .trackLongTasks(durationThreshold)
+ .build()
+```
+
+For example, to replace the default `100 ms` duration, set a custom threshold in your configuration.
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ // …
+ .trackLongTasks(250L) // track tasks longer than 250ms as long tasks
+ .build()
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
+ // …
+ .trackLongTasks(durationThreshold)
+ .build();
+```
+
+For example, to replace the default `100 ms` duration, set a custom threshold in your configuration.
+
+```java
+RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
+ // …
+ .trackLongTasks(250L) // track tasks longer than 250ms as long tasks
+ .build();
+```
+
+{% /tab %}
+{% /tabs %}
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/android
+[3]: /real_user_monitoring/android/data_collected
+[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views
+[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters
+[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests
+[7]: /real_user_monitoring/android/data_collected/#event-specific-attributes
+[8]: /real_user_monitoring/application_monitoring/android/setup/#sending-data-when-device-is-offline
+[9]: https://github.com/DataDog/dd-sdk-android/blob/eaa15cd344d1723fafaf179fcebf800d6030c6bb/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt#L279
+[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget
+[11]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#time-to-network-settled
+[12]: https://square.github.io/okhttp/features/events/
+[13]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#interaction-to-next-view
+[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/flutter.mdoc.md
new file mode 100644
index 00000000000..cb31258d39c
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/flutter.mdoc.md
@@ -0,0 +1,57 @@
+### Notify the SDK that your view finished loading
+
+iOS RUM tracks the time it takes for your view to load. To notify the SDK that your view has finished loading, call the `addViewLoadingTime` method on `DatadogRum`.
+Call this method when your view is fully loaded and ready to be displayed to the user:
+
+```dart
+ DatadogSdk.instance.rum?.addViewLoadingTime(override);
+```
+
+Use the `override` option to replace the previously calculated loading time for the current view.
+
+After the loading time is sent, it is accessible as `@view.loading_time` and is visible in the RUM UI.
+
+**Note**: This API is still experimental and might change in the future.
+
+### Add your own performance timing
+
+In addition to RUM's default attributes, you can measure where your application is spending its time by using `DdRum.addTiming`. The timing measure is relative to the start of the current RUM view.
+
+For example, you can time how long it takes for your hero image to appear:
+
+```dart
+void _onHeroImageLoaded() {
+ DatadogSdk.instance.rum?.addTiming("hero_image");
+}
+```
+
+After you set the timing, it is accessible as `@view.custom_timings.`. For example, `@view.custom_timings.hero_image`.
+
+To create visualizations in your dashboards, [create a measure][15] first.
+
+## Flutter-specific performance metrics
+
+To enable the collection of Flutter-specific performance metrics, set `reportFlutterPerformance: true` in `DatadogRumConfiguration`. Widget build and raster times are displayed in [Mobile Vitals][18].
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/flutter/setup/
+[3]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries/
+[4]: /getting_started/tagging/#defining-tags
+[5]: /real_user_monitoring/connect_rum_and_traces/?tab=browserrum#how-are-rum-resources-linked-to-traces
+[6]: https://github.com/openzipkin/b3-propagation#single-headers
+[7]: https://github.com/openzipkin/b3-propagation#multiple-headers
+[8]: https://www.w3.org/TR/trace-context/#tracestate-header
+[9]: /real_user_monitoring/application_monitoring/browser/frustration_signals/
+[10]: https://pub.dev/packages/datadog_tracking_http_client
+[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html
+[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html
+[13]: /serverless/aws_lambda/distributed_tracing/
+[14]: /real_user_monitoring/application_monitoring/flutter/data_collected
+[15]: /real_user_monitoring/explorer/?tab=measures#setup-facets-and-measures
+[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client
+[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/
+[18]: /real_user_monitoring/application_monitoring/mobile_vitals/?tab=flutter
+[19]: https://pub.dev/packages/datadog_grpc_interceptor
+[20]: https://pub.dev/packages/datadog_gql_link
+[21]: https://pub.dev/packages/datadog_dio
+[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..a031bc89cf6
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,43 @@
+### Add your own performance timing
+
+In addition to RUM's default attributes, you can measure where your application is spending its time by using the `addTiming` API. The timing measure is relative to the start of the current RUM view. For example, you can time how long it takes for your hero image to appear:
+
+```kotlin
+fun onHeroImageLoaded() {
+ GlobalRumMonitor.get().addTiming("hero_image")
+}
+```
+
+After the timing is sent, the timing is accessible as `@view.custom_timings.`. For example: `@view.custom_timings.hero_image`. You must [create a measure][8] before graphing it in RUM analytics or in dashboards.
+
+### Automatically track long tasks
+
+Long running operations performed on the main thread can impact the visual performance and reactivity of your application. To track these operations, define the duration threshold above which a task is considered too long.
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ // …
+ .trackLongTasks(durationThreshold)
+ .build()
+```
+
+For example, to replace the default `100 ms` duration, set a custom threshold in your configuration.
+
+```kotlin
+val rumConfig = RumConfiguration.Builder(applicationId)
+ // …
+ .trackLongTasks(250L) // track tasks longer than 250ms as long tasks
+ .build()
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform
+[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
+[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views
+[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters
+[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor
+[7]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
+[8]: /real_user_monitoring/explorer/search/#setup-facets-and-measures
+[9]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#sending-data-when-device-is-offline
+[10]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting
+[a1]: https://docs.datadoghq.com/help/
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/react_native.mdoc.md
new file mode 100644
index 00000000000..10cc6738cfa
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/react_native.mdoc.md
@@ -0,0 +1,46 @@
+### Notify the SDK that your view finished loading
+
+You can notify the SDK that your view has finished loading by calling the `addViewLoadingTime` method on `DdRum`.
+Call this method when your view is fully loaded and ready to be displayed to the user:
+
+```javascript
+DdRum.addViewLoadingTime(true);
+```
+
+Use the `overwrite` parameter to replace the previously calculated loading time for the current view.
+
+After the loading time is sent, it is accessible as `@view.loading_time` and is visible in the RUM UI.
+
+**Note**: This API is experimental.
+
+### Add custom timings
+
+You can add custom timings:
+
+```javascript
+DdRum.addTiming('');
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/react_native
+[3]: https://jestjs.io/
+[4]: /account_management/api-app-keys/#client-tokens
+[5]: /getting_started/tagging/#define-tags
+[6]: /getting_started/site/
+[7]: /real_user_monitoring/application_monitoring/browser/frustration_signals/
+[8]: /real_user_monitoring/correlate_with_other_telemetry/apm?tab=reactnativerum
+[9]: /real_user_monitoring/guide/proxy-mobile-rum-data/
+[10]: https://github.com/wix/react-native-navigation
+[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/
+[12]: https://github.com/react-navigation/react-navigation
+[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation
+[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2
+[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
+[16]: https://reactnative.dev/docs/global-requestIdleCallback
+[17]: https://reactnative.dev/docs/interactionmanager#runafterinteractions
+[18]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation-async
+[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications
+[20]: /real_user_monitoring/error_tracking/mobile/ios/?tab=cocoapods#configure-the-app-hang-threshold
+[21]: #rum-configuration
+[22]: #logs-configuration
+[23]: #trace-configuration
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/android.mdoc.md
new file mode 100644
index 00000000000..c96c62c0045
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/android.mdoc.md
@@ -0,0 +1,34 @@
+### Track user sessions
+
+Adding user information to your RUM sessions makes it possible to:
+* Follow the journey of a given user
+* Know which users are the most impacted by errors
+* Monitor performance for your most important users
+
+{% img src="real_user_monitoring/browser/advanced_configuration/user-api-1.png" alt="User attributes of a session in the RUM UI" /%}
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+
+To identify user sessions, use the `setUserInfo` API, for example:
+
+```kotlin
+Datadog.setUserInfo('1234', 'John Doe', 'john@doe.com')
+```
+
+### Add user properties
+
+You can use the `addUserProperties` API to append extra user properties to previously set properties.
+
+```kotlin
+fun addUserProperties(extraInfo: Map, sdkCore: SdkCore = getInstance()) {
+ sdkCore.addUserProperties(extraInfo)
+}
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/android
+[3]: /real_user_monitoring/android/data_collected
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/flutter.mdoc.md
new file mode 100644
index 00000000000..92df4a200f7
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/flutter.mdoc.md
@@ -0,0 +1,41 @@
+### Track user sessions
+
+Adding user information to your RUM sessions makes it possible to:
+
+* Follow the journey of a given user
+* Know which users are the most impacted by errors
+* Monitor performance for your most important users
+
+{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in the RUM UI" style="width:90%" /%}
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+
+To identify user sessions, use `DatadogSdk.setUserInfo`.
+
+For example:
+
+```dart
+DatadogSdk.instance.setUserInfo("1234", "John Doe", "john@doe.com");
+```
+
+### Add custom user attributes
+
+You can add custom attributes to your user session. This additional information is automatically applied to logs, traces, and RUM events.
+
+To remove an existing attribute, set it to `null`.
+
+For example:
+
+```dart
+DatadogSdk.instance.addUserExtraInfo({
+ 'attribute_1': 'foo',
+ 'attribute_2': null,
+});
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[14]: /real_user_monitoring/application_monitoring/flutter/data_collected
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/ios.mdoc.md
new file mode 100644
index 00000000000..fe8b7c9cb8f
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/ios.mdoc.md
@@ -0,0 +1,51 @@
+### Track user sessions
+
+Adding user information to your RUM sessions makes it possible to:
+
+* Follow the journey of a given user
+* Know which users are the most impacted by errors
+* Monitor performance for your most important users
+
+{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in the RUM UI" /%}
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+
+To identify user sessions, use the `Datadog.setUserInfo(id:name:email:)` API.
+
+For example:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+import DatadogCore
+
+Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com")
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}];
+```
+
+{% /tab %}
+{% /tabs %}
+
+## Add user properties
+
+You can use the `Datadog.addUserExtraInfo(_:)` API to append extra user properties to previously set properties.
+
+```swift
+import DatadogCore
+
+Datadog.addUserExtraInfo(["company": "Foo"])
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/ios
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..34f20adac0b
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,31 @@
+### Track user sessions
+
+Adding user information to your RUM sessions helps you to:
+* Follow the journey of a given user
+* Know which users are the most impacted by errors
+* Monitor performance for your most important users
+
+{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in RUM UI" /%}
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+
+To identify user sessions, use the `setUserInfo` API, for example:
+
+```kotlin
+Datadog.setUserInfo('1234', 'John Doe', 'john@doe.com')
+```
+
+### Add user properties
+
+You can use the `addUserExtraInfo` API to append extra user properties to previously set properties.
+
+```kotlin
+Datadog.addUserExtraInfo(extraInfo)
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/react_native.mdoc.md
new file mode 100644
index 00000000000..dc4e83b092c
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/react_native.mdoc.md
@@ -0,0 +1,45 @@
+### Track user sessions
+
+Adding user information to your RUM sessions makes it possible to:
+* Follow the journey of a given user
+* Know which users are the most impacted by errors
+* Monitor performance for your most important users
+
+{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in RUM UI" /%}
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+| `usr.extraInfo` | Object | (Optional) Include custom attributes such as subscription type, any user specific information that enhance user context in RUM sessions. |
+
+To identify user sessions, use the `setUserInfo` API, for example:
+
+```js
+DdSdkReactNative.setUserInfo({
+ id: '1337',
+ name: 'John Smith',
+ email: 'john@example.com',
+ extraInfo: {
+ type: 'premium'
+ }
+});
+```
+
+If you want to add or update user information, you can use the following code to modify the existing user's details.
+
+```js
+DdSdkReactNative.addUserExtraInfo({
+ hasPaid: 'true'
+});
+```
+
+If you want to clear the user information (for example, when the user signs out), you can do so by calling the `clearUserInfo` API:
+
+```js
+DdSdkReactNative.clearUserInfo();
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/react_native
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/roku.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/roku.mdoc.md
new file mode 100644
index 00000000000..e335e3a537d
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/roku.mdoc.md
@@ -0,0 +1,21 @@
+### Identifying your users
+
+Adding user information to your RUM sessions makes it possible to:
+* Follow the journey of a given user.
+* Know which users are the most impacted by errors.
+* Monitor performance for your most important users.
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+
+To identify user sessions, use the `datadogUserInfo` global field, after initializing the SDK, for example:
+
+```text
+ m.global.setField("datadogUserInfo", { id: 42, name: "Abcd Efg", email: "abcd.efg@example.com"})
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[2]: /real_user_monitoring/application_monitoring/roku/setup
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/unity.mdoc.md
new file mode 100644
index 00000000000..fcc63c519d8
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/unity.mdoc.md
@@ -0,0 +1,42 @@
+### Track user sessions
+
+Adding user information to your RUM sessions makes it possible to:
+
+* Follow the journey of a given user
+* Know which users are the most impacted by errors
+* Monitor performance for your most important users
+
+{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in the RUM UI" style="width:90%" /%}
+
+| Attribute | Type | Description |
+| ----------- | ------ | ------------------------------------------------------------------------------- |
+| `usr.id` | String | (Required) Unique user identifier. |
+| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. |
+| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. |
+
+To identify user sessions, use `DatadogSdk.SetUserInfo`.
+
+For example:
+
+```csharp
+DatadogSdk.Instance.SetUserInfo("1234", "John Doe", "john@doe.com");
+```
+
+### Add custom user attributes
+
+You can add custom attributes to your user session. This additional information is automatically applied to logs, traces, and RUM events.
+
+To remove an existing attribute, set it to `null`.
+
+For example:
+
+```csharp
+DatadogSdk.Instance.AddUserExtraInfo(new ()
+{
+ { "attribute_1", "foo" },
+ { "attribute_2", null },
+});
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[3]: /real_user_monitoring/application_monitoring/unity/data_collected/
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/android.mdoc.md
new file mode 100644
index 00000000000..efc5e285aaa
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/android.mdoc.md
@@ -0,0 +1,34 @@
+### Custom actions
+
+In addition to [tracking actions automatically][5], you can also track specific custom user actions (such as taps, clicks, and scrolls) with `RumMonitor#addAction`. For continuous action tracking (for example, tracking a user scrolling a list), use `RumMonitor#startAction` and `RumMonitor#stopAction`.
+
+The action type should be one of the following: "custom", "click", "tap", "scroll", "swipe", "back".
+
+{% tabs %}
+{% tab label="Kotlin" %}
+
+```kotlin
+fun onUserInteraction() {
+ GlobalRumMonitor.get().addAction(actionType, name, actionAttributes)
+}
+```
+
+{% /tab %}
+{% tab label="Java" %}
+
+```java
+public void onUserInteraction() {
+ GlobalRumMonitor.get().addAction(actionType, name, actionAttributes);
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+## Track widgets
+
+Widgets are not automatically tracked with the SDK. To send UI interactions from your widgets manually, call the Datadog API. [See example][10].
+
+[1]: https://app.datadoghq.com/rum/application/create
+[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters
+[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/flutter.mdoc.md
new file mode 100644
index 00000000000..57c9225db53
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/flutter.mdoc.md
@@ -0,0 +1,20 @@
+### Track user actions
+
+You can track specific user actions such as taps, clicks, and scrolls using `DdRum.addAction`.
+
+To manually register instantaneous RUM actions such as `RumActionType.tap`, use `DdRum.addAction()`. For continuous RUM actions such as `RumActionType.scroll`, use `DdRum.startAction()` or `DdRum.stopAction()`.
+
+For example:
+
+```dart
+void _downloadResourceTapped(String resourceName) {
+ DatadogSdk.instance.rum?.addAction(
+ RumActionType.tap,
+ resourceName,
+ );
+}
+```
+
+When using `DdRum.startAction` and `DdRum.stopAction`, the `type` action must be the same for the Datadog Flutter SDK to match an action's start with its completion.
+
+[1]: https://app.datadoghq.com/rum/application/create
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/ios.mdoc.md
new file mode 100644
index 00000000000..38bfabd0d00
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/ios.mdoc.md
@@ -0,0 +1,117 @@
+### Custom actions
+
+In addition to [tracking actions automatically](#automatically-track-user-actions), you can track specific custom user actions (taps, clicks, and scrolls) with the `addAction(type:name:)` API.
+
+To manually register instantaneous RUM actions such as `.tap` on `RUMMonitor.shared()`, use `.addAction(type:name:)`. For continuous RUM actions such as `.scroll`, use `.startAction(type:name:)` or `.stopAction(type:)`.
+
+For example:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+import DatadogRUM
+
+// in your `UIViewController`:
+
+let rum = RUMMonitor.shared()
+
+@IBAction func didTapDownloadResourceButton(_ sender: UIButton) {
+ rum.addAction(
+ type: .tap,
+ name: sender.currentTitle ?? ""
+ )
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+- (IBAction)didTapDownloadResourceButton:(UIButton *)sender {
+ NSString *name = sender.currentTitle ? sender.currentTitle : @"";
+ [[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}];
+}
+```
+
+{% /tab %}
+{% /tabs %}
+
+**Note**: When using `.startAction(type:name:)` and `.stopAction(type:)`, the action `type` must be the same. This is necessary for the RUM iOS SDK to match an action start with its completion.
+
+For more details and available options, see [`RUMMonitorProtocol` in GitHub][4].
+
+### Automatically track user actions
+
+#### UIKit
+
+To automatically track user tap actions with UIKit, set the `uiKitActionsPredicate` option when enabling RUM.
+
+#### SwiftUI
+
+To automatically track user tap actions in SwiftUI, enable the `swiftUIActionsPredicate` option when enabling RUM.
+
+**Notes:**
+- Datadog recommends enabling UIKit action tracking as well even for pure SwiftUI apps as many interactive components rely on UIKit internally.
+- On tvOS, only press interactions on the remote are tracked. Only a UIKit predicate is needed for this. If you have a pure SwiftUI app but want to track remote presses on tvOS, you should also enable UIKit instrumentation.
+- The implementation differs between iOS 18+ and iOS 17 and below:
+ - **iOS 18 and above:** Most interactions are reliably tracked with correct component names (for example, `SwiftUI_Button`, `SwiftUI_NavigationLink`).
+ - **iOS 17 and below:** The SDK cannot distinguish between interactive and non-interactive components (for example, Button vs. Label). For that reason, actions are reported as `SwiftUI_Unidentified_Element`.
+- If you use both automatic and manual tracking, you may see duplicate events. This is a known limitation. To avoid this, use only one instrumentation type - either automatic or manual.
+- You can use the default predicate, `DefaultSwiftUIRUMActionsPredicate`, or provide your own to filter or rename actions. You can also disable legacy detection (iOS 17 and below) if you only want reliable iOS 18+ tracking:
+
+{% tabs %}
+{% tab label="Swift" %}
+
+```swift
+// Use the default predicate by disabling iOS 17 and below detection
+let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false)
+
+// Use your own predicate
+class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate {
+ func rumAction(for componentName: String) -> RUMAction? {
+ // Custom logic to filter or rename actions
+ return RUMAction(name: componentName)
+ }
+}
+```
+
+{% /tab %}
+{% tab label="Objective-C" %}
+
+```objective-c
+// Use the default predicate by disabling iOS 17 and below detection
+DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO];
+
+// Use your own predicate
+@protocol DDSwiftUIRUMActionsPredicate
+- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName;
+@end
+
+@interface CustomSwiftUIActionsPredicate : NSObject
+@end
+
+@implementation CustomSwiftUIActionsPredicate
+- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName {
+ // Custom logic to filter or rename actions
+ return [[DDRUMAction alloc] initWithName:componentName attributes:@{}];
+}
+@end
+```
+
+{% /tab %}
+{% /tabs %}
+
+#### Action reporting by iOS version
+
+The table below shows how iOS 17 and iOS 18 report different user interactions.
+
+| **Component** | **iOS 18 reported name** | **iOS 17 reported name** |
+|------------------|---------------------------------------------------|--------------------------------------|
+| Button | SwiftUI_Button | SwiftUI_Unidentified_Element |
+| NavigationLink | NavigationLink | SwiftUI_Unidentified_Element |
+| Menu | SwiftUI_Menu (and its items as _UIContextMenuCell)| SwiftUI_Menu (and its items as _UIContextMenuCell) |
+| Link | SwiftUI_Button | SwiftUI_Unidentified_Element |
+
+[1]: https://app.datadoghq.com/rum/application/create
+[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/kotlin_multiplatform.mdoc.md
new file mode 100644
index 00000000000..af713b76ced
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/kotlin_multiplatform.mdoc.md
@@ -0,0 +1,14 @@
+### Custom actions
+
+In addition to [tracking actions automatically][5], you can also track specific custom user actions (such as taps, clicks, and scrolls) with `RumMonitor#addAction`. For continuous action tracking (for example, tracking a user scrolling a list), use `RumMonitor#startAction` and `RumMonitor#stopAction`.
+
+The action type should be one of the following: "custom", "click", "tap", "scroll", "swipe", "back".
+
+```kotlin
+fun onUserInteraction() {
+ GlobalRumMonitor.get().addAction(actionType, name, actionAttributes)
+}
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
+[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/react_native.mdoc.md
new file mode 100644
index 00000000000..160d2006741
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/react_native.mdoc.md
@@ -0,0 +1,17 @@
+### Manually track RUM actions
+
+You can manually track RUM actions:
+
+```javascript
+DdRum.addAction(RumActionType.TAP, 'action name', {}, Date.now());
+```
+
+To track a continuous action:
+
+```javascript
+DdRum.startAction(RumActionType.TAP, 'action name', {}, Date.now());
+//...
+DdRum.stopAction({}, Date.now());
+```
+
+[1]: https://app.datadoghq.com/rum/application/create
diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/unity.mdoc.md
new file mode 100644
index 00000000000..60d5fdbd0a2
--- /dev/null
+++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/unity.mdoc.md
@@ -0,0 +1,20 @@
+### Track user actions
+
+You can track specific user actions such as taps, clicks, and scrolls using `DdRum.AddAction`.
+
+To manually register instantaneous RUM actions such as `RumActionType.Tap`, use `DdRum.AddAction()`. For continuous RUM actions such as `RumActionType.Scroll`, use `DdRum.StartAction()` or `DdRum.StopAction()`.
+
+For example:
+
+```csharp
+void DownloadResourceTapped(string resourceName) {
+ DatadogSdk.Instance.Rum.AddAction(
+ RumActionType.Tap,
+ resourceName,
+ );
+}
+```
+
+When using `DdRum.StartAction` and `DdRum.StopAction`, the `type` action must be the same for the Datadog Unity SDK to match an action's start with its completion.
+
+[1]: https://app.datadoghq.com/rum/application/create
diff --git a/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md
index 0ffad191456..42d2ca5c142 100644
--- a/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md
+++ b/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md
@@ -51,6 +51,8 @@ If data is being sent, you should see network requests targeting `api/v2/rum` (t
{% img src="real_user_monitoring/browser/troubleshooting/network_intake-1.png" alt="RUM requests to Datadog intake" /%}
+After the data reaches the intake, availability in the Datadog UI depends on your retention filter configuration. If the session is retained, events typically appear in the RUM Explorer within a few seconds after the [retention decision][17] is made. Otherwise, it may take a few minutes.
+
## RUM cookies
The RUM Browser SDK relies on cookies to store session information and follow a [user session][7] across different pages. The cookies are first-party (they are set on your domain) and are not used for cross-site tracking. Here are the cookies set by the RUM Browser SDK:
@@ -153,3 +155,4 @@ A warning appears when deobfuscation fails for a stack trace. If the stack trace
[14]: https://app.datadoghq.com/source-code/setup/rum
[15]: /real_user_monitoring/guide/debug-symbols
[16]: /real_user_monitoring/#technical-limitations
+[17]: /real_user_monitoring/rum_without_limits/retention_filters
\ No newline at end of file
diff --git a/layouts/shortcodes/serverless-init-troubleshooting.en.md b/layouts/shortcodes/serverless-init-troubleshooting.en.md
index fd7f6fcd75c..7e73f619b4d 100644
--- a/layouts/shortcodes/serverless-init-troubleshooting.en.md
+++ b/layouts/shortcodes/serverless-init-troubleshooting.en.md
@@ -8,4 +8,8 @@ To have your {{ .Get "productNames" }} appear in the [software catalog][2001], y
{{ if eq (.Get "sidecar") "true" }}If you are missing logs or traces during container shutdown, specify a container start up order to make your main container depend on the sidecar container.
{{ end }}
+
+{{ if eq (.Get "in_container") "true" }}
+If you are using [request-based billing](https://docs.cloud.google.com/run/docs/container-contract#cpu) for a Google Cloud Run application instrumented in-container, very short requests may lead to dropped logs during the post-request CPU throttling. You can control the speed at which logs are sent to Datadog using the [`DD_LOGS_CONFIG_BATCH_WAIT`](https://docs.datadoghq.com/agent/logs/log_transport/?tab=https#configure-the-batch-wait-time) environment variable. Set `DD_LOGS_CONFIG_BATCH_WAIT` to a value shorter than your typical request duration to avoid dropped logs. Sidecar instrumentation also prevents this issue, as the sidecar is not affected by request-based CPU throttling.
+{{ end }}
[2001]: /internal_developer_portal/software_catalog/
diff --git a/local/bin/py/integration-finder.py b/local/bin/py/integration-finder.py
index 008eec1ea4e..d4c6f95757d 100755
--- a/local/bin/py/integration-finder.py
+++ b/local/bin/py/integration-finder.py
@@ -4,6 +4,7 @@
from os.path import isdir
import git
import argparse
+import json
def filter_out_dots(array):
for dir in array:
@@ -11,17 +12,22 @@ def filter_out_dots(array):
array.remove(dir)
return array
+def normalize(s):
+ return s.strip().lower().replace('_', '-')
+
# Hardcode integration data
integrations_repos = {
- 'integrations-core': 'master',
- 'integrations-extras': 'master',
- 'integrations-internal-core': 'main',
- 'marketplace':'master'
+ 'integrations-core': {'branch': 'master', 'github': True},
+ 'integrations-extras': {'branch': 'master', 'github': True},
+ 'integrations-internal-core': {'branch': 'main', 'github': True},
+ 'marketplace': {'branch': 'master', 'github': True},
+ 'publishing-platform': {'branch': 'main', 'github': False},
}
# Check if the repos are present locally. If not, clone them. If so, update them
def update_repos(integrations_repos):
- for repo, branch in integrations_repos.items():
+ for repo, cfg in integrations_repos.items():
+ branch = cfg['branch']
local_repo_path = os.path.join('..', repo)
if isdir(local_repo_path):
try:
@@ -36,9 +42,9 @@ def update_repos(integrations_repos):
# Pull the latest changes from the remote repository
print(f'\tPulling latest changes from {repo} on branch {branch}')
local_repo.remotes.origin.pull(branch)
- except:
+ except:
print(f'\n\x1b[33mWARNING\x1b[0m:Failed to update {repo}' +
- '\nContinuing without updating the repo. ' +
+ '\nContinuing without updating the repo. ' +
f'To resolve, check {repo} for a dirty feature branch and commit, ' +
'stash, or reset any changes and try again.\n')
else:
@@ -48,29 +54,46 @@ def update_repos(integrations_repos):
# Find the given integration in the integrations repos
def find_integration(integrations_repos, integration_name):
found = []
- for repo,branch in integrations_repos.items():
- integration_list = []
+ target = normalize(integration_name)
+ for repo, cfg in integrations_repos.items():
+ branch = cfg['branch']
+ is_github = cfg['github']
location = os.path.join('..', repo)
- url = f'https://github.com/DataDog/{repo}/blob/{branch}/{integration_name}/README.md'
- integration_list = [f.name for f in os.scandir(location) if f.is_dir()]
- integration_list = filter_out_dots(integration_list)
- if integration_name in integration_list:
- readme_path = os.path.join(location, integration_name, 'README.md')
- if os.path.exists(readme_path):
- found.append(f'{location}/{integration_name}/README.md\n- {url}')
+ if not os.path.isdir(location):
+ continue
+ dirs = [f.name for f in os.scandir(location) if f.is_dir()]
+ dirs = filter_out_dots(dirs)
+ for dir_name in dirs:
+ manifest_path = os.path.join(location, dir_name, 'manifest.json')
+ if not os.path.exists(manifest_path):
+ continue
+ try:
+ with open(manifest_path) as fp:
+ manifest = json.load(fp)
+ except Exception:
+ continue
+ app_id = manifest.get('app_id', '')
+ if not app_id or normalize(app_id) != target:
+ continue
+ readme_path = os.path.join(location, dir_name, 'README.md')
+ if is_github:
+ url = f'https://github.com/DataDog/{repo}/blob/{branch}/{dir_name}/README.md'
+ found.append(f'{readme_path}\n- {url}')
+ else:
+ found.append(f'{readme_path}\n- {integration_name} is published through the publishing platform')
+ break # short-circuit within this repo; continue to other repos
if len(found) == 0:
print(f'\nIntegration "{integration_name}" not found. Check the spelling and try again.')
elif len(found) == 1:
print(f'\nYou can find {integration_name} here:\n- {"".join(found)}')
else:
-
print('\nMore than one integration with that name was found. Check the following:')
for entry in found:
print(f'{entry}\n')
parser = argparse.ArgumentParser(description="Find an integration")
-parser.add_argument('integration', help="The name of the integration to search for", type=str)
+parser.add_argument('integration', help="The app-id of the integration to search for (for example, rapdev-box)", type=str)
args = parser.parse_args()
-integrations = update_repos(integrations_repos)
+update_repos(integrations_repos)
find_integration(integrations_repos, args.integration)
diff --git a/static/images/incident_response/status_pages/delete_degradation_update.png b/static/images/incident_response/status_pages/delete_degradation_update.png
new file mode 100644
index 00000000000..94a527691ba
Binary files /dev/null and b/static/images/incident_response/status_pages/delete_degradation_update.png differ
diff --git a/static/images/incident_response/status_pages/edit_degradation_update.png b/static/images/incident_response/status_pages/edit_degradation_update.png
new file mode 100644
index 00000000000..d6b70366f7b
Binary files /dev/null and b/static/images/incident_response/status_pages/edit_degradation_update.png differ