Skip to content

Commit 237650e

Browse files
authored
Add x-opaque-id to search slow logs (#31539)
Add x-opaque-id to search slow logs only. Indexing slow log and audit logs will be handled as separate PRs. Relates #31521
1 parent bb1d4aa commit 237650e

File tree

10 files changed

+35
-12
lines changed

10 files changed

+35
-12
lines changed

modules/transport-netty4/src/test/java/org/elasticsearch/http/netty4/Netty4HttpClient.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.elasticsearch.common.collect.Tuple;
4545
import org.elasticsearch.common.unit.ByteSizeUnit;
4646
import org.elasticsearch.common.unit.ByteSizeValue;
47+
import org.elasticsearch.tasks.Task;
4748

4849
import java.io.Closeable;
4950
import java.net.SocketAddress;
@@ -74,7 +75,7 @@ static Collection<String> returnHttpResponseBodies(Collection<FullHttpResponse>
7475
static Collection<String> returnOpaqueIds(Collection<FullHttpResponse> responses) {
7576
List<String> list = new ArrayList<>(responses.size());
7677
for (HttpResponse response : responses) {
77-
list.add(response.headers().get("X-Opaque-Id"));
78+
list.add(response.headers().get(Task.X_OPAQUE_ID));
7879
}
7980
return list;
8081
}

plugins/transport-nio/src/test/java/org/elasticsearch/http/nio/Netty4HttpClient.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.elasticsearch.common.collect.Tuple;
4545
import org.elasticsearch.common.unit.ByteSizeUnit;
4646
import org.elasticsearch.common.unit.ByteSizeValue;
47+
import org.elasticsearch.tasks.Task;
4748

4849
import java.io.Closeable;
4950
import java.net.SocketAddress;
@@ -74,7 +75,7 @@ static Collection<String> returnHttpResponseBodies(Collection<FullHttpResponse>
7475
static Collection<String> returnOpaqueIds(Collection<FullHttpResponse> responses) {
7576
List<String> list = new ArrayList<>(responses.size());
7677
for (HttpResponse response : responses) {
77-
list.add(response.headers().get("X-Opaque-Id"));
78+
list.add(response.headers().get(Task.X_OPAQUE_ID));
7879
}
7980
return list;
8081
}
@@ -90,7 +91,7 @@ public Collection<FullHttpResponse> get(SocketAddress remoteAddress, String... u
9091
for (int i = 0; i < uris.length; i++) {
9192
final HttpRequest httpRequest = new DefaultFullHttpRequest(HTTP_1_1, HttpMethod.GET, uris[i]);
9293
httpRequest.headers().add(HOST, "localhost");
93-
httpRequest.headers().add("X-Opaque-ID", String.valueOf(i));
94+
httpRequest.headers().add(Task.X_OPAQUE_ID, String.valueOf(i));
9495
requests.add(httpRequest);
9596
}
9697
return sendRequests(remoteAddress, requests);

server/src/main/java/org/elasticsearch/action/ActionModule.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@
316316
import org.elasticsearch.rest.action.search.RestMultiSearchAction;
317317
import org.elasticsearch.rest.action.search.RestSearchAction;
318318
import org.elasticsearch.rest.action.search.RestSearchScrollAction;
319+
import org.elasticsearch.tasks.Task;
319320
import org.elasticsearch.threadpool.ThreadPool;
320321
import org.elasticsearch.usage.UsageService;
321322

@@ -369,7 +370,7 @@ public ActionModule(boolean transportClient, Settings settings, IndexNameExpress
369370
destructiveOperations = new DestructiveOperations(settings, clusterSettings);
370371
Set<String> headers = Stream.concat(
371372
actionPlugins.stream().flatMap(p -> p.getRestHeaders().stream()),
372-
Stream.of("X-Opaque-Id")
373+
Stream.of(Task.X_OPAQUE_ID)
373374
).collect(Collectors.toSet());
374375
UnaryOperator<RestHandler> restWrapper = null;
375376
for (ActionPlugin plugin : actionPlugins) {

server/src/main/java/org/elasticsearch/http/DefaultRestChannel.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import java.util.List;
3939
import java.util.Map;
4040

41+
import static org.elasticsearch.tasks.Task.X_OPAQUE_ID;
42+
4143
/**
4244
* The default rest channel for incoming requests. This class implements the basic logic for sending a rest
4345
* response. It will set necessary headers nad ensure that bytes are released after the response is sent.
@@ -50,7 +52,6 @@ public class DefaultRestChannel extends AbstractRestChannel implements RestChann
5052
static final String CONTENT_TYPE = "content-type";
5153
static final String CONTENT_LENGTH = "content-length";
5254
static final String SET_COOKIE = "set-cookie";
53-
static final String X_OPAQUE_ID = "X-Opaque-Id";
5455

5556
private final HttpRequest httpRequest;
5657
private final BigArrays bigArrays;

server/src/main/java/org/elasticsearch/index/SearchSlowLog.java

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.elasticsearch.common.xcontent.ToXContent;
2929
import org.elasticsearch.index.shard.SearchOperationListener;
3030
import org.elasticsearch.search.internal.SearchContext;
31+
import org.elasticsearch.tasks.Task;
3132

3233
import java.util.Collections;
3334
import java.util.concurrent.TimeUnit;
@@ -174,6 +175,11 @@ public String toString() {
174175
} else {
175176
sb.append("source[], ");
176177
}
178+
if (context.getTask().getHeader(Task.X_OPAQUE_ID) != null) {
179+
sb.append("id[").append(context.getTask().getHeader(Task.X_OPAQUE_ID)).append("], ");
180+
} else {
181+
sb.append("id[], ");
182+
}
177183
return sb.toString();
178184
}
179185
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
136136
import org.elasticsearch.search.fetch.FetchPhase;
137137
import org.elasticsearch.snapshots.SnapshotShardsService;
138138
import org.elasticsearch.snapshots.SnapshotsService;
139+
import org.elasticsearch.tasks.Task;
139140
import org.elasticsearch.tasks.TaskResultsService;
140141
import org.elasticsearch.threadpool.ExecutorBuilder;
141142
import org.elasticsearch.threadpool.ThreadPool;
@@ -447,7 +448,7 @@ protected Node(final Environment environment, Collection<Class<? extends Plugin>
447448
final Transport transport = networkModule.getTransportSupplier().get();
448449
Set<String> taskHeaders = Stream.concat(
449450
pluginsService.filterPlugins(ActionPlugin.class).stream().flatMap(p -> p.getTaskHeaders().stream()),
450-
Stream.of("X-Opaque-Id")
451+
Stream.of(Task.X_OPAQUE_ID)
451452
).collect(Collectors.toSet());
452453
final TransportService transportService = newTransportService(settings, transport, threadPool,
453454
networkModule.getTransportInterceptor(), localNodeFactory, settingsModule.getClusterSettings(), taskHeaders);

server/src/main/java/org/elasticsearch/tasks/Task.java

+5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
*/
3535
public class Task {
3636

37+
/**
38+
* The request header to mark tasks with specific ids
39+
*/
40+
public static final String X_OPAQUE_ID = "X-Opaque-Id";
41+
3742
private final long id;
3843

3944
private final String type;

server/src/test/java/org/elasticsearch/action/admin/cluster/node/tasks/TasksIT.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ public void testSearchTaskDescriptions() {
357357
.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).get();
358358

359359
Map<String, String> headers = new HashMap<>();
360-
headers.put("X-Opaque-Id", "my_id");
360+
headers.put(Task.X_OPAQUE_ID, "my_id");
361361
headers.put("Foo-Header", "bar");
362362
headers.put("Custom-Task-Header", "my_value");
363363
assertSearchResponse(
@@ -404,7 +404,7 @@ public void testSearchTaskHeaderLimit() {
404404
int maxSize = Math.toIntExact(SETTING_HTTP_MAX_HEADER_SIZE.getDefault(Settings.EMPTY).getBytes() / 2 + 1);
405405

406406
Map<String, String> headers = new HashMap<>();
407-
headers.put("X-Opaque-Id", "my_id");
407+
headers.put(Task.X_OPAQUE_ID, "my_id");
408408
headers.put("Custom-Task-Header", randomAlphaOfLengthBetween(maxSize, maxSize + 100));
409409
IllegalArgumentException ex = expectThrows(
410410
IllegalArgumentException.class,
@@ -415,7 +415,7 @@ public void testSearchTaskHeaderLimit() {
415415

416416
private void assertTaskHeaders(TaskInfo taskInfo) {
417417
assertThat(taskInfo.getHeaders().keySet(), hasSize(2));
418-
assertEquals("my_id", taskInfo.getHeaders().get("X-Opaque-Id"));
418+
assertEquals("my_id", taskInfo.getHeaders().get(Task.X_OPAQUE_ID));
419419
assertEquals("my_value", taskInfo.getHeaders().get("Custom-Task-Header"));
420420
}
421421

server/src/test/java/org/elasticsearch/http/DefaultRestChannelTests.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.elasticsearch.rest.RestRequest;
3737
import org.elasticsearch.rest.RestResponse;
3838
import org.elasticsearch.rest.RestStatus;
39+
import org.elasticsearch.tasks.Task;
3940
import org.elasticsearch.test.ESTestCase;
4041
import org.elasticsearch.threadpool.TestThreadPool;
4142
import org.elasticsearch.threadpool.ThreadPool;
@@ -180,7 +181,7 @@ public void testResponse() {
180181
public void testHeadersSet() {
181182
Settings settings = Settings.builder().build();
182183
final TestRequest httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
183-
httpRequest.getHeaders().put(DefaultRestChannel.X_OPAQUE_ID, Collections.singletonList("abc"));
184+
httpRequest.getHeaders().put(Task.X_OPAQUE_ID, Collections.singletonList("abc"));
184185
final RestRequest request = RestRequest.request(xContentRegistry(), httpRequest, httpChannel);
185186
HttpHandlingSettings handlingSettings = HttpHandlingSettings.fromSettings(settings);
186187

@@ -200,15 +201,15 @@ public void testHeadersSet() {
200201
Map<String, List<String>> headers = httpResponse.headers;
201202
assertNull(headers.get("non-existent-header"));
202203
assertEquals(customHeaderValue, headers.get(customHeader).get(0));
203-
assertEquals("abc", headers.get(DefaultRestChannel.X_OPAQUE_ID).get(0));
204+
assertEquals("abc", headers.get(Task.X_OPAQUE_ID).get(0));
204205
assertEquals(Integer.toString(resp.content().length()), headers.get(DefaultRestChannel.CONTENT_LENGTH).get(0));
205206
assertEquals(resp.contentType(), headers.get(DefaultRestChannel.CONTENT_TYPE).get(0));
206207
}
207208

208209
public void testCookiesSet() {
209210
Settings settings = Settings.builder().put(HttpTransportSettings.SETTING_HTTP_RESET_COOKIES.getKey(), true).build();
210211
final TestRequest httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
211-
httpRequest.getHeaders().put(DefaultRestChannel.X_OPAQUE_ID, Collections.singletonList("abc"));
212+
httpRequest.getHeaders().put(Task.X_OPAQUE_ID, Collections.singletonList("abc"));
212213
final RestRequest request = RestRequest.request(xContentRegistry(), httpRequest, httpChannel);
213214
HttpHandlingSettings handlingSettings = HttpHandlingSettings.fromSettings(settings);
214215

server/src/test/java/org/elasticsearch/index/SearchSlowLogTests.java

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index;
2121

2222
import org.elasticsearch.Version;
23+
import org.elasticsearch.action.search.SearchTask;
2324
import org.elasticsearch.action.search.SearchType;
2425
import org.elasticsearch.cluster.metadata.IndexMetaData;
2526
import org.elasticsearch.common.bytes.BytesReference;
@@ -34,12 +35,15 @@
3435
import org.elasticsearch.search.internal.AliasFilter;
3536
import org.elasticsearch.search.internal.SearchContext;
3637
import org.elasticsearch.search.internal.ShardSearchRequest;
38+
import org.elasticsearch.tasks.Task;
3739
import org.elasticsearch.test.ESSingleNodeTestCase;
3840
import org.elasticsearch.test.TestSearchContext;
3941
import org.elasticsearch.threadpool.ThreadPool;
4042

4143
import java.io.IOException;
44+
import java.util.Collections;
4245

46+
import static org.hamcrest.Matchers.endsWith;
4347
import static org.hamcrest.Matchers.hasToString;
4448
import static org.hamcrest.Matchers.instanceOf;
4549
import static org.hamcrest.Matchers.not;
@@ -166,10 +170,12 @@ public void testSlowLogSearchContextPrinterToLog() throws IOException {
166170
SearchContext searchContext = createSearchContext(index);
167171
SearchSourceBuilder source = SearchSourceBuilder.searchSource().query(QueryBuilders.matchAllQuery());
168172
searchContext.request().source(source);
173+
searchContext.setTask(new SearchTask(0, "n/a", "n/a", "test", null, Collections.singletonMap(Task.X_OPAQUE_ID, "my_id")));
169174
SearchSlowLog.SlowLogSearchContextPrinter p = new SearchSlowLog.SlowLogSearchContextPrinter(searchContext, 10);
170175
assertThat(p.toString(), startsWith("[foo][0]"));
171176
// Makes sure that output doesn't contain any new lines
172177
assertThat(p.toString(), not(containsString("\n")));
178+
assertThat(p.toString(), endsWith("id[my_id], "));
173179
}
174180

175181
public void testLevelSetting() {

0 commit comments

Comments
 (0)