From b023e5a96a7bc22e3843395665dcf96031bec490 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Fri, 14 Sep 2018 13:58:06 +0200 Subject: [PATCH 1/2] feat: Capture modules --- sentry_sdk/integrations/__init__.py | 2 ++ sentry_sdk/integrations/modules.py | 34 ++++++++++++++++++++++ tests/integrations/modules/test_modules.py | 13 +++++++++ 3 files changed, 49 insertions(+) create mode 100644 sentry_sdk/integrations/modules.py create mode 100644 tests/integrations/modules/test_modules.py diff --git a/sentry_sdk/integrations/__init__.py b/sentry_sdk/integrations/__init__.py index 2ab82f91e2..55dce10656 100644 --- a/sentry_sdk/integrations/__init__.py +++ b/sentry_sdk/integrations/__init__.py @@ -23,12 +23,14 @@ def get_default_integrations(): from sentry_sdk.integrations.excepthook import ExcepthookIntegration from sentry_sdk.integrations.dedupe import DedupeIntegration from sentry_sdk.integrations.atexit import AtexitIntegration + from sentry_sdk.integrations.modules import ModulesIntegration yield LoggingIntegration() yield StdlibIntegration() yield ExcepthookIntegration() yield DedupeIntegration() yield AtexitIntegration() + yield ModulesIntegration() def setup_integrations(integrations, with_defaults=True): diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py new file mode 100644 index 0000000000..f5e7bd1f2e --- /dev/null +++ b/sentry_sdk/integrations/modules.py @@ -0,0 +1,34 @@ +from __future__ import absolute_import + +from sentry_sdk.api import configure_scope +from sentry_sdk.integrations import Integration + +_installed_modules = None + +def _generate_installed_modules(): + try: + import pkg_resources + except ImportError: + return + + for info in pkg_resources.working_set: + yield info.key, info.version + + +def _get_installed_modules(): + global _installed_modules + if _installed_modules is None: + _installed_modules = dict(_generate_installed_modules()) + return _installed_modules + + +class ModulesIntegration(Integration): + identifier = "modules" + + def install(self): + with configure_scope() as scope: + @scope.add_event_processor + def processor(event, hint): + if "modules" not in event: + event["modules"] = dict(_get_installed_modules()) + return event diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py new file mode 100644 index 0000000000..6abc682977 --- /dev/null +++ b/tests/integrations/modules/test_modules.py @@ -0,0 +1,13 @@ +import sentry_sdk + +from sentry_sdk.integrations.modules import ModulesIntegration + +def test_basic(sentry_init, capture_events): + sentry_init(integrations=[ModulesIntegration()]) + events = capture_events() + + sentry_sdk.capture_exception(ValueError()) + + event, = events + assert 'sentry-sdk' in event['modules'] + assert 'pytest' in event['modules'] From fd0f635a96cf31465e981ef3563631d9e318ecb2 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Fri, 14 Sep 2018 14:17:56 +0200 Subject: [PATCH 2/2] fix: Stylefixes --- sentry_sdk/integrations/modules.py | 2 ++ tests/integrations/modules/test_modules.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index f5e7bd1f2e..7b6250e7c5 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -5,6 +5,7 @@ _installed_modules = None + def _generate_installed_modules(): try: import pkg_resources @@ -27,6 +28,7 @@ class ModulesIntegration(Integration): def install(self): with configure_scope() as scope: + @scope.add_event_processor def processor(event, hint): if "modules" not in event: diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 6abc682977..1529afc8e5 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -2,6 +2,7 @@ from sentry_sdk.integrations.modules import ModulesIntegration + def test_basic(sentry_init, capture_events): sentry_init(integrations=[ModulesIntegration()]) events = capture_events() @@ -9,5 +10,5 @@ def test_basic(sentry_init, capture_events): sentry_sdk.capture_exception(ValueError()) event, = events - assert 'sentry-sdk' in event['modules'] - assert 'pytest' in event['modules'] + assert "sentry-sdk" in event["modules"] + assert "pytest" in event["modules"]