Skip to content

Supported runtimes

Coralogix Continuous Profiling supports a broad set of native and managed runtimes through the OpenTelemetry eBPF profiler. The matrix below summarizes supported versions and available profile types. Expand a language for symbolization details, runtime caveats, and troubleshooting.

Supported runtimes

LanguageTypeVersionsProfile typesSymbol uploadNotes
JVM (Java, Scala, Kotlin)ManagedJDK 7 - JDK 25CPU, Memory❌ No
Node.jsManaged14.x - 23.xCPU❌ NoARM64 requires Node 16+
PythonManaged3.6 - 3.14CPU❌ No
.NETManaged6.0 - 10CPU❌ No
RubyManaged2.5 - 4.0CPU❌ No
PHPManaged7.3 - 8.4CPU❌ No
PerlManaged5.28 - 5.42CPU❌ No
GoNativeCPU❌ No (embedded)
RustNativeCPU✅ Yes
C/C++NativeCPU✅ Yes
ZigNativeCPU✅ Yes

Native binaries (Rust, C/C++, Zig) require debug symbols to be uploaded to Coralogix for human-readable stack traces — see Upload debug symbols. Go binaries embed their symbols and are symbolized automatically. Memory profiles are currently available for JVM services through the Async Profiler.

Language-specific reference

Rust

To get symbolized Rust stack traces, compile with debug symbols and upload them to Coralogix. In your Cargo.toml, set the debug profile setting to a value higher than line-tables-only:

[profile.release]
debug = "full"

For the upload workflow (CLI install, build-ID pairing, dynamic libraries), see Upload debug symbols.

C/C++

C and C++ binaries are profiled by the OpenTelemetry eBPF profiler. Because they compile to Native machine code, you must upload debug symbols to Coralogix to see fully symbolized stack traces. Symbol files can be uploaded using the Coralogix symbol upload tool.

Zig

Zig binaries are profiled by the OpenTelemetry eBPF profiler. As a Natively compiled language, Zig requires debug symbols to be uploaded to Coralogix for fully symbolized stack traces. Symbol files can be uploaded using the Coralogix symbol upload tool.

JVM

Symbols for JVM languages (for example, Java, Scala, Kotlin) are supported out of the box without any additional configuration or setup.

JVM frames

Most JVM services start with a few unsymbolized frames like the example below. These frames belong to the JVM runtime itself and typically are not useful for profiling analysis.

JVM frame

Node.js

Node.js is fully supported on AMD64 across the entire version range above. On ARM64, support starts at Node.js 16.0.0. Symbols for Node.js are supported out of the box without any additional configuration or setup.

Node.js frames

Most Node.js services start with a few unsymbolized frames like the example below. These frames belong to the Node.js runtime itself and typically are not useful for profiling analysis.

Node.js frames

Known limitations

Profiling async functions

Like most Node.js CPU profilers, the OpenTelemetry eBPF profiler has limitations when profiling asynchronous functions. Reconstructing asynchronous call stacks requires accessing the Node.js (V8) heap, which introduces significant overhead. As a result, asynchronous call stacks are currently recorded separately, without reconstructing the full end-to-end call stack.

Troubleshooting

Named anonymous functions appear as <anonymous> with ESBuild

When using ESBuild to bundle your Node.js application, named anonymous functions might appear as <anonymous> in the profiling data instead of their actual names. This happens when using the keepNames option in ESBuild, which doesn't correctly reset the function names of anonymous (arrow) functions after minification.

Python

Python applications work out of the box with the OpenTelemetry eBPF profiler.

Python frames

Most Python services start with a few unsymbolized frames like the example below. These frames belong to the Python runtime itself and typically are not useful for profiling analysis.

Python frames

Next steps

Learn how to visualize and analyze CPU usage across your services in Monitor CPU consumption.