Skip to main content

A diagnostic toolkit for on-the-fly analysis of remote python processes.

Project description

PyFlightProfiler

OS Linux PyPI - Python Version PyPI - Implementation PyPI PyPI - Downloads

A diagnostic toolbox for Python applications that provides non-intrusive, low-overhead capabilities for online analysis.

Background

The growing demand for AI inference and agent-based applications has led to an increased deployment of Python systems in production environments. Inference services frequently encounter performance bottlenecks, while agent-based services face challenges in troubleshooting complex business logic. Production issues are often difficult to reproduce and debug, and traditional logging-based diagnostics typically result in prolonged investigation cycles with limited efficiency. PyFlightProfiler is designed to help address some of these common pain points.

What is PyFlightProfiler

PyFlightProfiler is a toolbox that lets you inspect the status of a running Python process. It allows developers to observe method execution, trace call paths, monitor GIL status, and more, without restarting the application.

What PyFlightProfiler can do

PyFlightProfiler has the following amazing features:

  • 🛫 Non-intrusive Online Diagnostics: Analyze running Python processes without restarting or modifying the application code.
  • 🎯 Method Execution Observation: Watch method inputs, outputs, and execution time with customizable expressions.
  • 🔍 Call Path Tracing: Trace internal method calls and their execution times to identify performance bottlenecks.
  • 🧵 Thread Stack Analysis: Display Python stack frames for all threads, including native stack information.
  • 🌐 Cross-time Method Observation: Record method calls over time and replay them for detailed analysis.
  • 🌍 Global Variable Inspection: View module global variables and class static variables.
  • 🧮 Class Instance Management: Get and manipulate live class instances in the process.
  • 🔥 Performance Profiling: Generate flame graphs for performance hotspot analysis.
  • 🐚 Interactive Console: Execute custom scripts within the target process.
  • 📦 Memory Analysis: Analyze memory usage, including memory diffs and object summaries.
  • 🧠 PyTorch Profiling: Profile PyTorch function execution times and GPU memory allocation behavior.
  • 🔒 GIL Status Monitoring: Observe the Global Interpreter Lock (GIL) status, including lock acquisition and release times.

What platforms are supported

PyFlightProfiler currently supports Linux x86_64 (glibc ≥ 2.17) and macOS (arm64), and requires Python 3.8 or later.

Installation

To install PyFlightProfiler, simply use pip:

pip3 install flight_profiler

Documentation

You can find the full documentation here.

Usage

For a Python process to be profiled, PyFlightProfiler must reside in the same Python environment. Only then can the process correctly reference the flight_profiler library once attached. PyFlightProfiler follows a two-stage attach-then-profile workflow. After attaching to a target process, you can use various subcommands to inspect and debug your Python program in real time.

Attaching to a Running Process

The first step for attachment is to use the flight_profiler command followed by the PID of the process you want to analyze.

usage: flight_profiler <pid>

description: A realtime analysis tool used for profiling python program!

positional arguments:
  pid         python process id to analyze.

optional arguments:
  -h, --help  show this help message and exit
  --cmd CMD   One-time profile, primarily used for unit testing.
  --debug     enable debug logging for attachment.

For CPython 3.14 and above, we utilize sys.remote_exec for remote code execution, a feature introduced by PEP-0768. This approach is therefore largely safe.

In CPython 3.13 and earlier versions, the implementation of remote code execution differs between macOS and Linux. On macOS, we utilize LLDB to inject agent logic into the target process. On Linux, however, code is dispatched to the remote process via ptrace. This approach requires that the Linux distribution supports ptrace and that the SYS_PTRACE capability is enabled in Docker environments.

[!Note]

It is important to note that this procedure involves certain risks, and its safety cannot be fully guaranteed, as it is influenced by CPython's internal mechanisms. For example, if the Global Interpreter Lock (GIL) is held indefinitely by another thread, the injected code may never execute. We have thoroughly tested PyFlightProfiler with a variety of applications on CentOS systems using libc versions 2.17 to 2.32. We welcome further user feedback to help us reduce attachment failures and improve reliability.

