logging: Fix duplicate detection for email errors.

Our implementation of duplication detection in the Zulip email error
reporting system was buggy in two important ways:

* It did not look at the traceback, and thus considered all errors as
  the same.

* It reset the 10-minute duplicate timer every time an error happened,
  thus concealing situations where the same error was occuring more
  often than 1/10 minutes.
This commit is contained in:
Tim Abbott
2016-08-26 22:55:54 -07:00
parent 4423222d92
commit 0d324d38b3

View File

@@ -1,6 +1,8 @@
from __future__ import absolute_import
import hashlib
import logging
import traceback
from datetime import datetime, timedelta
# Adapted http://djangosnippets.org/snippets/2242/ by user s29 (October 25, 2010)
@@ -26,8 +28,10 @@ class _RateLimitFilter(object):
use_cache = False
if use_cache:
key = self.__class__.__name__.upper()
tb = '\n'.join(traceback.format_exception(*record.exc_info))
key = self.__class__.__name__.upper() + hashlib.sha1(tb).hexdigest()
duplicate = cache.get(key) == 1
if not duplicate:
cache.set(key, 1, rate)
else:
min_date = datetime.now() - timedelta(seconds=rate)