Skip to content

Commit 6ead5f7

Browse files
authored
Remove ccs_telemetry feature flag (#113825) (#114452)
This removes `ccs_telemetry` feature flag, and instead introduces an undocumented, true by default setting: - `search.ccs.collect_telemetry` - enables CCS search telemetry collection and `_cluster/stats?include_remote=true`. Can be disabled if this is causing any problems. (cherry picked from commit 510a56b)
1 parent 09a50e5 commit 6ead5f7

File tree

12 files changed

+40
-55
lines changed

12 files changed

+40
-55
lines changed

docs/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ testClusters.matching { it.name == "yamlRestTest"}.configureEach {
123123

124124
requiresFeature 'es.index_mode_feature_flag_registered', Version.fromString("8.0.0")
125125
requiresFeature 'es.failure_store_feature_flag_enabled', Version.fromString("8.12.0")
126-
requiresFeature 'es.ccs_telemetry_feature_flag_enabled', Version.fromString("8.16.0")
127126

128127
// TODO Rene: clean up this kind of cross project file references
129128
extraConfigFile 'op-jwks.json', project(':x-pack:test:idp-fixture').file("src/main/resources/oidc/op-jwks.json")

docs/changelog/113825.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
pr: 113825
2+
summary: Cross-cluster search telemetry
3+
area: Search
4+
type: feature
5+
issues: []
6+
highlight:
7+
title: Cross-cluster search telemetry
8+
body: |-
9+
The cross-cluster search telemetry is collected when cross-cluster searches
10+
are performed, and is returned as "ccs" field in `_cluster/stats` output.
11+
It also add a new parameter `include_remotes=true` to the `_cluster/stats` API
12+
which will collect data from connected remote clusters.

server/src/internalClusterTest/java/org/elasticsearch/action/admin/cluster/stats/ClusterStatsRemoteIT.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.elasticsearch.client.internal.Client;
1515
import org.elasticsearch.cluster.health.ClusterHealthStatus;
1616
import org.elasticsearch.common.settings.Settings;
17-
import org.elasticsearch.common.util.FeatureFlag;
1817
import org.elasticsearch.core.TimeValue;
1918
import org.elasticsearch.index.query.MatchAllQueryBuilder;
2019
import org.elasticsearch.search.builder.SearchSourceBuilder;
@@ -23,7 +22,6 @@
2322
import org.elasticsearch.test.ESIntegTestCase.Scope;
2423
import org.elasticsearch.test.InternalTestCluster;
2524
import org.junit.Assert;
26-
import org.junit.BeforeClass;
2725

2826
import java.util.Collection;
2927
import java.util.List;
@@ -46,7 +44,6 @@ public class ClusterStatsRemoteIT extends AbstractMultiClustersTestCase {
4644
private static final String REMOTE2 = "cluster-b";
4745

4846
private static final String INDEX_NAME = "demo";
49-
private static final FeatureFlag CCS_TELEMETRY_FEATURE_FLAG = new FeatureFlag("ccs_telemetry");
5047

5148
@Override
5249
protected boolean reuseClusters() {
@@ -63,11 +60,6 @@ protected Map<String, Boolean> skipUnavailableForRemoteClusters() {
6360
return Map.of(REMOTE1, false, REMOTE2, true);
6461
}
6562

66-
@BeforeClass
67-
protected static void skipIfTelemetryDisabled() {
68-
assumeTrue("Skipping test as CCS_TELEMETRY_FEATURE_FLAG is disabled", CCS_TELEMETRY_FEATURE_FLAG.isEnabled());
69-
}
70-
7163
public void testRemoteClusterStats() throws ExecutionException, InterruptedException {
7264
setupClusters();
7365
final Client client = client(LOCAL_CLUSTER);

server/src/internalClusterTest/java/org/elasticsearch/search/ccs/CCSUsageTelemetryIT.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.elasticsearch.common.bytes.BytesReference;
2626
import org.elasticsearch.common.settings.Settings;
2727
import org.elasticsearch.common.util.CollectionUtils;
28-
import org.elasticsearch.common.util.FeatureFlag;
2928
import org.elasticsearch.core.TimeValue;
3029
import org.elasticsearch.index.query.MatchAllQueryBuilder;
3130
import org.elasticsearch.plugins.Plugin;
@@ -40,7 +39,6 @@
4039
import org.elasticsearch.test.InternalTestCluster;
4140
import org.elasticsearch.usage.UsageService;
4241
import org.junit.Assert;
43-
import org.junit.BeforeClass;
4442
import org.junit.Rule;
4543
import org.junit.rules.TestRule;
4644
import org.junit.runner.Description;
@@ -73,7 +71,6 @@ public class CCSUsageTelemetryIT extends AbstractMultiClustersTestCase {
7371
private static final Logger LOGGER = LogManager.getLogger(CCSUsageTelemetryIT.class);
7472
private static final String REMOTE1 = "cluster-a";
7573
private static final String REMOTE2 = "cluster-b";
76-
private static final FeatureFlag CCS_TELEMETRY_FEATURE_FLAG = new FeatureFlag("ccs_telemetry");
7774

7875
@Override
7976
protected boolean reuseClusters() {
@@ -88,11 +85,6 @@ protected Collection<String> remoteClusterAlias() {
8885
@Rule
8986
public SkipUnavailableRule skipOverride = new SkipUnavailableRule(REMOTE1, REMOTE2);
9087

91-
@BeforeClass
92-
protected static void skipIfTelemetryDisabled() {
93-
assumeTrue("Skipping test as CCS_TELEMETRY_FEATURE_FLAG is disabled", CCS_TELEMETRY_FEATURE_FLAG.isEnabled());
94-
}
95-
9688
@Override
9789
protected Map<String, Boolean> skipUnavailableForRemoteClusters() {
9890
var map = skipOverride.getMap();

server/src/main/java/org/elasticsearch/action/admin/cluster/stats/ClusterStatsResponse.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
import java.util.Map;
2929
import java.util.Set;
3030

31-
import static org.elasticsearch.action.search.TransportSearchAction.CCS_TELEMETRY_FEATURE_FLAG;
32-
3331
public class ClusterStatsResponse extends BaseNodesResponse<ClusterStatsNodeResponse> implements ToXContentFragment {
3432

3533
final ClusterStatsNodes nodesStats;
@@ -145,14 +143,12 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
145143
builder.field("repositories");
146144
repositoryUsageStats.toXContent(builder, params);
147145

148-
if (CCS_TELEMETRY_FEATURE_FLAG.isEnabled()) {
149-
builder.startObject("ccs");
150-
if (remoteClustersStats != null) {
151-
builder.field("clusters", remoteClustersStats);
152-
}
153-
ccsMetrics.toXContent(builder, params);
154-
builder.endObject();
146+
builder.startObject("ccs");
147+
if (remoteClustersStats != null) {
148+
builder.field("clusters", remoteClustersStats);
155149
}
150+
ccsMetrics.toXContent(builder, params);
151+
builder.endObject();
156152

157153
return builder;
158154
}

server/src/main/java/org/elasticsearch/action/admin/cluster/stats/TransportClusterStatsAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.elasticsearch.injection.guice.Inject;
5151
import org.elasticsearch.node.NodeService;
5252
import org.elasticsearch.repositories.RepositoriesService;
53+
import org.elasticsearch.search.SearchService;
5354
import org.elasticsearch.tasks.CancellableTask;
5455
import org.elasticsearch.tasks.Task;
5556
import org.elasticsearch.tasks.TaskId;
@@ -434,8 +435,8 @@ public Map<String, RemoteClusterStats> getRemoteStats() {
434435
}
435436
}
436437

437-
private static boolean doRemotes(ClusterStatsRequest request) {
438-
return request.doRemotes();
438+
private boolean doRemotes(ClusterStatsRequest request) {
439+
return SearchService.CCS_COLLECT_TELEMETRY.get(settings) && request.doRemotes();
439440
}
440441

441442
private class RemoteStatsFanout extends CancellableFanOut<String, RemoteClusterStatsResponse, Map<String, RemoteClusterStats>> {

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@
5252
import org.elasticsearch.common.regex.Regex;
5353
import org.elasticsearch.common.settings.Setting;
5454
import org.elasticsearch.common.settings.Setting.Property;
55+
import org.elasticsearch.common.settings.Settings;
5556
import org.elasticsearch.common.util.ArrayUtils;
5657
import org.elasticsearch.common.util.CollectionUtils;
57-
import org.elasticsearch.common.util.FeatureFlag;
5858
import org.elasticsearch.common.util.Maps;
5959
import org.elasticsearch.common.util.concurrent.CountDown;
6060
import org.elasticsearch.common.util.concurrent.EsExecutors;
@@ -128,8 +128,6 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
128128
public static final String FROZEN_INDICES_DEPRECATION_MESSAGE = "Searching frozen indices [{}] is deprecated."
129129
+ " Consider cold or frozen tiers in place of frozen indices. The frozen feature will be removed in a feature release.";
130130

131-
public static final FeatureFlag CCS_TELEMETRY_FEATURE_FLAG = new FeatureFlag("ccs_telemetry");
132-
133131
/** The maximum number of shards for a single search request. */
134132
public static final Setting<Long> SHARD_COUNT_LIMIT_SETTING = Setting.longSetting(
135133
"action.search.shard_count.limit",
@@ -162,6 +160,7 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
162160
private final SearchResponseMetrics searchResponseMetrics;
163161
private final Client client;
164162
private final UsageService usageService;
163+
private final Settings settings;
165164

166165
@Inject
167166
public TransportSearchAction(
@@ -194,8 +193,9 @@ public TransportSearchAction(
194193
this.indexNameExpressionResolver = indexNameExpressionResolver;
195194
this.namedWriteableRegistry = namedWriteableRegistry;
196195
this.executorSelector = executorSelector;
197-
this.defaultPreFilterShardSize = DEFAULT_PRE_FILTER_SHARD_SIZE.get(clusterService.getSettings());
198-
this.ccsCheckCompatibility = SearchService.CCS_VERSION_CHECK_SETTING.get(clusterService.getSettings());
196+
this.settings = clusterService.getSettings();
197+
this.defaultPreFilterShardSize = DEFAULT_PRE_FILTER_SHARD_SIZE.get(settings);
198+
this.ccsCheckCompatibility = SearchService.CCS_VERSION_CHECK_SETTING.get(settings);
199199
this.searchResponseMetrics = searchResponseMetrics;
200200
this.client = client;
201201
this.usageService = usageService;
@@ -372,7 +372,7 @@ void executeRequest(
372372
searchPhaseProvider.apply(delegate)
373373
);
374374
} else {
375-
if ((listener instanceof TelemetryListener tl) && CCS_TELEMETRY_FEATURE_FLAG.isEnabled()) {
375+
if (listener instanceof TelemetryListener tl) {
376376
tl.setRemotes(resolvedIndices.getRemoteClusterIndices().size());
377377
if (task.isAsync()) {
378378
tl.setFeature(CCSUsageTelemetry.ASYNC_FEATURE);
@@ -398,7 +398,7 @@ void executeRequest(
398398
}
399399
final TaskId parentTaskId = task.taskInfo(clusterService.localNode().getId(), false).taskId();
400400
if (shouldMinimizeRoundtrips(rewritten)) {
401-
if ((listener instanceof TelemetryListener tl) && CCS_TELEMETRY_FEATURE_FLAG.isEnabled()) {
401+
if (listener instanceof TelemetryListener tl) {
402402
tl.setFeature(CCSUsageTelemetry.MRT_FEATURE);
403403
}
404404
final AggregationReduceContext.Builder aggregationReduceContextBuilder = rewritten.source() != null
@@ -1868,7 +1868,7 @@ private class SearchResponseActionListener implements ActionListener<SearchRespo
18681868
* Should we collect telemetry for this search?
18691869
*/
18701870
private boolean collectTelemetry() {
1871-
return CCS_TELEMETRY_FEATURE_FLAG.isEnabled() && usageBuilder.getRemotesCount() > 0;
1871+
return SearchService.CCS_COLLECT_TELEMETRY.get(settings) && usageBuilder.getRemotesCount() > 0;
18721872
}
18731873

18741874
public void setRemotes(int count) {

server/src/main/java/org/elasticsearch/common/settings/ClusterSettings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ public void apply(Settings value, Settings current, Settings previous) {
465465
SearchService.MAX_KEEPALIVE_SETTING,
466466
SearchService.ALLOW_EXPENSIVE_QUERIES,
467467
SearchService.CCS_VERSION_CHECK_SETTING,
468+
SearchService.CCS_COLLECT_TELEMETRY,
468469
MultiBucketConsumerService.MAX_BUCKET_SETTING,
469470
SearchService.LOW_LEVEL_CANCELLATION_SETTING,
470471
SearchService.MAX_OPEN_SCROLL_CONTEXT,

server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterStatsAction.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
import org.elasticsearch.action.admin.cluster.stats.ClusterStatsRequest;
1313
import org.elasticsearch.client.internal.node.NodeClient;
14-
import org.elasticsearch.common.util.FeatureFlag;
15-
import org.elasticsearch.common.util.set.Sets;
1614
import org.elasticsearch.rest.BaseRestHandler;
1715
import org.elasticsearch.rest.RestRequest;
1816
import org.elasticsearch.rest.Scope;
@@ -33,10 +31,9 @@ public class RestClusterStatsAction extends BaseRestHandler {
3331

3432
private static final Set<String> SUPPORTED_CAPABILITIES = Set.of(
3533
"human-readable-total-docs-size",
36-
"verbose-dense-vector-mapping-stats"
34+
"verbose-dense-vector-mapping-stats",
35+
"ccs-stats"
3736
);
38-
private static final Set<String> SUPPORTED_CAPABILITIES_CCS_STATS = Set.copyOf(Sets.union(SUPPORTED_CAPABILITIES, Set.of("ccs-stats")));
39-
public static final FeatureFlag CCS_TELEMETRY_FEATURE_FLAG = new FeatureFlag("ccs_telemetry");
4037
private static final Set<String> SUPPORTED_QUERY_PARAMETERS = Set.of("include_remotes", "nodeId", REST_TIMEOUT_PARAM);
4138

4239
@Override
@@ -73,6 +70,6 @@ public boolean canTripCircuitBreaker() {
7370

7471
@Override
7572
public Set<String> supportedCapabilities() {
76-
return CCS_TELEMETRY_FEATURE_FLAG.isEnabled() ? SUPPORTED_CAPABILITIES_CCS_STATS : SUPPORTED_CAPABILITIES;
73+
return SUPPORTED_CAPABILITIES;
7774
}
7875
}

server/src/main/java/org/elasticsearch/search/SearchService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,13 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
262262
Property.NodeScope
263263
);
264264

265+
public static final Setting<Boolean> CCS_COLLECT_TELEMETRY = Setting.boolSetting(
266+
"search.ccs.collect_telemetry",
267+
true,
268+
Property.Dynamic,
269+
Property.NodeScope
270+
);
271+
265272
public static final int DEFAULT_SIZE = 10;
266273
public static final int DEFAULT_FROM = 0;
267274

0 commit comments

Comments
 (0)