elastic/otel-profiling-agent logo

elastic/otel-profiling-agent

Free

The production-scale datacenter profiler (C/C++, Go, Rust, Python, Java, NodeJS, .NET, PHP, Ruby, Perl, ...)

FreeFree tier
Type
Open Source

About elastic/otel-profiling-agent

The OpenTelemetry eBPF Profiler is a whole-system, cross-language profiler for Linux that leverages eBPF. It provides production-scale profiling with very low CPU and memory overhead (upper limits of 1% CPU and 250MB memory in testing). It supports native C/C++, Go, Rust, Python, Java, Node.js, .NET, PHP, Ruby, Perl, and Erlang runtimes, including mixed stack traces from kernel space through system libraries into high-level languages. The profiler is 100% non-intrusive—no agents or libraries need to be loaded into target processes, and no reconfiguration or restarts are required. It supports ARM64 architectures, native inline frames for deeper insight into compiler optimizations, and can unwind even without DWARF debug information by using .eh_frame data. It implements the Alpha OpenTelemetry Profiles signal. The minimum supported Linux kernel version is 5.10 (with some earlier commits supporting 5.4 and 4.19).

Key Features

Very low CPU and memory overhead (1% CPU, 250MB memory upper limits)
Support for native C/C++ executables without DWARF debug information (uses .eh_frame data)
Support for a broad set of high-level languages: Hotspot JVM, Python, Ruby, PHP, Node.JS, V8, Perl, Erlang, .NET
100% non-intrusive: no agents or libraries loaded into profiled processes, no reconfiguration or restarts needed
ARM64 support for all unwinders
Support for native inline frames providing insights into compiler optimizations
Mixed stack traces from kernel space through system libraries into high-level languages
Implements the Alpha OTel Profiles signal

Pros & Cons

Pros
  • Extremely low overhead suitable for production environments
  • Broad language support without requiring debug symbols or frame pointers
  • Completely non-intrusive, no code or configuration changes needed
  • ARM64 support makes it usable across modern server architectures
  • Open source with active development under OpenTelemetry
Cons
  • Requires Linux kernel version 5.10 or newer (some features require later kernels)
  • Limited to x86_64 and ARM64 architectures
  • Still in alpha stage for the OTel Profiles signal, may have breaking changes
  • No Windows or macOS support (Linux only)

Best For

Production profiling in datacentersDebugging performance issues across multiple language runtimesGaining visibility into mixed-language application stacksAnalyzing kernel-to-user-space call chains without instrumentation overhead

FAQ

What languages are supported?
The profiler supports native C/C++, Go, Rust, as well as high-level language runtimes including Hotspot JVM (Java), Python, Ruby, PHP, Node.JS, V8, Perl, Erlang, and .NET.
Is the profiler intrusive? Does it require code changes?
No, the profiler is 100% non-intrusive. It does not need to load agents or libraries into the profiled processes, and no reconfiguration or restarts of language interpreters or VMs are required.
What is the performance overhead?
The profiler has very low overhead, with upper limits of 1% CPU and 250MB memory in testing, and typically stays well below those limits.
What Linux kernel versions are supported?
The minimum required Linux kernel version is 5.10 for the latest release. Earlier commits supported versions 5.4 and 4.19, but these are not actively maintained.
Does it support ARM64?
Yes, the profiler supports ARM64 for all unwinders.