Migrating from 0.24 to 0.25
Removed deprecated --serve
CLI argument removed-deprecated-serve-cli-argument
Use --web-viewer
instead.
Removed the --drop-at-latency
CLI argument removed-the-dropatlatency-cli-argument
This feature has been defunct for a while. A better replacement can be tracked in this issue.
Removed the -o
CLI argument shorthand for --stdout
in script_add_args
removed-the-o-cli-argument-shorthand-for-stdout-in-scriptaddargs
Use --stdout
directly instead.
Flush takes an optional timeout, and returns errors flush-takes-an-optional-timeout-and-returns-errors
When flushing a recording stream you can now give it a maximum time for how long it should block. The flush will block until either it completes, fails (e.g. because of connection loss), or the timeout is reached.
Previously this could only be configured for gRPC sinks, and it was configured once upon setting up the connection.
In the C++ and Python APIs, negative timeouts used to have special meaning. Now they are no longer permitted.
The Python flush calls now raises an error if the flushing did not complete successfully.
❗ Deprecations -deprecations
Python 3.9 python-39
Support for Python 3.9 is being deprecated. Python 3.9 is past end-of-life. See: https://devguide.python.org/versions/ In the next release, we will fully drop support and switch to Python 3.10 as the minimum supported version.
See an overview for supported python versions here.
archetype
specification in AnyValues
archetype-specification-in-anyvalues
Previously, logging two AnyValues
with the same field name but different archetype name under the same entity would lead to an inconsistency where the viewer would disambiguate them, but not the dataframe API.
arbitrary_int = 10
example = AnyValues()
example.with_field(
ComponentDescriptor("component_name", "archetype_name"), arbitrary_int
)
example.with_field(
ComponentDescriptor("component_name", "different_archetype"), arbitrary_int+1
)
rr.log("/path", example)
In the viewer we would see two component_name
entries under different archetypes but they would not be uniquely queryable.
from rerun.dataframe import load_recording
rec = load_recording("<path_to_logs_above>.rrd")
rec.view(index="log_time", contents="/path").select().schema
# Only shows one `component_name` component
To address that, we split this functionality into two utilities:
AnyValues
, which has no archetype nameDynamicArchetype
, which requires an archetype name
When using DynamicArchetype
, the dataframe API will include the archetype the column names (similar to how built-in components are handled), which reduces the possibility for ambiguity.
In the next release we will remove the ability to specify an archetype
when creating AnyValues
to finalize the transition.
arbitrary_int = 10
example = DynamicArchetype("archetype_name")
example.with_component_from_data(
"component_name", arbitrary_int
)
another_example = DynamicArchetype("another_archetype")
another_example.with_field(
"component_name", arbitrary_int+1
)
rr.log("/path", example)
rr.log("/path", another_example)
from rerun.dataframe import load_recording
rec = load_recording("<path_to_logs_above>.rrd")
rec.view(index="log_time", contents="/path").select().schema
# Only shows two `component_name` components deduplicated by archetype!