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.3-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.3-cp314-cp314-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

flight_profiler-1.0.3-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.3-cp313-cp313-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

flight_profiler-1.0.3-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.3-cp312-cp312-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

flight_profiler-1.0.3-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.3-cp311-cp311-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

flight_profiler-1.0.3-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.3-cp310-cp310-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

flight_profiler-1.0.3-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.3-cp39-cp39-macosx_15_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

flight_profiler-1.0.3-cp38-cp38-manylinux_2_17_x86_64.whl (6.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

flight_profiler-1.0.3-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.3-cp314-cp314-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp314-cp314-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 9e219afc74e324d7623b5e970fa169040c07e4d9611cd63e445f711ae8c4077c
MD5 7a5b340242752fab997ed6456237e98b
BLAKE2b-256 a0b497f8e5e9e59021e1fa4845e88d7aac9cd388a414dd8e5153daf01aea9f55

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 46c757846cd94965228ced08d7dd39ba49b1726bc580c50e53a40699b1010990
MD5 9b0f8feb15ea6c726bd7f8831fc1fb51
BLAKE2b-256 371ee1ab5ba06bad4a7bc592489d1f63c1507dc7b9e09087dd5b156bfb4bcfa8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp313-cp313-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 2912354c3c30168be03eccc1a0123304f111044f4f1fb6a2e8707a06c9e0dc09
MD5 e9ebf5c438a0552c6e963c69a1f52d51
BLAKE2b-256 2c4f5e06682f80fef7805714d3807d8ef5d5fa506939dbf91124e8f1163f653f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c03f16c30ff5dddbf3e2e7152e65528435456779c518382d96124a81b78d5651
MD5 a0c8331b824fb30bd4bd65035b56fd58
BLAKE2b-256 e96ba2ba07ff9cbdc069db6a12a117190f76b41b150e15868623889446e7cee7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp312-cp312-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 635fb1c41f2f0459c9ab0646e02d71f12c32335754fdab3e4484dbd9c1449028
MD5 a8953a916a71dd332f591da4c5e5a5f3
BLAKE2b-256 94e459bddd40aa34e9128b1e1cad8f9e087250ffa5eeef0629759b5e267928d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ceae943d8daa391c8a267ff6903a61cdf9ab280f2933f3b113ed7fd0523a9eaa
MD5 3d679e46d1bfcae07ff208326dc97942
BLAKE2b-256 fd996d2104ca9096ac7a68c0f1a7ecaeec043ad76cf9b0b0ec94b4986fb78288

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp311-cp311-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 6c3e44102f87d48e8877c76dcd3ac6eee0c12a823a0a741efd74dba78818a27f
MD5 7fbe57e12d26fda599657431ee8891c6
BLAKE2b-256 43f4308600073d3ae760ba504db9293a61b5f77fb8f0ed2f8c1d1b96ba2b8422

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 b4967a205f62df52e834780b93d5fa11f9dd78db98d78cbdf069ed81874461d9
MD5 a09250f96139bacf31f6c3ea219a291e
BLAKE2b-256 04e3867223ece8706e6377528602a63ac22f95e6483521767def70b8e0498b16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp310-cp310-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d08f8cf899c817242024a17e8f896e6c8d113c2cbe22061cc170dcd12ee8ff25
MD5 f1653069c13ccb70bb600d6cc6c34fe7
BLAKE2b-256 57c84cbe1783b9afd51c935b2249f1a54ea10b9805c56748a27131abc53351d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 57d4058ba6106e711b92c817f8d658f19137b74343f3d63d1a9134e381d2d5de
MD5 84f80cf165c6b9f710c4f81f251fe1ca
BLAKE2b-256 8fdbef54fc5413df30297b3655716d26d71a6cc0224cc6c61d738de38a2b60c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp39-cp39-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 9533e69fa38064dc6fa36b4b7c109d5d0933f7ea1877edd95e01a2d382a6bb3c
MD5 d99036f4620192e3bcdfdc6b053b67fa
BLAKE2b-256 50db32a7cd60d0d9f9d7b032641a73af8e37a3bf697a27b6f0c97b79d9de1efd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 cddfdd6cd69f5a8239d27dacee2cdbdcfe147815eba069b3d080a5a3558e8a35
MD5 d7579839d0bee08651a4df4683f8852f
BLAKE2b-256 8434f85f54b301bf5efcaf3a732ccf8d264a594b1b7a9e58c1114f3f1e928871

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp38-cp38-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 1ca745b550517068614419567a1a24e56f3abdb541eee7ad5293ae1b8a749028
MD5 c0d5031af06cb819d198f8870f2ed17f
BLAKE2b-256 84cab77a51f6743f40f4ff7ba6fa35a309856fab42325d45da1b87c20dcfd918

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flight_profiler-1.0.3-cp38-cp38-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 86c79dfa3f47e8b8493744eef07249bd69301e9a477e48485a200a5a5040f51d
MD5 17266a88e564ce79d210e8cfa83b2cf6
BLAKE2b-256 4322e90056a3b3ecbf1794a1fdf0b549e7e8f35b1f7f297c1f1e623f958c7eb5

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