|
@@ -10,10 +10,11 @@ from datetime import datetime, timedelta
|
|
|
import pytz
|
|
|
|
|
|
from mock import patch
|
|
|
+from django.utils import timezone
|
|
|
|
|
|
from sentry import eventstream, tagstore
|
|
|
from sentry.app import tsdb
|
|
|
-from sentry.models import Environment, Event, Group, GroupHash, GroupRelease, Release, UserReport
|
|
|
+from sentry.models import Environment, Group, GroupHash, GroupRelease, Release, UserReport
|
|
|
from sentry.similarity import features, _make_index_backend
|
|
|
from sentry.tasks.unmerge import (
|
|
|
get_caches,
|
|
@@ -35,60 +36,69 @@ from six.moves import xrange
|
|
|
index = _make_index_backend(redis.clusters.get("default").get_local_client(0))
|
|
|
|
|
|
|
|
|
-def test_get_fingerprint():
|
|
|
- assert (
|
|
|
- get_fingerprint(Event(data={"logentry": {"message": "Hello world"}}))
|
|
|
- == hashlib.md5("Hello world").hexdigest()
|
|
|
- )
|
|
|
-
|
|
|
- assert (
|
|
|
- get_fingerprint(
|
|
|
- Event(data={"fingerprint": ["Not hello world"], "logentry": {"message": "Hello world"}})
|
|
|
+@patch("sentry.similarity.features.index", new=index)
|
|
|
+class UnmergeTestCase(TestCase, SnubaTestCase):
|
|
|
+ def test_get_fingerprint(self):
|
|
|
+ assert (
|
|
|
+ get_fingerprint(
|
|
|
+ self.store_event(data={"message": "Hello world"}, project_id=self.project.id)
|
|
|
+ )
|
|
|
+ == hashlib.md5("Hello world").hexdigest()
|
|
|
)
|
|
|
- == hashlib.md5("Not hello world").hexdigest()
|
|
|
- )
|
|
|
|
|
|
+ assert (
|
|
|
+ get_fingerprint(
|
|
|
+ self.store_event(
|
|
|
+ data={"message": "Hello world", "fingerprint": ["Not hello world"]},
|
|
|
+ project_id=self.project.id,
|
|
|
+ )
|
|
|
+ )
|
|
|
+ == hashlib.md5("Not hello world").hexdigest()
|
|
|
+ )
|
|
|
|
|
|
-@patch("sentry.similarity.features.index", new=index)
|
|
|
-class UnmergeTestCase(TestCase, SnubaTestCase):
|
|
|
def test_get_group_creation_attributes(self):
|
|
|
- now = datetime(2017, 5, 3, 6, 6, 6, tzinfo=pytz.utc)
|
|
|
- events = [
|
|
|
- Event(
|
|
|
- platform="javascript",
|
|
|
- message="Hello from JavaScript",
|
|
|
- datetime=now,
|
|
|
- data={
|
|
|
- "type": "default",
|
|
|
- "metadata": {},
|
|
|
- "tags": [["level", "info"], ["logger", "javascript"]],
|
|
|
- },
|
|
|
- ),
|
|
|
- Event(
|
|
|
- platform="python",
|
|
|
- message="Hello from Python",
|
|
|
- datetime=now - timedelta(hours=1),
|
|
|
- data={
|
|
|
- "type": "default",
|
|
|
- "metadata": {},
|
|
|
- "tags": [["level", "error"], ["logger", "python"]],
|
|
|
- },
|
|
|
- ),
|
|
|
- Event(
|
|
|
- platform="java",
|
|
|
- message="Hello from Java",
|
|
|
- datetime=now - timedelta(hours=2),
|
|
|
- data={
|
|
|
- "type": "default",
|
|
|
- "metadata": {},
|
|
|
- "tags": [["level", "debug"], ["logger", "java"]],
|
|
|
- },
|
|
|
- ),
|
|
|
- ]
|
|
|
+ now = datetime.utcnow().replace(microsecond=0, tzinfo=timezone.utc)
|
|
|
+ e1 = self.store_event(
|
|
|
+ data={
|
|
|
+ "fingerprint": ["group1"],
|
|
|
+ "platform": "javascript",
|
|
|
+ "message": "Hello from JavaScript",
|
|
|
+ "type": "default",
|
|
|
+ "level": "info",
|
|
|
+ "tags": {"logger": "javascript"},
|
|
|
+ "timestamp": iso_format(now),
|
|
|
+ },
|
|
|
+ project_id=self.project.id,
|
|
|
+ )
|
|
|
+ e2 = self.store_event(
|
|
|
+ data={
|
|
|
+ "fingerprint": ["group1"],
|
|
|
+ "platform": "python",
|
|
|
+ "message": "Hello from Python",
|
|
|
+ "type": "default",
|
|
|
+ "level": "error",
|
|
|
+ "tags": {"logger": "python"},
|
|
|
+ "timestamp": iso_format(now),
|
|
|
+ },
|
|
|
+ project_id=self.project.id,
|
|
|
+ )
|
|
|
+ e3 = self.store_event(
|
|
|
+ data={
|
|
|
+ "fingerprint": ["group1"],
|
|
|
+ "platform": "java",
|
|
|
+ "message": "Hello from Java",
|
|
|
+ "type": "default",
|
|
|
+ "level": "debug",
|
|
|
+ "tags": {"logger": "java"},
|
|
|
+ "timestamp": iso_format(now),
|
|
|
+ },
|
|
|
+ project_id=self.project.id,
|
|
|
+ )
|
|
|
+ events = [e1, e2, e3]
|
|
|
|
|
|
assert get_group_creation_attributes(get_caches(), events) == {
|
|
|
- "active_at": now - timedelta(hours=2),
|
|
|
- "first_seen": now - timedelta(hours=2),
|
|
|
+ "active_at": now,
|
|
|
+ "first_seen": now,
|
|
|
"last_seen": now,
|
|
|
"platform": "java",
|
|
|
"message": "Hello from JavaScript",
|
|
@@ -98,11 +108,16 @@ class UnmergeTestCase(TestCase, SnubaTestCase):
|
|
|
"times_seen": 3,
|
|
|
"first_release": None,
|
|
|
"culprit": "",
|
|
|
- "data": {"type": "default", "last_received": to_timestamp(now), "metadata": {}},
|
|
|
+ "data": {
|
|
|
+ "type": "default",
|
|
|
+ "last_received": e1.data["received"],
|
|
|
+ "metadata": {"title": "Hello from JavaScript"},
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
def test_get_group_backfill_attributes(self):
|
|
|
- now = datetime(2017, 5, 3, 6, 6, 6, tzinfo=pytz.utc)
|
|
|
+ now = datetime.utcnow().replace(microsecond=0, tzinfo=timezone.utc)
|
|
|
+
|
|
|
assert get_group_backfill_attributes(
|
|
|
get_caches(),
|
|
|
Group(
|
|
@@ -120,25 +135,27 @@ class UnmergeTestCase(TestCase, SnubaTestCase):
|
|
|
data={"type": "default", "last_received": to_timestamp(now), "metadata": {}},
|
|
|
),
|
|
|
[
|
|
|
- Event(
|
|
|
- platform="python",
|
|
|
- message="Hello from Python",
|
|
|
- datetime=now - timedelta(hours=1),
|
|
|
+ self.store_event(
|
|
|
data={
|
|
|
+ "platform": "python",
|
|
|
+ "message": "Hello from Python",
|
|
|
+ "timestamp": iso_format(now - timedelta(hours=1)),
|
|
|
"type": "default",
|
|
|
- "metadata": {},
|
|
|
- "tags": [["level", "error"], ["logger", "python"]],
|
|
|
+ "level": "debug",
|
|
|
+ "tags": {"logger": "java"},
|
|
|
},
|
|
|
+ project_id=self.project.id,
|
|
|
),
|
|
|
- Event(
|
|
|
- platform="java",
|
|
|
- message="Hello from Java",
|
|
|
- datetime=now - timedelta(hours=2),
|
|
|
+ self.store_event(
|
|
|
data={
|
|
|
+ "platform": "java",
|
|
|
+ "message": "Hello from Java",
|
|
|
+ "timestamp": iso_format(now - timedelta(hours=2)),
|
|
|
"type": "default",
|
|
|
- "metadata": {},
|
|
|
- "tags": [["level", "debug"], ["logger", "java"]],
|
|
|
+ "level": "debug",
|
|
|
+ "tags": {"logger": "java"},
|
|
|
},
|
|
|
+ project_id=self.project.id,
|
|
|
),
|
|
|
],
|
|
|
) == {
|