mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
234 lines
7.8 KiB
Python
234 lines
7.8 KiB
Python
from datetime import timedelta, timezone
|
|
|
|
from sentry.models.rule import Rule
|
|
from sentry.models.rulefirehistory import RuleFireHistory
|
|
from sentry.rules.history.backends.postgres import PostgresRuleHistoryBackend
|
|
from sentry.rules.history.base import RuleGroupHistory
|
|
from sentry.testutils.cases import TestCase
|
|
from sentry.testutils.helpers.datetime import before_now, freeze_time
|
|
from sentry.testutils.silo import region_silo_test
|
|
from sentry.testutils.skips import requires_snuba
|
|
|
|
pytestmark = [requires_snuba]
|
|
|
|
|
|
class BasePostgresRuleHistoryBackendTest(TestCase):
|
|
def setUp(self):
|
|
self.backend = PostgresRuleHistoryBackend()
|
|
|
|
|
|
@region_silo_test
|
|
class RecordTest(BasePostgresRuleHistoryBackendTest):
|
|
def test(self):
|
|
rule = Rule.objects.create(project=self.event.project)
|
|
self.backend.record(rule, self.group)
|
|
assert RuleFireHistory.objects.filter(rule=rule, group=self.group).count() == 1
|
|
self.backend.record(rule, self.group)
|
|
assert RuleFireHistory.objects.filter(rule=rule, group=self.group).count() == 2
|
|
group_2 = self.create_group()
|
|
self.backend.record(rule, group_2)
|
|
assert RuleFireHistory.objects.filter(rule=rule, group=self.group).count() == 2
|
|
assert RuleFireHistory.objects.filter(rule=rule, group=group_2).count() == 1
|
|
assert RuleFireHistory.objects.filter(rule=rule).count() == 3
|
|
|
|
|
|
@region_silo_test
|
|
@freeze_time()
|
|
class FetchRuleGroupsPaginatedTest(BasePostgresRuleHistoryBackendTest):
|
|
def run_test(self, rule, start, end, expected, cursor=None, per_page=25):
|
|
result = self.backend.fetch_rule_groups_paginated(rule, start, end, cursor, per_page)
|
|
assert result.results == expected, (result.results, expected)
|
|
return result
|
|
|
|
def test(self):
|
|
history = []
|
|
rule = Rule.objects.create(project=self.event.project)
|
|
for i in range(3):
|
|
history.append(
|
|
RuleFireHistory(
|
|
project=rule.project,
|
|
rule=rule,
|
|
group=self.group,
|
|
date_added=before_now(days=i + 1),
|
|
)
|
|
)
|
|
group_2 = self.create_group()
|
|
history.append(
|
|
RuleFireHistory(
|
|
project=rule.project, rule=rule, group=group_2, date_added=before_now(days=1)
|
|
)
|
|
)
|
|
group_3 = self.create_group()
|
|
for i in range(2):
|
|
history.append(
|
|
RuleFireHistory(
|
|
project=rule.project,
|
|
rule=rule,
|
|
group=group_3,
|
|
date_added=before_now(days=i + 1),
|
|
)
|
|
)
|
|
rule_2 = Rule.objects.create(project=self.event.project)
|
|
history.append(
|
|
RuleFireHistory(
|
|
project=rule.project, rule=rule_2, group=self.group, date_added=before_now(days=0)
|
|
)
|
|
)
|
|
RuleFireHistory.objects.bulk_create(history)
|
|
|
|
base_triggered_date = before_now(days=1).replace(tzinfo=timezone.utc)
|
|
|
|
self.run_test(
|
|
rule,
|
|
before_now(days=6),
|
|
before_now(days=0),
|
|
[
|
|
RuleGroupHistory(self.group, count=3, last_triggered=base_triggered_date),
|
|
RuleGroupHistory(group_3, count=2, last_triggered=base_triggered_date),
|
|
RuleGroupHistory(group_2, count=1, last_triggered=base_triggered_date),
|
|
],
|
|
)
|
|
result = self.run_test(
|
|
rule,
|
|
before_now(days=6),
|
|
before_now(days=0),
|
|
[
|
|
RuleGroupHistory(self.group, count=3, last_triggered=base_triggered_date),
|
|
],
|
|
per_page=1,
|
|
)
|
|
result = self.run_test(
|
|
rule,
|
|
before_now(days=6),
|
|
before_now(days=0),
|
|
[
|
|
RuleGroupHistory(group_3, count=2, last_triggered=base_triggered_date),
|
|
],
|
|
cursor=result.next,
|
|
per_page=1,
|
|
)
|
|
self.run_test(
|
|
rule,
|
|
before_now(days=6),
|
|
before_now(days=0),
|
|
[
|
|
RuleGroupHistory(group_2, count=1, last_triggered=base_triggered_date),
|
|
],
|
|
cursor=result.next,
|
|
per_page=1,
|
|
)
|
|
|
|
self.run_test(
|
|
rule,
|
|
before_now(days=1),
|
|
before_now(days=0),
|
|
[
|
|
RuleGroupHistory(self.group, count=1, last_triggered=base_triggered_date),
|
|
RuleGroupHistory(group_2, count=1, last_triggered=base_triggered_date),
|
|
RuleGroupHistory(group_3, count=1, last_triggered=base_triggered_date),
|
|
],
|
|
)
|
|
|
|
self.run_test(
|
|
rule,
|
|
before_now(days=3),
|
|
before_now(days=2),
|
|
[
|
|
RuleGroupHistory(
|
|
self.group, count=1, last_triggered=base_triggered_date - timedelta(days=2)
|
|
),
|
|
],
|
|
)
|
|
|
|
def test_event_id(self):
|
|
rule = Rule.objects.create(project=self.event.project)
|
|
for i in range(3):
|
|
RuleFireHistory.objects.create(
|
|
project=rule.project,
|
|
rule=rule,
|
|
group=self.group,
|
|
date_added=before_now(days=i + 1),
|
|
event_id=i,
|
|
)
|
|
|
|
base_triggered_date = before_now(days=1).replace(tzinfo=timezone.utc)
|
|
self.run_test(
|
|
rule,
|
|
before_now(days=3),
|
|
before_now(days=0),
|
|
[
|
|
RuleGroupHistory(
|
|
group=self.group, count=3, last_triggered=base_triggered_date, event_id="0"
|
|
)
|
|
],
|
|
)
|
|
|
|
group_2 = self.create_group()
|
|
for i in range(3):
|
|
RuleFireHistory.objects.create(
|
|
project=rule.project,
|
|
rule=rule,
|
|
group=group_2,
|
|
date_added=before_now(days=i + 4),
|
|
event_id=i + 3,
|
|
)
|
|
self.run_test(
|
|
rule,
|
|
before_now(days=5),
|
|
before_now(days=2),
|
|
[
|
|
RuleGroupHistory(
|
|
group=group_2,
|
|
count=2,
|
|
last_triggered=base_triggered_date - timedelta(days=3),
|
|
event_id="3",
|
|
),
|
|
RuleGroupHistory(
|
|
group=self.group,
|
|
count=1,
|
|
last_triggered=base_triggered_date - timedelta(days=2),
|
|
event_id="2",
|
|
),
|
|
],
|
|
)
|
|
|
|
|
|
@region_silo_test
|
|
@freeze_time()
|
|
class FetchRuleHourlyStatsPaginatedTest(BasePostgresRuleHistoryBackendTest):
|
|
def test(self):
|
|
rule = Rule.objects.create(project=self.event.project)
|
|
rule_2 = Rule.objects.create(project=self.event.project)
|
|
history = []
|
|
|
|
for i in range(3):
|
|
for _ in range(i + 1):
|
|
history.append(
|
|
RuleFireHistory(
|
|
project=rule.project,
|
|
rule=rule,
|
|
group=self.group,
|
|
date_added=before_now(hours=i + 1),
|
|
)
|
|
)
|
|
|
|
for i in range(2):
|
|
history.append(
|
|
RuleFireHistory(
|
|
project=rule_2.project,
|
|
rule=rule_2,
|
|
group=self.group,
|
|
date_added=before_now(hours=i + 1),
|
|
)
|
|
)
|
|
|
|
RuleFireHistory.objects.bulk_create(history)
|
|
|
|
results = self.backend.fetch_rule_hourly_stats(rule, before_now(hours=24), before_now())
|
|
assert len(results) == 24
|
|
assert [r.count for r in results[-5:]] == [0, 3, 2, 1, 0]
|
|
|
|
results = self.backend.fetch_rule_hourly_stats(rule_2, before_now(hours=24), before_now())
|
|
assert len(results) == 24
|
|
assert [r.count for r in results[-5:]] == [0, 0, 1, 1, 0]
|