From a859bb6aa6460811b3c73ca26501fc2ee67becca Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 17 Jun 2019 09:27:51 +0200 Subject: [PATCH 01/11] Add basic package for launch integration --- .gitignore | 3 +++ package.xml | 22 ++++++++++++++++++++++ setup.cfg | 4 ++++ setup.py | 23 +++++++++++++++++++++++ tracetools_launch/__init__.py | 0 tracetools_launch/destroy.py | 24 ++++++++++++++++++++++++ tracetools_launch/trace.py | 29 +++++++++++++++++++++++++++++ 7 files changed, 105 insertions(+) create mode 100644 .gitignore create mode 100644 package.xml create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 tracetools_launch/__init__.py create mode 100644 tracetools_launch/destroy.py create mode 100644 tracetools_launch/trace.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eef29c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +*.pyc + diff --git a/package.xml b/package.xml new file mode 100644 index 0000000..bbf1fb6 --- /dev/null +++ b/package.xml @@ -0,0 +1,22 @@ + + + + tracetools_launch + 0.0.1 + Launch integration for tracing + Christophe Bedard + TODO + Christophe Bedard + + launch + launch_ros + + ament_copyright + ament_flake8 + ament_pep257 + python3-pytest + + + ament_python + + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..b7ef5cb --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script-dir=$base/lib/tracetools_launch +[install] +install-scripts=$base/lib/tracetools_launch diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..5480236 --- /dev/null +++ b/setup.py @@ -0,0 +1,23 @@ +from setuptools import find_packages +from setuptools import setup + +package_name = 'tracetools_launch' + +setup( + name=package_name, + version='0.0.1', + packages=find_packages(exclude=['test']), + data_files=[ + ('share/' + package_name, ['package.xml']), + ], + install_requires=['setuptools'], + maintainer='Christophe Bedard', + maintainer_email='fixed-term.christophe.bourquebedard@de.bosch.com', + author='Christophe Bedard', + author_email='fixed-term.christophe.bourquebedard@de.bosch.com', + # url='', + keywords=['ROS'], + description='Launch integration for tracing', + license='TODO', + tests_require=['pytest'], +) diff --git a/tracetools_launch/__init__.py b/tracetools_launch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tracetools_launch/destroy.py b/tracetools_launch/destroy.py new file mode 100644 index 0000000..8b4a456 --- /dev/null +++ b/tracetools_launch/destroy.py @@ -0,0 +1,24 @@ + +from typing import List +from typing import Optional +from typing import Text + +from launch.action import Action +from launch_context import LaunchContext +from launch_description_entity import LaunchDescriptionEntity + + +class Destroy(Action): + """ + Action for launch that destroys a tracing session. + + It finalizes and destroys a tracing session that was setup with the Trace action. + """ + + def __init__(self, session_name: str, **kwargs) -> None: + """Constructor.""" + super().__init__(**kwargs) + self.__session_name = session_name + + def execute(self, context: LaunchContext) -> Optional[List[Action]]: + pass \ No newline at end of file diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py new file mode 100644 index 0000000..5d847bd --- /dev/null +++ b/tracetools_launch/trace.py @@ -0,0 +1,29 @@ + +from typing import List +from typing import Optional +from typing import Text + +from launch.action import Action +from launch_context import LaunchContext +from launch_description_entity import LaunchDescriptionEntity + + +class Trace(Action): + """ + Tracing action for launch. + + Sets up and enables tracing through a launch file description. + """ + + def __init__(self, *, + session_name: str, + base_path: str, + events_ust: List[str], + events_kernel: List[str], + **kwargs) -> None: + """Constructor.""" + super().__init__(**kwargs) + + def execute(self, context: LaunchContext) -> Optional[List[Action]]: + # TODO + pass From bd0f23ba3772de51e432f26ec6f580575cf5231b Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 17 Jun 2019 14:33:04 +0200 Subject: [PATCH 02/11] Add proof of concept for Trace(Action) --- tracetools_launch/destroy.py | 24 ------------------------ tracetools_launch/trace.py | 34 +++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 31 deletions(-) delete mode 100644 tracetools_launch/destroy.py diff --git a/tracetools_launch/destroy.py b/tracetools_launch/destroy.py deleted file mode 100644 index 8b4a456..0000000 --- a/tracetools_launch/destroy.py +++ /dev/null @@ -1,24 +0,0 @@ - -from typing import List -from typing import Optional -from typing import Text - -from launch.action import Action -from launch_context import LaunchContext -from launch_description_entity import LaunchDescriptionEntity - - -class Destroy(Action): - """ - Action for launch that destroys a tracing session. - - It finalizes and destroys a tracing session that was setup with the Trace action. - """ - - def __init__(self, session_name: str, **kwargs) -> None: - """Constructor.""" - super().__init__(**kwargs) - self.__session_name = session_name - - def execute(self, context: LaunchContext) -> Optional[List[Action]]: - pass \ No newline at end of file diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index 5d847bd..c032a4f 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -1,11 +1,14 @@ +import os from typing import List from typing import Optional from typing import Text from launch.action import Action -from launch_context import LaunchContext -from launch_description_entity import LaunchDescriptionEntity +from launch.event import Event +from launch.event_handlers import OnShutdown +from launch.launch_context import LaunchContext +from tracetools_trace.tools import names class Trace(Action): @@ -15,15 +18,32 @@ class Trace(Action): Sets up and enables tracing through a launch file description. """ - def __init__(self, *, + def __init__( + self, *, session_name: str, - base_path: str, - events_ust: List[str], - events_kernel: List[str], + base_path: str = '/tmp', + events_ust: List[str] = names.DEFAULT_EVENTS_ROS, + events_kernel: List[str] = names.DEFAULT_EVENTS_KERNEL, **kwargs) -> None: """Constructor.""" super().__init__(**kwargs) + self.__session_name = session_name + self.__path = os.path.join(base_path, session_name) + self.__events_ust = events_ust + self.__events_kernel = events_kernel def execute(self, context: LaunchContext) -> Optional[List[Action]]: + # TODO make sure this is done as late as possible + context.register_event_handler(OnShutdown( + on_shutdown=self._destroy, + )) + # TODO make sure this is done as early as possible + self._setup() + + def _setup(self): # TODO - pass + print('setting up tracing!') + + def _destroy(self, event: Event, context: LaunchContext): + # TODO + print('destroying tracing session!') From f0cfc13af5345f23d43eac35c52ebc7294a69ccf Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 17 Jun 2019 14:55:06 +0200 Subject: [PATCH 03/11] Implement tracing integration --- package.xml | 1 + tracetools_launch/trace.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package.xml b/package.xml index bbf1fb6..b99c7a6 100644 --- a/package.xml +++ b/package.xml @@ -10,6 +10,7 @@ launch launch_ros + tracetools_trace ament_copyright ament_flake8 diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index c032a4f..ce29a4c 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -8,6 +8,7 @@ from launch.action import Action from launch.event import Event from launch.event_handlers import OnShutdown from launch.launch_context import LaunchContext +from tracetools_trace.tools import lttng from tracetools_trace.tools import names @@ -41,9 +42,15 @@ class Trace(Action): self._setup() def _setup(self): - # TODO print('setting up tracing!') + lttng.lttng_setup( + self.__session_name, + self.__path, + ros_events=self.__events_ust, + kernel_events=self.__events_kernel) + lttng.lttng_start(self.__session_name) def _destroy(self, event: Event, context: LaunchContext): - # TODO print('destroying tracing session!') + lttng.lttng_stop(self.__session_name) + lttng.lttng_destroy(self.__session_name) From bf8a2b01ada4005e68b61abd5ebf3d2eb6e864c0 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 17 Jun 2019 14:56:29 +0200 Subject: [PATCH 04/11] Cleanup --- tracetools_launch/trace.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index ce29a4c..4694bfb 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -2,7 +2,6 @@ import os from typing import List from typing import Optional -from typing import Text from launch.action import Action from launch.event import Event From 152fa2f5f370b12ddac78c840d369ad2069c71b9 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 17 Jun 2019 15:22:50 +0200 Subject: [PATCH 05/11] Add example launch file with Trace action --- launch/example.launch.py | 21 +++++++++++++++++++++ setup.py | 3 +++ 2 files changed, 24 insertions(+) create mode 100644 launch/example.launch.py diff --git a/launch/example.launch.py b/launch/example.launch.py new file mode 100644 index 0000000..f5499db --- /dev/null +++ b/launch/example.launch.py @@ -0,0 +1,21 @@ +# Example launch file for the Trace action + +from launch import LaunchDescription +from launch_ros.actions import Node +from tracetools_launch.trace import Trace + + +def generate_launch_description(): + return LaunchDescription([ + Trace( + session_name='my-tracing-session', + base_path='/tmp'), + Node( + package='examples_rclcpp_minimal_publisher', + node_executable='publisher_member_function', + output='screen'), + Node( + package='examples_rclcpp_minimal_subscriber', + node_executable='subscriber_member_function', + output='screen'), + ]) diff --git a/setup.py b/setup.py index 5480236..370b97c 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,5 @@ +import glob + from setuptools import find_packages from setuptools import setup @@ -9,6 +11,7 @@ setup( packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), + ('share/' + package_name + '/launch', glob.glob('launch/*.launch.py')), ], install_requires=['setuptools'], maintainer='Christophe Bedard', From f5e35d347d4bb6b5198fb05ee4350f94b4899613 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Mon, 17 Jun 2019 16:42:49 +0200 Subject: [PATCH 06/11] Fix indent --- tracetools_launch/trace.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index 4694bfb..156af97 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -24,7 +24,8 @@ class Trace(Action): base_path: str = '/tmp', events_ust: List[str] = names.DEFAULT_EVENTS_ROS, events_kernel: List[str] = names.DEFAULT_EVENTS_KERNEL, - **kwargs) -> None: + **kwargs + ) -> None: """Constructor.""" super().__init__(**kwargs) self.__session_name = session_name From 8713ef01c0c53b0e2931b1347c9ea350a8bfbbe7 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 14:20:46 +0200 Subject: [PATCH 07/11] Add file comment --- tracetools_launch/trace.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index 156af97..b260e43 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -1,3 +1,4 @@ +"""Module for the Trace action.""" import os from typing import List From 410162dba9c43abc51ea5a711d4e090028579fcf Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 14:21:01 +0200 Subject: [PATCH 08/11] Implement __repr__ for trace action --- tracetools_launch/trace.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index b260e43..3ffc244 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -55,3 +55,10 @@ class Trace(Action): print('destroying tracing session!') lttng.lttng_stop(self.__session_name) lttng.lttng_destroy(self.__session_name) + + def __repr__(self): + return "Trace("\ + f"session_name='{self.__session_name}', "\ + f"path='{self.__path}', "\ + f"num_events_ust={len(self.__events_ust)}, "\ + f"num_events_kernel={len(self.__events_kernel)})" From 4487d974d4793ded95d0422545e9e140e17a7a64 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 14:24:30 +0200 Subject: [PATCH 09/11] Add typing info --- tracetools_launch/trace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index 3ffc244..68f6d37 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -42,7 +42,7 @@ class Trace(Action): # TODO make sure this is done as early as possible self._setup() - def _setup(self): + def _setup(self) -> None: print('setting up tracing!') lttng.lttng_setup( self.__session_name, @@ -51,7 +51,7 @@ class Trace(Action): kernel_events=self.__events_kernel) lttng.lttng_start(self.__session_name) - def _destroy(self, event: Event, context: LaunchContext): + def _destroy(self, event: Event, context: LaunchContext) -> None: print('destroying tracing session!') lttng.lttng_stop(self.__session_name) lttng.lttng_destroy(self.__session_name) From 03e943918c0dc1fd144e81e3493117290d20568e Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 14:33:56 +0200 Subject: [PATCH 10/11] Format --- tracetools_launch/trace.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index 68f6d37..0323d98 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -20,12 +20,13 @@ class Trace(Action): """ def __init__( - self, *, + self, + *, session_name: str, base_path: str = '/tmp', events_ust: List[str] = names.DEFAULT_EVENTS_ROS, events_kernel: List[str] = names.DEFAULT_EVENTS_KERNEL, - **kwargs + **kwargs, ) -> None: """Constructor.""" super().__init__(**kwargs) @@ -36,9 +37,7 @@ class Trace(Action): def execute(self, context: LaunchContext) -> Optional[List[Action]]: # TODO make sure this is done as late as possible - context.register_event_handler(OnShutdown( - on_shutdown=self._destroy, - )) + context.register_event_handler(OnShutdown(on_shutdown=self._destroy)) # TODO make sure this is done as early as possible self._setup() @@ -57,8 +56,10 @@ class Trace(Action): lttng.lttng_destroy(self.__session_name) def __repr__(self): - return "Trace("\ - f"session_name='{self.__session_name}', "\ - f"path='{self.__path}', "\ - f"num_events_ust={len(self.__events_ust)}, "\ + return ( + "Trace(" + f"session_name='{self.__session_name}', " + f"path='{self.__path}', " + f"num_events_ust={len(self.__events_ust)}, " f"num_events_kernel={len(self.__events_kernel)})" + ) From 5ecd96ab5cfc9d3453a2e40a9590162255ff9c00 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 15:51:13 +0200 Subject: [PATCH 11/11] Wrap lttng init and fini methods --- tracetools_launch/trace.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tracetools_launch/trace.py b/tracetools_launch/trace.py index 156af97..766fa15 100644 --- a/tracetools_launch/trace.py +++ b/tracetools_launch/trace.py @@ -43,14 +43,12 @@ class Trace(Action): def _setup(self): print('setting up tracing!') - lttng.lttng_setup( + lttng.lttng_init( self.__session_name, self.__path, ros_events=self.__events_ust, kernel_events=self.__events_kernel) - lttng.lttng_start(self.__session_name) def _destroy(self, event: Event, context: LaunchContext): print('destroying tracing session!') - lttng.lttng_stop(self.__session_name) - lttng.lttng_destroy(self.__session_name) + lttng.lttng_fini(self.__session_name)