Commit b1a76f12 by Gabe Mulley

Merge pull request #925 from mulby/fix/gabe/configurable-tracking-filter

Make URL patterns to exclude from tracking configurable
parents e360f1d5 761a4dcc
...@@ -127,6 +127,10 @@ LOGGING = get_logger_config(LOG_DIR, ...@@ -127,6 +127,10 @@ LOGGING = get_logger_config(LOG_DIR,
#theming start: #theming start:
PLATFORM_NAME = ENV_TOKENS.get('PLATFORM_NAME', 'edX') PLATFORM_NAME = ENV_TOKENS.get('PLATFORM_NAME', 'edX')
# Event Tracking
if "TRACKING_IGNORE_URL_PATTERNS" in ENV_TOKENS:
TRACKING_IGNORE_URL_PATTERNS = ENV_TOKENS.get("TRACKING_IGNORE_URL_PATTERNS")
################ SECURE AUTH ITEMS ############################### ################ SECURE AUTH ITEMS ###############################
# Secret things: passwords, access keys, etc. # Secret things: passwords, access keys, etc.
......
...@@ -404,3 +404,7 @@ TRACKING_BACKENDS = { ...@@ -404,3 +404,7 @@ TRACKING_BACKENDS = {
} }
} }
} }
# We're already logging events, and we don't want to capture user
# names/passwords. Heartbeat events are likely not interesting.
TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat']
import json import json
import re
from django.conf import settings
import views import views
class TrackMiddleware: class TrackMiddleware(object):
def process_request(self, request): def process_request(self, request):
try: try:
# We're already logging events, and we don't want to capture user if not self._should_process_request(request):
# names/passwords.
if request.META['PATH_INFO'] in ['/event', '/login']:
return return
# Removes passwords from the tracking logs # Removes passwords from the tracking logs
...@@ -45,3 +46,14 @@ class TrackMiddleware: ...@@ -45,3 +46,14 @@ class TrackMiddleware:
views.server_track(request, request.META['PATH_INFO'], event) views.server_track(request, request.META['PATH_INFO'], event)
except: except:
pass pass
def _should_process_request(self, request):
path = request.META['PATH_INFO']
ignored_url_patterns = getattr(settings, 'TRACKING_IGNORE_URL_PATTERNS', [])
for pattern in ignored_url_patterns:
# Note we are explicitly relying on python's internal caching of
# compiled regular expressions here.
if re.match(pattern, path):
return False
return True
import re
from mock import patch
from django.test import TestCase
from django.test.client import RequestFactory
from django.test.utils import override_settings
from track.middleware import TrackMiddleware
@patch('track.views.server_track')
class TrackMiddlewareTestCase(TestCase):
def setUp(self):
self.track_middleware = TrackMiddleware()
self.request_factory = RequestFactory()
def test_normal_request(self, mock_server_track):
request = self.request_factory.get('/somewhere')
self.track_middleware.process_request(request)
self.assertTrue(mock_server_track.called)
def test_default_filters_do_not_render_view(self, mock_server_track):
for url in ['/event', '/event/1', '/login', '/heartbeat']:
request = self.request_factory.get(url)
self.track_middleware.process_request(request)
self.assertFalse(mock_server_track.called)
mock_server_track.reset_mock()
@override_settings(TRACKING_IGNORE_URL_PATTERNS=[])
def test_reading_filtered_urls_from_settings(self, mock_server_track):
request = self.request_factory.get('/event')
self.track_middleware.process_request(request)
self.assertTrue(mock_server_track.called)
@override_settings(TRACKING_IGNORE_URL_PATTERNS=[r'^/some/excluded.*'])
def test_anchoring_of_patterns_at_beginning(self, mock_server_track):
request = self.request_factory.get('/excluded')
self.track_middleware.process_request(request)
self.assertTrue(mock_server_track.called)
mock_server_track.reset_mock()
request = self.request_factory.get('/some/excluded/url')
self.track_middleware.process_request(request)
self.assertFalse(mock_server_track.called)
...@@ -187,6 +187,10 @@ for name, value in ENV_TOKENS.get("CODE_JAIL", {}).items(): ...@@ -187,6 +187,10 @@ for name, value in ENV_TOKENS.get("CODE_JAIL", {}).items():
COURSES_WITH_UNSAFE_CODE = ENV_TOKENS.get("COURSES_WITH_UNSAFE_CODE", []) COURSES_WITH_UNSAFE_CODE = ENV_TOKENS.get("COURSES_WITH_UNSAFE_CODE", [])
# Event Tracking
if "TRACKING_IGNORE_URL_PATTERNS" in ENV_TOKENS:
TRACKING_IGNORE_URL_PATTERNS = ENV_TOKENS.get("TRACKING_IGNORE_URL_PATTERNS")
############################## SECURE AUTH ITEMS ############### ############################## SECURE AUTH ITEMS ###############
# Secret things: passwords, access keys, etc. # Secret things: passwords, access keys, etc.
......
...@@ -334,6 +334,10 @@ if MITX_FEATURES.get('ENABLE_SQL_TRACKING_LOGS'): ...@@ -334,6 +334,10 @@ if MITX_FEATURES.get('ENABLE_SQL_TRACKING_LOGS'):
} }
}) })
# We're already logging events, and we don't want to capture user
# names/passwords. Heartbeat events are likely not interesting.
TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat']
######################## subdomain specific settings ########################### ######################## subdomain specific settings ###########################
COURSE_LISTINGS = {} COURSE_LISTINGS = {}
SUBDOMAIN_BRANDING = {} SUBDOMAIN_BRANDING = {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment