Skip to content

Commit 6bc4d9f

Browse files
authored
Merge pull request #4322 from OpenShot/sentry-improvements
Sentry & Metric Improvements
2 parents 7c83cf0 + 5d7dc0b commit 6bc4d9f

File tree

8 files changed

+76
-44
lines changed

8 files changed

+76
-44
lines changed

src/classes/info.py

+11
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,17 @@
103103
CURRENT_LANGUAGE = 'en_US'
104104
SUPPORTED_LANGUAGES = ['en_US']
105105

106+
# Sentry.io error reporting rate (0.0 TO 1.0)
107+
# 0.0 = no error reporting to Sentry
108+
# 0.5 = 1/2 of errors reported to Sentry
109+
# 1.0 = all errors reporting to Sentry
110+
# STABLE: If this version matches the current version (reported on openshot.org)
111+
# UNSTABLE: If this version does not match the current version (reported on openshot.org)
112+
# STABLE_VERSION: This is the current stable release reported by openshot.org
113+
ERROR_REPORT_RATE_STABLE = 0.0
114+
ERROR_REPORT_RATE_UNSTABLE = 0.0
115+
ERROR_REPORT_STABLE_VERSION = None
116+
106117
try:
107118
from language import openshot_lang
108119
language_path = ":/locale/"

src/classes/logger_libopenshot.py

+21-11
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,17 @@ class LoggerLibOpenShot(Thread):
3838
def __init__(self):
3939
super().__init__()
4040
self.daemon = True
41+
self.running = False
42+
self.context = None
43+
self.socket = None
44+
4145

4246
def kill(self):
4347
self.running = False
48+
if self.context:
49+
self.context.destroy()
50+
if self.socket:
51+
self.socket.close()
4452

4553
def run(self):
4654
# Running
@@ -63,23 +71,25 @@ def run(self):
6371
openshot.ZmqLogger.Instance().Enable(debug_enabled)
6472

6573
# Socket to talk to server
66-
context = zmq.Context()
67-
socket = context.socket(zmq.SUB)
68-
socket.setsockopt_string(zmq.SUBSCRIBE, '')
74+
self.context = zmq.Context()
75+
self.socket = self.context.socket(zmq.SUB)
76+
self.socket.setsockopt_string(zmq.SUBSCRIBE, '')
6977

7078
poller = zmq.Poller()
71-
poller.register(socket, zmq.POLLIN)
79+
poller.register(self.socket, zmq.POLLIN)
7280

7381
log.info("Connecting to libopenshot with debug port: %s" % port)
74-
socket.connect ("tcp://localhost:%s" % port)
82+
self.socket.connect("tcp://localhost:%s" % port)
7583

7684
while self.running:
7785
msg = None
7886

7987
# Receive all debug message sent from libopenshot (if any)
80-
socks = dict(poller.poll(1000))
81-
if socks and socks.get(socket) == zmq.POLLIN:
82-
msg = socket.recv(zmq.NOBLOCK)
83-
84-
if msg:
85-
log.info(msg.strip().decode('UTF-8'))
88+
try:
89+
socks = dict(poller.poll(1000))
90+
if socks and socks.get(self.socket) == zmq.POLLIN:
91+
msg = self.socket.recv(zmq.NOBLOCK)
92+
if msg:
93+
log.info(msg.strip().decode('UTF-8'))
94+
except Exception as ex:
95+
log.warning(ex)

src/classes/metrics.py

-2
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,6 @@ def send_metric(params):
173173
# Send metric HTTP data
174174
try:
175175
r = requests.get(url, headers={"user-agent": user_agent})
176-
log.info("Track metric: [%s] %s | (%s bytes)" % (r.status_code, r.url, len(r.content)))
177-
178176
except Exception:
179177
log.warning("Failed to track metric", exc_info=1)
180178

src/classes/sentry.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import platform
3030

31+
from classes.logger import log
3132
from classes import info
3233

