Use pool of threads and queue for Google Analytics Event Tracking requests

This commit is contained in:
Alex Sadleir 2014-11-05 13:39:53 +11:00
parent 5809f205f5
commit 803b3f7f81
1 changed files with 36 additions and 9 deletions

View File

@ -8,6 +8,7 @@ import urllib2
import logging import logging
import ckan.logic as logic import ckan.logic as logic
import hashlib import hashlib
import Queue
import threading import threading
from pylons import config from pylons import config
@ -27,8 +28,42 @@ class GAController(BaseController):
return render('summary.html') return render('summary.html')
class AnalyticsPostThread(threading.Thread):
"""Threaded Url POST"""
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
# grabs host from queue
data_dict = self.queue.get()
data = urllib.urlencode(data_dict)
log.debug("Sending API event to Google Analytics: " + data)
# send analytics
urllib2.urlopen(
"http://www.google-analytics.com/collect",
data,
# timeout in seconds
# https://docs.python.org/2/library/urllib2.html#urllib2.urlopen
10)
# signals to queue job is done
self.queue.task_done()
class GAApiController(ApiController): class GAApiController(ApiController):
# intercept API calls to record via google analytics # intercept API calls to record via google analytics
analytics_queue = Queue.Queue()
def __init__(self):
# spawn a pool of 5 threads, and pass them queue instance
for i in range(5):
t = AnalyticsPostThread(self.analytics_queue)
t.setDaemon(True)
t.start()
def _post_analytics( def _post_analytics(
self, user, request_obj_type, request_function, request_id): self, user, request_obj_type, request_function, request_id):
if config.get('googleanalytics.id'): if config.get('googleanalytics.id'):
@ -45,15 +80,7 @@ class GAApiController(ApiController):
"ea": request_obj_type+request_function, "ea": request_obj_type+request_function,
"el": request_id, "el": request_id,
} }
data = urllib.urlencode(data_dict) self.analytics_queue.put(data_dict)
log.debug("Sending API event to Google Analytics: "+data)
# send analytics asynchronously
threading.Thread(target=urllib2.urlopen,
args=(
"http://www.google-analytics.com/collect",
data,
# timeout in seconds https://docs.python.org/2/library/urllib2.html#urllib2.urlopen
10)).start()
def action(self, logic_function, ver=None): def action(self, logic_function, ver=None):
try: try: