Skip to content

Commit

Permalink
Support larger intervals in event frequency conditions. (#4640)
Browse files Browse the repository at this point in the history
  • Loading branch information
tkaemming committed Dec 6, 2016
1 parent 930e2f0 commit f967887
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 24 deletions.
34 changes: 15 additions & 19 deletions src/sentry/rules/conditions/event_frequency.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,22 @@
from sentry.rules.conditions.base import EventCondition


class Interval(object):
ONE_MINUTE = '1m'
ONE_HOUR = '1h'
ONE_DAY = '1d'
intervals = {
'1m': ('one minute', timedelta(minutes=1)),
'1h': ('one hour', timedelta(hours=1)),
'1d': ('one day', timedelta(hours=24)),
'1w': ('one week', timedelta(days=7)),
'30d': ('30 days', timedelta(days=30)),
}


class EventFrequencyForm(forms.Form):
interval = forms.ChoiceField(choices=(
(Interval.ONE_MINUTE, 'one minute'),
(Interval.ONE_HOUR, 'one hour'),
(Interval.ONE_DAY, 'one day'),
))
interval = forms.ChoiceField(choices=[
(key, label) for key, (label, duration) in sorted(
intervals.items(),
key=lambda (key, (label, duration)): duration
)
])
value = forms.IntegerField(widget=forms.TextInput(attrs={
'placeholder': '100',
'type': 'number'
Expand Down Expand Up @@ -64,19 +68,11 @@ def query(self, event, start, end):
raise NotImplementedError # subclass must implement

def get_rate(self, event, interval):
_, duration = intervals[interval]
end = timezone.now()
if interval == Interval.ONE_MINUTE:
start = end - timedelta(minutes=1)
elif interval == Interval.ONE_HOUR:
start = end - timedelta(hours=1)
elif interval == Interval.ONE_DAY:
start = end - timedelta(hours=24)
else:
raise ValueError(interval)

return self.query(
event,
start,
end - duration,
end,
)

Expand Down
10 changes: 5 additions & 5 deletions tests/sentry/rules/conditions/test_event_frequency.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from sentry.app import tsdb
from sentry.rules.conditions.event_frequency import (
EventFrequencyCondition, EventUniqueUserFrequencyCondition, Interval
EventFrequencyCondition, EventUniqueUserFrequencyCondition
)
from sentry.testutils.cases import RuleTestCase

Expand All @@ -25,7 +25,7 @@ def test_one_minute(self, now):
event = self.get_event()
value = 10
rule = self.get_rule({
'interval': Interval.ONE_MINUTE,
'interval': '1m',
'value': six.text_type(value),
})

Expand All @@ -50,7 +50,7 @@ def test_one_hour(self, now):
event = self.get_event()
value = 10
rule = self.get_rule({
'interval': Interval.ONE_HOUR,
'interval': '1h',
'value': six.text_type(value),
})

Expand All @@ -75,7 +75,7 @@ def test_one_day(self, now):
event = self.get_event()
value = 10
rule = self.get_rule({
'interval': Interval.ONE_DAY,
'interval': '1d',
'value': six.text_type(value),
})

Expand All @@ -99,7 +99,7 @@ def test_more_than_zero(self, now):

event = self.get_event()
rule = self.get_rule({
'interval': Interval.ONE_MINUTE,
'interval': '1m',
'value': six.text_type('0'),
})

Expand Down

0 comments on commit f967887

Please sign in to comment.