As a best practice, PyFlightProfiler should be comprehensively validated in a non-production environment to ensure stability and performance before being trusted with live services.

Watching Method Input and Output

For method location, PyFlightProfiler uses the format module [class] method, where module corresponds to the import path as it appears in the program. For instance, __main__ for top-level scripts executed directly, pkg_a.pkg_b when the code uses from pkg_a import pkg_b, and pkg_b when using import pkg_b. This simple module resolution scheme suffices for most use cases. If you know the file path of the target code but are unsure of its runtime module name, you can use the module subcommand (described below) to verify whether the module as well as the target method is loaded in the process. The [class] component is optional and should only be included when the method belongs to a class. It is omitted for standalone (non-class) functions.

In addition, PyFlightProfiler provides mechanisms for method filtering (-f) and custom extraction of key properties (--expr). You can specify a Python expression that operates within a context where the effective function signature is (target, return_obj, cost, *args, **kwargs), and the expression you provide serves as the body of a return statement. Here, target refers to the class instance if the method is bound (or None for standalone functions), return_obj is the value returned by the method, cost represents the execution time in milliseconds, and args and kwargs correspond to the positional and keyword arguments passed to the method, respectively. For concrete usage patterns, refer to the examples provided in the watch command below.

USAGE:                                                                                                                                                                                               12:01:21 [3/52]
  watch module [class] method [--expr <value>] [-nm <value] [-e] [-r] [-v] [-n <value>] [-x <value>] [-f <value>]

SUMMARY:
  Display the input/output args, return object and cost time of method invocation.

EXAMPLES:
  watch __main__ func -x 2
  watch __main__ func -f args[0]["query"]=='hello'
  watch __main__ func -f return_obj['success']==True
  watch __main__ func --expr return_obj,args -f cost>10
  watch __main__ classA func

OPTIONS:
<module>                           the module that method locates.
<class>                            the class name if method belongs to class.
<method>                           target method name.
--expr <value>                     contents you want to watch,  write python bool statement like input func args is (target, return_obj, cost, *args, **kwargs). default is args,kwargs .
-x, --expand                       object represent tree expand level(default 1), -1 means infinity.
-e, --exception                    short for --exception, only record when method throws exception.
-nm, --nested-method               watch nested method with depth restrict to 1.
-r, --raw                          display raw output without json format.
-v, --verbose                      display all the nested items in target list or dict.
-n, --limits <value>               limit the the upperbound of display watched result, default is 10.
-f, --filter <value>               filter method params&args&return_obj&cost&target, expressions according to --expreg: args[0]=='hello'.

Tracing Method Call Paths

The trace subcommand is used to inspect method execution time and its inner method call chain. It uses the same method location mechanism as described in the watch subcommand. The -i, --interval option sets the threshold (in milliseconds) for displaying inner method calls—only invocations with a cost greater than ${interval} will be shown, with a default value of 0.1 ms. A higher interval reduces the profiler’s impact on the original program. In practice, we observe an average runtime overhead of 5%–20%, depending on the chosen interval.

USAGE:
  trace module [class] method [-i <value>] [-nm <value>] [-et <value>] [-d <value>] [-n <value>] [-f <value>]

SUMMARY:
  Trace the execution time of specified method invocation.

EXAMPLES:
  trace __main__ func
  trace __main__ func --interval 1
  trace __main__ func -et 30 -i 1
  trace __main__ classA func

OPTIONS:
<module>                           the module that method locates.
<class>                            the class name if method belongs to class.
<method>                           target method name.
-i, --interval <value>             display function invocation cost more than ${value} milliseconds, default is 0.1ms.
-et, --entrance_time <value>       filter function execute cost more than ${value} milliseconds, but on entrance filter.
-d, --depth <value>                display the method call stack, limited to the specified depth ${value}. When a depth is specified, the ${interval} parameter is ignored and its value is constrained to 0.
-nm, --nested-method               trace nested method with depth restrict to 1.
-f, --filter_expr <value>          filter method params expressions, only support filter target&args, write python bool statement like input func args is (target, *args, **kwargs), eg: args[0]=='hello'.
-n, --limits <value>               threshold of trace method times, default is 10.

Locating module with filepath

Use the module subcommand to determine the correct module name for a given source file path. This is helpful when you know the file location but are unsure how it was imported.

USAGE:
  module filepath

EXAMPLES:
  module /home/admin/application/compute.py

OPTIONS:
<filepath>          Absolute or relative path to the Python source file.

Other Subcommands

PyFlightProfiler includes several additional tools for advanced diagnostics:

  • help - Display help for any command.
  • console - Launch an interactive Python console inside the target process.
  • stack - Analyze Python thread stacks (based on pystack).
  • tt, timetunnel - Observe method behavior across time (historical execution context).
  • reload - Reload method implementation from the latest source file.
  • getglobal - Inspect global variables in the target process.
  • vmtool - Inspect live class instances and their attributes.
  • perf - Sample CPU hotspots and generate flame graphs (based on py-spy).
  • torch - Profile PyTorch operations using the pre-installed PyTorch profiler (based on pytorch).
  • mem - Report memory usage statistics (based on pympler).
  • gilstat - Monitor Python’s Global Interpreter Lock (GIL) contention and performance impact.

Acknowledgements

PyFlightProfiler is inspired by the design of Arthas. The project is developed by Alibaba Group. The code is distributed under the Apache License (Version 2.0). This product contains various third-party components under other open-source licenses. See the NOTICE file for more information.

The implementation of the trace subcommand is conceptually inspired by pyinstrument. The process attachment mechanism on Linux is inspired by linux-inject. Python bytecode transform mechanism is inspired by Python on-the-fly function update. The following open-source libraries and tools are used in PyFlightProfiler, either in their close-to-original form or as an inspiration:

  • pystack - Used for Python stack analysis on Linux
  • frida - Used for GIL lock analysis
  • pympler - Used for memory usage analysis
  • py-spy - Used for CPU hotspot function analysis
  • pytorch - Used for sampling torch timeline via torch.profiler

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

flight_profiler-1.0.5-cp314-cp314-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp314-cp314-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

flight_profiler-1.0.5-cp313-cp313-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp313-cp313-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

flight_profiler-1.0.5-cp312-cp312-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp312-cp312-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

flight_profiler-1.0.5-cp311-cp311-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp311-cp311-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

flight_profiler-1.0.5-cp310-cp310-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp310-cp310-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

flight_profiler-1.0.5-cp39-cp39-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp39-cp39-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

flight_profiler-1.0.5-cp38-cp38-manylinux_2_17_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.5-cp38-cp38-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.8macOS 15.0+ ARM64

File details

