From 7ca049ba147353127f9ff1adfd5bca06a91af04c Mon Sep 17 00:00:00 2001 From: "maruel@chromium.org" Date: Fri, 29 Apr 2011 12:58:23 +0000 Subject: [PATCH] Send googler profiling data. BUG= TEST= Review URL: http://codereview.chromium.org/6904055 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@83507 0039d316-1c4b-4281-b951-d872f2087c98 --- breakpad.py | 52 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/breakpad.py b/breakpad.py index d5b4d926a..cb9b79dca 100644 --- a/breakpad.py +++ b/breakpad.py @@ -15,17 +15,32 @@ It is only enabled when all these conditions are met: import atexit import getpass import os -import urllib -import traceback import socket import sys +import time +import traceback +import urllib +import urllib2 # Configure these values. -DEFAULT_URL = 'https://chromium-status.appspot.com/breakpad' +DEFAULT_URL = 'https://chromium-status.appspot.com' _REGISTERED = False +_TIME_STARTED = time.time() + + +def post(url, params): + """HTTP POST with timeout when it's supported.""" + kwargs = {} + if (sys.version_info[0] * 10 + sys.version_info[1]) >= 26: + kwargs['timeout'] = 4 + request = urllib2.urlopen(url, urllib.urlencode(params), **kwargs) + out = request.read() + request.close() + return out + def FormatException(e): """Returns a human readable form of an exception. @@ -58,7 +73,7 @@ def FormatException(e): def SendStack(last_tb, stack, url=None, maxlen=50): """Sends the stack trace to the breakpad server.""" if not url: - url = DEFAULT_URL + url = DEFAULT_URL + '/breakpad' print 'Sending crash report ...' try: params = { @@ -73,20 +88,35 @@ def SendStack(last_tb, stack, url=None, maxlen=50): # pylint: disable=W0702 print('\n'.join(' %s: %s' % (k, v[0:maxlen]) for k, v in params.iteritems())) - request = urllib.urlopen(url, urllib.urlencode(params)) - print(request.read()) - request.close() + print(post(url, params)) except IOError: print('There was a failure while trying to send the stack trace. Too bad.') +def SendProfiling(url=None): + try: + if not url: + url = DEFAULT_URL + '/profiling' + params = { + 'argv': ' '.join(sys.argv), + 'duration': time.time() - _TIME_STARTED, + 'platform': sys.platform, + } + post(url, params) + except IOError: + pass + + def CheckForException(): """Runs at exit. Look if there was an exception active.""" last_value = getattr(sys, 'last_value', None) - if last_value and not isinstance(last_value, KeyboardInterrupt): - last_tb = getattr(sys, 'last_traceback', None) - if last_tb: - SendStack(last_value, ''.join(traceback.format_tb(last_tb))) + if last_value: + if not isinstance(last_value, KeyboardInterrupt): + last_tb = getattr(sys, 'last_traceback', None) + if last_tb: + SendStack(last_value, ''.join(traceback.format_tb(last_tb))) + else: + SendProfiling() def Register():