From ee5258f4a99c9df69e1a8b339b4a2ec71bb53ee6 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 24 Dec 2020 09:11:26 -0500 Subject: [PATCH 1/2] Support instrumentation for linking a timer to a node Signed-off-by: Christophe Bedard --- .../tracetools_analysis/data_model/ros2.py | 13 ++++++++++++- .../tracetools_analysis/processor/ros2.py | 10 ++++++++++ .../tracetools_analysis/utils/ros2.py | 8 ++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/tracetools_analysis/tracetools_analysis/data_model/ros2.py b/tracetools_analysis/tracetools_analysis/data_model/ros2.py index 75f4c6f..28ebb22 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/ros2.py +++ b/tracetools_analysis/tracetools_analysis/data_model/ros2.py @@ -78,6 +78,10 @@ class Ros2DataModel(DataModel): 'period', 'tid']) self.timers.set_index(['timer_handle'], inplace=True, drop=True) + self.timer_node_links = pd.DataFrame(columns=['timer_handle', + 'timestamp', + 'node_handle']) + self.timer_node_links.set_index(['timer_handle'], inplace=True, drop=True) self.callback_objects = pd.DataFrame(columns=['reference', 'timestamp', @@ -142,6 +146,11 @@ class Ros2DataModel(DataModel): ) -> None: self.timers.loc[handle] = [timestamp, period, tid] + def add_timer_node_link( + self, handle, timestamp, node_handle + ) -> None: + self.timer_node_links.loc[handle] = [timestamp, node_handle] + def add_callback_object( self, reference, timestamp, callback_object ) -> None: @@ -205,6 +214,9 @@ class Ros2DataModel(DataModel): print('Timers:') print(self.timers.to_string()) print() + print('Timer-node links:') + print(self.timer_node_links.to_string()) + print() print('Callback objects:') print(self.callback_objects.to_string()) print() @@ -215,7 +227,6 @@ class Ros2DataModel(DataModel): print(self.callback_instances.to_string()) print() print('Lifecycle state machines:') - print() print(self.lifecycle_state_machines.to_string()) print() print('Lifecycle transitions:') diff --git a/tracetools_analysis/tracetools_analysis/processor/ros2.py b/tracetools_analysis/tracetools_analysis/processor/ros2.py index d340e05..a37731c 100644 --- a/tracetools_analysis/tracetools_analysis/processor/ros2.py +++ b/tracetools_analysis/tracetools_analysis/processor/ros2.py @@ -63,6 +63,8 @@ class Ros2Handler(EventHandler): self._handle_rcl_timer_init, 'ros2:rclcpp_timer_callback_added': self._handle_rclcpp_timer_callback_added, + 'ros2:rclcpp_timer_link_node': + self._handle_rclcpp_timer_link_node, 'ros2:rclcpp_callback_register': self._handle_rclcpp_callback_register, 'ros2:callback_start': @@ -198,6 +200,14 @@ class Ros2Handler(EventHandler): callback_object = get_field(event, 'callback') self.data.add_callback_object(handle, timestamp, callback_object) + def _handle_rclcpp_timer_link_node( + self, event: Dict, metadata: EventMetadata, + ) -> None: + handle = get_field(event, 'timer_handle') + timestamp = metadata.timestamp + node_handle = get_field(event, 'node_handle') + self.data.add_timer_node_link(handle, timestamp, node_handle) + def _handle_rclcpp_callback_register( self, event: Dict, metadata: EventMetadata, ) -> None: diff --git a/tracetools_analysis/tracetools_analysis/utils/ros2.py b/tracetools_analysis/tracetools_analysis/utils/ros2.py index 761b3e5..1b2a902 100644 --- a/tracetools_analysis/tracetools_analysis/utils/ros2.py +++ b/tracetools_analysis/tracetools_analysis/utils/ros2.py @@ -228,14 +228,18 @@ class Ros2DataModelUtil(DataModelUtil): :param timer_handle: the timer handle value :return: a dictionary with name:value info, or `None` if it fails """ - # TODO find a way to link a timer to a specific node if timer_handle not in self.data.timers.index: return None + node_handle = self.data.timer_node_links.loc[timer_handle, 'node_handle'] + node_handle_info = self.get_node_handle_info(node_handle) + if node_handle_info is None: + return None + tid = self.data.timers.loc[timer_handle, 'tid'] period_ns = self.data.timers.loc[timer_handle, 'period'] period_ms = period_ns / 1000000.0 - return {'tid': tid, 'period': f'{period_ms:.0f} ms'} + return {**node_handle_info, 'tid': tid, 'period': f'{period_ms:.0f} ms'} def get_publisher_handle_info( self, From c874d59f743f2daff424cf56bfb32cb5c4cdcbed Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 24 Dec 2020 09:07:01 -0500 Subject: [PATCH 2/2] Update callback_duration notebook and pingpong sample data Signed-off-by: Christophe Bedard --- .../analysis/callback_duration.ipynb | 11 ++++++++++- .../analysis/sample_data/converted_pingpong | Bin 41526 -> 43889 bytes 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tracetools_analysis/analysis/callback_duration.ipynb b/tracetools_analysis/analysis/callback_duration.ipynb index 432f5c4..3e6f044 100644 --- a/tracetools_analysis/analysis/callback_duration.ipynb +++ b/tracetools_analysis/analysis/callback_duration.ipynb @@ -100,6 +100,10 @@ " if owner_info is None:\n", " owner_info = '[unknown]'\n", "\n", + " # Filter out internal subscriptions\n", + " if '/parameter_events' in owner_info:\n", + " continue\n", + "\n", " # Duration\n", " duration_df = data_util.get_callback_durations(obj)\n", " starttime = duration_df.loc[:, 'timestamp'].iloc[0].strftime('%Y-%m-%d %H:%M')\n", @@ -173,6 +177,11 @@ "\n", "colour_i = 0\n", "for obj, symbol in callback_symbols.items():\n", + " # Filter out internal subscriptions\n", + " owner_info = data_util.get_callback_owner_info(obj)\n", + " if not owner_info or '/parameter_events' in owner_info:\n", + " continue\n", + "\n", " duration_df = data_util.get_callback_durations(obj)\n", " source = ColumnDataSource(duration_df)\n", " duration.title.align = 'center'\n", @@ -215,7 +224,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/tracetools_analysis/analysis/sample_data/converted_pingpong b/tracetools_analysis/analysis/sample_data/converted_pingpong index ab8f88c88d50a4f4f78b98fd022c45450112b905..2dabe6ef4132f333868950bb0bbd9c8c81c6891a 100644 GIT binary patch literal 43889 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 q2?NlTkJ5@3`0lg3?N%TrO8Im+yAK1Y(y8{|{~ literal 41526 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 Apa1{>