Skip to content

Commit

Permalink
Merge pull request #4322 from OpenShot/sentry-improvements
Browse files Browse the repository at this point in the history
Sentry & Metric Improvements
  • Loading branch information
jonoomph authored Aug 19, 2021
2 parents 7c83cf0 + 5d7dc0b commit 6bc4d9f
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 44 deletions.
11 changes: 11 additions & 0 deletions src/classes/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,17 @@
CURRENT_LANGUAGE = 'en_US'
SUPPORTED_LANGUAGES = ['en_US']

# Sentry.io error reporting rate (0.0 TO 1.0)
# 0.0 = no error reporting to Sentry
# 0.5 = 1/2 of errors reported to Sentry
# 1.0 = all errors reporting to Sentry
# STABLE: If this version matches the current version (reported on openshot.org)
# UNSTABLE: If this version does not match the current version (reported on openshot.org)
# STABLE_VERSION: This is the current stable release reported by openshot.org
ERROR_REPORT_RATE_STABLE = 0.0
ERROR_REPORT_RATE_UNSTABLE = 0.0
ERROR_REPORT_STABLE_VERSION = None

try:
from language import openshot_lang
language_path = ":/locale/"
Expand Down
32 changes: 21 additions & 11 deletions src/classes/logger_libopenshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,17 @@ class LoggerLibOpenShot(Thread):
def __init__(self):
super().__init__()
self.daemon = True
self.running = False
self.context = None
self.socket = None


def kill(self):
self.running = False
if self.context:
self.context.destroy()
if self.socket:
self.socket.close()

def run(self):
# Running
Expand All @@ -63,23 +71,25 @@ def run(self):
openshot.ZmqLogger.Instance().Enable(debug_enabled)

# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt_string(zmq.SUBSCRIBE, '')
self.context = zmq.Context()
self.socket = self.context.socket(zmq.SUB)
self.socket.setsockopt_string(zmq.SUBSCRIBE, '')

poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
poller.register(self.socket, zmq.POLLIN)

log.info("Connecting to libopenshot with debug port: %s" % port)
socket.connect ("tcp://localhost:%s" % port)
self.socket.connect("tcp://localhost:%s" % port)

while self.running:
msg = None

# Receive all debug message sent from libopenshot (if any)
socks = dict(poller.poll(1000))
if socks and socks.get(socket) == zmq.POLLIN:
msg = socket.recv(zmq.NOBLOCK)

if msg:
log.info(msg.strip().decode('UTF-8'))
try:
socks = dict(poller.poll(1000))
if socks and socks.get(self.socket) == zmq.POLLIN:
msg = self.socket.recv(zmq.NOBLOCK)
if msg:
log.info(msg.strip().decode('UTF-8'))
except Exception as ex:
log.warning(ex)
2 changes: 0 additions & 2 deletions src/classes/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,6 @@ def send_metric(params):
# Send metric HTTP data
try:
r = requests.get(url, headers={"user-agent": user_agent})
log.info("Track metric: [%s] %s | (%s bytes)" % (r.status_code, r.url, len(r.content)))

except Exception:
log.warning("Failed to track metric", exc_info=1)

Expand Down
17 changes: 11 additions & 6 deletions src/classes/sentry.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import platform

from classes.logger import log
from classes import info

try:
Expand All @@ -47,12 +48,16 @@ def init_tracing():
return

# Determine sample rate for exceptions
traces_sample_rate = 0.1
environment = "production"
if "-dev" in info.VERSION:
# Dev mode, trace all exceptions
traces_sample_rate = 1.0
environment = "development"
traces_sample_rate = 0.0
if info.VERSION == info.ERROR_REPORT_STABLE_VERSION:
traces_sample_rate = info.ERROR_REPORT_RATE_STABLE
environment = "production"
else:
traces_sample_rate = info.ERROR_REPORT_RATE_UNSTABLE
environment = "unstable"

if info.ERROR_REPORT_STABLE_VERSION:
log.info("Sentry initialized with %s error reporting rate (%s)" % (traces_sample_rate, environment))

# Initialize sentry exception tracing
sdk.init(
Expand Down
9 changes: 6 additions & 3 deletions src/classes/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from classes.app import get_app
from classes import info
from classes.logger import log
import json


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

# Parse version
openshot_version = r.json()["openshot_version"]
openshot_version = r.json().get("openshot_version")
info.ERROR_REPORT_STABLE_VERSION = r.json().get("openshot_version")
info.ERROR_REPORT_RATE_STABLE = r.json().get("error_rate_stable")
info.ERROR_REPORT_RATE_UNSTABLE = r.json().get("error_rate_unstable")

# Emit signal for the UI
get_app().window.FoundVersionSignal.emit(openshot_version)
Expand Down
6 changes: 3 additions & 3 deletions src/settings/_default.settings
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,14 @@
"setting": "title_editor"
},
{
"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",
"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",
"title": "",
"type": "hidden",
"category": "Qt",
"setting": "window_state_v2"
},
{
"value": "AdnQywACAAAAAAGbAAAAcQAABeAAAAOoAAABmwAAAI0AAAXgAAADqAAAAAAAAAAAB4A=",
"value": "AdnQywADAAAAAAGbAAAAaAAABeAAAAOoAAABmwAAAI0AAAXgAAADqAAAAAAAAAAACJAAAAGbAAAAjQAABeAAAAOo",
"title": "",
"type": "hidden",
"category": "Qt",
Expand Down Expand Up @@ -340,7 +340,7 @@
"restart": true
},
{
"value": false,
"value": true,
"title": "Send Anonymous Metrics and Errors",
"type": "bool",
"category": "Debug",
Expand Down
39 changes: 22 additions & 17 deletions src/windows/main_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ def closeEvent(self, event):
# Stop threads
self.StopSignal.emit()

# Stop thumbnail server thread
self.http_server_thread.kill()

# Stop ZMQ polling thread
get_app().logger_libopenshot.kill()

# Process any queued events
QCoreApplication.processEvents()

Expand Down Expand Up @@ -2079,19 +2085,7 @@ def actionSimple_View_trigger(self):

# Set initial size of docks
simple_state = "".join([
"AAAA/wAAAAD9AAAAAwAAAAAAAAEnAAAC3/wCAAAAA/wAAAJeAAAApwAAAAAA////+gAAAAACAAAAAfsAAAA"
"YAGQAbwBjAGsASwBlAHkAZgByAGEAbQBlAAAAAAD/////AAAAAAAAAAD7AAAAHABkAG8AYwBrAFAAcgBvAH"
"AAZQByAHQAaQBlAHMAAAAAJwAAAt8AAAChAP////sAAAAYAGQAbwBjAGsAVAB1AHQAbwByAGkAYQBsAgAAA"
"AAAAAAAAAAAyAAAAGQAAAABAAABHAAAAUD8AgAAAAH7AAAAGABkAG8AYwBrAEsAZQB5AGYAcgBhAG0AZQEA"
"AAFYAAAAFQAAAAAAAAAAAAAAAgAABEYAAALY/AEAAAAC/AAAAAAAAANnAAAA+gD////8AgAAAAL8AAAAJwA"
"AAcAAAACvAP////wBAAAAAvwAAAAAAAABFQAAAHsA////+gAAAAACAAAAA/sAAAASAGQAbwBjAGsARgBpAG"
"wAZQBzAQAAAAD/////AAAAkgD////7AAAAHgBkAG8AYwBrAFQAcgBhAG4AcwBpAHQAaQBvAG4AcwEAAAAA/"
"////wAAAJIA////+wAAABYAZABvAGMAawBFAGYAZgBlAGMAdABzAQAAAAD/////AAAAkgD////7AAAAEgBk"
"AG8AYwBrAFYAaQBkAGUAbwEAAAEbAAACTAAAAEcA////+wAAABgAZABvAGMAawBUAGkAbQBlAGwAaQBuAGU"
"BAAAB7QAAARIAAACWAP////wAAANtAAAA2QAAAIIA////+gAAAAECAAAAAvsAAAAiAGQAbwBjAGsAQwBhAH"
"AAdABpAG8AbgBFAGQAaQB0AG8AcgAAAAAA/////wAAAJgA////+wAAABQAZABvAGMAawBFAG0AbwBqAGkAc"
"wEAAADFAAACOgAAAJIA////AAAERgAAAAEAAAABAAAAAgAAAAEAAAAC/AAAAAEAAAACAAAAAQAAAA4AdABv"
"AG8AbABCAGEAcgEAAAAA/////wAAAAAAAAAA"
"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"
])
self.restoreState(qt_types.str_to_bytes(simple_state))
QCoreApplication.processEvents()
Expand Down Expand Up @@ -2633,7 +2627,6 @@ def clearSelections(self):

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

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

# Initialize sentry exception tracing (now that we know the current version)
from classes import sentry
sentry.init_tracing()

def moveEvent(self, event):
""" Move tutorial dialogs also (if any)"""
QMainWindow.moveEvent(self, event)
Expand Down Expand Up @@ -2823,17 +2820,25 @@ def __init__(self, *args, mode=None):

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

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

# Track 1st main screen
track_metric_screen("main-screen")

# Opt-out of metrics tracking on 1st launch (and prompt user)
track_metric_screen("metrics-opt-out")
s.set("send_metrics", False)
else:
# Only track main screen
track_metric_screen("main-screen")

# Set unique id for Sentry
sentry.set_user({"id": s.get("unique_install_id")})

# Track main screen
track_metric_screen("main-screen")

# Create blank tutorial manager
self.tutorial_manager = None

Expand Down
4 changes: 2 additions & 2 deletions src/windows/views/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ def process(self, parent_name=None):

# If a tutorial is already visible, just update it
if self.current_dialog:
# XXX: Respond to possible dock floats/moves
# Respond to possible dock floats/moves
self.dock.raise_()
self.re_position_dialog()
return
Expand Down Expand Up @@ -336,8 +336,8 @@ def re_position_dialog(self):
position = self.position_widget.mapToGlobal(pos_rect.bottomRight())

# Move tutorial widget to the correct position
self.re_show_dialog()
self.dock.move(position)
self.re_show_dialog()

def __init__(self, win):
""" Constructor """
Expand Down

0 comments on commit 6bc4d9f

Please sign in to comment.