Details for the file flight_profiler-1.0.5-cp314-cp314-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp314-cp314-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 9d8243aacd8984521663c3c301bc5700e7e371834b4181a615704e2de48f3616
MD5 b0e16edbd85bc58422bcf0d5f71aa110
BLAKE2b-256 5593674aab2dbfd105ceaa86d72f160753caa1c7c869c3d9b25669ce8b02ae77

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6270bd23e95d47292beaeac3d5de925d0a32191b3bb10da866ebcf55a381956d
MD5 a83c06e4418ff82d9c614c4005d1e58c
BLAKE2b-256 58b52a88fa601d17d3c06450c92ccea9cdb031e1b9c68ff7461e49990fc29812

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp313-cp313-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp313-cp313-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 fda6ae5062e5478e706b5256ba0e88cff306bf345c790f6cc8fd60cb0020d760
MD5 881ade58f82309f1edc43af5d5105605
BLAKE2b-256 615fc875218853082bc896cd7774de65f81705165941a58181eedaf6e4761642

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6940895624ff183a734e17cdf3e386a80e41483384ed979d5d1dda80aa093298
MD5 b08801aed99ffdfd283a17147bb83b64
BLAKE2b-256 2d7911c74adc8a1cd6ce7e2a1b5a60dd2d7d6ea9548a60dc81f970c5e6deb7bd

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp312-cp312-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp312-cp312-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c2308a2c16e033810dea48260073f0ebfd736303dfdaa38f058bf49beb10e965
MD5 d8509b33b2a4fb1381e459a40103bd94
BLAKE2b-256 b1a96ee8d8967fce7dc04f0d59debebd34e166a69af6328603a0f1fae5c4d1e2

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 83efdbe6e1c612bf20845b1f6d58f7d307a6f6f9e5099fb3e83354295049cd55
MD5 dae60bbc2e8ec6c62178f75cc887d043
BLAKE2b-256 2c5ae62c6c8d3c456c4c08dade6ac33c4f69731c3be8895b47d469f00195da11

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp311-cp311-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp311-cp311-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 7280733c0dc962c1ae14035d1e5ca27c360c09ea361fafc0394961225bdd37de
MD5 30f868ef33f5c8a1bef68d683692ba6e
BLAKE2b-256 99cd1da4db34c33b7760b6cf38179f372cf5d0668c5ebcc5d79bcb3e219c8029

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3ceaad463b654c3c5d84a8fc12b4f1c6a0a649f7e7d5d38b7e84637604b7661e
MD5 5f8f8dfb0187ee01adc02e53b9f534a5
BLAKE2b-256 3897775824f7f1681e2f45434321d484907b44b9417e27e8d1ae47f6d1ac5ec2

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp310-cp310-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp310-cp310-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b358e1843978503e611d0725ebb6f248e102e7b3199ac965bf99690073e806e4
MD5 3ee44653ff7b3a27553e24b6e7a12fba
BLAKE2b-256 01948038eefd47f570a210a7b9c0b74b24daf550d219d677bcf81e28c211c682

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ade01e7274b4221352958b86ff000ad5e07b5794930dbb2e53df5980b39afca1
MD5 0873695c3248b8bb6b6585451b61dd29
BLAKE2b-256 a8547f1a21474614db3f359635cb2413fe3ce1935aca9bce77ed636d9975136d

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp39-cp39-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp39-cp39-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d6e5f3037010cbd6f8c8dac1e239bd3df2b9efd21ec57abc4aae430e6666e108
MD5 ec9f8bc82666a6fe1118b447f4fbaeb8
BLAKE2b-256 85516443a0e125f8b6c081d4e699a47aeda1f79616b6102029f110f78e6cfa3e

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp39-cp39-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 38407d797a2262da426330c824a70357a39bddbb336eea050829e43310ab8b26
MD5 9cd82d1fbb292c1c5bec4eb259230742
BLAKE2b-256 40dafb226eada791fe1426be4fde436816cbf8650858444e5eea8f9ba291c869

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp38-cp38-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp38-cp38-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 794d4de489ce7efb68545f0e615b13b69658f4c44d90343918b74a3f34239fc4
MD5 eb9a6973ff9a38e1e935c3e62d1996d9
BLAKE2b-256 49b1d2f21f61a648805a041df448119b4dd759fa80412eeb0f85b4a3e8f65315

See more details on using hashes here.

File details

Details for the file flight_profiler-1.0.5-cp38-cp38-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.5-cp38-cp38-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 cf950cd19c6054019f524f48946eda3827077f28c4a911f4da6c158f9f1c89c9
MD5 3a9f17e746e34796f7a45031c4cfaf5c
BLAKE2b-256 c2a61296252705e8cac39a1b755569557d90ba7816f7b9fddb7bf0b8bb33c7a7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page