@@ -74,6 +74,21 @@ class DocumentMonitorRunnerIT : AlertingRestTestCase() {
74
74
75
75
val alerts = searchAlerts(monitor)
76
76
assertEquals(" Alert saved for test monitor" , 0 , alerts.size)
77
+
78
+ // ensure doc level query is deleted on dry run
79
+ val request = """ {
80
+ "size": 10,
81
+ "query": {
82
+ "match_all": {}
83
+ }
84
+ }"""
85
+ var httpResponse = adminClient().makeRequest(
86
+ " GET" , " /${monitor.dataSources.queryIndex} /_search" ,
87
+ StringEntity (request, ContentType .APPLICATION_JSON )
88
+ )
89
+ assertEquals(" Search failed" , RestStatus .OK , httpResponse.restStatus())
90
+ var searchResponse = SearchResponse .fromXContent(createParser(JsonXContent .jsonXContent, httpResponse.entity.content))
91
+ searchResponse.hits.totalHits?.let { assertEquals(" Query saved in query index" , 0L , it.value) }
77
92
}
78
93
79
94
fun `test dryrun execute monitor with queryFieldNames set up with correct field` () {
@@ -297,6 +312,120 @@ class DocumentMonitorRunnerIT : AlertingRestTestCase() {
297
312
assertEquals(" Incorrect search result" , 2 , matchingDocsToQuery.size)
298
313
assertTrue(" Incorrect search result" , matchingDocsToQuery.contains(" 1|$testIndex " ))
299
314
assertTrue(" Incorrect search result" , matchingDocsToQuery.contains(" 5|$testIndex " ))
315
+
316
+ // ensure doc level query is deleted on dry run
317
+ val request = """ {
318
+ "size": 10,
319
+ "query": {
320
+ "match_all": {}
321
+ }
322
+ }"""
323
+ var httpResponse = adminClient().makeRequest(
324
+ " GET" , " /${monitor.dataSources.queryIndex} /_search" ,
325
+ StringEntity (request, ContentType .APPLICATION_JSON )
326
+ )
327
+ assertEquals(" Search failed" , RestStatus .OK , httpResponse.restStatus())
328
+ var searchResponse = SearchResponse .fromXContent(createParser(JsonXContent .jsonXContent, httpResponse.entity.content))
329
+ searchResponse.hits.totalHits?.let { assertEquals(" Query saved in query index" , 0L , it.value) }
330
+ }
331
+
332
+ fun `test execute monitor returns search result with dryrun then without dryrun ensure dry run query not saved` () {
333
+ val testIndex = createTestIndex()
334
+ val testTime = DateTimeFormatter .ISO_OFFSET_DATE_TIME .format(ZonedDateTime .now().truncatedTo(MILLIS ))
335
+ val testDoc = """ {
336
+ "message" : "This is an error from IAD region",
337
+ "test_strict_date_time" : "$testTime ",
338
+ "test_field" : "us-west-2"
339
+ }"""
340
+
341
+ val docQuery = DocLevelQuery (query = " test_field:\" us-west-2\" " , name = " 3" , fields = listOf ())
342
+ val docLevelInput = DocLevelMonitorInput (" description" , listOf (testIndex), listOf (docQuery))
343
+
344
+ val trigger = randomDocumentLevelTrigger(condition = ALWAYS_RUN )
345
+ val monitor = randomDocumentLevelMonitor(inputs = listOf (docLevelInput), triggers = listOf (trigger))
346
+
347
+ indexDoc(testIndex, " 1" , testDoc)
348
+ indexDoc(testIndex, " 2" , testDoc)
349
+
350
+ val response = executeMonitor(monitor, params = DRYRUN_MONITOR )
351
+
352
+ val output = entityAsMap(response)
353
+
354
+ assertEquals(monitor.name, output[" monitor_name" ])
355
+ @Suppress(" UNCHECKED_CAST" )
356
+ val searchResult = (output.objectMap(" input_results" )[" results" ] as List <Map <String , Any >>).first()
357
+ @Suppress(" UNCHECKED_CAST" )
358
+ val matchingDocsToQuery = searchResult[docQuery.id] as List <String >
359
+ assertEquals(" Incorrect search result" , 2 , matchingDocsToQuery.size)
360
+ assertTrue(" Incorrect search result" , matchingDocsToQuery.contains(" 1|$testIndex " ))
361
+ assertTrue(" Incorrect search result" , matchingDocsToQuery.contains(" 2|$testIndex " ))
362
+
363
+ // ensure doc level query is deleted on dry run
364
+ val request = """ {
365
+ "size": 10,
366
+ "query": {
367
+ "match_all": {}
368
+ }
369
+ }"""
370
+ var httpResponse = adminClient().makeRequest(
371
+ " GET" , " /${monitor.dataSources.queryIndex} /_search" ,
372
+ StringEntity (request, ContentType .APPLICATION_JSON )
373
+ )
374
+ assertEquals(" Search failed" , RestStatus .OK , httpResponse.restStatus())
375
+ var searchResponse = SearchResponse .fromXContent(createParser(JsonXContent .jsonXContent, httpResponse.entity.content))
376
+ searchResponse.hits.totalHits?.let { assertEquals(0L , it.value) }
377
+
378
+ // create and execute second monitor not as dryrun
379
+ val testIndex2 = createTestIndex(" test1" )
380
+ val testTime2 = DateTimeFormatter .ISO_OFFSET_DATE_TIME .format(ZonedDateTime .now().truncatedTo(MILLIS ))
381
+ val testDoc2 = """ {
382
+ "message" : "This is an error from IAD region",
383
+ "test_strict_date_time" : "$testTime2 ",
384
+ "test_field" : "us-east-1"
385
+ }"""
386
+
387
+ val docQuery2 = DocLevelQuery (query = " test_field:\" us-east-1\" " , name = " 3" , fields = listOf ())
388
+ val docLevelInput2 = DocLevelMonitorInput (" description" , listOf (testIndex2), listOf (docQuery2))
389
+
390
+ val trigger2 = randomDocumentLevelTrigger(condition = ALWAYS_RUN )
391
+ val monitor2 = createMonitor(randomDocumentLevelMonitor(inputs = listOf (docLevelInput2), triggers = listOf (trigger2)))
392
+ assertNotNull(monitor2.id)
393
+
394
+ indexDoc(testIndex2, " 1" , testDoc2)
395
+ indexDoc(testIndex2, " 5" , testDoc2)
396
+
397
+ val response2 = executeMonitor(monitor2.id)
398
+ val output2 = entityAsMap(response2)
399
+
400
+ assertEquals(monitor2.name, output2[" monitor_name" ])
401
+ @Suppress(" UNCHECKED_CAST" )
402
+ val searchResult2 = (output2.objectMap(" input_results" )[" results" ] as List <Map <String , Any >>).first()
403
+ @Suppress(" UNCHECKED_CAST" )
404
+ val matchingDocsToQuery2 = searchResult2[docQuery2.id] as List <String >
405
+ assertEquals(" Incorrect search result" , 2 , matchingDocsToQuery2.size)
406
+ assertTrue(" Incorrect search result" , matchingDocsToQuery2.containsAll(listOf (" 1|$testIndex2 " , " 5|$testIndex2 " )))
407
+
408
+ val alerts = searchAlertsWithFilter(monitor2)
409
+ assertEquals(" Alert saved for test monitor" , 2 , alerts.size)
410
+
411
+ val findings = searchFindings(monitor2)
412
+ assertEquals(" Findings saved for test monitor" , 2 , findings.size)
413
+ assertTrue(" Findings saved for test monitor" , findings[0 ].relatedDocIds.contains(" 1" ))
414
+ assertTrue(" Findings saved for test monitor" , findings[1 ].relatedDocIds.contains(" 5" ))
415
+
416
+ // ensure query from second monitor was saved
417
+ val expectedQueries = listOf (" test_field_test1_${monitor2.id} :\" us-east-1\" " )
418
+ httpResponse = adminClient().makeRequest(
419
+ " GET" , " /${monitor.dataSources.queryIndex} /_search" ,
420
+ StringEntity (request, ContentType .APPLICATION_JSON )
421
+ )
422
+ assertEquals(" Search failed" , RestStatus .OK , httpResponse.restStatus())
423
+ searchResponse = SearchResponse .fromXContent(createParser(JsonXContent .jsonXContent, httpResponse.entity.content))
424
+ searchResponse.hits.forEach { hit ->
425
+ val query = ((hit.sourceAsMap[" query" ] as Map <String , Any >)[" query_string" ] as Map <String , Any >)[" query" ]
426
+ assertTrue(expectedQueries.contains(query))
427
+ }
428
+ searchResponse.hits.totalHits?.let { assertEquals(" Query saved in query index" , 1L , it.value) }
300
429
}
301
430
302
431
fun `test execute monitor generates alerts and findings` () {
0 commit comments