diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d307b45..94a8530 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -50,7 +50,9 @@ no_lttng: image: $BASE_IMAGE_ID:$DISTRO-base script: - colcon build --symlink-install --event-handlers console_cohesion+ --packages-up-to $PACKAGES_LIST + - . install/setup.sh - (! ./build/tracetools/status) + - (! ros2 trace) - colcon test --event-handlers console_cohesion+ --packages-select $PACKAGES_LIST - colcon test-result --all <<: *global_artifacts diff --git a/tracetools_trace/tracetools_trace/tools/lttng.py b/tracetools_trace/tracetools_trace/tools/lttng.py index ad402ef..31a7d93 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tracetools_trace/tools/lttng.py @@ -14,8 +14,9 @@ """Interface for tracing with LTTng.""" +import platform +import subprocess import sys - from typing import List from typing import Optional @@ -83,3 +84,35 @@ def lttng_fini( """ _lttng.stop(session_name) _lttng.destroy(session_name) + + +def is_lttng_installed() -> bool: + """ + Check if LTTng is installed. + + It first checks if the OS can support LTTng. + If so, it then simply checks if LTTng is installed using the 'lttng' command. + + :return: True if it is installed, False otherwise + """ + message_doc = ( + 'Cannot trace. See documentation at: ' + 'https://gitlab.com/micro-ROS/ros_tracing/ros2_tracing' + ) + system = platform.system() + if 'Linux' != system: + print(f"System '{system}' does not support LTTng.\n{message_doc}", file=sys.stderr) + return False + try: + process = subprocess.Popen( + ['lttng', '--version'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + _, stderr = process.communicate() + if 0 != process.returncode: + raise RuntimeError(stderr.decode()) + return True + except Exception as e: + print(f'LTTng not found: {e}\n{message_doc}', file=sys.stderr) + return False diff --git a/tracetools_trace/tracetools_trace/trace.py b/tracetools_trace/tracetools_trace/trace.py index 1f3aad9..bfdd3d2 100644 --- a/tracetools_trace/tracetools_trace/trace.py +++ b/tracetools_trace/tracetools_trace/trace.py @@ -15,6 +15,7 @@ """Entrypoint/script to setup and start an LTTng tracing session.""" +import sys from typing import List from tracetools_trace.tools import args @@ -41,6 +42,9 @@ def init( :param context_names: list of context names to enable :param display_list: whether to display list(s) of enabled events and context names """ + if not lttng.is_lttng_installed(): + sys.exit(2) + ust_enabled = len(ros_events) > 0 kernel_enabled = len(kernel_events) > 0 if ust_enabled: