diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index b9be3d8936..d70a18eb9c 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1837,6 +1837,16 @@ def _get_installed_modules() -> "Dict[str, str]": def package_version(package: str) -> "Optional[Tuple[int, ...]]": + try: + from importlib import metadata + + metadata_version = metadata.version(package) + if metadata_version is not None: + return parse_version(metadata_version) + except Exception: + # < py3.8, or missing or broken metadata for this package + pass + normalized_package = _normalize_module_name( _replace_hyphens_dots_and_underscores_with_dashes(package) ) diff --git a/tests/test_utils.py b/tests/test_utils.py index 77def0eb6e..03c4373c24 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1412,6 +1412,15 @@ def test_package_version_is_none(): assert package_version("non_existent_package") is None +@pytest.mark.skipif(sys.version_info < (3, 8), reason="requires importlib.metadata") +def test_package_version_does_not_scan_installed_packages(): + with mock.patch("sentry_sdk.utils._generate_installed_modules") as generate: + with mock.patch("sentry_sdk.utils._installed_modules", None): + assert package_version("pytest") is not None + + generate.assert_not_called() + + @pytest.mark.parametrize( "kwargs, expected", [