Skip to content

Commit 18f537c

Browse files
committed
[ML] refactor, update types, fix jobsForModelMemoryEstimation
1 parent 80eaeef commit 18f537c

File tree

2 files changed

+26
-29
lines changed

2 files changed

+26
-29
lines changed

x-pack/plugins/ml/common/types/modules.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,6 @@ export function isGeneralJobOverride(override: JobOverride): override is General
9898
return override.job_id === undefined;
9999
}
100100

101-
export type GeneralDatafeedsOverride = Partial<Omit<Datafeed, 'job_id'>>;
101+
export type GeneralDatafeedsOverride = Partial<Omit<Datafeed, 'job_id' | 'datafeed_id'>>;
102102

103103
export type DatafeedOverride = Partial<Datafeed> & { job_id: Job['job_id'] };

x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
import fs from 'fs';
88
import Boom from 'boom';
99
import numeral from '@elastic/numeral';
10-
import { CallAPIOptions, APICaller, SavedObjectsClientContract } from 'kibana/server';
10+
import { APICaller, SavedObjectsClientContract } from 'kibana/server';
1111
import moment from 'moment';
1212
import { IndexPatternAttributes } from 'src/plugins/data/server';
1313
import { merge } from 'lodash';
1414
import { AnalysisLimits, CombinedJobWithStats } from '../../../common/types/anomaly_detection_jobs';
15+
import { MlInfoResponse } from '../../../common/types/ml_server_info';
1516
import {
1617
KibanaObjects,
1718
ModuleDataFeed,
@@ -113,22 +114,15 @@ export class DataRecognizer {
113114
modulesDir = `${__dirname}/modules`;
114115
indexPatternName: string = '';
115116
indexPatternId: string | undefined = undefined;
116-
savedObjectsClient: SavedObjectsClientContract;
117117
/**
118118
* List of job ids that require model memory estimation
119119
*/
120-
jobsForModelMemoryEstimation: string[] = [];
120+
jobsForModelMemoryEstimation: ModuleJob[] = [];
121121

122-
callAsCurrentUser: (
123-
endpoint: string,
124-
clientParams?: Record<string, any>,
125-
options?: CallAPIOptions
126-
) => Promise<any>;
127-
128-
constructor(callAsCurrentUser: APICaller, savedObjectsClient: SavedObjectsClientContract) {
129-
this.callAsCurrentUser = callAsCurrentUser;
130-
this.savedObjectsClient = savedObjectsClient;
131-
}
122+
constructor(
123+
private callAsCurrentUser: APICaller,
124+
private savedObjectsClient: SavedObjectsClientContract
125+
) {}
132126

133127
// list all directories under the given directory
134128
async listDirs(dirName: string): Promise<string[]> {
@@ -385,8 +379,8 @@ export class DataRecognizer {
385379
startDatafeed?: boolean,
386380
start?: number,
387381
end?: number,
388-
jobOverrides?: JobOverride[],
389-
datafeedOverrides?: DatafeedOverride[],
382+
jobOverrides?: JobOverride | JobOverride[],
383+
datafeedOverrides?: DatafeedOverride | DatafeedOverride[],
390384
estimateModelMemory?: boolean
391385
) {
392386
// load the config from disk
@@ -983,27 +977,25 @@ export class DataRecognizer {
983977
const calculateModelMemoryLimit = calculateModelMemoryLimitProvider(this.callAsCurrentUser);
984978
const query = moduleConfig.query ?? null;
985979

986-
const jobs = moduleConfig.jobs.filter(job =>
987-
this.jobsForModelMemoryEstimation.includes(job.id)
988-
);
989-
990980
// Checks if all jobs in the module have the same time field configured
991-
const isSameTimeFields = jobs.every(
992-
job => job.config.data_description.time_field === jobs[0].config.data_description.time_field
981+
const isSameTimeFields = this.jobsForModelMemoryEstimation.every(
982+
job =>
983+
job.config.data_description.time_field ===
984+
this.jobsForModelMemoryEstimation[0].config.data_description.time_field
993985
);
994986

995987
if (isSameTimeFields && (start === undefined || end === undefined)) {
996988
// In case of time range is not provided and the time field is the same
997989
// set the fallback range for all jobs
998990
const { start: fallbackStart, end: fallbackEnd } = await this.getFallbackTimeRange(
999-
jobs[0].config.data_description.time_field,
991+
this.jobsForModelMemoryEstimation[0].config.data_description.time_field,
1000992
query
1001993
);
1002994
start = fallbackStart;
1003995
end = fallbackEnd;
1004996
}
1005997

1006-
for (const job of jobs) {
998+
for (const job of this.jobsForModelMemoryEstimation) {
1007999
let earliestMs = start;
10081000
let latestMs = end;
10091001
if (earliestMs === undefined || latestMs === undefined) {
@@ -1032,7 +1024,7 @@ export class DataRecognizer {
10321024
}
10331025
}
10341026

1035-
const { limits } = await this.callAsCurrentUser('ml.info');
1027+
const { limits } = await this.callAsCurrentUser<MlInfoResponse>('ml.info');
10361028
const maxMml = limits.max_model_memory_limit;
10371029

10381030
if (!maxMml) {
@@ -1077,7 +1069,11 @@ export class DataRecognizer {
10771069
return false;
10781070
}
10791071

1080-
applyJobConfigOverrides(moduleConfig: Module, jobOverrides?: JobOverride[], jobPrefix = '') {
1072+
applyJobConfigOverrides(
1073+
moduleConfig: Module,
1074+
jobOverrides?: JobOverride | JobOverride[],
1075+
jobPrefix = ''
1076+
) {
10811077
if (jobOverrides === undefined || jobOverrides === null) {
10821078
return;
10831079
}
@@ -1109,9 +1105,10 @@ export class DataRecognizer {
11091105
if (generalOverrides.some(override => !!override.analysis_limits?.model_memory_limit)) {
11101106
this.jobsForModelMemoryEstimation = [];
11111107
} else {
1112-
this.jobsForModelMemoryEstimation = jobSpecificOverrides
1113-
.filter(override => !override.analysis_limits?.model_memory_limit)
1114-
.map(override => override.job_id);
1108+
this.jobsForModelMemoryEstimation = moduleConfig.jobs.filter(job => {
1109+
const override = jobSpecificOverrides.find(o => o.job_id === job.id);
1110+
return override?.analysis_limits?.model_memory_limit === undefined;
1111+
});
11151112
}
11161113

11171114
function processArrayValues(source: any, update: any) {

0 commit comments

Comments
 (0)