You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
7.7 KiB
183 lines
7.7 KiB
From 2ea1946c0f83672f5289edcce207a8d2de03cc43 Mon Sep 17 00:00:00 2001
|
|
From: grossmj <grossmj@gns3.net>
|
|
Date: Tue, 19 May 2020 15:48:53 +0930
|
|
Subject: [PATCH] Replace Raven by Sentry SDK. Fixes
|
|
https://github.com/GNS3/gns3-server/issues/1758
|
|
|
|
---
|
|
gns3/crash_report.py | 111 +++++++++++++++++++++++++------------------
|
|
requirements.txt | 2 +-
|
|
2 files changed, 66 insertions(+), 47 deletions(-)
|
|
|
|
diff --git a/gns3/crash_report.py b/gns3/crash_report.py
|
|
index a6a555fd5..dfbb9fc46 100644
|
|
--- a/gns3/crash_report.py
|
|
+++ b/gns3/crash_report.py
|
|
@@ -23,12 +23,11 @@
|
|
import distro
|
|
|
|
try:
|
|
- import raven
|
|
- from raven.transport.http import HTTPTransport
|
|
- RAVEN_AVAILABLE = True
|
|
+ import sentry_sdk
|
|
+ SENTRY_SDK_AVAILABLE = True
|
|
except ImportError:
|
|
- # raven is not installed with deb package in order to simplify packaging
|
|
- RAVEN_AVAILABLE = False
|
|
+ # Sentry SDK is not installed with deb package in order to simplify packaging
|
|
+ SENTRY_SDK_AVAILABLE = False
|
|
|
|
from .utils.get_resource import get_resource
|
|
from .version import __version__, __version_info__
|
|
@@ -69,49 +68,50 @@ def __init__(self):
|
|
sentry_uncaught = logging.getLogger('sentry.errors.uncaught')
|
|
sentry_uncaught.disabled = True
|
|
|
|
- def captureException(self, exception, value, tb):
|
|
- from .local_server import LocalServer
|
|
- from .local_config import LocalConfig
|
|
- from .controller import Controller
|
|
- from .compute_manager import ComputeManager
|
|
-
|
|
- local_server = LocalServer.instance().localServerSettings()
|
|
- if local_server["report_errors"]:
|
|
- if not RAVEN_AVAILABLE:
|
|
- return
|
|
-
|
|
- if os.path.exists(LocalConfig.instance().runAsRootPath()):
|
|
- log.warning("User has run application as root. Crash reports are disabled.")
|
|
- sys.exit(1)
|
|
- return
|
|
+ if SENTRY_SDK_AVAILABLE:
|
|
+ cacert = None
|
|
+ if hasattr(sys, "frozen"):
|
|
+ cacert_resource = get_resource("cacert.pem")
|
|
+ if cacert_resource is not None and os.path.isfile(cacert_resource):
|
|
+ cacert = cacert_resource
|
|
+ else:
|
|
+ log.error("The SSL certificate bundle file '{}' could not be found".format(cacert_resource))
|
|
|
|
- if os.path.exists(".git"):
|
|
- log.warning("A .git directory exist crash report is turn off for developers. Instant exit")
|
|
- sys.exit(1)
|
|
- return
|
|
+ sentry_sdk.init(dsn=CrashReport.DSN,
|
|
+ release=__version__,
|
|
+ ca_certs=cacert)
|
|
|
|
- if hasattr(exception, "fingerprint"):
|
|
- client = raven.Client(CrashReport.DSN, release=__version__, fingerprint=['{{ default }}', exception.fingerprint], transport=HTTPTransport)
|
|
- else:
|
|
- client = raven.Client(CrashReport.DSN, release=__version__, transport=HTTPTransport)
|
|
- context = {
|
|
+ tags = {
|
|
"os:name": platform.system(),
|
|
"os:release": platform.release(),
|
|
"os:win_32": " ".join(platform.win32_ver()),
|
|
"os:mac": "{} {}".format(platform.mac_ver()[0], platform.mac_ver()[2]),
|
|
"os:linux": " ".join(distro.linux_distribution()),
|
|
+
|
|
+ }
|
|
+
|
|
+ self._add_qt_information(tags)
|
|
+
|
|
+ with sentry_sdk.configure_scope() as scope:
|
|
+ for key, value in tags.items():
|
|
+ scope.set_tag(key, value)
|
|
+
|
|
+ extra_context = {
|
|
"python:version": "{}.{}.{}".format(sys.version_info[0],
|
|
sys.version_info[1],
|
|
sys.version_info[2]),
|
|
"python:bit": struct.calcsize("P") * 8,
|
|
"python:encoding": sys.getdefaultencoding(),
|
|
- "python:frozen": "{}".format(hasattr(sys, "frozen")),
|
|
+ "python:frozen": "{}".format(hasattr(sys, "frozen"))
|
|
}
|
|
|
|
# extra controller and compute information
|
|
- extra_context = {"controller:version": Controller.instance().version(),
|
|
- "controller:host": Controller.instance().host(),
|
|
- "controller:connected": Controller.instance().connected()}
|
|
+ from .controller import Controller
|
|
+ from .compute_manager import ComputeManager
|
|
+ extra_context["controller:version"] = Controller.instance().version()
|
|
+ extra_context["controller:host"] = Controller.instance().host()
|
|
+ extra_context["controller:connected"] = Controller.instance().connected()
|
|
+
|
|
for index, compute in enumerate(ComputeManager.instance().computes()):
|
|
extra_context["compute{}:id".format(index)] = compute.id()
|
|
extra_context["compute{}:name".format(index)] = compute.name(),
|
|
@@ -120,27 +120,46 @@ def captureException(self, exception, value, tb):
|
|
extra_context["compute{}:platform".format(index)] = compute.capabilities().get("platform")
|
|
extra_context["compute{}:version".format(index)] = compute.capabilities().get("version")
|
|
|
|
- context = self._add_qt_information(context)
|
|
- client.tags_context(context)
|
|
- client.extra_context(extra_context)
|
|
+ with sentry_sdk.configure_scope() as scope:
|
|
+ for key, value in extra_context.items():
|
|
+ scope.set_extra(key, value)
|
|
+
|
|
+ def captureException(self, exception, value, tb):
|
|
+ from .local_server import LocalServer
|
|
+ from .local_config import LocalConfig
|
|
+
|
|
+ local_server = LocalServer.instance().localServerSettings()
|
|
+ if local_server["report_errors"]:
|
|
+ if not SENTRY_SDK_AVAILABLE:
|
|
+ return
|
|
+
|
|
+ if os.path.exists(LocalConfig.instance().runAsRootPath()):
|
|
+ log.warning("User is running application as root. Crash reports disabled.")
|
|
+ sys.exit(1)
|
|
+ return
|
|
+
|
|
+ if os.path.exists(".git"):
|
|
+ log.warning("A .git directory exists, crash reporting is turned off for developers.")
|
|
+ sys.exit(1)
|
|
+ return
|
|
+
|
|
try:
|
|
- report = client.captureException((exception, value, tb))
|
|
+ sentry_sdk.capture_exception((exception, value, tb))
|
|
+ log.info("Crash report sent with event ID: {}".format(sentry_sdk.last_event_id()))
|
|
except Exception as e:
|
|
log.error("Can't send crash report to Sentry: {}".format(e))
|
|
- return
|
|
- log.debug("Crash report sent with event ID: {}".format(client.get_ident(report)))
|
|
|
|
- def _add_qt_information(self, context):
|
|
+ def _add_qt_information(self, tags):
|
|
+
|
|
try:
|
|
from .qt import QtCore
|
|
from .qt import sip
|
|
except ImportError:
|
|
- return context
|
|
- context["psutil:version"] = psutil.__version__
|
|
- context["pyqt:version"] = QtCore.PYQT_VERSION_STR
|
|
- context["qt:version"] = QtCore.QT_VERSION_STR
|
|
- context["sip:version"] = sip.SIP_VERSION_STR
|
|
- return context
|
|
+ return tags
|
|
+ tags["pyqt:version"] = QtCore.PYQT_VERSION_STR
|
|
+ tags["qt:version"] = QtCore.QT_VERSION_STR
|
|
+ tags["sip:version"] = sip.SIP_VERSION_STR
|
|
+ return tags
|
|
|
|
@classmethod
|
|
def instance(cls):
|
|
diff --git a/requirements.txt b/requirements.txt
|
|
index 99e803f1b..abd6cc7c9 100644
|
|
--- a/requirements.txt
|
|
+++ b/requirements.txt
|
|
@@ -1,5 +1,5 @@
|
|
jsonschema==3.2.0; python_version >= '3.8' # pyup: ignore
|
|
jsonschema==2.6.0; python_version < '3.8' # pyup: ignore
|
|
-raven>=5.23.0
|
|
+sentry-sdk>=0.14.4
|
|
psutil==5.6.6
|
|
distro>=1.3.0
|