EQL: Improve request logging (#64206)
Add logging to multi-search queries Log response count (cherry picked from commit ee9b9d58f68e2d545d5d841e2f683ec4e96f79e6) (cherry picked from commit 02a4c6b83475cebe715311eeba123ad6fc8d6ba1)
This commit is contained in:
parent
2363c4be4b
commit
6ca0b6ae6d
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
||||||
* or more contributor license agreements. Licensed under the Elastic License;
|
|
||||||
* you may not use this file except in compliance with the Elastic License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.xpack.eql.execution.search;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.elasticsearch.action.ActionListener;
|
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
|
||||||
import org.elasticsearch.action.search.ShardSearchFailure;
|
|
||||||
import org.elasticsearch.common.util.CollectionUtils;
|
|
||||||
import org.elasticsearch.xpack.eql.EqlIllegalArgumentException;
|
|
||||||
|
|
||||||
import static org.elasticsearch.xpack.eql.execution.search.RuntimeUtils.logSearchResponse;
|
|
||||||
|
|
||||||
public class BasicListener implements ActionListener<SearchResponse> {
|
|
||||||
|
|
||||||
private static final Logger log = RuntimeUtils.QUERY_LOG;
|
|
||||||
|
|
||||||
private final ActionListener<SearchResponse> listener;
|
|
||||||
|
|
||||||
public BasicListener(ActionListener<SearchResponse> listener) {
|
|
||||||
this.listener = listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(SearchResponse response) {
|
|
||||||
try {
|
|
||||||
ShardSearchFailure[] failures = response.getShardFailures();
|
|
||||||
if (CollectionUtils.isEmpty(failures) == false) {
|
|
||||||
listener.onFailure(new EqlIllegalArgumentException(failures[0].reason(), failures[0].getCause()));
|
|
||||||
} else {
|
|
||||||
if (log.isTraceEnabled()) {
|
|
||||||
logSearchResponse(response, log);
|
|
||||||
}
|
|
||||||
listener.onResponse(response);
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
onFailure(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(Exception ex) {
|
|
||||||
listener.onFailure(ex);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -32,7 +32,9 @@ import java.util.Map;
|
||||||
import java.util.StringJoiner;
|
import java.util.StringJoiner;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.idsQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.idsQuery;
|
||||||
|
import static org.elasticsearch.xpack.eql.execution.search.RuntimeUtils.multiSearchLogListener;
|
||||||
import static org.elasticsearch.xpack.eql.execution.search.RuntimeUtils.prepareRequest;
|
import static org.elasticsearch.xpack.eql.execution.search.RuntimeUtils.prepareRequest;
|
||||||
|
import static org.elasticsearch.xpack.eql.execution.search.RuntimeUtils.searchLogListener;
|
||||||
|
|
||||||
public class BasicQueryClient implements QueryClient {
|
public class BasicQueryClient implements QueryClient {
|
||||||
|
|
||||||
|
@ -55,7 +57,7 @@ public class BasicQueryClient implements QueryClient {
|
||||||
searchSource.timeout(cfg.requestTimeout());
|
searchSource.timeout(cfg.requestTimeout());
|
||||||
|
|
||||||
SearchRequest search = prepareRequest(client, searchSource, false, indices);
|
SearchRequest search = prepareRequest(client, searchSource, false, indices);
|
||||||
search(search, new BasicListener(listener));
|
search(search, searchLogListener(listener, log));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void search(SearchRequest search, ActionListener<SearchResponse> listener) {
|
protected void search(SearchRequest search, ActionListener<SearchResponse> listener) {
|
||||||
|
@ -85,7 +87,7 @@ public class BasicQueryClient implements QueryClient {
|
||||||
log.trace("About to execute multi-queries {} on {}", sj, indices);
|
log.trace("About to execute multi-queries {} on {}", sj, indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
client.multiSearch(search, listener);
|
client.multiSearch(search, multiSearchLogListener(listener, log));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,9 +8,13 @@ package org.elasticsearch.xpack.eql.execution.search;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.elasticsearch.action.ActionListener;
|
||||||
|
import org.elasticsearch.action.search.MultiSearchResponse;
|
||||||
import org.elasticsearch.action.search.SearchRequest;
|
import org.elasticsearch.action.search.SearchRequest;
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
|
import org.elasticsearch.action.search.ShardSearchFailure;
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
|
import org.elasticsearch.common.util.CollectionUtils;
|
||||||
import org.elasticsearch.index.query.BoolQueryBuilder;
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
|
@ -44,7 +48,45 @@ public final class RuntimeUtils {
|
||||||
|
|
||||||
private RuntimeUtils() {}
|
private RuntimeUtils() {}
|
||||||
|
|
||||||
static void logSearchResponse(SearchResponse response, Logger logger) {
|
public static ActionListener<SearchResponse> searchLogListener(ActionListener<SearchResponse> listener, Logger log) {
|
||||||
|
return ActionListener.wrap(response -> {
|
||||||
|
ShardSearchFailure[] failures = response.getShardFailures();
|
||||||
|
if (CollectionUtils.isEmpty(failures) == false) {
|
||||||
|
listener.onFailure(new EqlIllegalArgumentException(failures[0].reason(), failures[0].getCause()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (log.isTraceEnabled()) {
|
||||||
|
logSearchResponse(response, log);
|
||||||
|
}
|
||||||
|
listener.onResponse(response);
|
||||||
|
}, listener::onFailure);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ActionListener<MultiSearchResponse> multiSearchLogListener(ActionListener<MultiSearchResponse> listener, Logger log) {
|
||||||
|
return ActionListener.wrap(items -> {
|
||||||
|
for (MultiSearchResponse.Item item : items) {
|
||||||
|
Exception failure = item.getFailure();
|
||||||
|
SearchResponse response = item.getResponse();
|
||||||
|
|
||||||
|
if (failure == null) {
|
||||||
|
ShardSearchFailure[] failures = response.getShardFailures();
|
||||||
|
if (CollectionUtils.isEmpty(failures) == false) {
|
||||||
|
failure = new EqlIllegalArgumentException(failures[0].reason(), failures[0].getCause());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (failure != null) {
|
||||||
|
listener.onFailure(failure);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (log.isTraceEnabled()) {
|
||||||
|
logSearchResponse(response, log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listener.onResponse(items);
|
||||||
|
}, listener::onFailure);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void logSearchResponse(SearchResponse response, Logger logger) {
|
||||||
List<Aggregation> aggs = Collections.emptyList();
|
List<Aggregation> aggs = Collections.emptyList();
|
||||||
if (response.getAggregations() != null) {
|
if (response.getAggregations() != null) {
|
||||||
aggs = response.getAggregations().asList();
|
aggs = response.getAggregations().asList();
|
||||||
|
@ -54,8 +96,10 @@ public final class RuntimeUtils {
|
||||||
aggsNames.append(aggs.get(i).getName() + (i + 1 == aggs.size() ? "" : ", "));
|
aggsNames.append(aggs.get(i).getName() + (i + 1 == aggs.size() ? "" : ", "));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SearchHit[] hits = response.getHits().getHits();
|
||||||
|
int count = hits != null ? hits.length : 0;
|
||||||
logger.trace("Got search response [hits {}, {} aggregations: [{}], {} failed shards, {} skipped shards, "
|
logger.trace("Got search response [hits {}, {} aggregations: [{}], {} failed shards, {} skipped shards, "
|
||||||
+ "{} successful shards, {} total shards, took {}, timed out [{}]]", response.getHits().getTotalHits(), aggs.size(),
|
+ "{} successful shards, {} total shards, took {}, timed out [{}]]", count, aggs.size(),
|
||||||
aggsNames, response.getFailedShards(), response.getSkippedShards(), response.getSuccessfulShards(),
|
aggsNames, response.getFailedShards(), response.getSkippedShards(), response.getSuccessfulShards(),
|
||||||
response.getTotalShards(), response.getTook(), response.isTimedOut());
|
response.getTotalShards(), response.getTook(), response.isTimedOut());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue