Skip to content

Commit b337796

Browse files
authored
Refactor field names - all goes under elasticsearch.querylog (elastic#143182)
* Refactor field names - all goes under elasticsearch.querylog
1 parent cd8155b commit b337796

File tree

22 files changed

+145
-90
lines changed

22 files changed

+145
-90
lines changed

server/src/internalClusterTest/java/org/elasticsearch/search/SearchLoggingIT.java

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.elasticsearch.action.search.ClosePointInTimeRequest;
2121
import org.elasticsearch.action.search.OpenPointInTimeRequest;
2222
import org.elasticsearch.action.search.OpenPointInTimeResponse;
23+
import org.elasticsearch.action.search.SearchLogContext;
2324
import org.elasticsearch.action.search.SearchLogProducer;
2425
import org.elasticsearch.action.search.SearchPhaseExecutionException;
2526
import org.elasticsearch.action.search.SearchResponse;
@@ -32,6 +33,7 @@
3233
import org.elasticsearch.cluster.metadata.Template;
3334
import org.elasticsearch.common.logging.AccumulatingMockAppender;
3435
import org.elasticsearch.common.logging.Loggers;
36+
import org.elasticsearch.common.logging.activity.QueryLogging;
3537
import org.elasticsearch.common.settings.Settings;
3638
import org.elasticsearch.common.util.CollectionUtils;
3739
import org.elasticsearch.core.TimeValue;
@@ -63,8 +65,8 @@
6365
import static org.elasticsearch.action.search.SearchLogProducer.QUERY_FIELD_IS_SYSTEM;
6466
import static org.elasticsearch.action.search.SearchLogProducer.QUERY_FIELD_SEARCH_HITS;
6567
import static org.elasticsearch.action.search.SearchLogProducer.QUERY_FIELD_SEARCH_HITS_GTE;
66-
import static org.elasticsearch.common.logging.activity.ActivityLogProducer.ES_FIELDS_PREFIX;
6768
import static org.elasticsearch.common.logging.activity.ActivityLogProducer.EVENT_OUTCOME_FIELD;
69+
import static org.elasticsearch.common.logging.activity.QueryLogging.ES_QUERY_FIELDS_PREFIX;
6870
import static org.elasticsearch.common.logging.activity.QueryLogging.QUERY_FIELD_INDICES;
6971
import static org.elasticsearch.common.logging.activity.QueryLogging.QUERY_FIELD_QUERY;
7072
import static org.elasticsearch.common.logging.activity.QueryLogging.QUERY_FIELD_RESULT_COUNT;
@@ -77,19 +79,22 @@
7779
import static org.elasticsearch.test.ActivityLoggingUtils.assertMessageFailure;
7880
import static org.elasticsearch.test.ActivityLoggingUtils.assertMessageSuccess;
7981
import static org.elasticsearch.test.ActivityLoggingUtils.getMessageData;
82+
import static org.elasticsearch.test.ActivityLoggingUtils.getMessageField;
8083
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
8184
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertFailures;
8285
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertResponse;
8386
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchHitsWithoutFailures;
87+
import static org.hamcrest.Matchers.arrayContaining;
8488
import static org.hamcrest.Matchers.containsString;
8589
import static org.hamcrest.Matchers.equalTo;
8690
import static org.hamcrest.Matchers.greaterThan;
8791
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
8892
import static org.hamcrest.Matchers.hasSize;
93+
import static org.hamcrest.Matchers.instanceOf;
8994

9095
public 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

server/src/main/java/org/elasticsearch/action/search/SearchLogContext.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
package org.elasticsearch.action.search;
1111

12-
import joptsimple.internal.Strings;
13-
1412
import org.apache.lucene.search.TotalHits;
1513
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1614
import org.elasticsearch.common.logging.activity.ActivityLoggerContext;
@@ -23,7 +21,7 @@
2321
import java.util.function.Predicate;
2422

2523
public class SearchLogContext extends ActivityLoggerContext {
26-
private static final String TYPE = "search";
24+
public static final String TYPE = "dsl";
2725
private final SearchRequest request;
2826
private final @Nullable SearchResponse response;
2927
private final NamedWriteableRegistry namedWriteableRegistry;
@@ -108,8 +106,8 @@ public boolean isTimedOut() {
108106
return response != null && response.isTimedOut();
109107
}
110108

111-
public String getIndices() {
112-
return Strings.join(getIndexNames(), ",");
109+
public String[] getIndices() {
110+
return getIndexNames();
113111
}
114112

115113
public boolean hasAggregations() {

server/src/main/java/org/elasticsearch/action/search/SearchLogProducer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.function.Predicate;
2323

2424
import static org.elasticsearch.common.logging.activity.ActivityLogger.ACTIVITY_LOGGER_SETTINGS_PREFIX;
25+
import static org.elasticsearch.common.logging.activity.QueryLogging.ES_QUERY_FIELDS_PREFIX;
2526

2627
public class SearchLogProducer implements ActivityLogProducer<SearchLogContext> {
2728

@@ -58,7 +59,7 @@ public Optional<ESLogMessage> produce(SearchLogContext context, ActionLoggingFie
5859
if (logSystemSearches == false && isSystemSearch) {
5960
return Optional.empty();
6061
}
61-
ESLogMessage msg = produceCommon(context, additionalFields);
62+
ESLogMessage msg = produceCommon(context, ES_QUERY_FIELDS_PREFIX, additionalFields);
6263
msg.field(QueryLogging.QUERY_FIELD_QUERY, context.getQuery());
6364
msg.field(QueryLogging.QUERY_FIELD_INDICES, context.getIndices());
6465
msg.field(QueryLogging.QUERY_FIELD_RESULT_COUNT, context.getHits());

server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,6 @@ public TransportSearchAction(
240240
this.forceConnectTimeoutSecs = settings.getAsTime("search.ccs.force_connect_timeout", null);
241241
this.crossProjectModeDecider = new CrossProjectModeDecider(settings);
242242
this.activityLogger = new ActivityLogger<>(
243-
"search",
244243
clusterService.getClusterSettings(),
245244
new SearchLogProducer(clusterService.getClusterSettings(), indexNameExpressionResolver.getSystemNamePredicate()),
246245
logWriterProvider,

server/src/main/java/org/elasticsearch/common/logging/activity/ActivityLogProducer.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,42 +24,43 @@
2424
*/
2525
public interface ActivityLogProducer<Context extends ActivityLoggerContext> {
2626

27-
String ES_FIELDS_PREFIX = "elasticsearch.activitylog.";
2827
String X_OPAQUE_ID_FIELD = "http.request.headers.x_opaque_id";
2928
String EVENT_OUTCOME_FIELD = "event.outcome";
3029
String EVENT_DURATION_FIELD = "event.duration";
31-
// Fields specific to querying logs - search, esql, etc. Common fields are in ES_FIELDS_PREFIX.
32-
String ES_QUERY_FIELDS_PREFIX = "elasticsearch.activitylog.querying.";
33-
String QUERY_LOGGER_NAME = "elasticsearch.querylog";
30+
String TRACE_ID_FIELD = "trace.id";
3431

3532
/**
3633
* Produces a {@link ESLogMessage} if the producer decides to log, or nothing otherwise.
3734
*/
3835
Optional<ESLogMessage> produce(Context context, ActionLoggingFields additionalFields);
3936

37+
/**
38+
* Since we only have query logging for now, set it as the default logger name for convenience.
39+
*/
4040
default String loggerName() {
41-
return QUERY_LOGGER_NAME;
41+
return QueryLogging.QUERY_LOGGER_NAME;
4242
}
4343

4444
/**
4545
* Produces a {@link ESLogMessage} with common fields.
4646
*/
47-
default ESLogMessage produceCommon(Context context, ActionLoggingFields additionalFields) {
47+
default ESLogMessage produceCommon(Context context, String prefix, ActionLoggingFields additionalFields) {
4848
var fields = new ESLogMessage();
4949
fields.withFields(additionalFields.logFields());
5050
fields.field(X_OPAQUE_ID_FIELD, context.getOpaqueId());
51+
fields.field(TRACE_ID_FIELD, context.getTraceId());
5152
long tookInNanos = context.getTookInNanos();
5253
fields.field(EVENT_DURATION_FIELD, tookInNanos);
53-
fields.field(ES_FIELDS_PREFIX + "took", tookInNanos);
54-
fields.field(ES_FIELDS_PREFIX + "took_millis", TimeUnit.NANOSECONDS.toMillis(tookInNanos));
5554
fields.field(EVENT_OUTCOME_FIELD, context.isSuccess() ? "success" : "failure");
56-
fields.field(ES_FIELDS_PREFIX + "type", context.getType());
55+
fields.field(prefix + "took", tookInNanos);
56+
fields.field(prefix + "took_millis", TimeUnit.NANOSECONDS.toMillis(tookInNanos));
57+
fields.field(prefix + "type", context.getType());
5758
if (context.isSuccess() == false) {
5859
fields.field("error.type", context.getErrorType());
5960
fields.field("error.message", context.getErrorMessage());
6061
}
6162
if (context.isTimedOut()) {
62-
fields.field(ES_FIELDS_PREFIX + "timed_out", true);
63+
fields.field(prefix + "timed_out", true);
6364
}
6465
return fields;
6566
}

server/src/main/java/org/elasticsearch/common/logging/activity/ActivityLogger.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ public class ActivityLogger<Context extends ActivityLoggerContext> {
7373
);
7474

7575
public ActivityLogger(
76-
String name,
7776
ClusterSettings settings,
7877
ActivityLogProducer<Context> producer,
7978
ActivityLogWriterProvider writerProvider,

server/src/main/java/org/elasticsearch/common/logging/activity/ActivityLoggerContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@ public String getErrorType() {
6161
public String getOpaqueId() {
6262
return task.getHeader(Task.X_OPAQUE_ID_HTTP_HEADER);
6363
}
64+
65+
public String getTraceId() {
66+
return task.getHeader(Task.TRACE_ID);
67+
}
6468
}

server/src/main/java/org/elasticsearch/common/logging/activity/QueryLogging.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,28 @@
99

1010
package org.elasticsearch.common.logging.activity;
1111

12-
import static org.elasticsearch.common.logging.activity.ActivityLogProducer.ES_FIELDS_PREFIX;
13-
1412
/**
15-
* Constants specific to logging queries - search, esql, etc. Common fields are in ES_FIELDS_PREFIX.
13+
* Constants specific to logging queries - DSL search, ESQL, etc.
1614
*/
1715
public interface QueryLogging {
18-
String ES_QUERY_FIELDS_PREFIX = ES_FIELDS_PREFIX + "querying.";
16+
/**
17+
* This is the prefix for all query logging specific fields.
18+
*/
19+
String ES_QUERY_FIELDS_PREFIX = "elasticsearch.querylog.";
20+
/**
21+
* Query text.
22+
*/
1923
String QUERY_FIELD_QUERY = ES_QUERY_FIELDS_PREFIX + "query";
24+
/**
25+
* How many results the search or query actually returned.
26+
*/
2027
String QUERY_FIELD_RESULT_COUNT = ES_QUERY_FIELDS_PREFIX + "result_count";
28+
/**
29+
* Which indices were queried. May not apply to some modules like ESQL or SQL.
30+
*/
2131
String QUERY_FIELD_INDICES = ES_QUERY_FIELDS_PREFIX + "indices";
32+
/**
33+
* This is the name Log4j logger will use.
34+
*/
35+
String QUERY_LOGGER_NAME = "elasticsearch.querylog";
2236
}

0 commit comments

Comments
 (0)