3. CTF writer API¶
The CTF writer API allows to write native CTF traces from a Python environment.
A CTF trace is made of one or more CTF streams. Streams contain packets, which in turn contain serialized events. CTF readers, such as Babeltrace, are able to merge streams and iterate on events in order when reading a CTF trace.
The CTF writer API is exposed as a set of classes available in the
babeltrace.writer
module.
See also
There is a clear distinction to be made between field declaration and field objects. A field declaration describes the properties, or metadata, of a field. It does not contain a value. For example, an integer field declaration contains a size in bits, a byte order, a display base, whether it’s signed or not, and so on. On the other hand, an integer field is linked with a specific integer field declaration, but contains an actual integer value. Thus, the layout and properties of fields are described once in field declarations, and then all concrete fields carry a value and a field declaration reference. The same applies to event classes vs. events, as well as to stream classes vs. streams.
The main interface to write a CTF trace is the Writer
class:
-
class
babeltrace.writer.
Writer
Writing object in which clocks and streams may be registered, and other common trace properties may be set.
A concrete Stream
object may be created from a
StreamClass
using Writer.create_stream()
method. A
stream class is also associated with a clock (Clock
), which
must also be registered to the writer object.
-
class
babeltrace.writer.
StreamClass
Stream class.
-
class
babeltrace.writer.
Stream
Stream, based on a stream class.
-
class
babeltrace.writer.
Clock
Reference clock of one to many streams.
Events, before being created, must be described in an event class
(EventClass
). An event class must be added to a stream class
using StreamClass.add_event_class()
before appending an event
to an actual stream linked with this stream class.
-
class
babeltrace.writer.
EventClass
Event class.
-
class
babeltrace.writer.
Event
Event, based on an event class.
An event class is created by instantiating an EventClass
object and using its add_field()
method to add an
instance of one of the following field declarations:
-
class
babeltrace.writer.
IntegerFieldDeclaration
Integer field declaration.
-
class
babeltrace.writer.
FloatingPointFieldDeclaration
Floating point number field declaration.
-
class
babeltrace.writer.
EnumerationFieldDeclaration
Enumeration field declaration (mapping from labels to ranges of integers).
-
class
babeltrace.writer.
StringFieldDeclaration
String (NULL-terminated array of bytes) field declaration.
-
class
babeltrace.writer.
ArrayFieldDeclaration
Static array field declaration.
-
class
babeltrace.writer.
SequenceFieldDeclaration
Sequence (dynamic array) field declaration.
-
class
babeltrace.writer.
StructureFieldDeclaration
Structure (ordered map of field names to field declarations) field declaration.
-
class
babeltrace.writer.
VariantFieldDeclaration
Variant (dynamic selection between different field declarations) field declaration.
Once an event class is created, a concrete event may be created by
instantiating an Event
object. Its payload()
method may be used to access the actual event’s fields and set their
values. Those fields are instances of the following types:
-
class
babeltrace.writer.
IntegerField
Integer field.
-
class
babeltrace.writer.
FloatingPointField
Floating point number field.
-
class
babeltrace.writer.
EnumerationField
Enumeration field (mapping from labels to ranges of integers).
-
class
babeltrace.writer.
StringField
String (NULL-terminated array of bytes) field.
-
class
babeltrace.writer.
ArrayField
Static array field.
-
class
babeltrace.writer.
SequenceField
Sequence (dynamic array) field.
-
class
babeltrace.writer.
StructureField
Structure (ordered map of field names to field declarations) field.
-
class
babeltrace.writer.
VariantField
Variant (dynamic selection between different field declarations) field.
The subclass relationship for the CTF writer API is the following:
object
FieldDeclaration
IntegerFieldDeclaration
FloatingPointFieldDeclaration
EnumerationFieldDeclaration
StringFieldDeclaration
ArrayFieldDeclaration
SequenceFieldDeclaration
StructureFieldDeclaration
VariantFieldDeclaration
Field
IntegerField
FloatingPointField
EnumerationField
StringField
ArrayField
SequenceField
StructureField
VariantField
EnumerationMapping
EventClass
Event
Clock
StreamClass
Stream
Writer
Most of these classes’ methods and properties raise ValueError
on error.
3.1. Writer
¶
-
class
babeltrace.writer.
Writer
(path)¶ This object is the CTF writer API context. It oversees its streams and clocks, and is responsible for writing one CTF trace.
-
__init__
(path)¶ Creates a CTF writer, initializing a new CTF trace at path path.
path must be an existing directory, since a CTF trace is made of multiple files.
ValueError
is raised if the creation fails.
-
add_clock
(clock)¶ Registers
Clock
object clock to the writer.You must register CTF clocks assigned to stream classes to the writer.
ValueError
is raised if the creation fails.
-
add_environment_field
(name, value)¶ Sets the CTF environment variable named name to value value (converted to a string).
ValueError
is raised on error.
-
byte_order
¶ Native byte order of this trace (one of
babeltrace.common.ByteOrder
constants).This is the actual byte order that is used when a field declaration has the
babeltrace.common.ByteOrder.BYTE_ORDER_NATIVE
value.Set this attribute to change the trace’s native byte order.
Defaults to the host machine’s endianness.
ValueError
is raised on error.
-
create_stream
(stream_class)¶ Creates and registers a new stream based on stream class stream_class.
This is the standard way of creating a
Stream
object: the user is not allowed to instantiate this class.Returns a new
Stream
object.
-
flush_metadata
()¶ Flushes the trace’s metadata to the metadata file.
-
metadata
¶ Current metadata of this trace (
str
).
-
3.2. StreamClass
¶
-
class
babeltrace.writer.
StreamClass
(name)¶ A stream class contains the properties of specific streams (
Stream
). Any concrete stream must be linked with aStreamClass
, usually by callingWriter.create_stream()
.Some attributes are automatically set when creating a stream class. For example, if no clock is explicitly set using the
clock
attribute, a default clock will be created when needed.-
__init__
(name)¶ Creates a stream class named name.
ValueError
is raised on error.
-
add_event_class
(event_class)¶ Registers the
EventClass
event_class to this stream class.Once the event class is registered, it will be generated as one of the event classes generated by
event_classes
.ValueError
is raised on error.
-
clock
¶ Stream class’ clock (
Clock
object).Set this attribute to change the clock of this stream class.
ValueError
is raised on error.
-
event_classes
¶ Generates the event classes (
EventClass
objects) of this stream class.TypeError
is raised on error.
-
id
¶ Stream class’ numeric ID.
Set this attribute to change the ID of this stream class.
ValueError
is raised on error.
-
name
¶ Stream class’ name.
TypeError
is raised on error.
-
packet_context_type
¶ Stream packet context declaration.
Set this attribute to change the stream packet context declaration (must be an instance of
StructureFieldDeclaration
).ValueError
is raised on error.
-
3.3. Stream
¶
-
class
babeltrace.writer.
Stream
¶ Streams are specific instances of stream classes, which means they may contain actual, concrete events.
Stream
objects are returned byWriter.create_stream()
; they are not meant to be instantiated by the user.Concrete
Event
objects are appended toStream
objects usingappend_event()
.When
flush()
is called, a CTF packet is created, containing all the appended events since the last flush. Although the stream is flushed on object destruction, it is strongly recommended that the user callflush()
manually before exiting the script, as__del__()
is not always reliable.-
append_discarded_events
(event_count)¶ Appends event_count discarded events to this stream.
-
append_event
(event)¶ Appends event event (
Event
object) to this stream.The stream’s associated clock will be sampled during this call. event shall not be modified after being appended to this stream.
ValueError
is raised on error.
-
discarded_events
¶ Number of discarded (lost) events in this stream so far.
ValueError
is raised on error.
-
flush
()¶ Flushes the current packet of this stream to disk. Events subsequently appended to the stream will be added to a new packet.
ValueError
is raised on error.
-
packet_context
¶ Stream packet context field (instance of
StructureField
).Set this attribute to assign a stream packet context field to this stream.
ValueError
is raised on error.
-
3.4. Clock
¶
-
class
babeltrace.writer.
Clock
(name)¶ A CTF clock allows the description of the system’s clock topology, as well as the definition of each clock’s parameters.
Clock
objects must be registered to aWriter
object (seeWriter.add_clock()
), as well as be registered to aStreamClass
object (seeStreamClass.clock
).-
__init__
(name)¶ Creates a default CTF clock named name.
ValueError
is raised on error.
-
absolute
¶ True
if this clock is absolute, i.e. if the clock is a global reference across the other clocks of the trace.Set this attribute to change the clock’s absolute state (boolean).
ValueError
is raised on error.
-
description
¶ Clock description (string).
Set this attribute to change the clock’s description.
ValueError
is raised on error.
-
frequency
¶ Clock frequency in Hz (integer).
Set this attribute to change the clock’s frequency.
ValueError
is raised on error.
-
name
¶ Clock name.
Set this attribute to change the clock’s name.
ValueError
is raised on error.
-
offset
¶ Clock offset in ticks since (POSIX.1 Epoch +
offset_seconds
).Set this attribute to change the clock’s offset.
ValueError
is raised on error.
-
offset_seconds
¶ Clock offset in seconds since POSIX.1 Epoch (integer).
Set this attribute to change the clock’s offset in seconds.
ValueError
is raised on error.
-
precision
¶ Clock precision in clock ticks (integer).
Set this attribute to change the clock’s precision.
ValueError
is raised on error.
-
time
¶ Clock current time; nanoseconds (integer) since clock origin (POSIX.1 Epoch +
offset_seconds
+offset
).Set this attribute to change the clock’s current time.
ValueError
is raised on error.
-
uuid
¶ Clock UUID (an
uuid.UUID
object).Set this attribute to change the clock’s UUID.
ValueError
is raised on error.
-
3.5. EventClass
¶
-
class
babeltrace.writer.
EventClass
(name)¶ An event class contains the properties of specific events (
Event
). Any concrete event must be linked with anEventClass
.Some attributes are automatically set when creating an event class. For example, if no numeric ID is explicitly set using the
id
attribute, a default, unique ID within the stream class containing this event class will be created when needed.-
__init__
(name)¶ Creates an event class named name.
ValueError
is raised on error.
-
add_field
(field_type, field_name)¶ Adds a field declaration field_type named field_name to this event class.
field_type must be one of:
IntegerFieldDeclaration
FloatingPointFieldDeclaration
EnumerationFieldDeclaration
StringFieldDeclaration
ArrayFieldDeclaration
SequenceFieldDeclaration
StructureFieldDeclaration
VariantFieldDeclaration
ValueError
is raised on error.
-
fields
¶ Generates the (field name,
FieldDeclaration
) pairs of this event class.TypeError
is raised on error.
-
get_field_by_name
(name)¶ Returns the
FieldDeclaration
object named name in this event class.TypeError
is raised on error.
-
id
¶ Event class’ numeric ID.
Set this attribute to assign a numeric ID to this event class. This ID must be unique amongst all the event class IDs of a given stream class.
TypeError
is raised on error.
-
name
¶ Event class’ name.
-
stream_class
¶ StreamClass
object containing this event class, orNone
if not set.
-
3.6. Event
¶
-
class
babeltrace.writer.
Event
(event_class)¶ Events are specific instances of event classes (
EventClass
), which means they may contain actual, concrete field values.-
__init__
(event_class)¶ Creates an event linked with the
EventClass
event_class.ValueError
is raised on error.
-
clock
()¶ Clock
object used by this object, orNone
if the event class is not registered to a stream class.
-
event_class
¶ EventClass
object to which this event is linked.
-
payload
(field_name)¶ Returns the
Field
object named field_name in this event.The returned field object is created using the event class’ field declaration named field_name.
The return type is one of:
IntegerField
FloatingPointField
EnumerationField
StringField
ArrayField
SequenceField
StructureField
VariantField
TypeError
is raised on error.
-
set_payload
(field_name, value_field)¶ Set the event’s field named field_name to the manually created
Field
object value_field.value_field’s type must be one of:
IntegerField
FloatingPointField
EnumerationField
StringField
ArrayField
SequenceField
StructureField
VariantField
ValueError
is raised on error.
-
3.7. FieldDeclaration
¶
-
class
babeltrace.writer.
FieldDeclaration
¶ Base class of all field declarations. This class is not meant to be instantiated by the user; use one of the concrete field declaration subclasses instead.
-
class
IntegerBase
¶
-
alignment
¶ Field alignment in bits (integer).
Set this attribute to change this field’s alignment.
ValueError
is raised on error.
-
byte_order
¶ Field byte order (one of
babeltrace.common.ByteOrder
constants).Set this attribute to change this field’s byte order.
ValueError
is raised on error.
-
class
3.8. IntegerBase
¶
3.9. IntegerFieldDeclaration
¶
-
class
babeltrace.writer.
IntegerFieldDeclaration
(size)¶ Bases:
babeltrace.writer.FieldDeclaration
Integer field declaration.
-
__init__
(size)¶ Creates an integer field declaration of size size bits.
ValueError
is raised on error.
-
base
¶ Integer display base (one of
IntegerBase
constants).Set this attribute to change this integer’s display base.
ValueError
is raised on error.
-
encoding
¶ Integer encoding (one of
babeltrace.common.CTFStringEncoding
constants).Set this attribute to change this integer’s encoding.
ValueError
is raised on error.
-
signed
¶ True
if this integer is signed.Set this attribute to change this integer’s signedness (boolean).
ValueError
is raised on error.
-
size
¶ Integer size in bits (integer).
Set this attribute to change this integer’s size.
ValueError
is raised on error.
-
3.10. FloatingPointFieldDeclaration
¶
-
class
babeltrace.writer.
FloatingPointFieldDeclaration
¶ Bases:
babeltrace.writer.FieldDeclaration
Floating point number field declaration.
A CTF floating point number is a made of three sections: the sign bit, the exponent bits, and the mantissa bits. The most significant bit of the resulting binary word is the sign bit, and is included in the number of mantissa bits.
For example, the IEEE 754 single precision floating point number is represented on a 32-bit word using an 8-bit exponent (
e
) and a 24-bit mantissa (m
), the latter count including the sign bit (s
):s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
The IEEE 754 double precision floating point number uses an 11-bit exponent and a 53-bit mantissa.
-
__init__
()¶ Creates a floating point number field declaration.
ValueError
is raised on error.
-
DBL_EXP_DIG
= 11¶ IEEE 754 double precision floating point number exponent size
-
DBL_MANT_DIG
= 53¶ IEEE 754 double precision floating point number mantissa size
-
FLT_EXP_DIG
= 8¶ IEEE 754 single precision floating point number exponent size
-
FLT_MANT_DIG
= 24¶ IEEE 754 single precision floating point number mantissa size
-
exponent_digits
¶ Floating point number exponent section size in bits (integer).
Set this attribute to change the floating point number’s exponent section’s size. You may use
FLT_EXP_DIG
orDBL_EXP_DIG
for IEEE 754 floating point numbers.ValueError
is raised on error.
-
mantissa_digits
¶ Floating point number mantissa section size in bits (integer).
Set this attribute to change the floating point number’s mantissa section’s size. You may use
FLT_MANT_DIG
orDBL_MANT_DIG
for IEEE 754 floating point numbers.ValueError
is raised on error.
-
3.11. EnumerationMapping
¶
-
class
babeltrace.writer.
EnumerationMapping
(name, start, end)¶ Mapping from an enumeration label to a range of integers.
-
__init__
(name, start, end)¶ Creates an enumeration mapping, where label name is mapped to the [start, end] range of integers (end is included).
Set start and end to the same value to create an enumeration mapping to a single value.
-
3.12. EnumerationFieldDeclaration
¶
-
class
babeltrace.writer.
EnumerationFieldDeclaration
(integer_type)¶ Bases:
babeltrace.writer.FieldDeclaration
Enumeration field declaration. A CTF enumeration maps labels to ranges of integers.
-
__init__
(integer_type)¶ Creates an enumeration field declaration, with integer_type being the underlying
IntegerFieldDeclaration
for storing the integer.ValueError
is raised on error.
-
add_mapping
(name, range_start, range_end)¶ Adds a mapping to the enumeration field declaration, from the label named name to range [range_start, range_end], where range_start and range_end are integers included in the range.
ValueError
is raised on error.
-
container
¶ Underlying container (
IntegerFieldDeclaration
).TypeError
is raised on error.
-
get_mapping_by_name
(name)¶ Returns the
EnumerationMapping
object for the label named name.TypeError
is raised on error.
-
get_mapping_by_value
(value)¶ Returns the
EnumerationMapping
object for the value value (integer).TypeError
is raised on error.
-
mappings
¶ Generates the mappings of this enumeration field declaration (
EnumerationMapping
objects).TypeError
is raised on error.
-
3.13. StringFieldDeclaration
¶
-
class
babeltrace.writer.
StringFieldDeclaration
¶ Bases:
babeltrace.writer.FieldDeclaration
String (NULL-terminated array of bytes) field declaration.
-
__init__
()¶ Creates a string field declaration.
ValueError
is raised on error.
-
encoding
¶ String encoding (one of
babeltrace.common.CTFStringEncoding
constants).Set this attribute to change this string’s encoding.
ValueError
is raised on error.
-
3.14. ArrayFieldDeclaration
¶
-
class
babeltrace.writer.
ArrayFieldDeclaration
(element_type, length)¶ Bases:
babeltrace.writer.FieldDeclaration
Static array field declaration.
-
__init__
(element_type, length)¶ Creates a static array field declaration of length elements of type element_type (
FieldDeclaration
).ValueError
is raised on error.
-
element_type
¶ Type of the elements of this this static array (subclass of
FieldDeclaration
).TypeError
is raised on error.
-
length
¶ Length of this static array (integer).
TypeError
is raised on error.
-
3.15. SequenceFieldDeclaration
¶
-
class
babeltrace.writer.
SequenceFieldDeclaration
(element_type, length_field_name)¶ Bases:
babeltrace.writer.FieldDeclaration
Sequence (dynamic array) field declaration.
-
__init__
(element_type, length_field_name)¶ Creates a sequence field declaration of elements of type element_type (
FieldDeclaration
). The length of a sequence field based on this sequence field declaration is obtained by retrieving the dynamic integer value of the field named length_field_name.ValueError
is raised on error.
-
element_type
¶ Type of the elements of this sequence (subclass of
FieldDeclaration
).TypeError
is raised on error.
-
length_field_name
¶ Name of the integer field defining the dynamic length of sequence fields based on this sequence field declaration.
TypeError
is raised on error.
-
3.16. StructureFieldDeclaration
¶
-
class
babeltrace.writer.
StructureFieldDeclaration
¶ Bases:
babeltrace.writer.FieldDeclaration
Structure field declaration, i.e. an ordered mapping from field names to field declarations.
-
__init__
()¶ Creates an empty structure field declaration.
ValueError
is raised on error.
-
add_field
(field_type, field_name)¶ Appends one
FieldDeclaration
field_type named field_name to the structure’s ordered map.ValueError
is raised on error.
-
fields
¶ Generates the (field name,
FieldDeclaration
) pairs of this structure.TypeError
is raised on error.
-
get_field_by_name
(name)¶ Returns the
FieldDeclaration
mapped to the field name name in this structure.TypeError
is raised on error.
-
3.17. VariantFieldDeclaration
¶
-
class
babeltrace.writer.
VariantFieldDeclaration
(enum_tag, tag_name)¶ Bases:
babeltrace.writer.FieldDeclaration
Variant field declaration.
A CTF variant is a dynamic selection between different fields. The value of a tag (a CTF enumeration) determines what is the current selected field. All the possible fields must be added to its field declaration before using an actual variant field.
-
__init__
(enum_tag, tag_name)¶ Creates an empty variant field declaration with tag field declaration enum_tag (instance of
EnumerationFieldDeclaration
) named tag_name (string).ValueError
is raised on error.
-
add_field
(field_type, field_name)¶ Registers the
FieldDeclaration
object field_type as the variant’s selected type when the variant’s tag’s current label is field_name.ValueError
is raised on error.
-
fields
¶ Generates the (field name,
FieldDeclaration
) pairs of this variant field declaration.TypeError
is raised on error.
-
get_field_by_name
(name)¶ Returns the
FieldDeclaration
selected when the variant’s tag’s current label is name.TypeError
is raised on error.
-
get_field_from_tag
(tag)¶ Returns the
FieldDeclaration
selected by the current label of theEnumerationField
tag.TypeError
is raised on error.
-
tag_name
¶ Variant field declaration tag name.
TypeError
is raised on error.
-
tag_type
¶ Variant field declaration tag field declaration (
EnumerationFieldDeclaration
object).TypeError
is raised on error.
-
3.18. Field
¶
-
class
babeltrace.writer.
Field
(field_type)¶ Base class of all fields. This class is not meant to be instantiated by the user, and neither are its subclasses. Use
Event.payload()
to access specific, concrete fields of an event.-
declaration
¶ Field declaration (subclass of
FieldDeclaration
).TypeError
is raised on error.
-
3.19. IntegerField
¶
-
class
babeltrace.writer.
IntegerField
(field_type)¶ Bases:
babeltrace.writer.Field
Integer field, based on an
IntegerFieldDeclaration
object.-
value
¶ Integer value (
int
).Set this attribute to change the integer field’s value.
ValueError
orTypeError
are raised on error.
-
3.20. FloatingPointField
¶
-
class
babeltrace.writer.
FloatingPointField
(field_type)¶ Bases:
babeltrace.writer.Field
Floating point number field, based on a
FloatingPointFieldDeclaration
object.-
value
¶ Floating point number value (
float
).Set this attribute to change the floating point number field’s value.
ValueError
orTypeError
are raised on error.
-
3.21. EnumerationField
¶
-
class
babeltrace.writer.
EnumerationField
(field_type)¶ Bases:
babeltrace.writer.Field
Enumeration field, based on an
EnumerationFieldDeclaration
object.-
container
¶ Underlying container (
IntegerField
).TypeError
is raised on error.
-
value
¶ Current label of this enumeration field (
str
).Set this attribute to an integer (
int
) to change the enumeration field’s value.ValueError
is raised on error.
-
3.22. StringField
¶
-
class
babeltrace.writer.
StringField
(field_type)¶ Bases:
babeltrace.writer.Field
String (NULL-terminated array of bytes) field.
-
value
¶ String value (
str
).Set this attribute to change the string’s value.
ValueError
orTypeError
are raised on error.
-
3.23. ArrayField
¶
-
class
babeltrace.writer.
ArrayField
(field_type)¶ Bases:
babeltrace.writer.Field
Static array field, based on an
ArrayFieldDeclaration
object.
3.24. SequenceField
¶
-
class
babeltrace.writer.
SequenceField
(field_type)¶ Bases:
babeltrace.writer.Field
Sequence (dynamic array) field, based on a
SequenceFieldDeclaration
object.-
length
¶ Sequence length (
IntegerField
).Set this attribute to change the sequence length’s integer field (integer must be unsigned).
ValueError
orTypeError
are raised on error.
-
3.25. StructureField
¶
-
class
babeltrace.writer.
StructureField
(field_type)¶ Bases:
babeltrace.writer.Field
Structure field, based on a
StructureFieldDeclaration
object.
3.26. VariantField
¶
-
class
babeltrace.writer.
VariantField
(field_type)¶ Bases:
babeltrace.writer.Field
Variant field, based on a
VariantFieldDeclaration
object.-
field
(tag)¶ Returns the
Field
selected by the current label of tag (EnumerationField
).ValueError
is raised on error.
-