3334
try:
@@ -47,12 +48,16 @@ def init_tracing():
4748
return
4849

4950
# Determine sample rate for exceptions
50-
traces_sample_rate = 0.1
51-
environment = "production"
52-
if "-dev" in info.VERSION:
53-
# Dev mode, trace all exceptions
54-
traces_sample_rate = 1.0
55-
environment = "development"
51+
traces_sample_rate = 0.0
52+
if info.VERSION == info.ERROR_REPORT_STABLE_VERSION:
53+
traces_sample_rate = info.ERROR_REPORT_RATE_STABLE
54+
environment = "production"
55+
else:
56+
traces_sample_rate = info.ERROR_REPORT_RATE_UNSTABLE
57+
environment = "unstable"
58+
59+
if info.ERROR_REPORT_STABLE_VERSION:
60+
log.info("Sentry initialized with %s error reporting rate (%s)" % (traces_sample_rate, environment))
5661

5762
# Initialize sentry exception tracing
5863
sdk.init(

src/classes/version.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from classes.app import get_app
3131
from classes import info
3232
from classes.logger import log
33-
import json
33+
3434

3535
def get_current_Version():
3636
"""Get the current version """
@@ -46,10 +46,13 @@ def get_version_from_http():
4646
# Send metric HTTP data
4747
try:
4848
r = requests.get(url, headers={"user-agent": "openshot-qt-%s" % info.VERSION}, verify=False)
49-
log.info("Found current version: %s" % r.text)
49+
log.info("Found current version: %s" % r.json())
5050

5151
# Parse version
52-
openshot_version = r.json()["openshot_version"]
52+
openshot_version = r.json().get("openshot_version")
53+
info.ERROR_REPORT_STABLE_VERSION = r.json().get("openshot_version")
54+
info.ERROR_REPORT_RATE_STABLE = r.json().get("error_rate_stable")
55+
info.ERROR_REPORT_RATE_UNSTABLE = r.json().get("error_rate_unstable")
5356

5457
# Emit signal for the UI
5558
get_app().window.FoundVersionSignal.emit(openshot_version)

src/settings/_default.settings

+3-3
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@
7878
"setting": "title_editor"
7979
},
8080
{
81-
"value": "AAAA/wAAAAD9AAAAAwAAAAAAAAEnAAAC3/wCAAAAA/wAAAJeAAAApwAAAAAA////+gAAAAACAAAAAfsAAAAYAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAAAAAAD/////AAAAAAAAAAD7AAAAHABkAG8AYwBrAFAAcgBvAHAAZQByAHQAaQBlAHMAAAAAJwAAAt8AAAChAP////sAAAAYAGQAbwBjAGsAVAB1AHQAbwByAGkAYQBsAgAAAAAAAAAAAAAAyAAAAGQAAAABAAABHAAAAUD8AgAAAAH7AAAAGABkAG8AYwBrAEsAZQB5AGYAcgBhAG0AZQEAAAFYAAAAFQAAAAAAAAAAAAAAAgAABEYAAALY/AEAAAAC/AAAAAAAAANnAAAA+gD////8AgAAAAL8AAAAJwAAAcAAAACvAP////wBAAAAAvwAAAAAAAABFQAAAHsA////+gAAAAACAAAAA/sAAAASAGQAbwBjAGsARgBpAGwAZQBzAQAAAAD/////AAAAkgD////7AAAAHgBkAG8AYwBrAFQAcgBhAG4AcwBpAHQAaQBvAG4AcwEAAAAA/////wAAAJIA////+wAAABYAZABvAGMAawBFAGYAZgBlAGMAdABzAQAAAAD/////AAAAkgD////7AAAAEgBkAG8AYwBrAFYAaQBkAGUAbwEAAAEbAAACTAAAAEcA////+wAAABgAZABvAGMAawBUAGkAbQBlAGwAaQBuAGUBAAAB7QAAARIAAACWAP////wAAANtAAAA2QAAAIIA////+gAAAAECAAAAAvsAAAAiAGQAbwBjAGsAQwBhAHAAdABpAG8AbgBFAGQAaQB0AG8AcgAAAAAA/////wAAAJgA////+wAAABQAZABvAGMAawBFAG0AbwBqAGkAcwEAAADFAAACOgAAAJIA////AAAERgAAAAEAAAABAAAAAgAAAAEAAAAC/AAAAAEAAAACAAAAAQAAAA4AdABvAG8AbABCAGEAcgEAAAAA/////wAAAAAAAAAA",
81+
"value": "AAAA/wAAAAD9AAAAAwAAAAAAAAEnAAAC3/wCAAAAA/wAAAJeAAAApwAAAAAA////+gAAAAACAAAAAfsAAAAYAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAAAAAAD/////AAAAAAAAAAD7AAAAHABkAG8AYwBrAFAAcgBvAHAAZQByAHQAaQBlAHMAAAAAJwAAAt8AAAChAP////sAAAAYAGQAbwBjAGsAVAB1AHQAbwByAGkAYQBsAgAABUQAAAF6AAABYAAAANwAAAABAAABHAAAAUD8AgAAAAH7AAAAGABkAG8AYwBrAEsAZQB5AGYAcgBhAG0AZQEAAAFYAAAAFQAAAAAAAAAAAAAAAgAABEYAAALC/AEAAAAC/AAAAAAAAARGAAAA+gD////8AgAAAAL8AAAAPQAAAa4AAACvAP////wBAAAAAvwAAAAAAAABwQAAAJcA////+gAAAAACAAAABPsAAAASAGQAbwBjAGsARgBpAGwAZQBzAQAAAAD/////AAAAkgD////7AAAAHgBkAG8AYwBrAFQAcgBhAG4AcwBpAHQAaQBvAG4AcwEAAAAA/////wAAAJIA////+wAAABYAZABvAGMAawBFAGYAZgBlAGMAdABzAQAAAAD/////AAAAkgD////7AAAAFABkAG8AYwBrAEUAbQBvAGoAaQBzAQAAAAD/////AAAAkgD////7AAAAEgBkAG8AYwBrAFYAaQBkAGUAbwEAAAHHAAACfwAAAEcA////+wAAABgAZABvAGMAawBUAGkAbQBlAGwAaQBuAGUBAAAB8QAAAQ4AAACWAP////sAAAAiAGQAbwBjAGsAQwBhAHAAdABpAG8AbgBFAGQAaQB0AG8AcgAAAANtAAAA2QAAAFgA////AAAERgAAAAEAAAABAAAAAgAAAAEAAAAC/AAAAAEAAAACAAAAAQAAAA4AdABvAG8AbABCAGEAcgEAAAAA/////wAAAAAAAAAA",
8282
"title": "",
8383
"type": "hidden",
8484
"category": "Qt",
8585
"setting": "window_state_v2"
8686
},
8787
{
88-
"value": "AdnQywACAAAAAAGbAAAAcQAABeAAAAOoAAABmwAAAI0AAAXgAAADqAAAAAAAAAAAB4A=",
88+
"value": "AdnQywADAAAAAAGbAAAAaAAABeAAAAOoAAABmwAAAI0AAAXgAAADqAAAAAAAAAAACJAAAAGbAAAAjQAABeAAAAOo",
8989
"title": "",
9090
"type": "hidden",
9191
"category": "Qt",
@@ -340,7 +340,7 @@
340340
"restart": true
341341
},
342342
{
343-
"value": false,
343+
"value": true,
344344
"title": "Send Anonymous Metrics and Errors",
345345
"type": "bool",
346346
"category": "Debug",

src/windows/main_window.py

+22-17
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@ def closeEvent(self, event):
166166
# Stop threads
167167
self.StopSignal.emit()
168168

169+
# Stop thumbnail server thread
170+
self.http_server_thread.kill()
171+
172+
# Stop ZMQ polling thread
173+
get_app().logger_libopenshot.kill()
174+
169175
# Process any queued events
170176
QCoreApplication.processEvents()
171177

@@ -2079,19 +2085,7 @@ def actionSimple_View_trigger(self):
20792085

20802086
# Set initial size of docks
20812087
simple_state = "".join([
2082-
"AAAA/wAAAAD9AAAAAwAAAAAAAAEnAAAC3/wCAAAAA/wAAAJeAAAApwAAAAAA////+gAAAAACAAAAAfsAAAA"
2083-
"YAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAAAAAAD/////AAAAAAAAAAD7AAAAHABkAG8AYwBrAFAAcgBvAH"
2084-
"AAZQByAHQAaQBlAHMAAAAAJwAAAt8AAAChAP////sAAAAYAGQAbwBjAGsAVAB1AHQAbwByAGkAYQBsAgAAA"
2085-
"AAAAAAAAAAAyAAAAGQAAAABAAABHAAAAUD8AgAAAAH7AAAAGABkAG8AYwBrAEsAZQB5AGYAcgBhAG0AZQEA"
2086-
"AAFYAAAAFQAAAAAAAAAAAAAAAgAABEYAAALY/AEAAAAC/AAAAAAAAANnAAAA+gD////8AgAAAAL8AAAAJwA"
2087-
"AAcAAAACvAP////wBAAAAAvwAAAAAAAABFQAAAHsA////+gAAAAACAAAAA/sAAAASAGQAbwBjAGsARgBpAG"
2088-
"wAZQBzAQAAAAD/////AAAAkgD////7AAAAHgBkAG8AYwBrAFQAcgBhAG4AcwBpAHQAaQBvAG4AcwEAAAAA/"
2089-
"////wAAAJIA////+wAAABYAZABvAGMAawBFAGYAZgBlAGMAdABzAQAAAAD/////AAAAkgD////7AAAAEgBk"
2090-
"AG8AYwBrAFYAaQBkAGUAbwEAAAEbAAACTAAAAEcA////+wAAABgAZABvAGMAawBUAGkAbQBlAGwAaQBuAGU"
2091-
"BAAAB7QAAARIAAACWAP////wAAANtAAAA2QAAAIIA////+gAAAAECAAAAAvsAAAAiAGQAbwBjAGsAQwBhAH"
2092-
"AAdABpAG8AbgBFAGQAaQB0AG8AcgAAAAAA/////wAAAJgA////+wAAABQAZABvAGMAawBFAG0AbwBqAGkAc"
2093-
"wEAAADFAAACOgAAAJIA////AAAERgAAAAEAAAABAAAAAgAAAAEAAAAC/AAAAAEAAAACAAAAAQAAAA4AdABv"
2094-
"AG8AbABCAGEAcgEAAAAA/////wAAAAAAAAAA"
2088+
"AAAA/wAAAAD9AAAAAwAAAAAAAAEnAAAC3/wCAAAAA/wAAAJeAAAApwAAAAAA////+gAAAAACAAAAAfsAAAAYAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAAAAAAD/////AAAAAAAAAAD7AAAAHABkAG8AYwBrAFAAcgBvAHAAZQByAHQAaQBlAHMAAAAAJwAAAt8AAAChAP////sAAAAYAGQAbwBjAGsAVAB1AHQAbwByAGkAYQBsAgAABUQAAAF6AAABYAAAANwAAAABAAABHAAAAUD8AgAAAAH7AAAAGABkAG8AYwBrAEsAZQB5AGYAcgBhAG0AZQEAAAFYAAAAFQAAAAAAAAAAAAAAAgAABEYAAALC/AEAAAAC/AAAAAAAAARGAAAA+gD////8AgAAAAL8AAAAPQAAAa4AAACvAP////wBAAAAAvwAAAAAAAABwQAAAJcA////+gAAAAACAAAABPsAAAASAGQAbwBjAGsARgBpAGwAZQBzAQAAAAD/////AAAAkgD////7AAAAHgBkAG8AYwBrAFQAcgBhAG4AcwBpAHQAaQBvAG4AcwEAAAAA/////wAAAJIA////+wAAABYAZABvAGMAawBFAGYAZgBlAGMAdABzAQAAAAD/////AAAAkgD////7AAAAFABkAG8AYwBrAEUAbQBvAGoAaQBzAQAAAAD/////AAAAkgD////7AAAAEgBkAG8AYwBrAFYAaQBkAGUAbwEAAAHHAAACfwAAAEcA////+wAAABgAZABvAGMAawBUAGkAbQBlAGwAaQBuAGUBAAAB8QAAAQ4AAACWAP////sAAAAiAGQAbwBjAGsAQwBhAHAAdABpAG8AbgBFAGQAaQB0AG8AcgAAAANtAAAA2QAAAFgA////AAAERgAAAAEAAAABAAAAAgAAAAEAAAAC/AAAAAEAAAACAAAAAQAAAA4AdABvAG8AbABCAGEAcgEAAAAA/////wAAAAAAAAAA"
20952089
])
20962090
self.restoreState(qt_types.str_to_bytes(simple_state))
20972091
QCoreApplication.processEvents()
@@ -2633,7 +2627,6 @@ def clearSelections(self):
26332627

26342628
def foundCurrentVersion(self, version):
26352629
"""Handle the callback for detecting the current version on openshot.org"""
2636-
log.info('foundCurrentVersion: Found the latest version: %s' % version)
26372630
_ = get_app()._tr
26382631

26392632
# Compare versions (alphabetical compare of version strings should work fine)
@@ -2654,6 +2647,10 @@ def foundCurrentVersion(self, version):
26542647
updateButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
26552648
self.toolBar.addWidget(updateButton)
26562649

2650+
# Initialize sentry exception tracing (now that we know the current version)
2651+
from classes import sentry
2652+
sentry.init_tracing()
2653+
26572654
def moveEvent(self, event):
26582655
""" Move tutorial dialogs also (if any)"""
26592656
QMainWindow.moveEvent(self, event)
@@ -2823,17 +2820,25 @@ def __init__(self, *args, mode=None):
28232820

28242821
# Set unique install id (if blank)
28252822
if not s.get("unique_install_id"):
2823+
# This is assumed to be the 1st launch
28262824
s.set("unique_install_id", str(uuid4()))
28272825

28282826
# Track 1st launch metric
28292827
track_metric_screen("initial-launch-screen")
28302828

2829+
# Track 1st main screen
2830+
track_metric_screen("main-screen")
2831+
2832+
# Opt-out of metrics tracking on 1st launch (and prompt user)
2833+
track_metric_screen("metrics-opt-out")
2834+
s.set("send_metrics", False)
2835+
else:
2836+
# Only track main screen
2837+
track_metric_screen("main-screen")
2838+
28312839
# Set unique id for Sentry
28322840
sentry.set_user({"id": s.get("unique_install_id")})
28332841

2834-
# Track main screen
2835-
track_metric_screen("main-screen")
2836-
28372842
# Create blank tutorial manager
28382843
self.tutorial_manager = None
28392844

src/windows/views/tutorial.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def process(self, parent_name=None):
180180

181181
# If a tutorial is already visible, just update it
182182
if self.current_dialog:
183-
# XXX: Respond to possible dock floats/moves
183+
# Respond to possible dock floats/moves
184184
self.dock.raise_()
185185
self.re_position_dialog()
186186
return
@@ -336,8 +336,8 @@ def re_position_dialog(self):
336336
position = self.position_widget.mapToGlobal(pos_rect.bottomRight())
337337

338338
# Move tutorial widget to the correct position
339-
self.re_show_dialog()
340339
self.dock.move(position)
340+
self.re_show_dialog()
341341

342342
def __init__(self, win):
343343
""" Constructor """

0 commit comments

Comments
 (0)