A slow application does not always need a restart, an emergency update or hours of searching through server logs. Sometimes the problem comes from a single function consuming too much processor time, an unexpected increase in memory allocations or a thread waiting for another operation to finish. OpenTelemetry Profiles offers a way to investigate these problems while applications continue running. By collecting samples of what software is doing, profiling helps developers identify the code responsible for excessive resource consumption. In 2026, this capability is becoming part of the wider OpenTelemetry approach to monitoring software. However, the technology is still evolving, and understanding both its benefits and current limitations is essential before introducing it into a production environment.
Most organisations already monitor application performance through metrics, logs and distributed traces. Metrics indicate that something has changed, such as a rise in CPU utilisation or an increase in response times. Logs record individual events and errors, while traces follow requests as they travel between services. These tools provide valuable information, but they do not always reveal which functions inside an application are responsible for a slowdown. A trace might show that a particular service took two seconds to process a request without explaining why the service needed that time. OpenTelemetry Profiles addresses this missing detail by collecting information about the code executing inside running applications.
Profiling works by observing an application repeatedly and recording samples of its activity. These samples can show which functions were executing when processor time was consumed, where memory was allocated or which operations were waiting for resources. Rather than relying on a single snapshot, engineers can examine patterns collected over a period of time. If one function appears repeatedly in CPU samples, it may deserve closer investigation. The results can also be presented as flame graphs, which help visualise how resource consumption is distributed across different parts of the code. This makes it easier to narrow down a problem without manually examining thousands of lines of application logic.
OpenTelemetry reached an important milestone on 26 March 2026, when its Profiles signal entered public Alpha. The release introduced a more developed profiling data format, improvements to the Linux eBPF profiling agent and integration with the OpenTelemetry Collector. It also strengthened compatibility with existing profiling formats, including pprof. These changes make it easier to experiment with profiling alongside established monitoring tools. Nevertheless, Alpha does not mean the technology is ready for every operational environment. The OpenTelemetry project explicitly advises against relying on this release for critical production workloads. Organisations should therefore distinguish between the mature practice of continuous profiling and the newer OpenTelemetry Profiles implementation, which remains under development.
Traditional performance investigations sometimes involve reproducing a problem in a testing environment, enabling additional diagnostics or restarting a service with different settings. These approaches can be disruptive, particularly when an issue appears only under genuine user traffic. Continuous profiling offers another option. A suitable profiler observes application activity while the service remains available, collecting small samples rather than recording every operation. This approach can reduce the need for disruptive investigations and provide information about problems that are difficult to reproduce elsewhere. It does not guarantee zero performance impact, but a carefully configured sampling profiler can operate with relatively low overhead.
One important development is the use of extended Berkeley Packet Filter, commonly known as eBPF, on Linux systems. This technology allows appropriately configured tools to observe certain application and operating-system activities without requiring developers to insert diagnostic instructions throughout their source code. The OpenTelemetry eBPF profiling agent can collect execution samples from supported applications and language runtimes. For example, an engineer investigating a busy service may be able to identify functions consuming processor time without rebuilding the application. However, profiling accuracy depends on factors such as operating-system support, permissions, the runtime involved and the availability of information needed to identify functions correctly.
Consider an online booking service that becomes noticeably slower during busy periods. Its monitoring dashboard shows increasing CPU usage, but the application continues processing requests without reporting errors. Continuous profiling might reveal that a function responsible for repeatedly formatting availability information consumes an unusually large share of processor time. Developers can then examine that function, investigate unnecessary repeated calculations and test a more efficient implementation. The service does not necessarily need to be stopped to gather the original evidence. This example illustrates the practical value of profiling: it helps teams move from a general performance warning to a specific area of code that can be investigated and improved.
Performance problems can have very different causes, even when users experience the same symptom. A slow webpage might result from excessive processor activity, inefficient memory management, a database operation or threads waiting for shared resources. OpenTelemetry Profiles supports a data model designed to represent several kinds of profiling information, although the available measurements depend on the profiler and programming language. On-CPU profiles help identify code consuming processor time, while off-CPU profiles can provide information about operations that spend time waiting. Heap profiles describe memory that remains allocated, whereas allocation profiles help identify where memory is being created. Distinguishing between these measurements prevents engineers from treating every slowdown as a CPU problem.
CPU profiling is particularly useful when an application experiences high processor utilisation or struggles to complete computational work efficiently. Imagine a reporting service that processes large amounts of data every morning. Server metrics reveal that CPU usage remains elevated throughout the reporting period, but they cannot identify which calculation is responsible. A CPU profile may show that most sampled execution time is concentrated in a data transformation function. Engineers can then investigate whether the function processes the same records repeatedly, performs unnecessary conversions or uses an inefficient algorithm. However, sampling results should be interpreted carefully: a frequently observed function may be performing legitimate work, and its prominence does not automatically mean that the code contains a defect.
Memory profiling answers a different set of questions. An application might respond normally after deployment but gradually consume more memory as it continues running. This behaviour could result from cached objects that remain accessible longer than intended, increasing workloads or unnecessary allocations. Heap profiling can help identify objects and code paths associated with retained memory, while allocation profiling can reveal functions creating large numbers of temporary objects. The distinction matters because high allocation activity does not necessarily indicate a memory leak. Some applications create and release objects frequently without retaining excessive memory. Profiling provides evidence for investigating these patterns, but engineers must interpret the results alongside garbage collection behaviour, traffic levels and other measurements.
The broader purpose of OpenTelemetry Profiles is to connect code-level performance information with the signals organisations already collect. Suppose a monitoring system detects a sudden increase in application response times. Metrics establish when the change occurred, and distributed traces identify which service or operation took longer than expected. Profiling can then help determine whether the delay coincided with expensive calculations, memory activity or another observable code-level problem. This combination can considerably narrow the investigation. Instead of treating processor metrics, application traces and diagnostic profiles as unrelated information, engineers can analyse them in the context of the same service and time period.
OpenTelemetry uses resource information, such as service identity and other configured attributes, to help associate profiling results with related monitoring data. Its Profiles data model also supports references to trace and span identifiers, making more precise connections possible when the collection tools provide the necessary information. This is particularly useful in applications where one user request passes through several services. For example, a slow payment request might involve an API service, a transaction processor and a database. Distributed tracing can identify the operation that took the longest, while profiling can provide additional information about the relevant service. Importantly, automatic links between individual requests and profiling samples are not guaranteed in every implementation, especially while the signal remains in Alpha.
Engineers also need to distinguish between code that actively consumes processor time and code that spends time waiting. A service may have low CPU usage while users experience significant delays because requests are waiting for database responses, network activity or access to a shared lock. On-CPU profiling alone cannot fully explain such behaviour. Off-CPU profiling, where supported, may provide evidence about waiting activity, while traces can help expose slow external operations. Logs may add useful information about timeouts, connection failures or application errors. Examining these signals together reduces the risk of optimising code that is not responsible for the actual delay. It also helps teams recognise when a problem originates outside the application itself.

