From 1868258871a52cbbef3b5a96b48f9aaf02af3642 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 15:51:13 +0200 Subject: [PATCH 1/4] Wrap lttng init and fini methods --- tracetools_trace/tools/lttng.py | 38 +++++++++++++++++++++++++++++---- tracetools_trace/trace.py | 7 ++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/tracetools_trace/tools/lttng.py b/tracetools_trace/tools/lttng.py index a5f4fac..6ce3d58 100644 --- a/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tools/lttng.py @@ -14,7 +14,37 @@ from .names import ( # noqa: E402 ) -def lttng_setup( +def lttng_init( + session_name: str, + full_path: str, + ros_events: List[str] = DEFAULT_EVENTS_ROS, + kernel_events: List[str] = DEFAULT_EVENTS_KERNEL, + context_names: List[str] = DEFAULT_CONTEXT +) -> None: + """ + Set up and start LTTng session. + + :param session_name: the name of the session + :param full_path: the full path to the main directory to write trace data to + :param ros_events: list of ROS events to enable + :param kernel_events: list of kernel events to enable + :param context_names: list of context elements to enable + """ + _lttng_setup(session_name, full_path, ros_events, kernel_events, context_names) + _lttng_start(session_name) + + +def lttng_fini(session_name: str) -> None: + """ + Stop and destroy LTTng session. + + :param session_name: the name of the session + """ + _lttng_stop(session_name) + _lttng_destroy(session_name) + + +def _lttng_setup( session_name: str, full_path: str, ros_events: List[str] = DEFAULT_EVENTS_ROS, @@ -82,7 +112,7 @@ def lttng_setup( _add_context(enabled_handles, context_list) -def lttng_start(session_name: str) -> None: +def _lttng_start(session_name: str) -> None: """ Start LTTng session, and check for errors. @@ -93,7 +123,7 @@ def lttng_start(session_name: str) -> None: raise RuntimeError(f'failed to start tracing: {lttng.strerror(result)}') -def lttng_stop(session_name: str) -> None: +def _lttng_stop(session_name: str) -> None: """ Stop LTTng session, and check for errors. @@ -104,7 +134,7 @@ def lttng_stop(session_name: str) -> None: raise RuntimeError(f'failed to stop tracing: {lttng.strerror(result)}') -def lttng_destroy(session_name: str) -> None: +def _lttng_destroy(session_name: str) -> None: """ Destroy LTTng session, and check for errors. diff --git a/tracetools_trace/trace.py b/tracetools_trace/trace.py index fe7269f..166ca99 100644 --- a/tracetools_trace/trace.py +++ b/tracetools_trace/trace.py @@ -60,13 +60,10 @@ def main(): else: print('kernel tracing disabled') - lttng.lttng_setup(session_name, full_path, ros_events=ros_events, kernel_events=kernel_events) print(f'writting tracing session to: {full_path}') - input('press enter to start...') - lttng.lttng_start(session_name) + lttng.lttng_init(session_name, full_path, ros_events=ros_events, kernel_events=kernel_events) input('press enter to stop...') print('stopping & destroying tracing session') - lttng.lttng_stop(session_name) - lttng.lttng_destroy(session_name) + lttng.lttng_fini(session_name) From a8fe961bb0ffa3c2f1f1d93d1ccee97ec359bc9c Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 16:02:48 +0200 Subject: [PATCH 2/4] Extract args parsing method --- tracetools_trace/tools/args.py | 34 ++++++++++++++++++++++++++ tracetools_trace/trace.py | 44 +++++++--------------------------- 2 files changed, 42 insertions(+), 36 deletions(-) create mode 100644 tracetools_trace/tools/args.py diff --git a/tracetools_trace/tools/args.py b/tracetools_trace/tools/args.py new file mode 100644 index 0000000..e9aaa5b --- /dev/null +++ b/tracetools_trace/tools/args.py @@ -0,0 +1,34 @@ +import argparse +import time + +from . import names + + +def parse_args(): + """ + Parse args for tracing. + """ + parser = argparse.ArgumentParser(description='Setup and launch an LTTng tracing session.') + parser.add_argument( + '--session-name', '-s', dest='session_name', + default=f'session-{time.strftime("%Y%m%d%H%M%S")}', + help='the name of the tracing session (default: session-YYYYMMDDHHMMSS)') + parser.add_argument( + '--path', '-p', dest='path', + default='/tmp', + help='path of the base directory for trace data (default: %(default)s)') + parser.add_argument( + '--ust', '-u', nargs='*', dest='events_ust', default=names.DEFAULT_EVENTS_ROS, + help='the ROS UST events to enable (default: all events) ' + '[to disable all UST events, ' + 'provide this flag without any event name]') + parser.add_argument( + '--kernel', '-k', nargs='*', dest='events_kernel', + default=names.DEFAULT_EVENTS_KERNEL, + help='the kernel events to enable (default: all events) ' + '[to disable all UST events, ' + 'provide this flag without any event name]') + parser.add_argument( + '--list', '-l', dest='list', action='store_true', + help='display lists of enabled events (default: %(default)s)') + return parser.parse_args() diff --git a/tracetools_trace/trace.py b/tracetools_trace/trace.py index 166ca99..16639dc 100644 --- a/tracetools_trace/trace.py +++ b/tracetools_trace/trace.py @@ -1,61 +1,33 @@ #!/usr/bin/env python3 # Entrypoint/script to setup and start an LTTng tracing session -import argparse import os -import time +from tracetools_trace.tools import args from tracetools_trace.tools import lttng from tracetools_trace.tools import names -def parse_args(): - parser = argparse.ArgumentParser(description='Setup and launch an LTTng tracing session.') - parser.add_argument( - '--session-name', '-s', dest='session_name', - default=f'session-{time.strftime("%Y%m%d%H%M%S")}', - help='the name of the tracing session (default: session-YYYYMMDDHHMMSS)') - parser.add_argument( - '--path', '-p', dest='path', - default='/tmp', - help='path of the base directory for trace data (default: %(default)s)') - parser.add_argument( - '--ust', '-u', nargs='*', dest='events_ust', default=names.DEFAULT_EVENTS_ROS, - help='the ROS UST events to enable (default: all events) ' - '[to disable all UST events, ' - 'provide this flag without any event name]') - parser.add_argument( - '--kernel', '-k', nargs='*', dest='events_kernel', - default=names.DEFAULT_EVENTS_KERNEL, - help='the kernel events to enable (default: all events) ' - '[to disable all UST events, ' - 'provide this flag without any event name]') - parser.add_argument( - '--list', '-l', dest='list', action='store_true', - help='display lists of enabled events (default: %(default)s)') - return parser.parse_args() - - def main(): - args = parse_args() + params = args.parse_args() - session_name = args.session_name - base_path = args.path + session_name = params.session_name + base_path = params.path full_path = os.path.join(base_path, session_name) - ros_events = args.events_ust - kernel_events = args.events_kernel + ros_events = params.events_ust + kernel_events = params.events_kernel ust_enabled = len(ros_events) > 0 kernel_enabled = len(kernel_events) > 0 if ust_enabled: print(f'UST tracing enabled ({len(ros_events)} events)') - if args.list: + if params.list: print(f'\tevents: {ros_events}') else: print('UST tracing disabled') if kernel_enabled: print(f'kernel tracing enabled ({len(kernel_events)} events)') - if args.list: + if params.list: print(f'\tevents: {kernel_events}') else: print('kernel tracing disabled') From 10210566a6ff55f7e0abf0ee6e914619548c1352 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 17:42:44 +0200 Subject: [PATCH 3/4] Extract add_arguments() from parse_args() --- tracetools_trace/tools/args.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tracetools_trace/tools/args.py b/tracetools_trace/tools/args.py index e9aaa5b..fbf3b09 100644 --- a/tracetools_trace/tools/args.py +++ b/tracetools_trace/tools/args.py @@ -9,6 +9,11 @@ def parse_args(): Parse args for tracing. """ parser = argparse.ArgumentParser(description='Setup and launch an LTTng tracing session.') + add_arguments(parser) + return parser.parse_args() + + +def add_arguments(parser): parser.add_argument( '--session-name', '-s', dest='session_name', default=f'session-{time.strftime("%Y%m%d%H%M%S")}', @@ -31,4 +36,3 @@ def parse_args(): parser.add_argument( '--list', '-l', dest='list', action='store_true', help='display lists of enabled events (default: %(default)s)') - return parser.parse_args() From f2bb28215ef3c28c53cb39babbefe690f6bbb1bb Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 23 Jun 2019 18:18:47 +0200 Subject: [PATCH 4/4] Add completers for event names --- tracetools_trace/tools/args.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tracetools_trace/tools/args.py b/tracetools_trace/tools/args.py index fbf3b09..5959f8c 100644 --- a/tracetools_trace/tools/args.py +++ b/tracetools_trace/tools/args.py @@ -4,6 +4,17 @@ import time from . import names +class DefaultArgValueCompleter: + """Callable returning an arg's default value.""" + + def __init__(self, arg): + default = arg.default + self.list = default if isinstance(default, list) else [default] + + def __call__(self, **kwargs): + return self.list + + def parse_args(): """ Parse args for tracing. @@ -22,17 +33,19 @@ def add_arguments(parser): '--path', '-p', dest='path', default='/tmp', help='path of the base directory for trace data (default: %(default)s)') - parser.add_argument( + arg = parser.add_argument( '--ust', '-u', nargs='*', dest='events_ust', default=names.DEFAULT_EVENTS_ROS, help='the ROS UST events to enable (default: all events) ' '[to disable all UST events, ' 'provide this flag without any event name]') - parser.add_argument( + arg.completer = DefaultArgValueCompleter(arg) + arg = parser.add_argument( '--kernel', '-k', nargs='*', dest='events_kernel', default=names.DEFAULT_EVENTS_KERNEL, help='the kernel events to enable (default: all events) ' '[to disable all UST events, ' 'provide this flag without any event name]') + arg.completer = DefaultArgValueCompleter(arg) parser.add_argument( '--list', '-l', dest='list', action='store_true', help='display lists of enabled events (default: %(default)s)')