diff --git a/config/_default/menus/main.en.yaml b/config/_default/menus/main.en.yaml index 80221d9146b67..73ac021d9ff10 100644 --- a/config/_default/menus/main.en.yaml +++ b/config/_default/menus/main.en.yaml @@ -4061,6 +4061,11 @@ menu: parent: profiler_enabling identifier: profiler_enabling_linux weight: 109 + - name: eBPF + url: profiler/enabling/ebpf/ + parent: profiler_enabling + identifier: profiler_enabling_ebpf + weight: 110 - name: Profile Types url: profiler/profile_types/ parent: profiler @@ -4126,6 +4131,11 @@ menu: parent: profiler_troubleshooting identifier: profiler_troubleshooting_linux weight: 608 + - name: eBPF + url: profiler/profiler_troubleshooting/ebpf/ + parent: profiler_troubleshooting + identifier: profiler_troubleshooting_ebpf + weight: 609 - name: Guides url: profiler/guide/ parent: profiler diff --git a/config/_default/params.yaml b/config/_default/params.yaml index 7f254d9547f3a..effc298f0ee89 100644 --- a/config/_default/params.yaml +++ b/config/_default/params.yaml @@ -105,6 +105,7 @@ code_language_ids: windows: Windows opentelemetry: OpenTelemetry ddprof: "Rust/C/C++" + ebpf: "eBPF" serverless: "Serverless" javascript: "JavaScript" swift: "Swift" diff --git a/content/en/profiler/enabling/ebpf.md b/content/en/profiler/enabling/ebpf.md new file mode 100644 index 0000000000000..0407b758dc640 --- /dev/null +++ b/content/en/profiler/enabling/ebpf.md @@ -0,0 +1,107 @@ +--- +title: Enabling the eBPF Profiler +code_lang: ebpf +type: multi-code-lang +code_lang_weight: 90 +aliases: + - /tracing/profiler/enabling/ebpf/ +further_reading: + - link: 'getting_started/profiler' + tag: 'Documentation' + text: 'Getting Started with Profiler' + - link: 'profiler/profiler_troubleshooting/ebpf' + tag: 'Documentation' + text: 'Fix problems you encounter while using the profiler' +--- + +
+ebpf is in beta. Datadog recommends evaluating the profiler in a non-sensitive environment before deploying in production. +
+ +The eBPF profiler is our eBPF-based host profiler built on OpenTelemetry and designed to send profiling data to the Datadog backend via the Datadog Agent. It supports symbolication for compiled languages and is optimized for containerized environments like Docker and Kubernetes. + +## Requirements + +For a summary of the minimum and recommended runtime and tracer versions across all languages, read [Supported Language and Tracer Versions][7]. + +Supported operating systems +: Linux + +Supported architecture +: `amd64` or `arm64` processors + +Serverless +: `ebpf` is not supported on serverless platforms, such as AWS Lambda. + +OS Settings +: TBD + +Debugging information +: Symbols should be available locallly or can be uploaded in CI via `datadog-ci` + +## Installation + +The profiler can be used as a standalone executable. + +### Running the Profiler +If the host is running workloads inside containers, it is recommended to run the profiler inside a container as well. A container image is [available][5]. + +If you're using Kubernetes, follow the instruction for [running in Kubernetes][8]. + +If you're directly using Docker, follow the instrcutins for [running in Docker][9]. + +If you're not using a container runtime, follow the instructions for running [directly on the host][10] + +### Configuring the Profiler +#### Local symbol upload (Experimental) +For compiled languages (C/C++/Rust/Go/...), the profiler can upload local symbols (when available) to Datadog for symbolication. Symbols need to be available locally (unstripped binaries). + +To enable local symbol upload: + +1. Set the `DD_HOST_PROFILING_EXPERIMENTAL_UPLOAD_SYMBOLS` environment variable to true. +2. Provide a Datadog API key through the `DD_API_KEY` environment variable. +3. Provide a Datadog APP key through the `DD_APP_KEY` environment variable. +4. Set the `DD_SITE environment` variable to your Datadog site (e.g. datadoghq.com, datadoghq.eu, us5.datadoghq.com, ...). + +### Build +You must first ensure you have the correct version of go installed. In order to build the profiler directly on your machine, you can simply run: + + ```shell + make + ``` + +### Library +TBD + +### Deploying the shared library + +TBD + +#### Installing the library + +TBD +#### Appending a search directory + +TBD + +## Configuration + +TBD + +## Not sure what to do next? + +The [Getting Started with Profiler][6] guide takes a sample service with a performance problem and shows you how to use Continuous Profiler to understand and fix the problem. + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + +[2]: shttps://github.com/DataDog/dd-otel-host-profiler/releases/ +[3]: https://app.datadoghq.com/profiling +[4]: /getting_started/tagging/unified_service_tagging +[5]: https://github.com/DataDog/dd-otel-host-profiler/pkgs/container/dd-otel-host-profiler/. +[6]: /getting_started/profiler/ +[7]: /profiler/enabling/supported_versions/ +[8]: https://github.com/DataDog/dd-otel-host-profiler/blob/main/doc/running-in-kubernetes.md +[9]: https://github.com/DataDog/dd-otel-host-profiler/blob/main/doc/running-in-docker.md +[10]: https://github.com/DataDog/dd-otel-host-profiler/blob/main/doc/running-on-host.md \ No newline at end of file diff --git a/content/en/profiler/enabling/supported_versions.md b/content/en/profiler/enabling/supported_versions.md index de8400f68c862..8344fe500c26b 100644 --- a/content/en/profiler/enabling/supported_versions.md +++ b/content/en/profiler/enabling/supported_versions.md @@ -17,8 +17,8 @@ The following tables summarize the features available for each language runtime. To use the Datadog Profiler, use at least the minimum versions summarized in the following table. For specific profile type availability by version, see [Profile types](#profile-types). -| | [Java][1] | [Python][2] | [Go][3] | [Ruby][4] | [Node.js][5] | [.NET][6] | [PHP][7] | [Rust/C/C++][8] | -|-----------------------------------|:------------:|:----------------:|:-------------:|:--------------:|:-------------:|:-----------------------------------------------------------------------:|:-------------:|:---------------:| +| | [Java][1] | [Python][2] | [Go][3] | [Ruby][4] | [Node.js][5] | [.NET][6] | [PHP][7] | [Rust/C/C++][8] | [eBPF][9] | +|-----------------------------------|:------------:|:----------------:|:-------------:|:--------------:|:-------------:|:-----------------------------------------------------------------------:|:-------------:|:---------------:|:---------------:| | Minimum runtime version | [JDK 8+][17] | Python 2.7+ | [previous major Go release][21] | Ruby 2.5+ | Node 14+ | .NET Core 2.1+, .NET 5+, .NET Framework 4.6.1+ | PHP 7.1+ | | | Feature-complete runtime version | [JDK 11+][17] | Python 3.6+ | [latest major Go release][21] | Ruby 3.2+ | Node 18+ | .NET 7+ | PHP 8.0+ | | | Feature-complete tracing library version | [latest][9] | [latest][10] | [latest][11] | [latest][12] | [latest][13] | [latest][14] | [latest][15] | [latest][16] | @@ -28,9 +28,9 @@ To use the Datadog Profiler, use at least the minimum versions summarized in the The following table shows profile type availability by language. For optimal performance and access to all features, Datadog recommends using the latest version of the tracing library for your language. If a specific runtime version isn't indicated, the profile type is available with the minimum runtime version listed in the [Runtime and tracing library versions](#runtime-and-tracing-library-versions). -|
| [Java][1] | [Python][2] | [Go][3] | [Ruby][4] | [Node.js][5] | [.NET][6] | [PHP][7] | [Rust/C/C++][8] | -|-----------------------------------|:-------------------------------------------------:|:-------:|:------------:|:------:|:---------:|:-------:|:------:|:----------:| -| {{< ci-details title="CPU" >}}The time each function/method spent running on the CPU.{{< /ci-details >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< tooltip glossary="preview" case="title" >}} | +|
| [Java][1] | [Python][2] | [Go][3] | [Ruby][4] | [Node.js][5] | [.NET][6] | [PHP][7] | [Rust/C/C++][8] |[eBPF][9] | +|-----------------------------------|:-------------------------------------------------:|:-------:|:------------:|:------:|:---------:|:-------:|:------:|:----------:|:----------:| +| {{< ci-details title="CPU" >}}The time each function/method spent running on the CPU.{{< /ci-details >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< tooltip glossary="preview" case="title" >}} | {{< tooltip glossary="preview" case="title" >}} | | {{< ci-details title="Exceptions" >}}The number of exceptions raised, including those caught.{{< /ci-details >}} | {{< X >}} | Python 3.7+ | | | | .NET 5+ | {{< X >}} | | | {{< ci-details title="Allocation" >}}Number and sizes of memory allocations made by each function/method, including allocations which were subsequently freed.{{< /ci-details >}} | [JDK 11+][17] | Python 3.6+ | {{< X >}} | {{< X >}} | | {{< tooltip glossary="preview" case="title" >}}
.NET 6+ | {{< X >}} | {{< tooltip glossary="preview" case="title" >}} | | {{< ci-details title="Heap" >}}The amount of heap memory allocated that remains in use.{{< /ci-details >}} | [JDK 11+][17] | Python 3.6+ | {{< X >}} | alpha
Ruby 3.1+ | {{< X >}} | {{< tooltip glossary="preview" case="title" >}}
.NET 7+ | | {{< tooltip glossary="preview" case="title" >}} | @@ -42,9 +42,9 @@ The following table shows profile type availability by language. For optimal per The following table outlines additional profiling features by language. For full functionality and best performance, Datadog recommends using the latest version of your language's tracing library. If a specific runtime version isn't indicated, the feature is available with the minimum runtime version listed in the [Runtime and tracing library versions](#runtime-and-tracing-library-versions). -| | [Java][1] | [Python][2] | [Go][3] | [Ruby][4] | [Node.js][5] | [.NET][6] | [PHP][7] | [Rust/C/C++][8] | -|-----------------------------------|:-------:|:-------:|:------------:|:------:|:---------:|:-------:|:------:|:----------:| -| {{< ci-details title="Trace to Profiling integration" >}}Find specific lines of code related to performance issues. Learn more{{< /ci-details >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | | +| | [Java][1] | [Python][2] | [Go][3] | [Ruby][4] | [Node.js][5] | [.NET][6] | [PHP][7] | [Rust/C/C++][8] | [eBPF][9] | +|-----------------------------------|:-------:|:-------:|:------------:|:------:|:---------:|:-------:|:------:|:----------:|:----------:| +| {{< ci-details title="Trace to Profiling integration" >}}Find specific lines of code related to performance issues. Learn more{{< /ci-details >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | | {{< X >}} | | {{< ci-details title="Endpoint Profiling" >}}Identify endpoints that are bottlenecks or responsible for heavy resource consumption. Learn more{{< /ci-details >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | | | {{< ci-details title="Timeline View" >}}Surface time-based patterns and work distribution over the period of a span. Learn more{{< /ci-details >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | {{< X >}} | | | {{< ci-details title="Memory Leaks" >}}A guided workflow to assist in investigating memory leaks. Learn more{{< /ci-details >}} | {{< X >}} | | {{< X >}} | | | | | | diff --git a/content/en/profiler/profile_types.md b/content/en/profiler/profile_types.md index 5537e9d69ece7..198a94669a979 100644 --- a/content/en/profiler/profile_types.md +++ b/content/en/profiler/profile_types.md @@ -15,7 +15,7 @@ further_reading: In the **Profiles** tab, you can see all profile types available for a given language. Depending on the language and version, the information collected about your profile differs. -{{< programming-lang-wrapper langs="java,python,go,ruby,nodejs,dotnet,php,ddprof" >}} +{{< programming-lang-wrapper langs="java,python,go,ruby,nodejs,dotnet,php,ddprof,ebpf" >}} {{< programming-lang lang="java" >}} Once profiling is enabled, the following profile types are collected for [supported Java versions][1]: @@ -265,9 +265,20 @@ Allocated memory [1]: /profiler/enabling/ddprof/ {{< /programming-lang >}} +{{< programming-lang lang="ebpf" >}} + +Once profiling is enabled, the following profile types are collected for [supported languages and versions][1]: + +CPU +: Time each method or function spent running on the CPU. In multi-threaded programs, CPU time can be greater than elapsed time: if 2 threads are running during 45s each, you'd see "eBPF CPU Time, 1m 30s per minute". + +[1]: /profiler/enabling/ebpf/ +{{< /programming-lang >}} {{< /programming-lang-wrapper >}} + + ## Further Reading {{< partial name="whats-next/whats-next.html" >}} diff --git a/content/en/profiler/profile_visualizations.md b/content/en/profiler/profile_visualizations.md index 9a9bfc82ed742..360301f270b7c 100644 --- a/content/en/profiler/profile_visualizations.md +++ b/content/en/profiler/profile_visualizations.md @@ -109,7 +109,7 @@ To access the timeline view: Depending on the runtime and language, the timeline lanes vary: -{{< programming-lang-wrapper langs="java,python,go,ruby,nodejs,dotnet,php" >}} +{{< programming-lang-wrapper langs="java,python,go,ruby,nodejs,dotnet,php,ebpf" >}} {{< programming-lang lang="java" >}} Each lane represents a **thread**. Threads from a common pool are grouped together. You can expand the pool to view details for each thread. @@ -181,6 +181,10 @@ Lanes on the top are runtime activities that may add extra latency to your reque [1]: /profiler/connect_traces_and_profiles/#prerequisites {{< /programming-lang >}} + +{{< programming-lang lang="ebpf" >}} +Timeline view is currently not supported for eBPF profiling +{{< /programming-lang >}} {{< /programming-lang-wrapper >}} ## Further Reading diff --git a/content/en/profiler/profiler_troubleshooting/ebpf.md b/content/en/profiler/profiler_troubleshooting/ebpf.md new file mode 100644 index 0000000000000..9f3bcad3775fa --- /dev/null +++ b/content/en/profiler/profiler_troubleshooting/ebpf.md @@ -0,0 +1,21 @@ +--- +title: Troubleshooting the eBPF Profiler +code_lang: ebpf +type: multi-code-lang +code_lang_weight: 90 +further_reading: + - link: '/tracing/troubleshooting' + tag: 'Documentation' + text: 'APM Troubleshooting' +--- + +
+eBPF is in Preview. Datadog recommends evaluating the profiler in a non-sensitive environment before deploying in production. +
+ + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + +[1]: /help/ diff --git a/layouts/partials/profiling/profiling-languages.html b/layouts/partials/profiling/profiling-languages.html index 729df4b448b15..0fd2d213b3bbf 100644 --- a/layouts/partials/profiling/profiling-languages.html +++ b/layouts/partials/profiling/profiling-languages.html @@ -72,6 +72,13 @@
+

diff --git a/layouts/partials/profiling/profiling-troubleshooting.html b/layouts/partials/profiling/profiling-troubleshooting.html index 2975b29a29323..89369df8fd11b 100644 --- a/layouts/partials/profiling/profiling-troubleshooting.html +++ b/layouts/partials/profiling/profiling-troubleshooting.html @@ -72,6 +72,13 @@ +
+ +
+ {{ partial "img.html" (dict "root" . "src" "integrations_logos/ebpf-icon.png" "class" "img-fluid" "alt" "eBPF" "width" "400") }} +
+
+

diff --git a/static/images/integrations_logos/ebpf-icon.png b/static/images/integrations_logos/ebpf-icon.png new file mode 100644 index 0000000000000..877059ebb829b Binary files /dev/null and b/static/images/integrations_logos/ebpf-icon.png differ