77
88package org.elasticsearch.xpack.esql.action;
99
10+ import org.elasticsearch.action.admin.cluster.stats.CCSTelemetrySnapshot;
11+ import org.elasticsearch.action.admin.cluster.stats.CCSUsageTelemetry;
1012import org.elasticsearch.plugins.Plugin;
13+ import org.elasticsearch.test.SkipUnavailableRule;
1114
1215import java.util.ArrayList;
1316import java.util.Collection;
1417import java.util.List;
18+ import java.util.Map;
1519
1620import static org.elasticsearch.action.admin.cluster.stats.CCSUsageTelemetry.ASYNC_FEATURE;
1721import static org.hamcrest.Matchers.equalTo;
@@ -26,6 +30,12 @@ protected Collection<Class<? extends Plugin>> nodePlugins(String clusterAlias) {
2630 return plugins;
2731 }
2832
33+ public void assertPerClusterCount(CCSTelemetrySnapshot.PerClusterCCSTelemetry perCluster, long count) {
34+ assertThat(perCluster.getCount(), equalTo(count));
35+ assertThat(perCluster.getSkippedCount(), equalTo(0L));
36+ assertThat(perCluster.getTook().count(), equalTo(count));
37+ }
38+
2939 public void testLocalRemote() throws Exception {
3040 setupClusters();
3141 var telemetry = getTelemetryFromQuery("from logs-*,c*:logs-* | stats sum (v)", "kibana");
@@ -46,11 +56,152 @@ public void testLocalRemote() throws Exception {
4656 var perCluster = telemetry.getByRemoteCluster();
4757 assertThat(perCluster.size(), equalTo(3));
4858 for (String clusterAlias : remoteClusterAlias()) {
49- var clusterTelemetry = perCluster.get(clusterAlias);
50- assertThat(clusterTelemetry.getCount(), equalTo(1L));
51- assertThat(clusterTelemetry.getSkippedCount(), equalTo(0L));
52- assertThat(clusterTelemetry.getTook().count(), equalTo(1L));
59+ assertPerClusterCount(perCluster.get(clusterAlias), 1L);
60+ }
61+ assertPerClusterCount(perCluster.get(LOCAL_CLUSTER), 1L);
62+
63+ telemetry = getTelemetryFromQuery("from logs-*,c*:logs-* | stats sum (v)", "kibana");
64+ assertThat(telemetry.getTotalCount(), equalTo(2L));
65+ assertThat(telemetry.getClientCounts().get("kibana"), equalTo(2L));
66+ perCluster = telemetry.getByRemoteCluster();
67+ assertThat(perCluster.size(), equalTo(3));
68+ for (String clusterAlias : remoteClusterAlias()) {
69+ assertPerClusterCount(perCluster.get(clusterAlias), 2L);
70+ }
71+ assertPerClusterCount(perCluster.get(LOCAL_CLUSTER), 2L);
72+ }
73+
74+ public void testLocalOnly() throws Exception {
75+ setupClusters();
76+ // Should not produce any usage info since it's a local search
77+ var telemetry = getTelemetryFromQuery("from logs-* | stats sum (v)", "kibana");
78+
79+ assertThat(telemetry.getTotalCount(), equalTo(0L));
80+ assertThat(telemetry.getSuccessCount(), equalTo(0L));
81+ assertThat(telemetry.getByRemoteCluster().size(), equalTo(0));
82+ }
83+
84+ @SkipUnavailableRule.NotSkipped(aliases = REMOTE1)
85+ public void testFailed() throws Exception {
86+ setupClusters();
87+ // Should not produce any usage info since it's a local search
88+ var telemetry = getTelemetryFromFailedQuery("from no_such_index | stats sum (v)");
89+
90+ assertThat(telemetry.getTotalCount(), equalTo(0L));
91+ assertThat(telemetry.getSuccessCount(), equalTo(0L));
92+ assertThat(telemetry.getByRemoteCluster().size(), equalTo(0));
93+
94+ // One remote is skipped, one is not
95+ telemetry = getTelemetryFromFailedQuery("from logs-*,c*:no_such_index | stats sum (v)");
96+
97+ assertThat(telemetry.getTotalCount(), equalTo(1L));
98+ assertThat(telemetry.getSuccessCount(), equalTo(0L));
99+ assertThat(telemetry.getByRemoteCluster().size(), equalTo(1));
100+ assertThat(telemetry.getRemotesPerSearchAvg(), equalTo(2.0));
101+ assertThat(telemetry.getRemotesPerSearchMax(), equalTo(2L));
102+ assertThat(telemetry.getSearchCountWithSkippedRemotes(), equalTo(1L));
103+ Map<String, Long> expectedFailure = Map.of(CCSUsageTelemetry.Result.NOT_FOUND.getName(), 1L);
104+ assertThat(telemetry.getFailureReasons(), equalTo(expectedFailure));
105+ // cluster-b should be skipped
106+ assertThat(telemetry.getByRemoteCluster().get(REMOTE2).getCount(), equalTo(0L));
107+ assertThat(telemetry.getByRemoteCluster().get(REMOTE2).getSkippedCount(), equalTo(1L));
108+
109+ // this is only for cluster-a so no skipped remotes
110+ telemetry = getTelemetryFromFailedQuery("from logs-*,cluster-a:no_such_index | stats sum (v)");
111+ assertThat(telemetry.getTotalCount(), equalTo(2L));
112+ assertThat(telemetry.getSuccessCount(), equalTo(0L));
113+ assertThat(telemetry.getByRemoteCluster().size(), equalTo(1));
114+ assertThat(telemetry.getRemotesPerSearchAvg(), equalTo(2.0));
115+ assertThat(telemetry.getRemotesPerSearchMax(), equalTo(2L));
116+ assertThat(telemetry.getSearchCountWithSkippedRemotes(), equalTo(1L));
117+ expectedFailure = Map.of(CCSUsageTelemetry.Result.NOT_FOUND.getName(), 2L);
118+ assertThat(telemetry.getFailureReasons(), equalTo(expectedFailure));
119+ assertThat(telemetry.getByRemoteCluster().size(), equalTo(1));
120+ }
121+
122+ // TODO: enable when skip-up patch is merged
123+ // public void testSkipAllRemotes() throws Exception {
124+ // var telemetry = getTelemetryFromQuery("from logs-*,c*:no_such_index | stats sum (v)", "unknown");
125+ //
126+ // assertThat(telemetry.getTotalCount(), equalTo(1L));
127+ // assertThat(telemetry.getSuccessCount(), equalTo(1L));
128+ // assertThat(telemetry.getFailureReasons().size(), equalTo(0));
129+ // assertThat(telemetry.getTook().count(), equalTo(1L));
130+ // assertThat(telemetry.getTookMrtFalse().count(), equalTo(0L));
131+ // assertThat(telemetry.getTookMrtTrue().count(), equalTo(0L));
132+ // assertThat(telemetry.getRemotesPerSearchAvg(), equalTo(2.0));
133+ // assertThat(telemetry.getRemotesPerSearchMax(), equalTo(2L));
134+ // assertThat(telemetry.getSearchCountWithSkippedRemotes(), equalTo(1L));
135+ // assertThat(telemetry.getClientCounts().size(), equalTo(0));
136+ //
137+ // var perCluster = telemetry.getByRemoteCluster();
138+ // assertThat(perCluster.size(), equalTo(3));
139+ // for (String clusterAlias : remoteClusterAlias()) {
140+ // var clusterData = perCluster.get(clusterAlias);
141+ // assertThat(clusterData.getCount(), equalTo(0L));
142+ // assertThat(clusterData.getSkippedCount(), equalTo(1L));
143+ // assertThat(clusterData.getTook().count(), equalTo(0L));
144+ // }
145+ // assertPerClusterCount(perCluster.get(LOCAL_CLUSTER), 1L);
146+ // }
147+
148+ public void testRemoteOnly() throws Exception {
149+ setupClusters();
150+ var telemetry = getTelemetryFromQuery("from c*:logs-* | stats sum (v)", "kibana");
151+
152+ assertThat(telemetry.getTotalCount(), equalTo(1L));
153+ assertThat(telemetry.getSuccessCount(), equalTo(1L));
154+ assertThat(telemetry.getFailureReasons().size(), equalTo(0));
155+ assertThat(telemetry.getTook().count(), equalTo(1L));
156+ assertThat(telemetry.getTookMrtFalse().count(), equalTo(0L));
157+ assertThat(telemetry.getTookMrtTrue().count(), equalTo(0L));
158+ assertThat(telemetry.getRemotesPerSearchAvg(), equalTo(2.0));
159+ assertThat(telemetry.getRemotesPerSearchMax(), equalTo(2L));
160+ assertThat(telemetry.getSearchCountWithSkippedRemotes(), equalTo(0L));
161+ assertThat(telemetry.getClientCounts().size(), equalTo(1));
162+ assertThat(telemetry.getClientCounts().get("kibana"), equalTo(1L));
163+ assertThat(telemetry.getFeatureCounts().get(ASYNC_FEATURE), equalTo(null));
164+
165+ var perCluster = telemetry.getByRemoteCluster();
166+ assertThat(perCluster.size(), equalTo(2));
167+ for (String clusterAlias : remoteClusterAlias()) {
168+ assertPerClusterCount(perCluster.get(clusterAlias), 1L);
169+ }
170+ assertThat(telemetry.getByRemoteCluster().size(), equalTo(2));
171+ }
172+
173+ public void testAsync() throws Exception {
174+ setupClusters();
175+ var telemetry = getTelemetryFromAsyncQuery("from logs-*,c*:logs-* | stats sum (v)");
176+
177+ assertThat(telemetry.getTotalCount(), equalTo(1L));
178+ assertThat(telemetry.getSuccessCount(), equalTo(1L));
179+ assertThat(telemetry.getFailureReasons().size(), equalTo(0));
180+ assertThat(telemetry.getTook().count(), equalTo(1L));
181+ assertThat(telemetry.getTookMrtFalse().count(), equalTo(0L));
182+ assertThat(telemetry.getTookMrtTrue().count(), equalTo(0L));
183+ assertThat(telemetry.getRemotesPerSearchAvg(), equalTo(2.0));
184+ assertThat(telemetry.getRemotesPerSearchMax(), equalTo(2L));
185+ assertThat(telemetry.getSearchCountWithSkippedRemotes(), equalTo(0L));
186+ assertThat(telemetry.getClientCounts().size(), equalTo(0));
187+ assertThat(telemetry.getFeatureCounts().get(ASYNC_FEATURE), equalTo(1L));
188+
189+ var perCluster = telemetry.getByRemoteCluster();
190+ assertThat(perCluster.size(), equalTo(3));
191+ for (String clusterAlias : remoteClusterAlias()) {
192+ assertPerClusterCount(perCluster.get(clusterAlias), 1L);
53193 }
194+ assertPerClusterCount(perCluster.get(LOCAL_CLUSTER), 1L);
54195
196+ // do it again
197+ telemetry = getTelemetryFromAsyncQuery("from logs-*,c*:logs-* | stats sum (v)");
198+ assertThat(telemetry.getTotalCount(), equalTo(2L));
199+ assertThat(telemetry.getFeatureCounts().get(ASYNC_FEATURE), equalTo(2L));
200+ perCluster = telemetry.getByRemoteCluster();
201+ assertThat(perCluster.size(), equalTo(3));
202+ for (String clusterAlias : remoteClusterAlias()) {
203+ assertPerClusterCount(perCluster.get(clusterAlias), 2L);
204+ }
205+ assertPerClusterCount(perCluster.get(LOCAL_CLUSTER), 2L);
55206 }
56207}
0 commit comments