:mod:`!sys.monitoring` --- Execution event monitoring
=====================================================

.. module:: sys.monitoring
   :synopsis: Access and control event monitoring

.. versionadded:: 3.12

-----------------

.. note::

    :mod:`!sys.monitoring` is a namespace within the :mod:`sys` module,
    not an independent module, so there is no need to
    ``import sys.monitoring``, simply ``import sys`` and then use
    ``sys.monitoring``.


This namespace provides access to the functions and constants necessary to
activate and control event monitoring.

As programs execute, events occur that might be of interest to tools that
monitor execution. The :mod:`!sys.monitoring` namespace provides means to
receive callbacks when events of interest occur.

The monitoring API consists of three components:

* `Tool identifiers`_
* `Events`_
* :ref:`Callbacks <callbacks>`

Tool identifiers
----------------

A tool identifier is an integer and the associated name.
Tool identifiers are used to discourage tools from interfering with each
other and to allow multiple tools to operate at the same time.
Currently tools are completely independent and cannot be used to
monitor each other. This restriction may be lifted in the future.

Before registering or activating events, a tool should choose an identifier.
Identifiers are integers in the range 0 to 5 inclusive.

Registering and using tools
'''''''''''''''''''''''''''

.. function:: use_tool_id(tool_id: int, name: str, /) -> None

   Must be called before *tool_id* can be used.
   *tool_id* must be in the range 0 to 5 inclusive.
   Raises a :exc:`ValueError` if *tool_id* is in use.

.. function:: clear_tool_id(tool_id: int, /) -> None

   Unregister all events and callback functions associated with *tool_id*.

.. function:: free_tool_id(tool_id: int, /) -> None

   Should be called once a tool no longer requires *tool_id*.
   Will call :func:`clear_tool_id` before releasing *tool_id*.

.. function:: get_tool(tool_id: int, /) -> str | None

   Returns the name of the tool if *tool_id* is in use,
   otherwise it returns ``None``.
   *tool_id* must be in the range 0 to 5 inclusive.

All IDs are treated the same by the VM with regard to events, but the
following IDs are pre-defined to make co-operation of tools easier::

  sys.monitoring.DEBUGGER_ID = 0
  sys.monitoring.COVERAGE_ID = 1
  sys.monitoring.PROFILER_ID = 2
  sys.monitoring.OPTIMIZER_ID = 5


Events
------

The following events are supported:

.. monitoring-event:: BRANCH_LEFT

   A conditional branch goes left.

   It is up to the tool to determine how to present "left" and "right" branches.
   There is no guarantee which branch is "left" and which is "right", except
   that it will be consistent for the duration of the program.

.. monitoring-event:: BRANCH_RIGHT

   A conditional branch goes right.

.. monitoring-event:: CALL

   A call in Python code (event occurs before the call).

.. monitoring-event:: C_RAISE

   An exception raised from any callable, except for Python functions (event occurs after the exit).

.. monitoring-event:: C_RETURN

   Return from any callable, except for Python functions (event occurs after the return).

.. monitoring-event:: EXCEPTION_HANDLED

   An exception is handled.

.. monitoring-event:: INSTRUCTION

   A VM instruction is about to be executed.

.. monitoring-event:: JUMP

   An unconditional jump in the control flow graph is made.

.. monitoring-event:: LINE

   An instruction is about to be executed that has a different line number from the preceding instruction.

.. monitoring-event:: PY_RESUME

   Resumption of a Python function (for generator and coroutine functions), except for ``throw()`` calls.

.. monitoring-event:: PY_RETURN

   Return from a Python function (occurs immediately before the return, the callee's frame will be on the stack).

.. monitoring-event:: PY_START

   Start of a Python function (occurs immediately after the call, the callee's frame will be on the stack)

.. monitoring-event:: PY_THROW

   A Python function is resumed by a ``throw()`` call.

.. monitoring-event:: PY_UNWIND

   Exit from a Python function during exception unwinding. This includes exceptions raised directly within the
   function and that are allowed to continue to propagate.

.. monitoring-event:: PY_YIELD

   Yield from a Python function (occurs immediately before the yield, the callee's frame will be on the stack).

.. monitoring-event:: RAISE

   An exception is raised, except those that cause a :monitoring-event:`STOP_ITERATION` event.

.. monitoring-event:: RERAISE

   An exception is re-raised, for example at the end of a :keyword:`finally` block.

.. monitoring-event:: STOP_ITERATION

   An artificial :exc:`StopIteration` is raised; see `the STOP_ITERATION event`_.


More events may be added in the future.

These events are attributes of the :mod:`!sys.monitoring.events` namespace.
Each event is represented as a power-of-2 integer constant.
To define a set of events, simply bitwise OR the individual events together.
For example, to specify both :monitoring-event:`PY_RETURN` and :monitoring-event:`PY_START`
events, use the expression ``PY_RETURN | PY_START``.

.. monitoring-event:: NO_EVENTS

    An alias for ``0`` so users can do explicit comparisons like::

      if get_events(DEBUGGER_ID) == NO_EVENTS:
          ...

    Setting this event deactivates all events.

.. _monitoring-event-local:

Local events
''''''''''''

Local events are associated with normal execution of the program and happen
at clearly defined locations. All local events can be disabled.
The local events are:

* :monitoring-event:`PY_START`
* :monitoring-event:`PY_RESUME`
* :monitoring-event:`PY_RETURN`
* :monitoring-event:`PY_YIELD`
* :monitoring-event:`CALL`
* :monitoring-event:`LINE`
* :monitoring-event:`INSTRUCTION`
* :monitoring-event:`JUMP`
* :monitoring-event:`BRANCH_LEFT`
* :monitoring-event:`BRANCH_RIGHT`
* :monitoring-event:`STOP_ITERATION`

Deprecated event
''''''''''''''''

* ``BRANCH``

The ``BRANCH`` event is deprecated in 3.14.
Using :monitoring-event:`BRANCH_LEFT` and :monitoring-event:`BRANCH_RIGHT`
events will give much better performance as they can be disabled
independently.

Ancillary events
''''''''''''''''

Ancillary events can be monitored like other events, but are controlled
by another event:

* :monitoring-event:`C_RAISE`
* :monitoring-event:`C_RETURN`

The :monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events
are controlled by the :monitoring-event:`CALL` event.
:monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events will only be
seen if the corresponding :monitoring-event:`CALL` event is being monitored.


.. _monitoring-event-global:

Other events
''''''''''''

Other events are not necessarily tied to a specific location in the
program and cannot be individually disabled via :data:`DISABLE`.

The other events that can be monitored are:

* :monitoring-event:`PY_THROW`
* :monitoring-event:`PY_UNWIND`
* :monitoring-event:`RAISE`
* :monitoring-event:`EXCEPTION_HANDLED`


The STOP_ITERATION event
''''''''''''''''''''''''

:pep:`PEP 380 <380#use-of-stopiteration-to-return-values>`
specifies that a :exc:`StopIteration` exception is raised when returning a value
from a generator or coroutine. However, this is a very inefficient way to
return a value, so some Python implementations, notably CPython 3.12+, do not
raise an exception unless it would be visible to other code.

To allow tools to monitor for real exceptions without slowing down generators
and coroutines, the :monitoring-event:`STOP_ITERATION` event is provided.
:monitoring-event:`STOP_ITERATION` can be locally disabled, unlike
:monitoring-event:`RAISE`.

Note that the :monitoring-event:`STOP_ITERATION` event and the
:monitoring-event:`RAISE` event for a :exc:`StopIteration` exception are
equivalent, and are treated as interchangeable when generating events.
Implementations will favor :monitoring-event:`STOP_ITERATION` for performance
reasons, but may generate a :monitoring-event:`RAISE` event with a
:exc:`StopIteration`.

Turning events on and off
-------------------------

In order to monitor an event, it must be turned on and a corresponding callback
must be registered. Events can be turned on or off by setting the events either
globally and/or for a particular code object. An event will trigger only once,
even if it is turned on both globally and locally.


Setting events globally
'''''''''''''''''''''''

Events can be controlled globally by modifying the set of events being monitored.

.. function:: get_events(tool_id: int, /) -> int

   Returns the ``int`` representing all the active events.

.. function:: set_events(tool_id: int, event_set: int, /) -> None

   Activates all events which are set in *event_set*.
   Raises a :exc:`ValueError` if *tool_id* is not in use.

No events are active by default.

