Skip to content

Commit 5bf0c63

Browse files
committed
Refactor log writer, update tests
1 parent 867f045 commit 5bf0c63

File tree

24 files changed

+166
-151
lines changed

24 files changed

+166
-151
lines changed

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

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import org.apache.logging.log4j.Level;
1313
import org.apache.logging.log4j.LogManager;
1414
import org.apache.logging.log4j.Logger;
15-
import org.apache.logging.log4j.core.LogEvent;
16-
import org.apache.logging.log4j.message.MapMessage;
1715
import org.elasticsearch.action.ActionFuture;
1816
import org.elasticsearch.action.admin.indices.create.AutoCreateAction;
1917
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
@@ -23,6 +21,7 @@
2321
import org.elasticsearch.action.search.OpenPointInTimeRequest;
2422
import org.elasticsearch.action.search.OpenPointInTimeResponse;
2523
import org.elasticsearch.action.search.SearchLogProducer;
24+
import org.elasticsearch.action.search.SearchPhaseExecutionException;
2625
import org.elasticsearch.action.search.SearchResponse;
2726
import org.elasticsearch.action.search.TransportClosePointInTimeAction;
2827
import org.elasticsearch.action.search.TransportOpenPointInTimeAction;
@@ -65,6 +64,9 @@
6564
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
6665
import static org.elasticsearch.index.query.QueryBuilders.simpleQueryStringQuery;
6766
import static org.elasticsearch.test.AbstractSearchCancellationTestCase.ScriptedBlockPlugin.SEARCH_BLOCK_SCRIPT_NAME;
67+
import static org.elasticsearch.test.ActionLoggingUtils.assertMessageFailure;
68+
import static org.elasticsearch.test.ActionLoggingUtils.assertMessageSuccess;
69+
import static org.elasticsearch.test.ActionLoggingUtils.getMessageData;
6870
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
6971
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertFailures;
7072
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertResponse;
@@ -74,7 +76,6 @@
7476
import static org.hamcrest.Matchers.greaterThan;
7577
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
7678
import static org.hamcrest.Matchers.hasSize;
77-
import static org.hamcrest.Matchers.instanceOf;
7879

7980
public class SearchLoggingIT extends AbstractSearchCancellationTestCase {
8081
static AccumulatingMockAppender appender;
@@ -119,14 +120,6 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
119120

120121
private static final String INDEX_NAME = "test_index";
121122

122-
@SuppressWarnings("unchecked")
123-
private Map<String, String> getMessageData(LogEvent event) {
124-
assertNotNull(event);
125-
assertThat(event.getMessage(), instanceOf(MapMessage.class));
126-
127-
return ((MapMessage<?, String>) event.getMessage()).getData();
128-
}
129-
130123
// Test _search
131124
public void testSearchLog() {
132125
setupIndex();
@@ -136,12 +129,8 @@ public void testSearchLog() {
136129
assertSearchHitsWithoutFailures(prepareSearch().setQuery(simpleQueryStringQuery("fox")), "1");
137130
var event = appender.getLastEventAndReset();
138131
Map<String, String> message = getMessageData(event);
139-
assertThat(message.get("success"), equalTo("true"));
140-
assertThat(message.get("type"), equalTo("search"));
132+
assertMessageSuccess(message, "search", "fox");
141133
assertThat(message.get("hits"), equalTo("1"));
142-
assertThat(Long.valueOf(message.get("took")), greaterThan(0L));
143-
assertThat(Long.valueOf(message.get("took_millis")), greaterThanOrEqualTo(0L));
144-
assertThat(message.get("query"), containsString("fox"));
145134
assertThat(message.get("indices"), equalTo(""));
146135
}
147136

@@ -150,12 +139,8 @@ public void testSearchLog() {
150139
assertSearchHitsWithoutFailures(prepareSearch(INDEX_NAME).setQuery(matchQuery("field1", "quick")), "1", "2", "3");
151140
var event = appender.getLastEventAndReset();
152141
Map<String, String> message = getMessageData(event);
153-
assertThat(message.get("success"), equalTo("true"));
154-
assertThat(message.get("type"), equalTo("search"));
142+
assertMessageSuccess(message, "search", "quick");
155143
assertThat(message.get("hits"), equalTo("3"));
156-
assertThat(Long.valueOf(message.get("took")), greaterThan(0L));
157-
assertThat(Long.valueOf(message.get("took_millis")), greaterThanOrEqualTo(0L));
158-
assertThat(message.get("query"), containsString("quick"));
159144
assertThat(message.get("indices"), equalTo(INDEX_NAME));
160145
}
161146
}
@@ -175,15 +160,9 @@ public void testFailureLog() {
175160
);
176161
var event = appender.getLastEventAndReset();
177162
Map<String, String> message = getMessageData(event);
178-
assertThat(message.get("success"), equalTo("false"));
179-
assertThat(message.get("type"), equalTo("search"));
163+
assertMessageFailure(message, "search", "quick brown", SearchPhaseExecutionException.class, "all shards failed");
180164
assertThat(message.get("hits"), equalTo("0"));
181-
assertThat(Long.valueOf(message.get("took")), greaterThan(0L));
182-
assertThat(Long.valueOf(message.get("took_millis")), greaterThanOrEqualTo(0L));
183-
assertThat(message.get("query"), containsString("quick brown"));
184165
assertThat(message.get("indices"), equalTo(INDEX_NAME));
185-
assertThat(message.get("error.type"), equalTo("org.elasticsearch.action.search.SearchPhaseExecutionException"));
186-
assertThat(message.get("error.message"), equalTo("all shards failed"));
187166
}
188167

