Skip to content

Commit c8e8ae6

Browse files
authored
Revert "ESQL: Implement a MetricsAware interface (elastic#120527)" (elastic#121036)
This reverts commit a4482d4. It turns out that `PlanTelemetry` can add quite a bit of memory usage, at least on "rude" queries. In `HeapAttackIT.testHugeManyConcat`, this was using 30MB. I'd like to revert this to see if we can - either reduce its memory footprint or - track its memory somehow.
1 parent 2b16515 commit c8e8ae6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+265
-297
lines changed

docs/changelog/120527.yaml

Lines changed: 0 additions & 6 deletions
This file was deleted.

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@
7373
import org.elasticsearch.xpack.esql.plugin.QueryPragmas;
7474
import org.elasticsearch.xpack.esql.session.Configuration;
7575
import org.elasticsearch.xpack.esql.session.QueryBuilderResolver;
76+
import org.elasticsearch.xpack.esql.stats.Metrics;
7677
import org.elasticsearch.xpack.esql.stats.SearchStats;
77-
import org.elasticsearch.xpack.esql.telemetry.Metrics;
7878
import org.elasticsearch.xpack.versionfield.Version;
7979
import org.junit.Assert;
8080

x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/TelemetryIT.java

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.elasticsearch.plugins.PluginsService;
2121
import org.elasticsearch.telemetry.Measurement;
2222
import org.elasticsearch.telemetry.TestTelemetryPlugin;
23-
import org.elasticsearch.xpack.esql.telemetry.PlanTelemetryManager;
23+
import org.elasticsearch.xpack.esql.stats.PlanningMetricsManager;
2424
import org.junit.Before;
2525

2626
import java.util.Collection;
@@ -113,17 +113,6 @@ public static Iterable<Object[]> parameters() {
113113
Map.ofEntries(Map.entry("TO_IP", 1), Map.entry("TO_STRING", 2)),
114114
true
115115
) },
116-
new Object[] {
117-
new Test(
118-
// Using the `::` cast operator and a function alias
119-
"""
120-
FROM idx
121-
| EVAL ip = host::ip::string, y = to_str(host)
122-
""",
123-
Map.ofEntries(Map.entry("FROM", 1), Map.entry("EVAL", 1)),
124-
Map.ofEntries(Map.entry("TO_IP", 1), Map.entry("TO_STRING", 2)),
125-
true
126-
) },
127116
new Object[] {
128117
new Test(
129118
"METRICS idx | LIMIT 10",
@@ -134,7 +123,9 @@ public static Iterable<Object[]> parameters() {
134123
new Object[] {
135124
new Test(
136125
"METRICS idx max(id) BY host | LIMIT 10",
137-
Build.current().isSnapshot() ? Map.ofEntries(Map.entry("METRICS", 1), Map.entry("LIMIT", 1)) : Collections.emptyMap(),
126+
Build.current().isSnapshot()
127+
? Map.ofEntries(Map.entry("METRICS", 1), Map.entry("LIMIT", 1), Map.entry("FROM TS", 1))
128+
: Collections.emptyMap(),
138129
Build.current().isSnapshot() ? Map.ofEntries(Map.entry("MAX", 1)) : Collections.emptyMap(),
139130
Build.current().isSnapshot()
140131
) }
@@ -147,7 +138,7 @@ public static Iterable<Object[]> parameters() {
147138
// | EVAL ip = to_ip(host), x = to_string(host), y = to_string(host)
148139
// | INLINESTATS max(id)
149140
// """,
150-
// Build.current().isSnapshot() ? Map.of("FROM", 1, "EVAL", 1, "INLINESTATS", 1) : Collections.emptyMap(),
141+
// Build.current().isSnapshot() ? Map.of("FROM", 1, "EVAL", 1, "INLINESTATS", 1, "STATS", 1) : Collections.emptyMap(),
151142
// Build.current().isSnapshot()
152143
// ? Map.ofEntries(Map.entry("MAX", 1), Map.entry("TO_IP", 1), Map.entry("TO_STRING", 2))
153144
// : Collections.emptyMap(),
@@ -195,19 +186,19 @@ private static void testQuery(
195186
client(dataNode.getName()).execute(EsqlQueryAction.INSTANCE, request, ActionListener.running(() -> {
196187
try {
197188
// test total commands used
198-
final List<Measurement> commandMeasurementsAll = measurements(plugin, PlanTelemetryManager.FEATURE_METRICS_ALL);
189+
final List<Measurement> commandMeasurementsAll = measurements(plugin, PlanningMetricsManager.FEATURE_METRICS_ALL);
199190
assertAllUsages(expectedCommands, commandMeasurementsAll, iteration, success);
200191

201192
// test num of queries using a command
202-
final List<Measurement> commandMeasurements = measurements(plugin, PlanTelemetryManager.FEATURE_METRICS);
193+
final List<Measurement> commandMeasurements = measurements(plugin, PlanningMetricsManager.FEATURE_METRICS);
203194
assertUsageInQuery(expectedCommands, commandMeasurements, iteration, success);
204195

205196
// test total functions used
206-
final List<Measurement> functionMeasurementsAll = measurements(plugin, PlanTelemetryManager.FUNCTION_METRICS_ALL);
197+
final List<Measurement> functionMeasurementsAll = measurements(plugin, PlanningMetricsManager.FUNCTION_METRICS_ALL);
207198
assertAllUsages(expectedFunctions, functionMeasurementsAll, iteration, success);
208199

209200
// test number of queries using a function
210-
final List<Measurement> functionMeasurements = measurements(plugin, PlanTelemetryManager.FUNCTION_METRICS);
201+
final List<Measurement> functionMeasurements = measurements(plugin, PlanningMetricsManager.FUNCTION_METRICS);
211202
assertUsageInQuery(expectedFunctions, functionMeasurements, iteration, success);
212203
} finally {
213204
latch.countDown();
@@ -225,8 +216,8 @@ private static void assertAllUsages(Map<String, Integer> expected, List<Measurem
225216
Set<String> found = featureNames(metrics);
226217
assertThat(found, is(expected.keySet()));
227218
for (Measurement metric : metrics) {
228-
assertThat(metric.attributes().get(PlanTelemetryManager.SUCCESS), is(success));
229-
String featureName = (String) metric.attributes().get(PlanTelemetryManager.FEATURE_NAME);
219+
assertThat(metric.attributes().get(PlanningMetricsManager.SUCCESS), is(success));
220+
String featureName = (String) metric.attributes().get(PlanningMetricsManager.FEATURE_NAME);
230221
assertThat(metric.getLong(), is(iteration * expected.get(featureName)));
231222
}
232223
}
@@ -236,7 +227,7 @@ private static void assertUsageInQuery(Map<String, Integer> expected, List<Measu
236227
functionsFound = featureNames(found);
237228
assertThat(functionsFound, is(expected.keySet()));
238229
for (Measurement measurement : found) {
239-
assertThat(measurement.attributes().get(PlanTelemetryManager.SUCCESS), is(success));
230+
assertThat(measurement.attributes().get(PlanningMetricsManager.SUCCESS), is(success));
240231
assertThat(measurement.getLong(), is(iteration));
241232
}
242233
}
@@ -247,7 +238,7 @@ private static List<Measurement> measurements(TestTelemetryPlugin plugin, String
247238

248239
private static Set<String> featureNames(List<Measurement> functionMeasurements) {
249240
return functionMeasurements.stream()
250-
.map(x -> x.attributes().get(PlanTelemetryManager.FEATURE_NAME))
241+
.map(x -> x.attributes().get(PlanningMetricsManager.FEATURE_NAME))
251242
.map(String.class::cast)
252243
.collect(Collectors.toSet());
253244
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
import org.elasticsearch.xpack.esql.rule.Rule;
9393
import org.elasticsearch.xpack.esql.rule.RuleExecutor;
9494
import org.elasticsearch.xpack.esql.session.Configuration;
95-
import org.elasticsearch.xpack.esql.telemetry.FeatureMetric;
95+
import org.elasticsearch.xpack.esql.stats.FeatureMetric;
9696
import org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter;
9797

9898
import java.time.Duration;
@@ -133,7 +133,7 @@
133133
import static org.elasticsearch.xpack.esql.core.type.DataType.TIME_DURATION;
134134
import static org.elasticsearch.xpack.esql.core.type.DataType.VERSION;
135135
import static org.elasticsearch.xpack.esql.core.type.DataType.isTemporalAmount;
136-
import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.LIMIT;
136+
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.LIMIT;
137137
import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.maybeParseTemporalAmount;
138138

139139
/**
@@ -220,7 +220,7 @@ private LogicalPlan resolveIndex(UnresolvedRelation plan, IndexResolution indexR
220220
plan.metadataFields(),
221221
plan.indexMode(),
222222
indexResolutionMessage,
223-
plan.telemetryLabel()
223+
plan.commandName()
224224
);
225225
}
226226
IndexPattern table = plan.indexPattern();
@@ -233,7 +233,7 @@ private LogicalPlan resolveIndex(UnresolvedRelation plan, IndexResolution indexR
233233
plan.metadataFields(),
234234
plan.indexMode(),
235235
"invalid [" + table + "] resolution to [" + indexResolution + "]",
236-
plan.telemetryLabel()
236+
plan.commandName()
237237
);
238238
}
239239

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
3333
import org.elasticsearch.xpack.esql.plan.logical.Lookup;
3434
import org.elasticsearch.xpack.esql.plan.logical.Project;
35-
import org.elasticsearch.xpack.esql.telemetry.FeatureMetric;
36-
import org.elasticsearch.xpack.esql.telemetry.Metrics;
35+
import org.elasticsearch.xpack.esql.stats.FeatureMetric;
36+
import org.elasticsearch.xpack.esql.stats.Metrics;
3737

3838
import java.util.ArrayList;
3939
import java.util.BitSet;

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/TelemetryAware.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/execution/PlanExecutor.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
import org.elasticsearch.xpack.esql.session.IndexResolver;
2727
import org.elasticsearch.xpack.esql.session.QueryBuilderResolver;
2828
import org.elasticsearch.xpack.esql.session.Result;
29-
import org.elasticsearch.xpack.esql.telemetry.Metrics;
30-
import org.elasticsearch.xpack.esql.telemetry.PlanTelemetry;
31-
import org.elasticsearch.xpack.esql.telemetry.PlanTelemetryManager;
32-
import org.elasticsearch.xpack.esql.telemetry.QueryMetric;
29+
import org.elasticsearch.xpack.esql.stats.Metrics;
30+
import org.elasticsearch.xpack.esql.stats.PlanningMetrics;
31+
import org.elasticsearch.xpack.esql.stats.PlanningMetricsManager;
32+
import org.elasticsearch.xpack.esql.stats.QueryMetric;
3333

3434
import static org.elasticsearch.action.ActionListener.wrap;
3535

@@ -41,7 +41,7 @@ public class PlanExecutor {
4141
private final Mapper mapper;
4242
private final Metrics metrics;
4343
private final Verifier verifier;
44-
private final PlanTelemetryManager planTelemetryManager;
44+
private final PlanningMetricsManager planningMetricsManager;
4545

4646
public PlanExecutor(IndexResolver indexResolver, MeterRegistry meterRegistry, XPackLicenseState licenseState) {
4747
this.indexResolver = indexResolver;
@@ -50,7 +50,7 @@ public PlanExecutor(IndexResolver indexResolver, MeterRegistry meterRegistry, XP
5050
this.mapper = new Mapper();
5151
this.metrics = new Metrics(functionRegistry);
5252
this.verifier = new Verifier(metrics, licenseState);
53-
this.planTelemetryManager = new PlanTelemetryManager(meterRegistry);
53+
this.planningMetricsManager = new PlanningMetricsManager(meterRegistry);
5454
}
5555

5656
public void esql(
@@ -65,7 +65,7 @@ public void esql(
6565
QueryBuilderResolver queryBuilderResolver,
6666
ActionListener<Result> listener
6767
) {
68-
final PlanTelemetry planTelemetry = new PlanTelemetry(functionRegistry);
68+
final PlanningMetrics planningMetrics = new PlanningMetrics();
6969
final var session = new EsqlSession(
7070
sessionId,
7171
cfg,
@@ -76,20 +76,20 @@ public void esql(
7676
new LogicalPlanOptimizer(new LogicalOptimizerContext(cfg, foldContext)),
7777
mapper,
7878
verifier,
79-
planTelemetry,
79+
planningMetrics,
8080
indicesExpressionGrouper,
8181
queryBuilderResolver
8282
);
8383
QueryMetric clientId = QueryMetric.fromString("rest");
8484
metrics.total(clientId);
8585

8686
ActionListener<Result> executeListener = wrap(x -> {
87-
planTelemetryManager.publish(planTelemetry, true);
87+
planningMetricsManager.publish(planningMetrics, true);
8888
listener.onResponse(x);
8989
}, ex -> {
9090
// TODO when we decide if we will differentiate Kibana from REST, this String value will likely come from the request
9191
metrics.failed(clientId);
92-
planTelemetryManager.publish(planTelemetry, false);
92+
planningMetricsManager.publish(planningMetrics, false);
9393
listener.onFailure(ex);
9494
});
9595
// Wrap it in a listener so that if we have any exceptions during execution, the listener picks it up

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ public class EsqlFunctionRegistry {
224224
// it has with the alias name associated to the FunctionDefinition instance
225225
private final Map<String, FunctionDefinition> defs = new LinkedHashMap<>();
226226
private final Map<String, String> aliases = new HashMap<>();
227-
private final Map<Class<? extends Function>, String> names = new HashMap<>();
228227

229228
private SnapshotFunctionRegistry snapshotRegistry = null;
230229

@@ -259,12 +258,6 @@ public boolean functionExists(String functionName) {
259258
return defs.containsKey(functionName);
260259
}
261260

262-
public String functionName(Class<? extends Function> clazz) {
263-
String name = names.get(clazz);
264-
Check.notNull(name, "Cannot find function by class {}", clazz);
265-
return name;
266-
}
267-
268261
public Collection<FunctionDefinition> listFunctions() {
269262
// It is worth double checking if we need this copy. These are immutable anyway.
270263
return defs.values();
@@ -765,14 +758,6 @@ void register(FunctionDefinition... functions) {
765758
}
766759
aliases.put(alias, f.name());
767760
}
768-
Check.isTrue(
769-
names.containsKey(f.clazz()) == false,
770-
"function type [{}} is registered twice with names [{}] and [{}]",
771-
f.clazz(),
772-
names.get(f.clazz()),
773-
f.name()
774-
);
775-
names.put(f.clazz(), f.name());
776761
}
777762
// sort the temporary map by key name and add it to the global map of functions
778763
defs.putAll(

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/AstBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
package org.elasticsearch.xpack.esql.parser;
99

1010
public class AstBuilder extends LogicalPlanBuilder {
11-
public AstBuilder(ParsingContext context) {
12-
super(context);
11+
public AstBuilder(QueryParams params) {
12+
super(params);
1313
}
1414
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
import org.elasticsearch.logging.LogManager;
1919
import org.elasticsearch.logging.Logger;
2020
import org.elasticsearch.xpack.esql.core.util.StringUtils;
21-
import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry;
2221
import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
23-
import org.elasticsearch.xpack.esql.telemetry.PlanTelemetry;
2422

2523
import java.util.BitSet;
2624
import java.util.function.BiFunction;
@@ -54,27 +52,20 @@ public void setEsqlConfig(EsqlConfig config) {
5452
this.config = config;
5553
}
5654

57-
// testing utility
5855
public LogicalPlan createStatement(String query) {
5956
return createStatement(query, new QueryParams());
6057
}
6158

62-
// testing utility
6359
public LogicalPlan createStatement(String query, QueryParams params) {
64-
return createStatement(query, params, new PlanTelemetry(new EsqlFunctionRegistry()));
65-
}
66-
67-
public LogicalPlan createStatement(String query, QueryParams params, PlanTelemetry metrics) {
6860
if (log.isDebugEnabled()) {
6961
log.debug("Parsing as statement: {}", query);
7062
}
71-
return invokeParser(query, params, metrics, EsqlBaseParser::singleStatement, AstBuilder::plan);
63+
return invokeParser(query, params, EsqlBaseParser::singleStatement, AstBuilder::plan);
7264
}
7365

7466
private <T> T invokeParser(
7567
String query,
7668
QueryParams params,
77-
PlanTelemetry metrics,
7869
Function<EsqlBaseParser, ParserRuleContext> parseFunction,
7970
BiFunction<AstBuilder, ParserRuleContext, T> result
8071
) {
@@ -108,7 +99,7 @@ private <T> T invokeParser(
10899
log.trace("Parse tree: {}", tree.toStringTree());
109100
}
110101

111-
return result.apply(new AstBuilder(new ExpressionBuilder.ParsingContext(params, metrics)), tree);
102+
return result.apply(new AstBuilder(params), tree);
112103
} catch (StackOverflowError e) {
113104
throw new ParsingException("ESQL statement is too large, causing stack overflow when generating the parsing tree: [{}]", query);
114105
}

0 commit comments

Comments
 (0)