Per code object events
''''''''''''''''''''''

Events can also be controlled on a per code object basis. The functions
defined below which accept a :class:`types.CodeType` should be prepared
to accept a look-alike object from functions which are not defined
in Python (see :ref:`c-api-monitoring`).

.. function:: get_local_events(tool_id: int, code: CodeType, /) -> int

   Returns all the :ref:`local events <monitoring-event-local>` for *code*

.. function:: set_local_events(tool_id: int, code: CodeType, event_set: int, /) -> None

   Activates all the :ref:`local events <monitoring-event-local>` for *code*
   which are set in *event_set*. Raises a :exc:`ValueError` if *tool_id* is not
   in use.


Disabling events
''''''''''''''''

.. data:: DISABLE

   A special value that can be returned from a callback function to disable
   events for the current code location.

:ref:`Local events <monitoring-event-local>` can be disabled for a specific code
location by returning :data:`sys.monitoring.DISABLE` from a callback function.
This does not change which events are set, or any other code locations for the
same event.

Disabling events for specific locations is very important for high
performance monitoring. For example, a program can be run under a
debugger with no overhead if the debugger disables all monitoring
except for a few breakpoints.

If :data:`DISABLE` is returned by a callback for a
:ref:`global event <monitoring-event-global>`, :exc:`ValueError` will be raised
by the interpreter in a non-specific location (that is, no traceback will be
provided).

.. function:: restart_events() -> None

   Enable all the events that were disabled by :data:`sys.monitoring.DISABLE`
   for all tools.


.. _callbacks:

Registering callback functions
------------------------------

.. function:: register_callback(tool_id: int, event: int, func: Callable | None, /) -> Callable | None

   Registers the callable *func* for the *event* with the given *tool_id*

   If another callback was registered for the given *tool_id* and *event*,
   it is unregistered and returned.
   Otherwise :func:`register_callback` returns ``None``.

   .. audit-event:: sys.monitoring.register_callback func sys.monitoring.register_callback

Functions can be unregistered by calling
``sys.monitoring.register_callback(tool_id, event, None)``.

Callback functions can be registered and unregistered at any time.

Callbacks are called only once regardless if the event is turned on both
globally and locally. As such, if an event could be turned on for both global
and local events by your code then the callback needs to be written to handle
either trigger.


Callback function arguments
'''''''''''''''''''''''''''

.. data:: MISSING

   A special value that is passed to a callback function to indicate
   that there are no arguments to the call.

When an active event occurs, the registered callback function is called.
Callback functions returning an object other than :data:`DISABLE` will have no effect.
Different events will provide the callback function with different arguments, as follows:

* :monitoring-event:`PY_START` and :monitoring-event:`PY_RESUME`::

    func(code: CodeType, instruction_offset: int) -> object

* :monitoring-event:`PY_RETURN` and :monitoring-event:`PY_YIELD`::

    func(code: CodeType, instruction_offset: int, retval: object) -> object

* :monitoring-event:`CALL`, :monitoring-event:`C_RAISE` and :monitoring-event:`C_RETURN`
  (*arg0* can be :data:`MISSING` specifically)::

    func(code: CodeType, instruction_offset: int, callable: object, arg0: object) -> object

  *code* represents the code object where the call is being made, while
  *callable* is the object that is about to be called (and thus
  triggered the event).
  If there are no arguments, *arg0* is set to :data:`sys.monitoring.MISSING`.

  For instance methods, *callable* will be the function object as found on the
  class with *arg0* set to the instance (i.e. the ``self`` argument to the
  method).

* :monitoring-event:`RAISE`, :monitoring-event:`RERAISE`, :monitoring-event:`EXCEPTION_HANDLED`,
  :monitoring-event:`PY_UNWIND`, :monitoring-event:`PY_THROW` and :monitoring-event:`STOP_ITERATION`::

    func(code: CodeType, instruction_offset: int, exception: BaseException) -> object

* :monitoring-event:`LINE`::

    func(code: CodeType, line_number: int) -> object

* :monitoring-event:`BRANCH_LEFT`, :monitoring-event:`BRANCH_RIGHT` and :monitoring-event:`JUMP`::

    func(code: CodeType, instruction_offset: int, destination_offset: int) -> object

  Note that the *destination_offset* is where the code will next execute.

* :monitoring-event:`INSTRUCTION`::

    func(code: CodeType, instruction_offset: int) -> object