189168
public void testSearchCancel() throws Exception {
@@ -201,14 +180,9 @@ public void testSearchCancel() throws Exception {
201180
ensureSearchWasCancelled(searchResponse);
202181
var event = appender.getLastEventAndReset();
203182
Map<String, String> message = getMessageData(event);
204-
assertThat(message.get("success"), equalTo("false"));
205-
assertThat(message.get("type"), equalTo("search"));
183+
assertMessageFailure(message, "search", "mockscript", SearchPhaseExecutionException.class, null);
206184
assertThat(message.get("hits"), equalTo("0"));
207-
assertThat(Long.valueOf(message.get("took")), greaterThan(0L));
208-
assertThat(Long.valueOf(message.get("took_millis")), greaterThanOrEqualTo(0L));
209-
assertThat(message.get("query"), containsString("mockscript"));
210185
assertThat(message.get("indices"), equalTo("test"));
211-
assertThat(message.get("error.type"), equalTo("org.elasticsearch.action.search.SearchPhaseExecutionException"));
212186
}
213187

214188
public void testMultiSearch() {
@@ -250,12 +224,8 @@ public void testPitSearch() {
250224
);
251225
var event = appender.getLastEventAndReset();
252226
Map<String, String> message = getMessageData(event);
253-
assertThat(message.get("success"), equalTo("true"));
254-
assertThat(message.get("type"), equalTo("search"));
227+
assertMessageSuccess(message, "search", "fox");
255228
assertThat(message.get("hits"), equalTo("1"));
256-
assertThat(Long.valueOf(message.get("took")), greaterThan(0L));
257-
assertThat(Long.valueOf(message.get("took_millis")), greaterThanOrEqualTo(0L));
258-
assertThat(message.get("query"), containsString("fox"));
259229
assertThat(message.get("indices"), equalTo(INDEX_NAME));
260230
} finally {
261231
response.decRef();

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ public Level logLevel(SearchLogContext context, Level defaultLevel) {
6767
return defaultLevel;
6868
}
6969

70+
@Override
71+
public String loggerName() {
72+
return LOGGER_NAME;
73+
}
74+
7075
public void setLogSystemSearches(boolean logSystemSearches) {
7176
this.logSystemSearches = logSystemSearches;
7277
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@
6060
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
6161
import org.elasticsearch.common.logging.DeprecationCategory;
6262
import org.elasticsearch.common.logging.DeprecationLogger;
63+
import org.elasticsearch.common.logging.action.ActionLogWriterProvider;
6364
import org.elasticsearch.common.logging.action.ActionLogger;
64-
import org.elasticsearch.common.logging.action.Log4jActionWriter;
6565
import org.elasticsearch.common.regex.Regex;
6666
import org.elasticsearch.common.settings.Setting;
6767
import org.elasticsearch.common.settings.Setting.Property;
@@ -205,7 +205,8 @@ public TransportSearchAction(
205205
SearchResponseMetrics searchResponseMetrics,
206206
Client client,
207207
UsageService usageService,
208-
ActionLoggingFieldsProvider fieldProvider
208+
ActionLoggingFieldsProvider fieldProvider,
209+
ActionLogWriterProvider logWriterProvider
209210
) {
210211
super(TYPE.name(), transportService, actionFilters, SearchRequest::new, EsExecutors.DIRECT_EXECUTOR_SERVICE);
211212
this.threadPool = threadPool;
@@ -241,7 +242,7 @@ public TransportSearchAction(
241242
"search",
242243
clusterService.getClusterSettings(),
243244
new SearchLogProducer(clusterService.getClusterSettings(), indexNameExpressionResolver.getSystemNamePredicate()),
244-
new Log4jActionWriter(SearchLogProducer.LOGGER_NAME),
245+
logWriterProvider,
245246
fieldProvider
246247
);
247248
}

server/src/main/java/org/elasticsearch/common/logging/action/ActionLogWriter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@
1313
* Generic writer interface to record a log message.
1414
*/
1515
public interface ActionLogWriter {
16+
ActionLogWriter NOOP = (m) -> {};
17+
1618
void write(ActionLogMessage message);
1719
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.common.logging.action;
11+
12+
public interface ActionLogWriterProvider {
13+
ActionLogWriterProvider NOOP = (n) -> ActionLogWriter.NOOP;
14+
15+
ActionLogWriter getWriter(String loggerName);
16+
}

server/src/main/java/org/elasticsearch/common/logging/action/ActionLogger.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@ public ActionLogger(
7070
String name,
7171
ClusterSettings settings,
7272
ActionLoggerProducer<Context> producer,
73-
ActionLogWriter writer,
73+
ActionLogWriterProvider writerProvider,
7474
ActionLoggingFieldsProvider fieldsProvider
7575
) {
7676
this.producer = producer;
77-
this.writer = writer;
77+
this.writer = writerProvider.getWriter(producer.loggerName());
7878
var context = new ActionLoggingFieldsContext(true);
7979
// Initialize
8080
this.additionalFields = fieldsProvider.create(context);

server/src/main/java/org/elasticsearch/common/logging/action/ActionLoggerProducer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ default Level logLevel(Context context, Level defaultLevel) {
2727
return defaultLevel;
2828
}
2929

30+
String loggerName();
31+
3032
/**
3133
* Produces a {@link ActionLogMessage} with common fields.
3234
*/

server/src/main/java/org/elasticsearch/common/logging/action/Log4jActionWriter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* TODO: Convert this class to use ES Logger API.
2020
*/
2121
public class Log4jActionWriter implements ActionLogWriter {
22+
public static final ActionLogWriterProvider PROVIDER = Log4jActionWriter::new;
2223

2324
private final Logger logger;
2425

server/src/main/java/org/elasticsearch/node/NodeConstruction.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
import org.elasticsearch.common.logging.DeprecationLogger;
7474
import org.elasticsearch.common.logging.DynamicContextDataProvider;
7575
import org.elasticsearch.common.logging.HeaderWarning;
76+
import org.elasticsearch.common.logging.action.ActionLogWriterProvider;
77+
import org.elasticsearch.common.logging.action.Log4jActionWriter;
7678
import org.elasticsearch.common.network.NetworkModule;
7779
import org.elasticsearch.common.network.NetworkService;
7880
import org.elasticsearch.common.settings.ClusterSettings;
@@ -1324,6 +1326,11 @@ public <T extends TransportResponse> void sendRequest(
13241326
);
13251327
dataStreamAutoShardingService.init();
13261328

1329+
ActionLogWriterProvider logWriterProvider = pluginsService.loadSingletonServiceProvider(
1330+
ActionLogWriterProvider.class,
1331+
() -> Log4jActionWriter.PROVIDER
1332+
);
1333+
13271334
modules.add(b -> {
13281335
b.bind(NodeService.class).toInstance(nodeService);
13291336
b.bind(BigArrays.class).toInstance(bigArrays);
@@ -1367,6 +1374,7 @@ public <T extends TransportResponse> void sendRequest(
13671374
b.bind(MergeMetrics.class).toInstance(mergeMetrics);
13681375
b.bind(ProjectRoutingResolver.class).toInstance(projectRoutingResolver);
13691376
b.bind(ActionLoggingFieldsProvider.class).toInstance(loggingFieldsProvider);
1377+
b.bind(ActionLogWriterProvider.class).toInstance(logWriterProvider);
13701378
});
13711379

13721380
if (ReadinessService.enabled(environment)) {

server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.elasticsearch.common.Strings;
4949
import org.elasticsearch.common.UUIDs;
5050
import org.elasticsearch.common.io.stream.StreamOutput;
51+
import org.elasticsearch.common.logging.action.ActionLogWriterProvider;
5152
import org.elasticsearch.common.settings.ClusterSettings;
5253
import org.elasticsearch.common.settings.Settings;
5354
import org.elasticsearch.common.transport.TransportAddress;
@@ -1827,7 +1828,8 @@ protected void doWriteTo(StreamOutput out) throws IOException {
18271828
new SearchResponseMetrics(TelemetryProvider.NOOP.getMeterRegistry()),
18281829
client,
18291830
new UsageService(),
1830-
new TestActionActionLoggingFieldsProvider()
1831+
new TestActionActionLoggingFieldsProvider(),
1832+
ActionLogWriterProvider.NOOP
18311833
);
18321834

18331835
CountDownLatch latch = new CountDownLatch(1);

0 commit comments

Comments
 (0)