Add some extra context info to the crashes

This commit is contained in:
Jaime van Kessel 2019-11-22 14:41:54 +01:00
parent c7649e3db1
commit 466c90ca6c
No known key found for this signature in database
GPG key ID: 3710727397403C91

View file

@ -1,4 +1,4 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import platform import platform
@ -9,16 +9,12 @@ import os
import os.path import os.path
import time import time
import json import json
import ssl from typing import cast
import urllib.request
import urllib.error
from sentry_sdk.hub import Hub from sentry_sdk.hub import Hub
from sentry_sdk.utils import capture_internal_exceptions, event_from_exception from sentry_sdk.utils import event_from_exception
from sentry_sdk import configure_scope from sentry_sdk import configure_scope
import certifi
from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QUrl from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QUrl
from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton
from PyQt5.QtGui import QDesktopServices from PyQt5.QtGui import QDesktopServices
@ -28,6 +24,7 @@ from UM.Logger import Logger
from UM.View.GL.OpenGL import OpenGL from UM.View.GL.OpenGL import OpenGL
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from UM.Resources import Resources from UM.Resources import Resources
from cura import ApplicationMetadata
catalog = i18nCatalog("cura") catalog = i18nCatalog("cura")
@ -48,9 +45,8 @@ skip_exception_types = [
GeneratorExit GeneratorExit
] ]
class CrashHandler:
crash_url = "https://stats.ultimaker.com/api/cura"
class CrashHandler:
def __init__(self, exception_type, value, tb, has_started = True): def __init__(self, exception_type, value, tb, has_started = True):
self.exception_type = exception_type self.exception_type = exception_type
self.value = value self.value = value
@ -58,15 +54,11 @@ class CrashHandler:
self.has_started = has_started self.has_started = has_started
self.dialog = None # Don't create a QDialog before there is a QApplication self.dialog = None # Don't create a QDialog before there is a QApplication
# While we create the GUI, the information will be stored for sending afterwards
self.data = dict()
self.data["time_stamp"] = time.time()
Logger.log("c", "An uncaught error has occurred!") Logger.log("c", "An uncaught error has occurred!")
for line in traceback.format_exception(exception_type, value, tb): for line in traceback.format_exception(exception_type, value, tb):
for part in line.rstrip("\n").split("\n"): for part in line.rstrip("\n").split("\n"):
Logger.log("c", part) Logger.log("c", part)
self.data = {}
# If Cura has fully started, we only show fatal errors. # If Cura has fully started, we only show fatal errors.
# If Cura has not fully started yet, we always show the early crash dialog. Otherwise, Cura will just crash # If Cura has not fully started yet, we always show the early crash dialog. Otherwise, Cura will just crash
# without any information. # without any information.
@ -204,6 +196,7 @@ class CrashHandler:
scope.set_tag("pyqt_version", PYQT_VERSION_STR) scope.set_tag("pyqt_version", PYQT_VERSION_STR)
scope.set_tag("os", platform.system()) scope.set_tag("os", platform.system())
scope.set_tag("os_version", platform.version()) scope.set_tag("os_version", platform.version())
scope.set_tag("is_enterprise", ApplicationMetadata.IsEnterpriseVersion)
return group return group
@ -220,10 +213,31 @@ class CrashHandler:
info += "</ul>" info += "</ul>"
self.data["opengl"] = {"version": opengl_instance.getOpenGLVersion(), "vendor": opengl_instance.getGPUVendorName(), "type": opengl_instance.getGPUType()} self.data["opengl"] = {"version": opengl_instance.getOpenGLVersion(), "vendor": opengl_instance.getGPUVendorName(), "type": opengl_instance.getGPUType()}
active_machine_definition_id = "unknown"
active_machine_manufacterer = "unknown"
try:
from cura.CuraApplication import CuraApplication
application = cast(CuraApplication, Application.getInstance())
machine_manager = application.getMachineManager()
global_stack = machine_manager.activeMachine
if global_stack is None:
active_machine_definition_id = "empty"
active_machine_manufacterer = "empty"
else:
active_machine_definition_id = global_stack.definition.getId()
active_machine_manufacterer = global_stack.definition.getMetaDataEntry("manufacturer", "unknown")
except:
pass
with configure_scope() as scope: with configure_scope() as scope:
scope.set_tag("opengl_version", opengl_instance.getOpenGLVersion()) scope.set_tag("opengl_version", opengl_instance.getOpenGLVersion())
scope.set_tag("gpu_vendor", opengl_instance.getGPUVendorName()) scope.set_tag("gpu_vendor", opengl_instance.getGPUVendorName())
scope.set_tag("gpu_type", opengl_instance.getGPUType()) scope.set_tag("gpu_type", opengl_instance.getGPUType())
scope.set_tag("active_machine", active_machine_definition_id)
scope.set_tag("active_machine_manufacterer", active_machine_manufacterer)
return info return info
def _exceptionInfoWidget(self): def _exceptionInfoWidget(self):