Custom Events

You may want to insert custom events to the report while you are tracing the program.

VizTracer supports three kinds of custom events:

  • Instant Event

  • Variable Event

  • Duration Event

Instant Event

Instant Event is a log at a specific timestamp, showing as an arrow. It’s useful to log a transient event. You need to give it a name which is a string, and an argument args. They will be displayed in the report

args has to be a jsonifiable object, normally a string, or a combination of dict, list, string and number.

scope can be set to t``(default), ``p or g, for thread, process and global.

tracer.log_instant(f"Event1", args=args, scope="p")

Variable Event

Variable Event is a way to log a specific variable in your program and display it in the report.

If the variable you log is a number, VizTracer will use a counter event to display it, otherwise instant event will be used.

A name should be given for the variable, then the variable itself

trace.log_var("name for the var", var)

Magic Comment

You can use magic comment to log instant events and variable events.

In this way, you’ll have 0 overhead and side effect when you run your program normally, and log the events when you use viztracer to trace it

# !viztracer: log_instant("start logging")
a = 3
# !viztracer: log_var("a", a)

Or you can use inline magic comment # !viztracer: log, which will log the assigned value if the statement is an assign or it will log an instant event indicating this line is executed

# This will log an instant event with name "f()"
f()  # !viztracer: log

# This will log the variable a
a = 3  # !viztracer: log

You can also do conditional log with if

# This will log the variable a
a = 3  # !viztracer: log if a == 3
# This has the same effect
# !viztracer: log_var("a", a)

You need --magic_comment option for viztracer to trigger the magic comment

viztracer --magic_comment

Duration Event

Duration Event is almost the same as function call event that normally being logged automatically, with the only exception that it does not have to be a function.

You can log any piece of code using duration event and it will look like a function call event in your final report.

from viztracer import get_tracer

with get_tracer().log_event("my event name"):
    # some code running here

You should use log_event method of your tracer, which is accessible through get_tracer() function when you are using CLI, or just pass the tracer if you are using inline.

This feature is especially helpful when you are using Log Sparse.