Introducing OpenTelemetry Profiles begins with understanding the existing environment rather than installing a profiler immediately. Teams should identify the applications they want to investigate, the operating systems and language runtimes they use, and the performance questions they need to answer. For Linux-based environments, the OpenTelemetry eBPF profiler offers a way to collect profiling information without adding application-level instrumentation in supported configurations. The public Alpha release also improved support for several runtimes, including aspects of Go, Node.js, Ruby, Erlang and Elixir, and newer .NET versions. This does not mean every profiling feature works equally well across those languages. Compatibility, permissions and profiler capabilities should be checked against the current project documentation before deployment.
The OpenTelemetry Collector provides a route for receiving, processing and exporting profiling information. Support for Profiles became available in relevant Collector components during the Alpha development period, with the OpenTelemetry project recommending Collector version 0.148.0 or newer for early testing. The Collector can handle profiling data alongside other telemetry signals, and certain configurations can enrich profiles with Kubernetes information or apply processing rules. However, organisations must use a Collector distribution containing the required profiling components and configure a compatible destination. An existing tracing or metrics setup does not automatically guarantee that profiles can be received, stored and displayed. Backend support must be confirmed separately, particularly because the Profiles protocol is still developing.
A sensible initial deployment focuses on a non-critical service or a controlled testing environment that resembles real workloads. Engineers can establish baseline measurements before enabling profiling, then compare resource usage and response times with the profiler active. They should also monitor the amount of data being collected, the additional processor and memory consumption, and any effect on the application’s stability. Starting with a limited number of services makes it easier to assess compatibility and operational cost. Because continuous profiling collects detailed information about code execution, access controls and data retention policies also deserve attention. Function names, stack information and associated attributes may expose implementation details that should not be available to unauthorised users.
Once profiling data is available, the most useful approach is to begin with a clearly defined performance symptom. If users report slow responses after a new release, engineers can compare profiles from before and after the change, provided comparable data is available. They might discover that a newly introduced function now accounts for a much greater proportion of sampled CPU activity. If memory consumption rises steadily, the investigation can focus on allocation patterns and retained objects instead. Changes should then be tested against representative workloads to confirm that they improve the original symptom. A profile helps identify promising areas for investigation, but it does not replace benchmarking, application testing or an understanding of how the software is intended to behave.
Several limitations remain important in 2026. Profiling is based on observations rather than a complete recording of every operation, so brief or infrequent events may be missed. Different profilers offer different levels of visibility, and some cannot identify all functions accurately without suitable debugging information or runtime support. Sampling frequency must balance the detail collected against additional overhead. Language-specific behaviour, container permissions and operating-system restrictions can also affect results. More fundamentally, OpenTelemetry Profiles itself remains an Alpha specification, and individual components may change as development continues. Teams should avoid assuming that a successful experiment proves the entire collection and storage arrangement is suitable for business-critical workloads.
OpenTelemetry Profiles represents a significant step towards understanding application performance without routinely interrupting running services. Its value lies in connecting familiar monitoring information with evidence about what application code is doing. For organisations already using OpenTelemetry, the emerging profiling signal offers an opportunity to assess how code-level measurements could improve incident investigations and performance testing. The practical priority in 2026 is to evaluate the available tools carefully, confirm compatibility and measure their impact under realistic conditions. As the specification and its integrations mature, this work can help teams build a more reliable process for finding inefficient code, investigating unexpected resource consumption and improving application responsiveness without unnecessary service disruption.