Skip to content

Commit a82a02e

Browse files
[Response Ops][Task Manager] Setting background task utilization window based on poll interval (#203481)
## Summary Setting a desired window length (15 seconds) for the background task utilization window running average and calcuating the number of entries to average based on the poll interval. Updating config to be optional so this value can still be configured but if not configured will be calculated. ## To Verify - Add a console log to log the window size ``` --- a/x-pack/platform/plugins/shared/task_manager/server/monitoring/background_task_utilization_statistics.ts +++ b/x-pack/platform/plugins/shared/task_manager/server/monitoring/background_task_utilization_statistics.ts @@ -59,6 +59,7 @@ export function createBackgroundTaskUtilizationAggregator( workerUtilizationRunningAverageWindowSize ?? WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW_SIZE_MS / pollInterval; + console.log(`workerUtilizationWindowSize ${workerUtilizationWindowSize}`); const taskRunEventToAdhocStat = createTaskRunEventToAdhocStat(); const taskRunAdhocEvents$: Observable<Pick<BackgroundTaskUtilizationStat, 'adhoc'>> = ``` - Start Kibana with `mget` claim strategy. The window size should be 30 - Start Kibana with `update_by_query` claim strategy. The window size should be 5 - Set `xpack.task_manager.worker_utilization_running_average_window: 22` in your Kibana config and start Kibana. The window size should be 22 (takes the configured window size if it's passed in). Co-authored-by: Elastic Machine <[email protected]>
1 parent 98ce312 commit a82a02e

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

x-pack/platform/plugins/shared/task_manager/server/config.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ describe('config validation', () => {
5151
"exclude_task_types": Array [],
5252
},
5353
"version_conflict_threshold": 80,
54-
"worker_utilization_running_average_window": 5,
5554
}
5655
`);
5756
});
@@ -110,7 +109,6 @@ describe('config validation', () => {
110109
"exclude_task_types": Array [],
111110
},
112111
"version_conflict_threshold": 80,
113-
"worker_utilization_running_average_window": 5,
114112
}
115113
`);
116114
});
@@ -172,7 +170,6 @@ describe('config validation', () => {
172170
"exclude_task_types": Array [],
173171
},
174172
"version_conflict_threshold": 80,
175-
"worker_utilization_running_average_window": 5,
176173
}
177174
`);
178175
});

x-pack/platform/plugins/shared/task_manager/server/config.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export const DEFAULT_METRICS_RESET_INTERVAL = 30 * 1000; // 30 seconds
2929
// At the default poll interval of 3sec, this averages over the last 15sec.
3030
export const DEFAULT_WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW = 5;
3131

32+
export const WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW_SIZE_MS = 15 * 1000; // 15 seconds
33+
3234
export const CLAIM_STRATEGY_UPDATE_BY_QUERY = 'update_by_query';
3335
export const CLAIM_STRATEGY_MGET = 'mget';
3436

@@ -189,11 +191,12 @@ export const configSchema = schema.object(
189191
min: 50,
190192
max: 100,
191193
}),
192-
worker_utilization_running_average_window: schema.number({
193-
defaultValue: DEFAULT_WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW,
194-
max: 100,
195-
min: 1,
196-
}),
194+
worker_utilization_running_average_window: schema.maybe(
195+
schema.number({
196+
max: 100,
197+
min: 1,
198+
})
199+
),
197200
claim_strategy: schema.string({ defaultValue: CLAIM_STRATEGY_MGET }),
198201
request_timeouts: requestTimeoutsConfig,
199202
auto_calculate_default_ech_capacity: schema.boolean({ defaultValue: false }),

x-pack/platform/plugins/shared/task_manager/server/monitoring/background_task_utilization_statistics.test.ts

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,10 @@ describe('Task Run Statistics', () => {
425425
});
426426

427427
test('returns a running count of load', async () => {
428-
const loads = [40, 80, 100, 100, 10, 10, 60, 40];
428+
const loads = [
429+
40, 80, 100, 100, 10, 10, 60, 40, 40, 80, 100, 100, 10, 10, 60, 40, 40, 80, 100, 100, 10,
430+
10, 60, 40, 40, 80, 100, 100, 10, 10, 60, 40, 30,
431+
];
429432
const events$ = new Subject<TaskLifecycleEvent>();
430433
const taskPollingLifecycle = taskPollingLifecycleMock.create({
431434
events$: events$ as Observable<TaskLifecycleEvent>,
@@ -434,7 +437,7 @@ describe('Task Run Statistics', () => {
434437
const BackgroundTaskUtilizationAggregator = createBackgroundTaskUtilizationAggregator(
435438
taskPollingLifecycle,
436439
new AdHocTaskCounter(),
437-
pollInterval
440+
500
438441
);
439442

440443
function expectWindowEqualsUpdate(
@@ -461,10 +464,36 @@ describe('Task Run Statistics', () => {
461464
expectWindowEqualsUpdate(taskStats[2], loads.slice(0, 3));
462465
expectWindowEqualsUpdate(taskStats[3], loads.slice(0, 4));
463466
expectWindowEqualsUpdate(taskStats[4], loads.slice(0, 5));
464-
// from the 6th value, begin to drop old values as our window is 5
465-
expectWindowEqualsUpdate(taskStats[5], loads.slice(1, 6));
466-
expectWindowEqualsUpdate(taskStats[6], loads.slice(2, 7));
467-
expectWindowEqualsUpdate(taskStats[7], loads.slice(3, 8));
467+
expectWindowEqualsUpdate(taskStats[5], loads.slice(0, 6));
468+
expectWindowEqualsUpdate(taskStats[6], loads.slice(0, 7));
469+
expectWindowEqualsUpdate(taskStats[7], loads.slice(0, 8));
470+
expectWindowEqualsUpdate(taskStats[8], loads.slice(0, 9));
471+
expectWindowEqualsUpdate(taskStats[9], loads.slice(0, 10));
472+
expectWindowEqualsUpdate(taskStats[10], loads.slice(0, 11));
473+
expectWindowEqualsUpdate(taskStats[11], loads.slice(0, 12));
474+
expectWindowEqualsUpdate(taskStats[12], loads.slice(0, 13));
475+
expectWindowEqualsUpdate(taskStats[13], loads.slice(0, 14));
476+
expectWindowEqualsUpdate(taskStats[14], loads.slice(0, 15));
477+
expectWindowEqualsUpdate(taskStats[15], loads.slice(0, 16));
478+
expectWindowEqualsUpdate(taskStats[16], loads.slice(0, 17));
479+
expectWindowEqualsUpdate(taskStats[17], loads.slice(0, 18));
480+
expectWindowEqualsUpdate(taskStats[18], loads.slice(0, 19));
481+
expectWindowEqualsUpdate(taskStats[19], loads.slice(0, 20));
482+
expectWindowEqualsUpdate(taskStats[20], loads.slice(0, 21));
483+
expectWindowEqualsUpdate(taskStats[21], loads.slice(0, 22));
484+
expectWindowEqualsUpdate(taskStats[22], loads.slice(0, 23));
485+
expectWindowEqualsUpdate(taskStats[23], loads.slice(0, 24));
486+
expectWindowEqualsUpdate(taskStats[24], loads.slice(0, 25));
487+
expectWindowEqualsUpdate(taskStats[25], loads.slice(0, 26));
488+
expectWindowEqualsUpdate(taskStats[26], loads.slice(0, 27));
489+
expectWindowEqualsUpdate(taskStats[27], loads.slice(0, 28));
490+
expectWindowEqualsUpdate(taskStats[28], loads.slice(0, 29));
491+
expectWindowEqualsUpdate(taskStats[29], loads.slice(0, 30));
492+
// from the 31st value, begin to drop old values as our window is 30
493+
expectWindowEqualsUpdate(taskStats[30], loads.slice(1, 31));
494+
expectWindowEqualsUpdate(taskStats[31], loads.slice(2, 32));
495+
expectWindowEqualsUpdate(taskStats[32], loads.slice(3, 33));
496+
468497
resolve();
469498
});
470499

x-pack/platform/plugins/shared/task_manager/server/monitoring/background_task_utilization_statistics.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
import { MonitoredStat } from './monitoring_stats_stream';
2323
import { AggregatedStat, AggregatedStatProvider } from '../lib/runtime_statistics_aggregator';
2424
import { createRunningAveragedStat } from './task_run_calculators';
25-
import { DEFAULT_WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW } from '../config';
25+
import { WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW_SIZE_MS } from '../config';
2626

2727
export interface PublicBackgroundTaskUtilizationStat extends JsonObject {
2828
load: number;
@@ -53,8 +53,12 @@ export function createBackgroundTaskUtilizationAggregator(
5353
taskPollingLifecycle: TaskPollingLifecycle,
5454
adHocTaskCounter: AdHocTaskCounter,
5555
pollInterval: number,
56-
workerUtilizationRunningAverageWindowSize: number = DEFAULT_WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW
56+
workerUtilizationRunningAverageWindowSize?: number
5757
): AggregatedStatProvider<BackgroundTaskUtilizationStat> {
58+
const workerUtilizationWindowSize =
59+
workerUtilizationRunningAverageWindowSize ??
60+
WORKER_UTILIZATION_RUNNING_AVERAGE_WINDOW_SIZE_MS / pollInterval;
61+
5862
const taskRunEventToAdhocStat = createTaskRunEventToAdhocStat();
5963
const taskRunAdhocEvents$: Observable<Pick<BackgroundTaskUtilizationStat, 'adhoc'>> =
6064
taskPollingLifecycle.events.pipe(
@@ -84,7 +88,7 @@ export function createBackgroundTaskUtilizationAggregator(
8488
);
8589

8690
const taskManagerUtilizationEventToLoadStat = createTaskRunEventToLoadStat(
87-
workerUtilizationRunningAverageWindowSize
91+
workerUtilizationWindowSize
8892
);
8993

9094
const taskManagerWorkerUtilizationEvent$: Observable<

0 commit comments

Comments
 (0)