25
25
import org .elasticsearch .xpack .core .XPackSettings ;
26
26
import org .elasticsearch .xpack .core .XPackField ;
27
27
import org .elasticsearch .xpack .core .ml .MachineLearningFeatureSetUsage ;
28
- import org .elasticsearch .xpack .core .ml .MlMetadata ;
29
28
import org .elasticsearch .xpack .core .ml .action .GetDatafeedsStatsAction ;
30
29
import org .elasticsearch .xpack .core .ml .action .GetJobsStatsAction ;
31
30
import org .elasticsearch .xpack .core .ml .datafeed .DatafeedState ;
32
31
import org .elasticsearch .xpack .core .ml .job .config .Job ;
33
32
import org .elasticsearch .xpack .core .ml .job .config .JobState ;
33
+ import org .elasticsearch .xpack .ml .job .JobManagerHolder ;
34
34
import org .elasticsearch .xpack .ml .process .NativeController ;
35
35
import org .elasticsearch .xpack .ml .process .NativeControllerHolder ;
36
36
import org .elasticsearch .xpack .core .ml .job .process .autodetect .state .ModelSizeStats ;
47
47
import java .util .Map ;
48
48
import java .util .Objects ;
49
49
import java .util .concurrent .TimeoutException ;
50
+ import java .util .stream .Collectors ;
50
51
51
52
public class MachineLearningFeatureSet implements XPackFeatureSet {
52
53
@@ -60,15 +61,17 @@ public class MachineLearningFeatureSet implements XPackFeatureSet {
60
61
private final XPackLicenseState licenseState ;
61
62
private final ClusterService clusterService ;
62
63
private final Client client ;
64
+ private final JobManagerHolder jobManagerHolder ;
63
65
private final Map <String , Object > nativeCodeInfo ;
64
66
65
67
@ Inject
66
68
public MachineLearningFeatureSet (Environment environment , ClusterService clusterService , Client client ,
67
- @ Nullable XPackLicenseState licenseState ) {
69
+ @ Nullable XPackLicenseState licenseState , JobManagerHolder jobManagerHolder ) {
68
70
this .enabled = XPackSettings .MACHINE_LEARNING_ENABLED .get (environment .settings ());
69
71
this .clusterService = Objects .requireNonNull (clusterService );
70
72
this .client = Objects .requireNonNull (client );
71
73
this .licenseState = licenseState ;
74
+ this .jobManagerHolder = jobManagerHolder ;
72
75
Map <String , Object > nativeCodeInfo = NativeController .UNKNOWN_NATIVE_CODE_INFO ;
73
76
// Don't try to get the native code version if ML is disabled - it causes too much controversy
74
77
// if ML has been disabled because of some OS incompatibility. Also don't try to get the native
@@ -133,7 +136,7 @@ public Map<String, Object> nativeCodeInfo() {
133
136
@ Override
134
137
public void usage (ActionListener <XPackFeatureSet .Usage > listener ) {
135
138
ClusterState state = clusterService .state ();
136
- new Retriever (client , MlMetadata . getMlMetadata ( state ) , available (), enabled (), mlNodeCount (state )).execute (listener );
139
+ new Retriever (client , jobManagerHolder , available (), enabled (), mlNodeCount (state )).execute (listener );
137
140
}
138
141
139
142
private int mlNodeCount (final ClusterState clusterState ) {
@@ -153,16 +156,16 @@ private int mlNodeCount(final ClusterState clusterState) {
153
156
public static class Retriever {
154
157
155
158
private final Client client ;
156
- private final MlMetadata mlMetadata ;
159
+ private final JobManagerHolder jobManagerHolder ;
157
160
private final boolean available ;
158
161
private final boolean enabled ;
159
162
private Map <String , Object > jobsUsage ;
160
163
private Map <String , Object > datafeedsUsage ;
161
164
private int nodeCount ;
162
165
163
- public Retriever (Client client , MlMetadata mlMetadata , boolean available , boolean enabled , int nodeCount ) {
166
+ public Retriever (Client client , JobManagerHolder jobManagerHolder , boolean available , boolean enabled , int nodeCount ) {
164
167
this .client = Objects .requireNonNull (client );
165
- this .mlMetadata = mlMetadata ;
168
+ this .jobManagerHolder = jobManagerHolder ;
166
169
this .available = available ;
167
170
this .enabled = enabled ;
168
171
this .jobsUsage = new LinkedHashMap <>();
@@ -171,7 +174,8 @@ public Retriever(Client client, MlMetadata mlMetadata, boolean available, boolea
171
174
}
172
175
173
176
public void execute (ActionListener <Usage > listener ) {
174
- if (enabled == false ) {
177
+ // empty holder means either ML disabled or transport client mode
178
+ if (jobManagerHolder .isEmpty ()) {
175
179
listener .onResponse (
176
180
new MachineLearningFeatureSetUsage (available , enabled , Collections .emptyMap (), Collections .emptyMap (), 0 ));
177
181
return ;
@@ -191,20 +195,19 @@ public void execute(ActionListener<Usage> listener) {
191
195
GetJobsStatsAction .Request jobStatsRequest = new GetJobsStatsAction .Request (MetaData .ALL );
192
196
ActionListener <GetJobsStatsAction .Response > jobStatsListener = ActionListener .wrap (
193
197
response -> {
194
- addJobsUsage (response );
195
- GetDatafeedsStatsAction .Request datafeedStatsRequest =
196
- new GetDatafeedsStatsAction .Request (GetDatafeedsStatsAction .ALL );
197
- client .execute (GetDatafeedsStatsAction .INSTANCE , datafeedStatsRequest ,
198
- datafeedStatsListener );
199
- },
200
- listener ::onFailure
201
- );
198
+ jobManagerHolder .getJobManager ().expandJobs (MetaData .ALL , true , ActionListener .wrap (jobs -> {
199
+ addJobsUsage (response , jobs .results ());
200
+ GetDatafeedsStatsAction .Request datafeedStatsRequest = new GetDatafeedsStatsAction .Request (
201
+ GetDatafeedsStatsAction .ALL );
202
+ client .execute (GetDatafeedsStatsAction .INSTANCE , datafeedStatsRequest , datafeedStatsListener );
203
+ }, listener ::onFailure ));
204
+ }, listener ::onFailure );
202
205
203
206
// Step 0. Kick off the chain of callbacks by requesting jobs stats
204
207
client .execute (GetJobsStatsAction .INSTANCE , jobStatsRequest , jobStatsListener );
205
208
}
206
209
207
- private void addJobsUsage (GetJobsStatsAction .Response response ) {
210
+ private void addJobsUsage (GetJobsStatsAction .Response response , List < Job > jobs ) {
208
211
StatsAccumulator allJobsDetectorsStats = new StatsAccumulator ();
209
212
StatsAccumulator allJobsModelSizeStats = new StatsAccumulator ();
210
213
ForecastStats allJobsForecastStats = new ForecastStats ();
@@ -214,11 +217,11 @@ private void addJobsUsage(GetJobsStatsAction.Response response) {
214
217
Map <JobState , StatsAccumulator > modelSizeStatsByState = new HashMap <>();
215
218
Map <JobState , ForecastStats > forecastStatsByState = new HashMap <>();
216
219
217
- Map <String , Job > jobs = mlMetadata .getJobs ();
218
220
List <GetJobsStatsAction .Response .JobStats > jobsStats = response .getResponse ().results ();
221
+ Map <String , Job > jobMap = jobs .stream ().collect (Collectors .toMap (Job ::getId , item -> item ));
219
222
for (GetJobsStatsAction .Response .JobStats jobStats : jobsStats ) {
220
223
ModelSizeStats modelSizeStats = jobStats .getModelSizeStats ();
221
- int detectorsCount = jobs .get (jobStats .getJobId ()).getAnalysisConfig ()
224
+ int detectorsCount = jobMap .get (jobStats .getJobId ()).getAnalysisConfig ()
222
225
.getDetectors ().size ();
223
226
double modelSize = modelSizeStats == null ? 0.0
224
227
: jobStats .getModelSizeStats ().getModelBytes ();
0 commit comments