From ba5a0b008502870f9cb2953383aab3d1c41915f1 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Thu, 2 Jan 2020 22:22:44 +0100 Subject: [PATCH] SentrySDK: Turn on deep integration on demand Only whenever the sentry_sdk module is there functions of this module will be used. The only changes, which were needed to be made, are done on cura_app.py and cura.CrashHandler. Whenever the module is not available, it's functions will be omitted. The if-clauses could happen earlier, but this at least the bare minimum, and, to be honest, on Ultimaker's distribution it won't speed up anything. I expect the if-clause to take the same amount of runtime sooner or later. The check is the same and it should be on Ultimaker's distribution always be "True". Signed-off-by: Thomas Karl Pietrowski (github: thopiekar) --- cura/CrashHandler.py | 81 +++++++++++++++++++++++++++----------------- cura_app.py | 37 +++++++++++--------- 2 files changed, 70 insertions(+), 48 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 09fda25a73..6b33dc2d03 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -12,9 +12,13 @@ import json import locale from typing import cast -from sentry_sdk.hub import Hub -from sentry_sdk.utils import event_from_exception -from sentry_sdk import configure_scope +try: + from sentry_sdk.hub import Hub + from sentry_sdk.utils import event_from_exception + from sentry_sdk import configure_scope + with_sentry_sdk = True +except ImportError: + with_sentry_sdk = False from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QUrl from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton @@ -66,8 +70,9 @@ class CrashHandler: if has_started and exception_type in skip_exception_types: return - with configure_scope() as scope: - scope.set_tag("during_startup", not has_started) + if with_sentry_sdk: + with configure_scope() as scope: + scope.set_tag("during_startup", not has_started) if not has_started: self._send_report_checkbox = None @@ -203,16 +208,17 @@ class CrashHandler: layout.addWidget(label) group.setLayout(layout) - with configure_scope() as scope: - scope.set_tag("qt_version", QT_VERSION_STR) - scope.set_tag("pyqt_version", PYQT_VERSION_STR) - scope.set_tag("os", platform.system()) - scope.set_tag("os_version", platform.version()) - scope.set_tag("locale_os", self.data["locale_os"]) - scope.set_tag("locale_cura", self.cura_locale) - scope.set_tag("is_enterprise", ApplicationMetadata.IsEnterpriseVersion) - - scope.set_user({"id": str(uuid.getnode())}) + if with_sentry_sdk: + with configure_scope() as scope: + scope.set_tag("qt_version", QT_VERSION_STR) + scope.set_tag("pyqt_version", PYQT_VERSION_STR) + scope.set_tag("os", platform.system()) + scope.set_tag("os_version", platform.version()) + scope.set_tag("locale_os", self.data["locale_os"]) + scope.set_tag("locale_cura", self.cura_locale) + scope.set_tag("is_enterprise", ApplicationMetadata.IsEnterpriseVersion) + + scope.set_user({"id": str(uuid.getnode())}) return group @@ -247,12 +253,13 @@ class CrashHandler: except: pass - with configure_scope() as scope: - scope.set_tag("opengl_version", opengl_instance.getOpenGLVersion()) - scope.set_tag("gpu_vendor", opengl_instance.getGPUVendorName()) - scope.set_tag("gpu_type", opengl_instance.getGPUType()) - scope.set_tag("active_machine", active_machine_definition_id) - scope.set_tag("active_machine_manufacturer", active_machine_manufacturer) + if with_sentry_sdk: + with configure_scope() as scope: + scope.set_tag("opengl_version", opengl_instance.getOpenGLVersion()) + scope.set_tag("gpu_vendor", opengl_instance.getGPUVendorName()) + scope.set_tag("gpu_type", opengl_instance.getGPUType()) + scope.set_tag("active_machine", active_machine_definition_id) + scope.set_tag("active_machine_manufacturer", active_machine_manufacturer) return info @@ -335,9 +342,10 @@ class CrashHandler: "module_name": module_name, "version": module_version, "is_plugin": isPlugin} self.data["exception"] = exception_dict - with configure_scope() as scope: - scope.set_tag("is_plugin", isPlugin) - scope.set_tag("module", module_name) + if with_sentry_sdk: + with configure_scope() as scope: + scope.set_tag("is_plugin", isPlugin) + scope.set_tag("module", module_name) return group @@ -396,15 +404,24 @@ class CrashHandler: # Before sending data, the user comments are stored self.data["user_info"] = self.user_description_text_area.toPlainText() - try: - hub = Hub.current - event, hint = event_from_exception((self.exception_type, self.value, self.traceback)) - hub.capture_event(event, hint=hint) - hub.flush() - except Exception as e: # We don't want any exception to cause problems - Logger.logException("e", "An exception occurred while trying to send crash report") + if with_sentry_sdk: + try: + hub = Hub.current + event, hint = event_from_exception((self.exception_type, self.value, self.traceback)) + hub.capture_event(event, hint=hint) + hub.flush() + except Exception as e: # We don't want any exception to cause problems + Logger.logException("e", "An exception occurred while trying to send crash report") + if not self.has_started: + print("An exception occurred while trying to send crash report: %s" % e) + else: + msg = "SentrySDK is not available and the report could not be sent." + Logger.logException("e", msg) if not self.has_started: - print("An exception occurred while trying to send crash report: %s" % e) + print(msg) + print("Exception type: {}".format(self.exception_type)) + print("Value: {}".format(self.value)) + print("Traceback: {}".format(self.traceback)) os._exit(1) diff --git a/cura_app.py b/cura_app.py index 51f9041e86..cb97792662 100755 --- a/cura_app.py +++ b/cura_app.py @@ -12,7 +12,11 @@ from UM.Platform import Platform from cura import ApplicationMetadata from cura.ApplicationMetadata import CuraAppName -import sentry_sdk +try: + import sentry_sdk + with_sentry_sdk = True +except ImportError: + with_sentry_sdk = False parser = argparse.ArgumentParser(prog = "cura", add_help = False) @@ -24,21 +28,22 @@ parser.add_argument("--debug", known_args = vars(parser.parse_known_args()[0]) -sentry_env = "production" -if ApplicationMetadata.CuraVersion == "master": - sentry_env = "development" -try: - if ApplicationMetadata.CuraVersion.split(".")[2] == "99": - sentry_env = "nightly" -except IndexError: - pass - -sentry_sdk.init("https://5034bf0054fb4b889f82896326e79b13@sentry.io/1821564", - environment = sentry_env, - release = "cura%s" % ApplicationMetadata.CuraVersion, - default_integrations = False, - max_breadcrumbs = 300, - server_name = "cura") +if with_sentry_sdk: + sentry_env = "production" + if ApplicationMetadata.CuraVersion == "master": + sentry_env = "development" + try: + if ApplicationMetadata.CuraVersion.split(".")[2] == "99": + sentry_env = "nightly" + except IndexError: + pass + + sentry_sdk.init("https://5034bf0054fb4b889f82896326e79b13@sentry.io/1821564", + environment = sentry_env, + release = "cura%s" % ApplicationMetadata.CuraVersion, + default_integrations = False, + max_breadcrumbs = 300, + server_name = "cura") if not known_args["debug"]: def get_cura_dir_path():