macOS provides the
OSSignposter
API
for measuring the duration of tasks in a program or marking events. These
so-called signposts can be visualized in the
Instruments.app application.
This Python package provides a wrapper for the OSSignposter
API, so that you
can mark tasks and events in Python applications.
Make sure you have Xcode installed and
then install with pip
:
pip install os-signpost
Signposter
Signposter
is the main class of this package. You should create an instance of
Signposter
in order to emit an event. You can create an instance as follows:
from os_signpost import Signposter
signposter = Signposter("com.example.my_subsystem", Signposter.Category.DynamicTracing)
The first argument to the constructor is the name of the subsystem, which is usually the name of your organization followed by the name of the subsystem. The second argument is the category within the subsystem. The system uses the category to filter events. There are three predefined categories available:
Category.PointsOfInterest
: signposts with this category are always enabled.Category.DynamicTracing
: signposts with this category are only enabled whenDynamicTracing
Category.DynamicStackTracing
: this category behaves like DynamicTracing
,To measure the duration of a task, you can create signposts that mark an
interval. The Signposter.begin_interval
method adds a signpost that marks the
beginning of an interval and returns a callback. This callback then marks the
end of the interval:
end_interval = signposter.begin_interval("begin my task")
# The task for which you want to measure the duration.
end_interval("end my task")
Both the begin_interval
method and the callback take a message.
Instruments.app includes these messages in the visualization and allows you to
categorize intervals by their messages. When no message is specified for the
interval end, the same message as the begin will be used.
You can also use the Signposter.use_interval
context manager in place of the
callback approach:
with signposter.use_interval("begin my task", "end my task"):
# The task for which you want to measure the duration.
use_interval
takes the begin and end messages as its arguments. The end
message is also optional for the context manager.
Besides marking intervals, you can also emit an event signpost. Instruments.app
shows events as single points. The Signposter.emit_event
method emits an
event:
signposter.emit_event("lp0 on fire")
The macOS signpost API also allows associating a name with a signpost. However,
this name is required to be a C string literal. Therefore, we hardcode the name
of signposts python
.