|
25 | 25 | import org.elasticsearch.xpack.core.action.XPackUsageFeatureAction;
|
26 | 26 | import org.elasticsearch.xpack.core.action.XPackUsageFeatureResponse;
|
27 | 27 | import org.elasticsearch.xpack.core.action.XPackUsageFeatureTransportAction;
|
| 28 | +import org.elasticsearch.xpack.core.action.util.PageParams; |
28 | 29 | import org.elasticsearch.xpack.core.ml.MachineLearningFeatureSetUsage;
|
| 30 | +import org.elasticsearch.xpack.core.ml.action.GetDataFrameAnalyticsStatsAction; |
29 | 31 | import org.elasticsearch.xpack.core.ml.action.GetDatafeedsStatsAction;
|
30 | 32 | import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction;
|
31 | 33 | import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
|
| 34 | +import org.elasticsearch.xpack.core.ml.dataframe.DataFrameAnalyticsState; |
32 | 35 | import org.elasticsearch.xpack.core.ml.job.config.Job;
|
33 | 36 | import org.elasticsearch.xpack.core.ml.job.config.JobState;
|
34 | 37 | import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSizeStats;
|
@@ -69,22 +72,35 @@ protected void masterOperation(Task task, XPackUsageRequest request, ClusterStat
|
69 | 72 | ActionListener<XPackUsageFeatureResponse> listener) {
|
70 | 73 | if (enabled == false) {
|
71 | 74 | MachineLearningFeatureSetUsage usage = new MachineLearningFeatureSetUsage(licenseState.isMachineLearningAllowed(), enabled,
|
72 |
| - Collections.emptyMap(), Collections.emptyMap(), 0); |
| 75 | + Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), 0); |
73 | 76 | listener.onResponse(new XPackUsageFeatureResponse(usage));
|
74 | 77 | return;
|
75 | 78 | }
|
76 | 79 |
|
77 | 80 | Map<String, Object> jobsUsage = new LinkedHashMap<>();
|
78 | 81 | Map<String, Object> datafeedsUsage = new LinkedHashMap<>();
|
| 82 | + Map<String, Object> analyticsUsage = new LinkedHashMap<>(); |
79 | 83 | int nodeCount = mlNodeCount(state);
|
80 | 84 |
|
| 85 | + // Step 3. Extract usage from data frame analytics stats and return usage response |
| 86 | + ActionListener<GetDataFrameAnalyticsStatsAction.Response> dataframeAnalyticsListener = ActionListener.wrap( |
| 87 | + response -> { |
| 88 | + addDataFrameAnalyticsUsage(response, analyticsUsage); |
| 89 | + MachineLearningFeatureSetUsage usage = new MachineLearningFeatureSetUsage(licenseState.isMachineLearningAllowed(), |
| 90 | + enabled, jobsUsage, datafeedsUsage, analyticsUsage, nodeCount); |
| 91 | + listener.onResponse(new XPackUsageFeatureResponse(usage)); |
| 92 | + }, |
| 93 | + listener::onFailure |
| 94 | + ); |
| 95 | + |
81 | 96 | // Step 2. Extract usage from datafeeds stats and return usage response
|
82 | 97 | ActionListener<GetDatafeedsStatsAction.Response> datafeedStatsListener =
|
83 | 98 | ActionListener.wrap(response -> {
|
84 | 99 | addDatafeedsUsage(response, datafeedsUsage);
|
85 |
| - MachineLearningFeatureSetUsage usage = new MachineLearningFeatureSetUsage(licenseState.isMachineLearningAllowed(), |
86 |
| - enabled, jobsUsage, datafeedsUsage, nodeCount); |
87 |
| - listener.onResponse(new XPackUsageFeatureResponse(usage)); |
| 100 | + GetDataFrameAnalyticsStatsAction.Request dataframeAnalyticsStatsRequest = |
| 101 | + new GetDataFrameAnalyticsStatsAction.Request(GetDatafeedsStatsAction.ALL); |
| 102 | + dataframeAnalyticsStatsRequest.setPageParams(new PageParams(0, 10_000)); |
| 103 | + client.execute(GetDataFrameAnalyticsStatsAction.INSTANCE, dataframeAnalyticsStatsRequest, dataframeAnalyticsListener); |
88 | 104 | },
|
89 | 105 | listener::onFailure);
|
90 | 106 |
|
@@ -184,19 +200,33 @@ private void addDatafeedsUsage(GetDatafeedsStatsAction.Response response, Map<St
|
184 | 200 | ds -> Counter.newCounter()).addAndGet(1);
|
185 | 201 | }
|
186 | 202 |
|
187 |
| - datafeedsUsage.put(MachineLearningFeatureSetUsage.ALL, createDatafeedUsageEntry(response.getResponse().count())); |
| 203 | + datafeedsUsage.put(MachineLearningFeatureSetUsage.ALL, createCountUsageEntry(response.getResponse().count())); |
188 | 204 | for (DatafeedState datafeedState : datafeedCountByState.keySet()) {
|
189 | 205 | datafeedsUsage.put(datafeedState.name().toLowerCase(Locale.ROOT),
|
190 |
| - createDatafeedUsageEntry(datafeedCountByState.get(datafeedState).get())); |
| 206 | + createCountUsageEntry(datafeedCountByState.get(datafeedState).get())); |
191 | 207 | }
|
192 | 208 | }
|
193 | 209 |
|
194 |
| - private Map<String, Object> createDatafeedUsageEntry(long count) { |
| 210 | + private Map<String, Object> createCountUsageEntry(long count) { |
195 | 211 | Map<String, Object> usage = new HashMap<>();
|
196 | 212 | usage.put(MachineLearningFeatureSetUsage.COUNT, count);
|
197 | 213 | return usage;
|
198 | 214 | }
|
199 | 215 |
|
| 216 | + private void addDataFrameAnalyticsUsage(GetDataFrameAnalyticsStatsAction.Response response, |
| 217 | + Map<String, Object> dataframeAnalyticsUsage) { |
| 218 | + Map<DataFrameAnalyticsState, Counter> dataFrameAnalyticsStateCounterMap = new HashMap<>(); |
| 219 | + |
| 220 | + for(GetDataFrameAnalyticsStatsAction.Response.Stats stats : response.getResponse().results()) { |
| 221 | + dataFrameAnalyticsStateCounterMap.computeIfAbsent(stats.getState(), ds -> Counter.newCounter()).addAndGet(1); |
| 222 | + } |
| 223 | + dataframeAnalyticsUsage.put(MachineLearningFeatureSetUsage.ALL, createCountUsageEntry(response.getResponse().count())); |
| 224 | + for (DataFrameAnalyticsState state : dataFrameAnalyticsStateCounterMap.keySet()) { |
| 225 | + dataframeAnalyticsUsage.put(state.name().toLowerCase(Locale.ROOT), |
| 226 | + createCountUsageEntry(dataFrameAnalyticsStateCounterMap.get(state).get())); |
| 227 | + } |
| 228 | + } |
| 229 | + |
200 | 230 | private static int mlNodeCount(final ClusterState clusterState) {
|
201 | 231 | int mlNodeCount = 0;
|
202 | 232 | for (DiscoveryNode node : clusterState.getNodes()) {
|
|
0 commit comments