From 69ba4eadc4b1f10cd468cf4390c93f7114f625d1 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 9 Jan 2020 11:54:46 -0500 Subject: [PATCH 1/6] Print to stderr if lttng Python package is not found --- tracetools_trace/tracetools_trace/tools/lttng.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tracetools_trace/tracetools_trace/tools/lttng.py b/tracetools_trace/tracetools_trace/tools/lttng.py index d358475..2f0b5eb 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tracetools_trace/tools/lttng.py @@ -14,6 +14,8 @@ """Interface for tracing with LTTng.""" +import sys + from typing import List from typing import Optional @@ -23,6 +25,7 @@ try: _lttng = lttng_impl except ImportError: # Fall back on empty functions + print('Warning: lttng Python package not found', file=sys.stderr) from . import lttng_stub _lttng = lttng_stub From 1366f709e1682c75da4b722d863b8db18b02cab1 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 9 Jan 2020 19:53:09 -0500 Subject: [PATCH 2/6] Raise RuntimeError instead of printing warning if lttng module not found --- tracetools_trace/tracetools_trace/tools/lttng.py | 1 - tracetools_trace/tracetools_trace/tools/lttng_stub.py | 11 +++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tracetools_trace/tracetools_trace/tools/lttng.py b/tracetools_trace/tracetools_trace/tools/lttng.py index 2f0b5eb..2c8dca7 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tracetools_trace/tools/lttng.py @@ -25,7 +25,6 @@ try: _lttng = lttng_impl except ImportError: # Fall back on empty functions - print('Warning: lttng Python package not found', file=sys.stderr) from . import lttng_stub _lttng = lttng_stub diff --git a/tracetools_trace/tracetools_trace/tools/lttng_stub.py b/tracetools_trace/tracetools_trace/tools/lttng_stub.py index 47c0c63..358ad70 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng_stub.py +++ b/tracetools_trace/tracetools_trace/tools/lttng_stub.py @@ -15,17 +15,20 @@ """Stub version of the interface for tracing with LTTng.""" +ERROR_MESSAGE = 'lttng Python module not found' + + def setup(*args, **kwargs) -> None: - pass + raise RuntimeError(ERROR_MESSAGE) def start(*args, **kwargs) -> None: - pass + raise RuntimeError(ERROR_MESSAGE) def stop(*args, **kwargs) -> None: - pass + raise RuntimeError(ERROR_MESSAGE) def destroy(*args, **kwargs) -> None: - pass + raise RuntimeError(ERROR_MESSAGE) From 3a715c7a2eb18f2f3b1e7b32d9c16dc04a0fc0de Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 9 Jan 2020 19:53:34 -0500 Subject: [PATCH 3/6] Add more information to comment about lttng stub functions --- tracetools_trace/tracetools_trace/tools/lttng.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracetools_trace/tracetools_trace/tools/lttng.py b/tracetools_trace/tracetools_trace/tools/lttng.py index 2c8dca7..aeb38ff 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tracetools_trace/tools/lttng.py @@ -24,7 +24,7 @@ try: _lttng = lttng_impl except ImportError: - # Fall back on empty functions + # Fall back on stub functions so that this still passes linter checks from . import lttng_stub _lttng = lttng_stub From 3980c2dd016a5e0821fa5c157af83a4e64fea893 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 9 Jan 2020 20:21:44 -0500 Subject: [PATCH 4/6] Check version of LTTng Python module and raise error if below 2.10.7 --- .../tracetools_trace/tools/lttng.py | 9 +++++++++ .../tracetools_trace/tools/lttng_impl.py | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/tracetools_trace/tracetools_trace/tools/lttng.py b/tracetools_trace/tracetools_trace/tools/lttng.py index aeb38ff..6bcd0cb 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tracetools_trace/tools/lttng.py @@ -23,6 +23,15 @@ try: from . import lttng_impl _lttng = lttng_impl + + # Check lttng module version + from distutils.version import StrictVersion + current_version = _lttng.get_version() + LTTNG_MIN_VERSION = '2.10.7' + if current_version is None or current_version < StrictVersion(LTTNG_MIN_VERSION): + raise RuntimeError( + f'lttng module version >={LTTNG_MIN_VERSION} required, found {str(current_version)}' + ) except ImportError: # Fall back on stub functions so that this still passes linter checks from . import lttng_stub diff --git a/tracetools_trace/tracetools_trace/tools/lttng_impl.py b/tracetools_trace/tracetools_trace/tools/lttng_impl.py index 9e488d8..0a959eb 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng_impl.py +++ b/tracetools_trace/tracetools_trace/tools/lttng_impl.py @@ -14,8 +14,11 @@ """Implementation of the interface for tracing with LTTng.""" +from distutils.version import StrictVersion +import re from typing import List from typing import Optional +from typing import Union import lttng @@ -26,6 +29,23 @@ from .path import DEFAULT_BASE_PATH from .path import get_full_session_path +def get_version() -> Union[StrictVersion, None]: + """ + Get the version of the lttng module. + + The module does not have a __version__ attribute, but the version is mentioned in its __doc__, + and seems to be written in a consistent way across versions. + + :return: the version as a StrictVersion object, or `None` if it cannot be extracted + """ + doc_lines = lttng.__doc__.split('\n') + first_line = list(filter(None, doc_lines))[0] + version_string = first_line.split(' ')[1] + if not re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+$').match(version_string): + return None + return StrictVersion(version_string) + + def setup( session_name: str, base_path: str = DEFAULT_BASE_PATH, From da9f4230a8c206a872f336333cfeae1996f02e50 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 9 Jan 2020 20:57:08 -0500 Subject: [PATCH 5/6] Print to stderr instead of raising error if version does not match --- tracetools_trace/tracetools_trace/tools/lttng.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tracetools_trace/tracetools_trace/tools/lttng.py b/tracetools_trace/tracetools_trace/tools/lttng.py index 6bcd0cb..782b9cf 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng.py +++ b/tracetools_trace/tracetools_trace/tools/lttng.py @@ -29,8 +29,9 @@ try: current_version = _lttng.get_version() LTTNG_MIN_VERSION = '2.10.7' if current_version is None or current_version < StrictVersion(LTTNG_MIN_VERSION): - raise RuntimeError( - f'lttng module version >={LTTNG_MIN_VERSION} required, found {str(current_version)}' + print( + f'lttng module version >={LTTNG_MIN_VERSION} required, found {str(current_version)}', + file=sys.stderr, ) except ImportError: # Fall back on stub functions so that this still passes linter checks From 38e0afe41743559f026081fc858c81b7db27aff8 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Thu, 9 Jan 2020 21:41:04 -0500 Subject: [PATCH 6/6] Modify error message --- tracetools_trace/tracetools_trace/tools/lttng_stub.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracetools_trace/tracetools_trace/tools/lttng_stub.py b/tracetools_trace/tracetools_trace/tools/lttng_stub.py index 358ad70..ce7ecc7 100644 --- a/tracetools_trace/tracetools_trace/tools/lttng_stub.py +++ b/tracetools_trace/tracetools_trace/tools/lttng_stub.py @@ -15,7 +15,7 @@ """Stub version of the interface for tracing with LTTng.""" -ERROR_MESSAGE = 'lttng Python module not found' +ERROR_MESSAGE = 'lttng module not found, but still tried to use it' def setup(*args, **kwargs) -> None: