15
15
class SnubaEventStorageTest (TestCase , SnubaTestCase , PerformanceIssueTestCase ):
16
16
def setUp (self ):
17
17
super ().setUp ()
18
- self .min_ago = before_now (minutes = 1 ). isoformat ()
19
- self .two_min_ago = before_now (minutes = 2 ). isoformat ()
18
+ self .min_ago = before_now (minutes = 1 )
19
+ self .two_min_ago = before_now (minutes = 2 )
20
20
self .project1 = self .create_project ()
21
21
self .project2 = self .create_project ()
22
22
@@ -26,7 +26,7 @@ def setUp(self):
26
26
"type" : "default" ,
27
27
"platform" : "python" ,
28
28
"fingerprint" : ["group1" ],
29
- "timestamp" : self .two_min_ago ,
29
+ "timestamp" : self .two_min_ago . isoformat () ,
30
30
"tags" : {"foo" : "1" },
31
31
},
32
32
project_id = self .project1 .id ,
@@ -37,7 +37,7 @@ def setUp(self):
37
37
"type" : "default" ,
38
38
"platform" : "python" ,
39
39
"fingerprint" : ["group1" ],
40
- "timestamp" : self .min_ago ,
40
+ "timestamp" : self .min_ago . isoformat () ,
41
41
"tags" : {"foo" : "1" },
42
42
},
43
43
project_id = self .project2 .id ,
@@ -48,7 +48,7 @@ def setUp(self):
48
48
"type" : "default" ,
49
49
"platform" : "python" ,
50
50
"fingerprint" : ["group2" ],
51
- "timestamp" : self .min_ago ,
51
+ "timestamp" : self .min_ago . isoformat () ,
52
52
"tags" : {"foo" : "1" },
53
53
},
54
54
project_id = self .project2 .id ,
@@ -176,7 +176,7 @@ def test_get_event_by_id_cached(self):
176
176
dummy_event = Event (
177
177
project_id = self .project2 .id ,
178
178
event_id = "1" * 32 ,
179
- data = {"something" : "hi" , "timestamp" : self .min_ago , "type" : "error" },
179
+ data = {"something" : "hi" , "timestamp" : self .min_ago . isoformat () , "type" : "error" },
180
180
)
181
181
mock_event .return_value = dummy_event
182
182
event = self .eventstore .get_event_by_id (self .project2 .id , "1" * 32 )
@@ -185,7 +185,7 @@ def test_get_event_by_id_cached(self):
185
185
186
186
# Now we store the event properly, so it will exist in Snuba.
187
187
self .store_event (
188
- data = {"event_id" : "1" * 32 , "timestamp" : self .min_ago , "type" : "error" },
188
+ data = {"event_id" : "1" * 32 , "timestamp" : self .min_ago . isoformat () , "type" : "error" },
189
189
project_id = self .project2 .id ,
190
190
)
191
191
@@ -217,33 +217,47 @@ def test_get_event_beyond_retention(self):
217
217
def test_get_adjacent_event_ids (self ):
218
218
event = self .eventstore .get_event_by_id (self .project2 .id , "b" * 32 )
219
219
220
- _filter = Filter (project_ids = [self .project1 .id , self .project2 .id ])
220
+ filter = Filter (project_ids = [self .project1 .id , self .project2 .id ])
221
221
222
- prev_event , next_event = self .eventstore .get_adjacent_event_ids (event , filter = _filter )
222
+ prev_event , next_event = self .eventstore .get_adjacent_event_ids (event , filter = filter )
223
223
224
224
assert prev_event == (str (self .project1 .id ), "a" * 32 )
225
225
226
226
# Events with the same timestamp are sorted by event_id
227
227
assert next_event == (str (self .project2 .id ), "c" * 32 )
228
228
229
- # Returns None if no event
230
- prev_event_none , next_event_none = self .eventstore .get_adjacent_event_ids (
231
- None , filter = _filter
229
+ # Returns None if the prev event is outside the start window
230
+ period_filter = Filter (
231
+ project_ids = [self .project1 .id , self .project2 .id ],
232
+ start = self .min_ago ,
232
233
)
234
+ prev_event , next_event = self .eventstore .get_adjacent_event_ids (event , filter = period_filter )
235
+ assert prev_event is None
236
+ assert next_event == (str (self .project2 .id ), "c" * 32 )
237
+
238
+ # Returns None if the next event is outside the end window
239
+ period_filter = Filter (
240
+ project_ids = [self .project1 .id , self .project2 .id ],
241
+ end = self .min_ago ,
242
+ )
243
+ prev_event , next_event = self .eventstore .get_adjacent_event_ids (event , filter = period_filter )
244
+ assert prev_event == (str (self .project1 .id ), "a" * 32 )
245
+ assert next_event is None
233
246
234
- assert prev_event_none is None
235
- assert next_event_none is None
247
+ # Returns None if no event
248
+ prev_event , next_event = self .eventstore .get_adjacent_event_ids (None , filter = filter )
249
+
250
+ assert prev_event is None
251
+ assert next_event is None
236
252
237
253
# Returns None if the query fails for a known reason
238
254
with mock .patch (
239
255
"sentry.utils.snuba.bulk_raw_query" , side_effect = snuba .QueryOutsideRetentionError ()
240
256
):
241
- prev_event_none , next_event_none = self .eventstore .get_adjacent_event_ids (
242
- event , filter = _filter
243
- )
257
+ prev_event , next_event = self .eventstore .get_adjacent_event_ids (event , filter = filter )
244
258
245
- assert prev_event_none is None
246
- assert next_event_none is None
259
+ assert prev_event is None
260
+ assert next_event is None
247
261
248
262
def test_adjacent_event_ids_same_timestamp (self ):
249
263
project = self .create_project ()
@@ -254,7 +268,7 @@ def test_adjacent_event_ids_same_timestamp(self):
254
268
"type" : "default" ,
255
269
"platform" : "python" ,
256
270
"fingerprint" : ["group" ],
257
- "timestamp" : self .min_ago ,
271
+ "timestamp" : self .min_ago . isoformat () ,
258
272
},
259
273
project_id = project .id ,
260
274
)
@@ -264,7 +278,7 @@ def test_adjacent_event_ids_same_timestamp(self):
264
278
"type" : "default" ,
265
279
"platform" : "python" ,
266
280
"fingerprint" : ["group" ],
267
- "timestamp" : self .min_ago ,
281
+ "timestamp" : self .min_ago . isoformat () ,
268
282
},
269
283
project_id = project .id ,
270
284
)
@@ -316,36 +330,33 @@ def test_transaction_get_next_prev_event_id(self):
316
330
317
331
def test_get_adjacent_event_ids_snql (self ):
318
332
project = self .create_project ()
333
+ data = {
334
+ "type" : "default" ,
335
+ "platform" : "python" ,
336
+ "fingerprint" : ["group" ],
337
+ }
338
+ self .store_event (
339
+ data = {** data , "event_id" : "a" * 32 , "timestamp" : before_now (minutes = 10 ).isoformat ()},
340
+ project_id = project .id ,
341
+ )
319
342
event1 = self .store_event (
320
- data = {
321
- "event_id" : "a" * 32 ,
322
- "type" : "default" ,
323
- "platform" : "python" ,
324
- "fingerprint" : ["group" ],
325
- "timestamp" : self .two_min_ago ,
326
- },
343
+ data = {** data , "event_id" : "b" * 32 , "timestamp" : before_now (minutes = 4 ).isoformat ()},
327
344
project_id = project .id ,
328
345
)
329
346
event2 = self .store_event (
330
- data = {
331
- "event_id" : "b" * 32 ,
332
- "type" : "default" ,
333
- "platform" : "python" ,
334
- "fingerprint" : ["group" ],
335
- "timestamp" : self .min_ago ,
336
- },
347
+ data = {** data , "event_id" : "c" * 32 , "timestamp" : before_now (minutes = 3 ).isoformat ()},
337
348
project_id = project .id ,
338
349
)
339
350
event3 = self .store_event (
340
- data = {
341
- "event_id" : "c" * 32 ,
342
- "type" : "default" ,
343
- "platform" : "python" ,
344
- "fingerprint" : ["group" ],
345
- "timestamp" : before_now (minutes = 0 ).isoformat (),
346
- },
351
+ data = {** data , "event_id" : "d" * 32 , "timestamp" : before_now (minutes = 2 ).isoformat ()},
352
+ project_id = project .id ,
353
+ )
354
+ self .store_event (
355
+ data = {** data , "event_id" : "e" * 32 , "timestamp" : before_now (minutes = 0 ).isoformat ()},
347
356
project_id = project .id ,
348
357
)
358
+
359
+ # Finds next and previous IDs
349
360
prev_ids , next_ids = self .eventstore .get_adjacent_event_ids_snql (
350
361
organization_id = event2 .organization .id ,
351
362
project_id = event2 .project_id ,
@@ -357,6 +368,28 @@ def test_get_adjacent_event_ids_snql(self):
357
368
assert prev_ids == (str (event1 .project_id ), event1 .event_id )
358
369
assert next_ids == (str (event3 .project_id ), event3 .event_id )
359
370
371
+ # Filter previous events that are outside of the start window
372
+ prev_ids , _ = self .eventstore .get_adjacent_event_ids_snql (
373
+ organization_id = event1 .organization .id ,
374
+ project_id = event1 .project_id ,
375
+ group_id = event1 .group_id ,
376
+ environments = [],
377
+ event = event1 ,
378
+ start = before_now (minutes = 5 ),
379
+ )
380
+ assert prev_ids is None
381
+
382
+ # Filter next events that are outside of the end window
383
+ _ , next_ids = self .eventstore .get_adjacent_event_ids_snql (
384
+ organization_id = event3 .organization .id ,
385
+ project_id = event3 .project_id ,
386
+ group_id = event3 .group_id ,
387
+ environments = [],
388
+ event = event3 ,
389
+ end = before_now (minutes = 1 ),
390
+ )
391
+ assert next_ids is None
392
+
360
393
def test_get_adjacent_event_ids_snql_order_of_event_ids (self ):
361
394
project = self .create_project ()
362
395
event1 = self .store_event (
@@ -365,7 +398,7 @@ def test_get_adjacent_event_ids_snql_order_of_event_ids(self):
365
398
"type" : "default" ,
366
399
"platform" : "python" ,
367
400
"fingerprint" : ["group" ],
368
- "timestamp" : self .two_min_ago ,
401
+ "timestamp" : self .two_min_ago . isoformat () ,
369
402
},
370
403
project_id = project .id ,
371
404
)
@@ -375,7 +408,7 @@ def test_get_adjacent_event_ids_snql_order_of_event_ids(self):
375
408
"type" : "default" ,
376
409
"platform" : "python" ,
377
410
"fingerprint" : ["group" ],
378
- "timestamp" : self .min_ago ,
411
+ "timestamp" : self .min_ago . isoformat () ,
379
412
},
380
413
project_id = project .id ,
381
414
)
@@ -408,7 +441,7 @@ def test_adjacent_event_ids_same_timestamp_snql(self):
408
441
"type" : "default" ,
409
442
"platform" : "python" ,
410
443
"fingerprint" : ["group" ],
411
- "timestamp" : self .min_ago ,
444
+ "timestamp" : self .min_ago . isoformat () ,
412
445
},
413
446
project_id = project .id ,
414
447
)
@@ -418,7 +451,7 @@ def test_adjacent_event_ids_same_timestamp_snql(self):
418
451
"type" : "default" ,
419
452
"platform" : "python" ,
420
453
"fingerprint" : ["group" ],
421
- "timestamp" : self .min_ago ,
454
+ "timestamp" : self .min_ago . isoformat () ,
422
455
},
423
456
project_id = project .id ,
424
457
)
@@ -458,7 +491,7 @@ def test_adjacent_event_ids_with_query_conditions(self):
458
491
"type" : "default" ,
459
492
"platform" : "python" ,
460
493
"fingerprint" : ["group" ],
461
- "timestamp" : self .min_ago ,
494
+ "timestamp" : self .min_ago . isoformat () ,
462
495
"tags" : {"organization.slug" : "sentry" },
463
496
},
464
497
project_id = project .id ,
@@ -469,7 +502,7 @@ def test_adjacent_event_ids_with_query_conditions(self):
469
502
"type" : "default" ,
470
503
"platform" : "python" ,
471
504
"fingerprint" : ["group" ],
472
- "timestamp" : self .min_ago ,
505
+ "timestamp" : self .min_ago . isoformat () ,
473
506
},
474
507
project_id = project .id ,
475
508
)
@@ -479,7 +512,7 @@ def test_adjacent_event_ids_with_query_conditions(self):
479
512
"type" : "default" ,
480
513
"platform" : "python" ,
481
514
"fingerprint" : ["group" ],
482
- "timestamp" : self .min_ago ,
515
+ "timestamp" : self .min_ago . isoformat () ,
483
516
"tags" : {"organization.slug" : "sentry" },
484
517
},
485
518
project_id = project .id ,
0 commit comments