Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Logs UI] Add ML job status callouts to results page #47642

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
4adc91d
Amend outer page / panel structure
Kerry350 Oct 3, 2019
62c7a6b
Remove unused imports
Kerry350 Oct 3, 2019
9793f4c
Merge remote-tracking branch 'upstream/master' into 47201-adapt-log-e…
Kerry350 Oct 7, 2019
0cefd23
Add anomalies section and overall chart
Kerry350 Oct 7, 2019
b5f3bf8
Merge remote-tracking branch 'upstream/master' into 47201-adapt-log-e…
Kerry350 Oct 8, 2019
7524569
Add legend
Kerry350 Oct 8, 2019
4119a05
Rename dataSet to partition
weltenwort Oct 8, 2019
8d887a8
Add max bucket anomaly score
weltenwort Oct 8, 2019
6ff0634
Move job and setup status types to common
weltenwort Sep 18, 2019
5eeefce
Move initial job status fetching into page content
weltenwort Sep 18, 2019
43c2edf
Poll for job status on results page
weltenwort Sep 18, 2019
bb157fd
Merge branch '47201-adapt-log-entry-rate-data-vis' of github.com:Kerr…
Kerry350 Oct 8, 2019
7811629
Add table / expanded row charts
Kerry350 Oct 8, 2019
ae059f0
Add bucket span text
Kerry350 Oct 8, 2019
a3820b7
Add stat section to expanded rows
Kerry350 Oct 8, 2019
1e8678d
Amend annotations on overall graph
Kerry350 Oct 8, 2019
427105d
Add rule to account for EuiFlexItem edge case
Kerry350 Oct 9, 2019
123084b
Move functions that handle derivations of data to a new file
Kerry350 Oct 9, 2019
737a25d
Tweak data points fetched
Kerry350 Oct 9, 2019
ded5117
Style bars in grey for anomalies charts
Kerry350 Oct 9, 2019
94fdb76
Add severity scoring to annotations
Kerry350 Oct 9, 2019
25d6e54
Fix default
Kerry350 Oct 9, 2019
7be35d2
Remove decimal places from anomaly score representations
Kerry350 Oct 9, 2019
a3d81da
Show all partitions and overall anomaly score in annotation tooltip f…
Kerry350 Oct 9, 2019
2f7855e
Handle 'unknown' to workaround lack of '' suuport in tables
Kerry350 Oct 10, 2019
78750b3
Add stats section to overall anomalies section
Kerry350 Oct 10, 2019
7e72fe4
Base x-domain off the series so that certain buckets aren't omitted
Kerry350 Oct 10, 2019
cb3d525
Tweak colours and DRY up annotation rendering
Kerry350 Oct 10, 2019
9db1834
Add sorting to table
Kerry350 Oct 10, 2019
a0908da
Merge remote-tracking branch 'upstream/master' into 47201-adapt-log-e…
Kerry350 Oct 10, 2019
fd26252
Add "number of logs" to API results and render in UI stats
Kerry350 Oct 10, 2019
2569bc8
Track and render out-of-sync job configurations
weltenwort Oct 8, 2019
1813c80
Adjust translation labels
weltenwort Oct 11, 2019
ced21c8
Add stopped state callout
weltenwort Oct 11, 2019
992a7c5
Add more callout icons
weltenwort Oct 11, 2019
5591652
Merge branch 'master' into logs-ui-analysis-add-job-status-callouts
weltenwort Oct 11, 2019
87074d1
Fix api integration tests
weltenwort Oct 11, 2019
e453e07
Merge remote-tracking branch 'upstream/master' into 47201-adapt-log-e…
Kerry350 Oct 14, 2019
3e181b0
Use "pretty" numbers for "Number of logs" stats
Kerry350 Oct 14, 2019
d65af63
Merge branch 'master' into logs-ui-analysis-add-job-status-callouts
weltenwort Oct 14, 2019
ce095aa
Improve status message wording
weltenwort Oct 14, 2019
c92615d
Change recreate job button color back to default
weltenwort Oct 14, 2019
bb01766
Add toolbar text
Kerry350 Oct 14, 2019
6100b51
Format all y axis values to 3 digits
Kerry350 Oct 14, 2019
36c7cb9
Remove "Overall anomaly score" and change all wording / calculations …
Kerry350 Oct 14, 2019
af7833c
Merge branch '47201-adapt-log-entry-rate-data-vis' of github.com:Kerr…
Kerry350 Oct 14, 2019
3031b69
Sort anomaly maximum scores for the overall chart tooltip
Kerry350 Oct 14, 2019
fbe41af
Remove unused translations
Kerry350 Oct 14, 2019
5f85146
Use white text with badge in toolbar
Kerry350 Oct 14, 2019
4df0469
Merge branch 'master' into logs-ui-analysis-add-job-status-callouts
weltenwort Oct 15, 2019
af01a97
Merge remote-tracking branch 'upstream/master' into 47201-adapt-log-e…
Kerry350 Oct 15, 2019
f329127
Factor out a job recreation callout
weltenwort Oct 15, 2019
6e7f872
Replace `filter()[0]` with `find()` call
weltenwort Oct 15, 2019
40dbb59
Amend key
Kerry350 Oct 15, 2019
8e215d3
Use Math.round and introduce a formatAnomalyScore helper function
Kerry350 Oct 15, 2019
19ef762
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
32833e6
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
e732f5d
Format y-axis of log entry rate chart the same as anomalies charts
Kerry350 Oct 15, 2019
1548e14
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
b1a743a
Merge branch '47201-adapt-log-entry-rate-data-vis' of github.com:Kerr…
Kerry350 Oct 15, 2019
b76bf02
Remove grow prop
Kerry350 Oct 15, 2019
1cb4143
Update x-pack/legacy/plugins/infra/common/http_api/log_analysis/resul…
Kerry350 Oct 15, 2019
cadd37f
Update x-pack/legacy/plugins/infra/common/http_api/log_analysis/resul…
Kerry350 Oct 15, 2019
79c4e21
Update x-pack/legacy/plugins/infra/server/routes/log_analysis/results…
Kerry350 Oct 15, 2019
63aca0b
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/page_re…
Kerry350 Oct 15, 2019
7bd5708
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
ee60082
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
157ddd8
Update x-pack/legacy/plugins/infra/server/routes/log_analysis/results…
Kerry350 Oct 15, 2019
e4ed1d1
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
eb0b34a
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
a685a43
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
ad530c7
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
4c3f3f0
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
ad81285
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
0ce5bf6
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
1c587f1
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
8b7535c
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
b52d9c1
Update x-pack/legacy/plugins/infra/public/pages/logs/analysis/section…
Kerry350 Oct 15, 2019
4bdfcfb
Update x-pack/legacy/plugins/infra/server/lib/log_analysis/log_analys…
Kerry350 Oct 15, 2019
a32f8e5
Update x-pack/legacy/plugins/infra/server/lib/log_analysis/log_analys…
Kerry350 Oct 15, 2019
8e31a6c
Update x-pack/legacy/plugins/infra/server/routes/log_analysis/results…
Kerry350 Oct 15, 2019
721b7f8
Update x-pack/legacy/plugins/infra/server/routes/log_analysis/results…
Kerry350 Oct 15, 2019
914790e
Merge branch '47201-adapt-log-entry-rate-data-vis' of github.com:Kerr…
Kerry350 Oct 15, 2019
a491bff
Change path
Kerry350 Oct 15, 2019
f7787bd
Amend property name
Kerry350 Oct 15, 2019
305cdf4
Use proper default value argument
Kerry350 Oct 15, 2019
7f468b4
Use Kibana dateFormat setting for toolbar formatting
Kerry350 Oct 15, 2019
7fa26ed
Change logic for calculating severity score categories
Kerry350 Oct 15, 2019
d01e5f1
Add missing translations
Kerry350 Oct 15, 2019
a1493ce
Add interface to top of file
Kerry350 Oct 15, 2019
8197183
Add no-wrap to tooltip
Kerry350 Oct 15, 2019
5bcad0d
Use more idomatic code
Kerry350 Oct 15, 2019
a5d6e45
Use static value for series styles
Kerry350 Oct 15, 2019
abae288
Merge remote-tracking branch 'upstream/master' into 47201-adapt-log-e…
Kerry350 Oct 15, 2019
a688c3b
Merge branch '47201-adapt-log-entry-rate-data-vis' into logs-ui-analy…
weltenwort Oct 15, 2019
2727c69
Move the callouts into the right location
weltenwort Oct 15, 2019
ae7de65
Fix linter warning
weltenwort Oct 15, 2019
949ffa1
Add non-functional ML link button
weltenwort Oct 15, 2019
b4267a3
Merge branch 'master' into logs-ui-analysis-add-job-status-callouts
weltenwort Oct 15, 2019
8828a9d
Fix merge mistake
weltenwort Oct 15, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions x-pack/legacy/plugins/infra/common/log_analysis/log_analysis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,45 @@ export const jobTypeRT = rt.keyof({

export type JobType = rt.TypeOf<typeof jobTypeRT>;

export const jobStatusRT = rt.keyof({
created: null,
missing: null,
running: null,
});
// combines and abstracts job and datafeed status
export type JobStatus =
| 'unknown'
| 'missing'
| 'initializing'
| 'stopped'
| 'started'
| 'finished'
| 'failed';

export type SetupStatus =
| 'initializing' // acquiring job statuses to determine setup status
| 'unknown' // job status could not be acquired (failed request etc)
| 'required' // jobs are missing
| 'requiredForReconfiguration' // the configurations don't match the source configurations
| 'requiredForUpdate' // the definitions don't match the module definitions
| 'pending' // In the process of setting up the module for the first time or retrying, waiting for response
| 'succeeded' // setup succeeded, notifying user
| 'failed' // setup failed, notifying user
| 'hiddenAfterSuccess' // hide the setup screen and we show the results for the first time
| 'skipped' // setup hidden because the module is in a correct state already
| 'skippedButReconfigurable' // setup hidden even though the job configurations are outdated
| 'skippedButUpdatable'; // setup hidden even though the job definitions are outdated

/**
* Maps a job status to the possibility that results have already been produced
* before this state was reached.
*/
export const isJobStatusWithResults = (jobStatus: JobStatus) =>
['started', 'finished', 'stopped', 'failed'].includes(jobStatus);

export const isHealthyJobStatus = (jobStatus: JobStatus) =>
['started', 'finished'].includes(jobStatus);

export type JobStatus = rt.TypeOf<typeof jobStatusRT>;
/**
* Maps a setup status to the possibility that results have already been
* produced before this state was reached.
*/
export const isSetupStatusWithResults = (setupStatus: SetupStatus) =>
['skipped', 'hiddenAfterSuccess', 'skippedButReconfigurable', 'skippedButUpdatable'].includes(
setupStatus
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

export * from './log_analysis_job_problem_indicator';
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import React from 'react';

import { RecreateJobCallout } from './recreate_job_callout';

export const JobConfigurationOutdatedCallout: React.FC<{
onRecreateMlJob: () => void;
}> = ({ onRecreateMlJob }) => (
<RecreateJobCallout title={jobConfigurationOutdatedTitle} onRecreateMlJob={onRecreateMlJob}>
<FormattedMessage
id="xpack.infra.logs.analysis.jobConfigurationOutdatedCalloutMessage"
defaultMessage="The ML job was created using a different source configuration. Recreate the job to apply the current configuration. This removes previously detected anomalies."
/>
</RecreateJobCallout>
);

const jobConfigurationOutdatedTitle = i18n.translate(
'xpack.infra.logs.analysis.jobConfigurationOutdatedCalloutTitle',
{
defaultMessage: 'ML job configuration outdated',
}
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import React from 'react';

import { RecreateJobCallout } from './recreate_job_callout';

export const JobDefinitionOutdatedCallout: React.FC<{
onRecreateMlJob: () => void;
}> = ({ onRecreateMlJob }) => (
<RecreateJobCallout title={jobDefinitionOutdatedTitle} onRecreateMlJob={onRecreateMlJob}>
<FormattedMessage
id="xpack.infra.logs.analysis.jobDefinitionOutdatedCalloutMessage"
defaultMessage="A newer version of the ML job is available. Recreate the job to deploy the newer version. This removes previously detected anomalies."
/>
</RecreateJobCallout>
);

const jobDefinitionOutdatedTitle = i18n.translate(
'xpack.infra.logs.analysis.jobDefinitionOutdatedCalloutTitle',
{
defaultMessage: 'ML job definition outdated',
}
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import React from 'react';
import { EuiCallOut } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';

export const JobStoppedCallout: React.FC = () => (
<EuiCallOut color="primary" iconType="pause" title={jobStoppedTitle}>
<FormattedMessage
id="xpack.infra.logs.analysis.jobStoppedCalloutMessage"
defaultMessage="The ML job has been stopped manually or due to a lack of resources. New log entries will not be processed until the job has been restarted."
tagName="p"
/>
</EuiCallOut>
);

const jobStoppedTitle = i18n.translate('xpack.infra.logs.analysis.jobStoppedCalloutTitle', {
defaultMessage: 'ML job stopped',
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import React from 'react';

import { JobStatus, SetupStatus } from '../../../../common/log_analysis';
import { JobConfigurationOutdatedCallout } from './job_configuration_outdated_callout';
import { JobDefinitionOutdatedCallout } from './job_definition_outdated_callout';
import { JobStoppedCallout } from './job_stopped_callout';

export const LogAnalysisJobProblemIndicator: React.FC<{
jobStatus: JobStatus;
setupStatus: SetupStatus;
onRecreateMlJobForReconfiguration: () => void;
onRecreateMlJobForUpdate: () => void;
}> = ({ jobStatus, setupStatus, onRecreateMlJobForReconfiguration, onRecreateMlJobForUpdate }) => {
if (jobStatus === 'stopped') {
return <JobStoppedCallout />;
} else if (setupStatus === 'skippedButUpdatable') {
return <JobDefinitionOutdatedCallout onRecreateMlJob={onRecreateMlJobForUpdate} />;
} else if (setupStatus === 'skippedButReconfigurable') {
return <JobConfigurationOutdatedCallout onRecreateMlJob={onRecreateMlJobForReconfiguration} />;
}

return null; // no problem to indicate
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import React from 'react';
import { EuiCallOut, EuiButton } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';

export const RecreateJobCallout: React.FC<{
onRecreateMlJob: () => void;
title?: React.ReactNode;
}> = ({ children, onRecreateMlJob, title }) => (
<EuiCallOut color="warning" iconType="alert" title={title}>
<p>{children}</p>
<EuiButton color="warning" onClick={onRecreateMlJob}>
<FormattedMessage
id="xpack.infra.logs.analysis.recreateJobButtonLabel"
defaultMessage="Recreate ML job"
/>
</EuiButton>
</EuiCallOut>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import * as rt from 'io-ts';

export const jobCustomSettingsRT = rt.partial({
job_revision: rt.number,
logs_source_config: rt.partial({
indexPattern: rt.string,
timestampField: rt.string,
bucketSpan: rt.number,
}),
});
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
* you may not use this file except in compliance with the Elastic License.
*/

import * as rt from 'io-ts';
import { kfetch } from 'ui/kfetch';
import { pipe } from 'fp-ts/lib/pipeable';
import { fold } from 'fp-ts/lib/Either';
import { identity } from 'fp-ts/lib/function';
import * as rt from 'io-ts';
import { kfetch } from 'ui/kfetch';

import { jobCustomSettingsRT } from './ml_api_types';
import { throwErrors, createPlainError } from '../../../../../common/runtime_types';
import { getAllModuleJobIds } from '../../../../../common/log_analysis';

Expand Down Expand Up @@ -56,11 +58,14 @@ export const jobSummaryRT = rt.intersection([
datafeedIndices: rt.array(rt.string),
datafeedState: datafeedStateRT,
fullJob: rt.partial({
custom_settings: jobCustomSettingsRT,
finished_time: rt.number,
}),
}),
]);

export type JobSummary = rt.TypeOf<typeof jobSummaryRT>;

export const fetchJobStatusResponsePayloadRT = rt.array(jobSummaryRT);

export type FetchJobStatusResponsePayload = rt.TypeOf<typeof fetchJobStatusResponsePayloadRT>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import { fold } from 'fp-ts/lib/Either';
import { pipe } from 'fp-ts/lib/pipeable';
import { identity } from 'fp-ts/lib/function';
import * as rt from 'io-ts';
import { kfetch } from 'ui/kfetch';

import { throwErrors, createPlainError } from '../../../../../common/runtime_types';
import { jobCustomSettingsRT } from './ml_api_types';

export const callGetMlModuleAPI = async (moduleId: string) => {
const response = await kfetch({
method: 'GET',
pathname: `/api/ml/modules/get_module/${moduleId}`,
});

return pipe(
getMlModuleResponsePayloadRT.decode(response),
fold(throwErrors(createPlainError), identity)
);
};

const jobDefinitionRT = rt.type({
id: rt.string,
config: rt.type({
custom_settings: jobCustomSettingsRT,
}),
});

export type JobDefinition = rt.TypeOf<typeof jobDefinitionRT>;

const getMlModuleResponsePayloadRT = rt.type({
id: rt.string,
jobs: rt.array(jobDefinitionRT),
});

export type GetMlModuleResponsePayload = rt.TypeOf<typeof getMlModuleResponsePayloadRT>;
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,18 @@
* you may not use this file except in compliance with the Elastic License.
*/

import * as rt from 'io-ts';
import { kfetch } from 'ui/kfetch';

import { fold } from 'fp-ts/lib/Either';
import { pipe } from 'fp-ts/lib/pipeable';
import { identity } from 'fp-ts/lib/function';
import * as rt from 'io-ts';
import { kfetch } from 'ui/kfetch';

import { throwErrors, createPlainError } from '../../../../../common/runtime_types';
import { getJobIdPrefix } from '../../../../../common/log_analysis';

const MODULE_ID = 'logs_ui_analysis';

// This is needed due to: https://github.com/elastic/kibana/issues/43671
const removeSampleDataIndex = (indexPattern: string) => {
const SAMPLE_DATA_INDEX = 'kibana_sample_data_logs*';
return indexPattern
.split(',')
.filter(index => index !== SAMPLE_DATA_INDEX)
.join(',');
};
import { jobCustomSettingsRT } from './ml_api_types';

export const callSetupMlModuleAPI = async (
moduleId: string,
start: number | undefined,
end: number | undefined,
spaceId: string,
Expand All @@ -35,23 +26,30 @@ export const callSetupMlModuleAPI = async (
) => {
const response = await kfetch({
method: 'POST',
pathname: `/api/ml/modules/setup/${MODULE_ID}`,
pathname: `/api/ml/modules/setup/${moduleId}`,
body: JSON.stringify(
setupMlModuleRequestPayloadRT.encode({
start,
end,
indexPatternName: removeSampleDataIndex(indexPattern),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

indexPatternName: indexPattern,
prefix: getJobIdPrefix(spaceId, sourceId),
startDatafeed: true,
jobOverrides: [
{
job_id: 'log-entry-rate',
job_id: 'log-entry-rate' as const,
analysis_config: {
bucket_span: `${bucketSpan}ms`,
},
data_description: {
time_field: timeField,
},
custom_settings: {
logs_source_config: {
indexPattern,
timestampField: timeField,
bucketSpan,
},
},
},
],
datafeedOverrides: [],
Expand All @@ -70,11 +68,22 @@ const setupMlModuleTimeParamsRT = rt.partial({
end: rt.number,
});

const setupMlModuleLogEntryRateJobOverridesRT = rt.type({
job_id: rt.literal('log-entry-rate'),
analysis_config: rt.type({
bucket_span: rt.string,
}),
data_description: rt.type({
time_field: rt.string,
}),
custom_settings: jobCustomSettingsRT,
});

const setupMlModuleRequestParamsRT = rt.type({
indexPatternName: rt.string,
prefix: rt.string,
startDatafeed: rt.boolean,
jobOverrides: rt.array(rt.object),
jobOverrides: rt.array(setupMlModuleLogEntryRateJobOverridesRT),
datafeedOverrides: rt.array(rt.object),
});

Expand Down
Loading