2020import org .elasticsearch .action .search .ClosePointInTimeRequest ;
2121import org .elasticsearch .action .search .OpenPointInTimeRequest ;
2222import org .elasticsearch .action .search .OpenPointInTimeResponse ;
23+ import org .elasticsearch .action .search .SearchLogContext ;
2324import org .elasticsearch .action .search .SearchLogProducer ;
2425import org .elasticsearch .action .search .SearchPhaseExecutionException ;
2526import org .elasticsearch .action .search .SearchResponse ;
3233import org .elasticsearch .cluster .metadata .Template ;
3334import org .elasticsearch .common .logging .AccumulatingMockAppender ;
3435import org .elasticsearch .common .logging .Loggers ;
36+ import org .elasticsearch .common .logging .activity .QueryLogging ;
3537import org .elasticsearch .common .settings .Settings ;
3638import org .elasticsearch .common .util .CollectionUtils ;
3739import org .elasticsearch .core .TimeValue ;
6365import static org .elasticsearch .action .search .SearchLogProducer .QUERY_FIELD_IS_SYSTEM ;
6466import static org .elasticsearch .action .search .SearchLogProducer .QUERY_FIELD_SEARCH_HITS ;
6567import static org .elasticsearch .action .search .SearchLogProducer .QUERY_FIELD_SEARCH_HITS_GTE ;
66- import static org .elasticsearch .common .logging .activity .ActivityLogProducer .ES_FIELDS_PREFIX ;
6768import static org .elasticsearch .common .logging .activity .ActivityLogProducer .EVENT_OUTCOME_FIELD ;
69+ import static org .elasticsearch .common .logging .activity .QueryLogging .ES_QUERY_FIELDS_PREFIX ;
6870import static org .elasticsearch .common .logging .activity .QueryLogging .QUERY_FIELD_INDICES ;
6971import static org .elasticsearch .common .logging .activity .QueryLogging .QUERY_FIELD_QUERY ;
7072import static org .elasticsearch .common .logging .activity .QueryLogging .QUERY_FIELD_RESULT_COUNT ;
7779import static org .elasticsearch .test .ActivityLoggingUtils .assertMessageFailure ;
7880import static org .elasticsearch .test .ActivityLoggingUtils .assertMessageSuccess ;
7981import static org .elasticsearch .test .ActivityLoggingUtils .getMessageData ;
82+ import static org .elasticsearch .test .ActivityLoggingUtils .getMessageField ;
8083import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertAcked ;
8184import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertFailures ;
8285import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertResponse ;
8386import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertSearchHitsWithoutFailures ;
87+ import static org .hamcrest .Matchers .arrayContaining ;
8488import static org .hamcrest .Matchers .containsString ;
8589import static org .hamcrest .Matchers .equalTo ;
8690import static org .hamcrest .Matchers .greaterThan ;
8791import static org .hamcrest .Matchers .greaterThanOrEqualTo ;
8892import static org .hamcrest .Matchers .hasSize ;
93+ import static org .hamcrest .Matchers .instanceOf ;
8994
9095public class SearchLoggingIT extends AbstractSearchCancellationTestCase {
9196 static AccumulatingMockAppender appender ;
92- static Logger queryLog = LogManager .getLogger (SearchLogProducer .QUERY_LOGGER_NAME );
97+ static Logger queryLog = LogManager .getLogger (QueryLogging .QUERY_LOGGER_NAME );
9398 static Level origQueryLogLevel = queryLog .getLevel ();
9499
95100 @ BeforeClass
@@ -144,21 +149,21 @@ public void testSearchLog() {
144149 assertSearchHitsWithoutFailures (prepareSearch ().setQuery (simpleQueryStringQuery ("fox" )), "1" );
145150 var event = appender .getLastEventAndReset ();
146151 Map <String , String > message = getMessageData (event );
147- assertMessageSuccess (message , "search" , "fox" );
152+ assertMessageSuccess (message , SearchLogContext . TYPE , "fox" );
148153 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("1" ));
149154 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo ("" ));
150- assertNull (message .get (ES_FIELDS_PREFIX + "timed_out" ));
155+ assertNull (message .get (ES_QUERY_FIELDS_PREFIX + "timed_out" ));
151156 }
152157
153158 // Match
154159 {
155160 assertSearchHitsWithoutFailures (prepareSearch (INDEX_NAME ).setQuery (matchQuery ("field1" , "quick" )), "1" , "2" , "3" );
156161 var event = appender .getLastEventAndReset ();
157162 Map <String , String > message = getMessageData (event );
158- assertMessageSuccess (message , "search" , "quick" );
163+ assertMessageSuccess (message , SearchLogContext . TYPE , "quick" );
159164 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("3" ));
160165 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo (INDEX_NAME ));
161- assertNull (message .get (ES_FIELDS_PREFIX + "timed_out" ));
166+ assertNull (message .get (ES_QUERY_FIELDS_PREFIX + "timed_out" ));
162167 }
163168 // Total hits
164169 {
@@ -168,15 +173,34 @@ public void testSearchLog() {
168173 );
169174 var event = appender .getLastEventAndReset ();
170175 Map <String , String > message = getMessageData (event );
171- assertMessageSuccess (message , "search" , "quick" );
176+ assertMessageSuccess (message , SearchLogContext . TYPE , "quick" );
172177 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("1" ));
173178 assertThat (message .get (QUERY_FIELD_SEARCH_HITS ), equalTo ("2" ));
174179 assertThat (message .get (QUERY_FIELD_SEARCH_HITS_GTE ), equalTo ("true" ));
175180 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo (INDEX_NAME ));
176- assertNull (message .get (ES_FIELDS_PREFIX + "timed_out" ));
181+ assertNull (message .get (ES_QUERY_FIELDS_PREFIX + "timed_out" ));
177182 }
178183 }
179184
185+ public void testIndicesFieldIsArray () {
186+ setupIndex ();
187+
188+ assertSearchHitsWithoutFailures (prepareSearch (INDEX_NAME ).setQuery (matchQuery ("field1" , "quick" )), "1" , "2" , "3" );
189+ var event = appender .getLastEventAndReset ();
190+ Object indicesField = getMessageField (event , QUERY_FIELD_INDICES );
191+ assertThat (indicesField , instanceOf (String [].class ));
192+ assertThat ((String []) indicesField , arrayContaining (INDEX_NAME ));
193+
194+ // Test with more than one index
195+ String secondIndex = INDEX_NAME + "_2" ;
196+ assertAcked (prepareCreate (secondIndex ));
197+ assertSearchHitsWithoutFailures (prepareSearch (INDEX_NAME , secondIndex ).setQuery (matchQuery ("field1" , "quick" )), "1" , "2" , "3" );
198+ var event2 = appender .getLastEventAndReset ();
199+ Object indicesField2 = getMessageField (event2 , QUERY_FIELD_INDICES );
200+ assertThat (indicesField2 , instanceOf (String [].class ));
201+ assertThat ((String []) indicesField2 , arrayContaining (INDEX_NAME , secondIndex ));
202+ }
203+
180204 public void testFailureLog () {
181205 assertAcked (prepareCreate (INDEX_NAME ).setMapping ("field1" , "type=text,index_options=docs" ));
182206 indexRandom (
@@ -192,7 +216,7 @@ public void testFailureLog() {
192216 );
193217 var event = appender .getLastEventAndReset ();
194218 Map <String , String > message = getMessageData (event );
195- assertMessageFailure (message , "search" , "quick brown" , SearchPhaseExecutionException .class , "all shards failed" );
219+ assertMessageFailure (message , SearchLogContext . TYPE , "quick brown" , SearchPhaseExecutionException .class , "all shards failed" );
196220 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("0" ));
197221 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo (INDEX_NAME ));
198222 }
@@ -212,7 +236,7 @@ public void testSearchCancel() throws Exception {
212236 ensureSearchWasCancelled (searchResponse );
213237 var event = appender .getLastEventAndReset ();
214238 Map <String , String > message = getMessageData (event );
215- assertMessageFailure (message , "search" , "mockscript" , SearchPhaseExecutionException .class , null );
239+ assertMessageFailure (message , SearchLogContext . TYPE , "mockscript" , SearchPhaseExecutionException .class , null );
216240 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("0" ));
217241 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo ("test" ));
218242 }
@@ -229,9 +253,9 @@ public void testMultiSearch() {
229253 appender .events .forEach (ev -> {
230254 Map <String , String > message = getMessageData (ev );
231255 assertThat (message .get (EVENT_OUTCOME_FIELD ), equalTo ("success" ));
232- assertThat (message .get (ES_FIELDS_PREFIX + "type" ), equalTo ("search" ));
233- assertThat (Long .valueOf (message .get (ES_FIELDS_PREFIX + "took" )), greaterThan (0L ));
234- assertThat (Long .valueOf (message .get (ES_FIELDS_PREFIX + "took_millis" )), greaterThanOrEqualTo (0L ));
256+ assertThat (message .get (ES_QUERY_FIELDS_PREFIX + "type" ), equalTo (SearchLogContext . TYPE ));
257+ assertThat (Long .valueOf (message .get (ES_QUERY_FIELDS_PREFIX + "took" )), greaterThan (0L ));
258+ assertThat (Long .valueOf (message .get (ES_QUERY_FIELDS_PREFIX + "took_millis" )), greaterThanOrEqualTo (0L ));
235259 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo (INDEX_NAME ));
236260 if (message .get (QUERY_FIELD_QUERY ).contains ("quick" )) {
237261 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("3" ));
@@ -256,7 +280,7 @@ public void testPitSearch() {
256280 );
257281 var event = appender .getLastEventAndReset ();
258282 Map <String , String > message = getMessageData (event );
259- assertMessageSuccess (message , "search" , "fox" );
283+ assertMessageSuccess (message , SearchLogContext . TYPE , "fox" );
260284 assertThat (message .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("1" ));
261285 assertThat (message .get (QUERY_FIELD_INDICES ), equalTo (INDEX_NAME ));
262286 } finally {
@@ -345,7 +369,7 @@ public void testSearchHasAggregationsLog() {
345369 assertSearchHitsWithoutFailures (prepareSearch (INDEX_NAME ).setQuery (matchQuery ("field1" , "quick" )), "1" , "2" , "3" );
346370 var eventNoAgg = appender .getLastEventAndReset ();
347371 Map <String , String > messageNoAgg = getMessageData (eventNoAgg );
348- assertMessageSuccess (messageNoAgg , "search" , "quick" );
372+ assertMessageSuccess (messageNoAgg , SearchLogContext . TYPE , "quick" );
349373 assertThat (messageNoAgg .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("3" ));
350374 assertNull (messageNoAgg .get (SearchLogProducer .QUERY_FIELD_HAS_AGGREGATIONS ));
351375
@@ -356,7 +380,7 @@ public void testSearchHasAggregationsLog() {
356380 );
357381 var eventWithAgg = appender .getLastEventAndReset ();
358382 Map <String , String > messageWithAgg = getMessageData (eventWithAgg );
359- assertMessageSuccess (messageWithAgg , "search" , "match_all" );
383+ assertMessageSuccess (messageWithAgg , SearchLogContext . TYPE , "match_all" );
360384 assertThat (messageWithAgg .get (QUERY_FIELD_RESULT_COUNT ), equalTo ("0" ));
361385 assertThat (messageWithAgg .get (QUERY_FIELD_SEARCH_HITS ), equalTo ("3" ));
362386 assertNull (messageWithAgg .get (QUERY_FIELD_SEARCH_HITS_GTE ));
@@ -365,7 +389,7 @@ public void testSearchHasAggregationsLog() {
365389
366390 public void testSearchTimedOutLog () {
367391 setupIndex ();
368- final String timedOutField = ES_FIELDS_PREFIX + "timed_out" ;
392+ final String timedOutField = ES_QUERY_FIELDS_PREFIX + "timed_out" ;
369393
370394 // Search that times out (using plugin that throws TimeExceededException): timed_out must be true
371395 SearchResponse timedOutResponse = null ;
@@ -383,7 +407,7 @@ public void testSearchTimedOutLog() {
383407 }
384408 var eventTimedOut = appender .getLastEventAndReset ();
385409 Map <String , String > messageTimedOut = getMessageData (eventTimedOut );
386- assertMessageSuccess (messageTimedOut , "search" , "timeout" );
410+ assertMessageSuccess (messageTimedOut , SearchLogContext . TYPE , "timeout" );
387411 assertThat (messageTimedOut .get (timedOutField ), equalTo ("true" ));
388412 }
389413
0 commit comments