Skip to content

Commit

Permalink
[ML] Fix overall bucket request for large number of job IDs (#198292)
Browse files Browse the repository at this point in the history
## Summary

Fixes #190591

Adds chunking for `over_buckets` request to prevent exceeding the
request length URL.

### Checklist

- [ ] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios

(cherry picked from commit fa0f397)
  • Loading branch information
darnautov committed Oct 31, 2024
1 parent fe3a0ff commit 4ae945d
Showing 1 changed file with 28 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';

import type { RuntimeMappings } from '@kbn/ml-runtime-field-utils';

import { isNumber } from 'lodash';
import { chunk, isNumber } from 'lodash';
import { ML_INTERNAL_BASE_PATH } from '../../../../common/constants/app';
import type {
MlServerDefaults,
Expand Down Expand Up @@ -397,25 +397,45 @@ export function mlApiProvider(httpService: HttpService) {
end,
overallScore,
}: {
jobId: string;
jobId: string[];
topN: string;
bucketSpan: string;
start: number;
end: number;
overallScore?: number;
}) {
}): Promise<estypes.MlGetOverallBucketsResponse> {
const body = JSON.stringify({
topN,
bucketSpan,
start,
end,
...(overallScore ? { overall_score: overallScore } : {}),
});
return httpService.http<any>({
path: `${ML_INTERNAL_BASE_PATH}/anomaly_detectors/${jobId}/results/overall_buckets`,
method: 'POST',
body,
version: '1',

// Max permitted job_id is 64 characters, so we can fit around 30 jobs per request
const maxJobsPerRequest = 30;

return Promise.all(
chunk(jobId, maxJobsPerRequest).map((jobIdsChunk) => {
return httpService.http<estypes.MlGetOverallBucketsResponse>({
path: `${ML_INTERNAL_BASE_PATH}/anomaly_detectors/${jobIdsChunk.join(
','
)}/results/overall_buckets`,
method: 'POST',
body,
version: '1',
});
})
).then((responses) => {
// Merge responses
return responses.reduce<estypes.MlGetOverallBucketsResponse>(
(acc, response) => {
acc.count += response.count;
acc.overall_buckets.push(...response.overall_buckets);
return acc;
},
{ count: 0, overall_buckets: [] }
);
});
},

Expand Down

0 comments on commit 4ae945d

Please sign in to comment.