#[repr(i32)]pub enum SiblingMergeBehavior {
Unspecified = 0,
ByTrackName = 1,
None = 2,
BySiblingMergeKey = 3,
}
Expand description
Specifies how the analysis tools should “merge” different sibling TrackEvent tracks.
For two or more tracks to be merged, they must be “eligible” siblings. Eligibility is determined by the following rules:
- All tracks must have the same parent.
- All tracks must have the same
sibling_merge_behavior
. The only exception isSIBLING_MERGE_BEHAVIOR_UNSPECIFIED
which is treated asSIBLING_MERGE_BEHAVIOR_BY_TRACK_NAME
. - Depending on the behavior, the corresponding key must match (e.g.
name
forBY_TRACK_NAME
,sibling_merge_key
forBY_SIBLING_MERGE_KEY
).
Specifically:
- in the UI, all tracks which are merged together will be displayed as a single “visual” track.
- in the trace processor, all tracks which are merged together will be “multiplexed” into n “analysis” tracks where n is the maximum number of tracks which have an active event at the same time.
When tracks are merged togther, the properties for the merged track will be chosen from the source tracks based on the following rules:
- for
sibling_order_rank
: the rank of the merged track will be the smallest rank among the source tracks. - for all other properties: the property taken is unspecified and can
be any value provided by one of the source tracks. This can lead to
non-deterministic behavior.
- examples of other properties include
name
,child_ordering
etc. - because of this, it’s strongly recommended to ensure that all source tracks have the same value for these properties.
- the trace processor will also emit an error stat if it detects that the properties are not the same across all source tracks.
- examples of other properties include
Note: merging is done recursively so entire trees of tracks can be merged together. To make this clearer, consider an example track hierarchy (in the diagrams: “smk” refers to “sibling_merge_key”, the first word on a track line, like “Updater”, is its ‘name’ property):
Initial track hierarchy: SystemActivity ├── AuthService (smk: “auth_main_cluster”) │ └── LoginOp (smk: “login_v1”) ├── AuthService (smk: “auth_main_cluster”) │ └── LoginOp (smk: “login_v1”) ├── AuthService (smk: “auth_backup_cluster”) │ └── GuestOp (smk: “guest_v1”) └── UserProfileService (smk: “profile_cluster”) └── GetProfileOp (smk: “getprofile_v1”)
Merging outcomes:
Scenario 1: Merging by SIBLING_MERGE_BEHAVIOR_BY_SIBLING_MERGE_KEY
- The first two “AuthService” tracks merge because they share
smk: "auth_main_cluster"
. Their names are consistent (“AuthService”), aligning with recommendations. The merged track is named “AuthService”. - The third “AuthService” track (with
smk: "auth_backup_cluster"
) remains separate, as itssibling_merge_key
is different. - “UserProfileService” also remains separate.
- Within the merged “AuthService” (from “auth_main_cluster”): “LoginOp” get merged as they have the same sibling merge key.
Resulting UI (when merging by SIBLING_MERGE_KEY): SystemActivity ├── AuthService (merged by smk: “auth_main_cluster”) │ ├── LoginOp (merged by smk: “login_v1”) ├── AuthService (smk: “auth_backup_cluster”) │ └── GuestOp (smk: “guest_v1”) └── UserProfileService (smk: “profile_cluster”) └── GetProfileOp (smk: “getprofile_v1”)
Scenario 2: Merging by SIBLING_MERGE_BEHAVIOR_BY_TRACK_NAME
- All three tracks named “AuthService” merge because they share the same
name. The merged track is named “AuthService”. The
sibling_merge_key
for this merged track would be taken from one of the source tracks (e.g., “auth_main_cluster” or “auth_backup_cluster”), which could be relevant if its children had key-based merge behaviors. - “UserProfileService” remains separate due to its different name.
- Within the single merged “AuthService” track: “LoginOp”, “GuestOp” become siblings. “LoginOp” tracks gets merged as they have the same name.
Resulting UI (when merging by SIBLING_MERGE_BEHAVIOR_BY_TRACK_NAME): SystemActivity ├── AuthService (merged from 3 “AuthService” tracks) │ ├── LoginOp (smk: “login_v1”) │ └── GuestOp (smk: “guest_v1”) └── UserProfileService (smk: “profile_cluster”) └── GetProfileOp (smk: “getprofile_v1”)
Note: for tracks where thread
or process
are set, this option is
ignored. See parent_uuid
for details.
Variants§
Unspecified = 0
When unspecified or not set, defaults to
SIBLING_MERGE_BEHAVIOR_BY_TRACK_NAME
.
ByTrackName = 1
Merge this track with eligible siblings which have the same name
.
This is the default behavior.option.
Fun fact: this is the default beahavior for legacy reasons as the UI has worked this way for years and inherited this behavior from chrome://tracing which has worked this way for even longer
None = 2
Never merge this track with any siblings. Useful if if this track has a specific meaning and you want to see separately from any others.
BySiblingMergeKey = 3
Merge this track with eligible siblings which have the same
sibling_merge_key
.
Implementations§
Source§impl SiblingMergeBehavior
impl SiblingMergeBehavior
Sourcepub fn as_str_name(&self) -> &'static str
pub fn as_str_name(&self) -> &'static str
String value of the enum field names used in the ProtoBuf definition.
The values are not transformed in any way and thus are considered stable (if the ProtoBuf definition does not change) and safe for programmatic use.
Trait Implementations§
Source§impl Clone for SiblingMergeBehavior
impl Clone for SiblingMergeBehavior
Source§fn clone(&self) -> SiblingMergeBehavior
fn clone(&self) -> SiblingMergeBehavior
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more